migration-architect
Shape the rollout strategy for a migration before any DDL or
code is written. Plans phases, dual-write windows, cutover
sequencing, deprecation cycles, and cross-service coordination.
Hands off to laravel-migration
(or the framework-native equivalent) for tactical DDL once the plan is locked.
When to use
- A schema change spans more than one deploy.
- A change requires a dual-write or backfill window.
- The migration touches multiple services, queues, or consumers
whose order of update matters.
- A column / table / API is being deprecated and the cycle needs
shape (announce → soft-fail → hard-fail → remove).
Do NOT use when:
- The change is a single additive migration safe in one deploy →
route to
laravel-migration (or framework-native equivalent).
- The decision is whether to migrate at all → route to
decision-record first.
- The concern is data correctness during the migration → route to
data-flow-mapper and feed
findings back here.
Procedure
1. Anchor on the goal
Write one sentence: "State X must become state Y across systems Z
without breaking consumers W." If you cannot, the migration is not
ripe — stop.
2. Identify the participating systems
List every service, queue, batch job, third-party consumer, and
client that reads or writes the affected schema. A system you
forget is a cutover surprise.
3. Pick a rollout shape
| Shape |
When to pick |
| Expand → migrate → contract |
Schema additive first, code switches reads, then drop old shape |
| Dual-write + backfill |
Both shapes written for a window; backfill closes the gap |
| Strangler fig |
New path runs alongside old; traffic ramps over time |
| Big-bang cutover |
Rare; only when downtime is acceptable AND coordination cost is trivial |
State why the shape fits — not just which one was picked.
4. Sequence the phases
For each phase, list:
- Trigger — what condition starts it.
- Actions — DDL, code deploy, feature flag, traffic shift.
- Reversibility — can we abort here, and how?
- Exit gate — what proves we can move to the next phase
(metric, sign-off, soak time).
A phase without an exit gate is a wish; reject.
5. Plan the deprecation cycle
For anything being removed:
- Announce window — comms cadence, who is told.
- Soft-fail window — log + warn, do not break.
- Hard-fail window — return errors.
- Removal — DDL drop, code delete.
Each window has a duration and a metric that justifies moving on.
Output format
Migration Architect
Goal: <one sentence>
Systems: <list>
Shape: expand-migrate-contract | dual-write | strangler | big-bang
Reason: <why this shape>
Phases:
1. <name> Trigger: <cond> Exit: <gate> Reversible: yes | costly | no
Actions: ...
2. ...
Deprecation cycle (if any):
Announce <duration> → soft-fail <duration> → hard-fail <duration> → remove
Next: /laravel-migration (or framework-native equivalent) for the DDL of phase 1
Gotcha
- The riskiest phase is the one with no rollback. Surface it
explicitly even if the user did not ask.
- Soak times in hours when interest is in days are a smell. Match
the soak to the actual blast radius.
Do NOT
- Do NOT write DDL — that is the framework-specific migration skill's job
(→
laravel-migration for Laravel).
- Do NOT collapse phases to "ship it" because the user is impatient;
surface the risk and let the user decide.
- Do NOT skip the deprecation cycle because nobody is using the old
shape "for sure" — verify before skipping.
1---2name: migration-architect3description: When shaping a non-trivial migration — rollout phases, dual-write windows, cutover sequencing, deprecation cycles — hands off to the framework-specific migration skill for DDL once locked.4---56# migration-architect78> Shape the **rollout strategy** for a migration before any DDL or9> code is written. Plans phases, dual-write windows, cutover10> sequencing, deprecation cycles, and cross-service coordination.11> Hands off to [`laravel-migration`](../laravel-migration/SKILL.md)12> (or the framework-native equivalent) for tactical DDL once the plan is locked.1314## When to use1516- A schema change spans more than one deploy.17- A change requires a dual-write or backfill window.18- The migration touches multiple services, queues, or consumers19 whose order of update matters.20- A column / table / API is being deprecated and the cycle needs21 shape (announce → soft-fail → hard-fail → remove).2223Do NOT use when:2425- The change is a single additive migration safe in one deploy →26 route to [`laravel-migration`](../laravel-migration/SKILL.md) (or framework-native equivalent).27- The decision is *whether* to migrate at all → route to28 [`decision-record`](../decision-record/SKILL.md) first.29- The concern is data correctness during the migration → route to30 [`data-flow-mapper`](../data-flow-mapper/SKILL.md) and feed31 findings back here.3233## Procedure3435### 1. Anchor on the goal3637Write one sentence: *"State X must become state Y across systems Z38without breaking consumers W."* If you cannot, the migration is not39ripe — stop.4041### 2. Identify the participating systems4243List every service, queue, batch job, third-party consumer, and44client that reads or writes the affected schema. A system you45forget is a cutover surprise.4647### 3. Pick a rollout shape4849| Shape | When to pick |50|---|---|51| Expand → migrate → contract | Schema additive first, code switches reads, then drop old shape |52| Dual-write + backfill | Both shapes written for a window; backfill closes the gap |53| Strangler fig | New path runs alongside old; traffic ramps over time |54| Big-bang cutover | Rare; only when downtime is acceptable AND coordination cost is trivial |5556State *why* the shape fits — not just which one was picked.5758### 4. Sequence the phases5960For each phase, list:6162- **Trigger** — what condition starts it.63- **Actions** — DDL, code deploy, feature flag, traffic shift.64- **Reversibility** — can we abort here, and how?65- **Exit gate** — what proves we can move to the next phase66 (metric, sign-off, soak time).6768A phase without an exit gate is a wish; reject.6970### 5. Plan the deprecation cycle7172For anything being removed:7374- Announce window — comms cadence, who is told.75- Soft-fail window — log + warn, do not break.76- Hard-fail window — return errors.77- Removal — DDL drop, code delete.7879Each window has a duration and a metric that justifies moving on.8081## Output format8283```84Migration Architect85Goal: <one sentence>86Systems: <list>87Shape: expand-migrate-contract | dual-write | strangler | big-bang88Reason: <why this shape>8990Phases:91 1. <name> Trigger: <cond> Exit: <gate> Reversible: yes | costly | no92 Actions: ...93 2. ...9495Deprecation cycle (if any):96 Announce <duration> → soft-fail <duration> → hard-fail <duration> → remove9798Next: /laravel-migration (or framework-native equivalent) for the DDL of phase 199```100101## Gotcha102103- The riskiest phase is the one with no rollback. Surface it104 explicitly even if the user did not ask.105- Soak times in hours when interest is in days are a smell. Match106 the soak to the actual blast radius.107108## Do NOT109110- Do NOT write DDL — that is the framework-specific migration skill's job111 (→ [`laravel-migration`](../laravel-migration/SKILL.md) for Laravel).112- Do NOT collapse phases to "ship it" because the user is impatient;113 surface the risk and let the user decide.114- Do NOT skip the deprecation cycle because nobody is using the old115 shape "for sure" — verify before skipping.