auto-evolution
Installation
SKILL.md
Evolution — What Claude Gets Wrong
You refactor like the old version vanishes the instant you deploy. It doesn't. Rolling deploys mean old code reads new data (and vice versa) for minutes or hours. Multi-binary systems mean one binary updates while others run the old version. Config files in the wild don't update themselves.
The Iron Rule
Every change to a shared interface must be safe for both old and new consumers simultaneously. Shared interfaces include: database columns, serialized messages (JSON, protobuf, job queue payloads), API response shapes, config file fields, environment variables, CLI flags, and public function signatures in shared libraries.
Anti-Patterns You Default To
| Anti-pattern | Example | Fix |
|---|---|---|
| Destructive rename | ALTER TABLE RENAME COLUMN |
Add new column → backfill → dual-write → migrate consumers → drop old |
| Required field on existing data | model: String (no default) |
#[serde(default)] model: Option<String> or DEFAULT in migration |
| Atomic switchover | Rename env var everywhere at once | New code reads new name, falls back to old, warns |
| No deprecation warning | Old config field silently ignored | tracing::warn!("interval_ms is deprecated, use interval_secs") |
| Missing consumer enumeration | Update struct, miss inline SQL/SSE types/dashboard | List ALL consumers before changing |
| Enum variant removal | Remove "active" status, old data breaks |
Keep old variants, map to new internally |
| Breaking return type change | Vec<T> → HashMap<K, T> on public fn |
Add new method, deprecate old |