migration-plan
Skill0 starsChanged 51 days agoMITView on GitHub
Move a system from one technology, provider or version to another without a cutover weekend. Use when the user asks how to migrate, port or move between databases, frameworks, languages, cloud providers, authentication systems or major versions, asks how to escape a vendor, asks about zero downtime data migration, dual writing or backfilling, or asks whether to upgrade or replace. Plans an incremental path with both systems running and traffic moved in slices, requires a tested reversal at every step, makes correctness verifiable by comparing the two systems on live traffic, and states the cost of the parallel running period that big bang plans leave out. Triggers on migrate from, port to, move off, switch database, upgrade major version, zero downtime migration, dual write, backfill, vendor lock in, replatform, cutover.
3 other projects use a version of this.
Adopted by
Most recently taken up by
- abevz/devops-skillstheir own version, first seen Oct 15, 2026
- analyticsengineering/ae-toolkittheir own version, first seen Oct 12, 2026
- prestarius/jet-skills-stacktheir own version, first seen Oct 11, 2026
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 3
- analyticsengineering/ae-toolkit★ 3same name
- prestarius/jet-skills-stack★ 1same name
- abevz/devops-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository57 other files it gives its agents.
- accessibility-auditSkill
- agent-orchestrateSkill
- arch-decideSkill
- auth-implementSkill
- backend-buildSkill
- build-pilotSkill
- business-modelSkill
- career-strategySkill
- codebase-onboardSkill
- code-craftSkill
- code-reviewSkill
- compliance-mapSkill
- content-craftSkill
- cost-controlSkill
- data-analysisSkill
- data-layerSkill
- debug-methodSkill
- deep-researchSkill
- dependency-guardSkill
- design-systemSkill
- devex-toolingSkill
- doc-forgeSkill
- email-deliverSkill
- finance-booksSkill
- frontend-buildSkill
- git-disciplineSkill
- growth-experimentSkill
- human-proseSkill
- i18n-localizeSkill
- incident-responseSkill
- index-fastSkill
- infra-deploySkill
- job-huntSkill
- landing-convertSkill
- launch-planSkill
- llm-app-buildSkill
- llm-visibilitySkill
- memory-keeperSkill
- ml-buildSkill
- mobile-buildSkill
- numbers-checkSkill
- observability-setupSkill
- payments-integrateSkill
- performance-tuningSkill
- pricing-modelSkill
- prompt-forgeSkill
- queue-designSkill
- reality-checkSkill
- refactor-safelySkill
- release-manageSkill
- security-hardeningSkill
- seo-optimizeSkill
- ship-auditSkill
- skill-forgeSkill
- test-strategySkill
- ui-designSkill
- user-researchSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
16 rules. 0 are common, 16 are distinctive, and 0 are very specific to this project.
0
Common
Most of the 3 edited versions we read keep these.
16
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 26
Read what the source actually is first: the exact engine and version, the schema or interface, and the configuration that reveals the …
- Distinctive: line 37
When the project has settled nothing, no target chosen and no inventory done, do not plan a cutover.
- Distinctive: line 38
Run the inventory step first and prove the hardest slice against a candidate target, then let those two results size the plan.
- Distinctive: line 54
Every step is reversible on its own.
- Distinctive: line 59
Never migrate and redesign at the same time.
- Distinctive: line 66
Write the reason down, and check it survives scrutiny.
- Distinctive: line 71
If the reason is that the current system is unpleasant to work with, a migration will not fix that for long.
- Distinctive: line 78
Every reader and writer, including scripts, reports, dashboards, scheduled jobs, third party integrations, and the one internal tool nobody …
- Distinctive: line 82
Every behaviour depended upon that is not in the documentation: ordering guarantees, case sensitivity, collation, precision, null handling, …
- Distinctive: line 93
Before committing, take the hardest representative piece and make it work end to end against the target.
- Distinctive: line 94
Not the easiest piece. The one you are least sure about.
- Distinctive: line 130
Run it against production load and watch the effect.
- Distinctive: line 133
Verify by comparing counts and checksums per batch, not only at the end.
- Distinctive: line 142
Keep the ability to return until the old system is genuinely no longer needed, which is later than it feels.
- Distinctive: line 153
Update the documentation and the runbooks, since the old ones now describe a system that no longer exists.
- Distinctive: line 167
Every step reversible, with the point of no return named.
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Migration planning
A single cutover concentrates all the risk into one irreversible moment, usually at night, with a tired team. The alternative is running both systems and moving traffic in slices, each one reversible.
A migration ships code that lives only for the transition: the dual write path, the comparison code,
the backfill runner, the routing shim. Hold that code to the code-craft contract while it exists, so
the scaffolding you will later remove is readable enough to remove safely rather than being the mess
that never gets torn down.
Fit to the project
Map the source system and everything wired to it before choosing a target, because the size of a migration is set by the dependants, not by the thing being moved.
Read what the source actually is first: the exact engine and version, the schema or interface, and the configuration that reveals the behaviour consumers may lean on, such as collation, isolation level, or identifier format. Then find the target's real limits by reading its own documentation or running a probe, rather than assuming it behaves the same, since recall is not verification.
Inventory the dependants next, across the whole organisation and not only the main application. Search the codebases for every reader and writer, and list the scripts, reports, dashboards, scheduled jobs, and third party integrations that touch the source. Get the data volume and its growth rate from the source itself, because that decides whether a backfill is hours or weeks. Check whether a tested restore exists for this data, and whether there is any comparison mechanism already in place.
When the project has settled nothing, no target chosen and no inventory done, do not plan a cutover. Run the inventory step first and prove the hardest slice against a candidate target, then let those two results size the plan.
When to stay off
Skip the parallel running apparatus when the move is genuinely small and reversible on its own: a config change with an immediate rollback, a single stateless service with no data to carry, or a dependency bump that a version control revert undoes. Dual writes and shadow reads for a change you can undo in one commit add weeks of scaffolding to a one line revert.
Saying "stop", "just execute", or "skip the migration plan" is the off switch. It stays off for the rest of the session unless the plan is asked for again. Insisting on a full parallel run for a trivially reversible change is how a small task turns into a quarter of maintained shims.
Non-negotiables
- Every step is reversible on its own. If a step cannot be undone, it gets split until it can, or it is scheduled as a known point of no return with its own preparation.
- Both systems run in parallel during the transition, and that cost is stated in money and in attention. Plans that omit it are the ones that get approved and then abandoned halfway.
- Correctness is verified by comparison on live traffic, not by hoping. Shadow reads, then compare, then report the mismatch rate.
- A tested restore exists before any data is moved, and it was tested on this data.
- The deadline for finishing the transition is part of the plan. A migration that stalls at eighty percent leaves two systems to maintain forever, which is worse than either alone.
- Never migrate and redesign at the same time. Move first, improve after. Combining them means a failure cannot be attributed and the comparison is impossible.
- Retrieve the target's actual limits and behaviour rather than assuming parity. Different engines and providers differ in ways that break assumptions, and recall is not verification.
Procedure
Step 1, be honest about why
Write the reason down, and check it survives scrutiny. Cost, a capability that is genuinely required, an unsupported version, or a limit being hit.
Then ask whether an upgrade in place achieves it, because it usually costs a fraction of a migration.
If the reason is that the current system is unpleasant to work with, a migration will not fix that for long. Say so.
Step 2, inventory what depends on it
This is the step that determines the true size, and skipping it is why migrations run over.
Every reader and writer, including scripts, reports, dashboards, scheduled jobs, third party integrations, and the one internal tool nobody remembers. Search the whole organisation's code, not only the main application.
Every behaviour depended upon that is not in the documentation: ordering guarantees, case sensitivity, collation, precision, null handling, timezone behaviour, identifier format, transaction isolation, and error codes. These are where migrations break, because both systems claim to do the same thing.
Data volume and growth, which decides whether a backfill takes hours or weeks.
For the full list of dependant classes to hunt down and the undocumented behaviours that break parity,
see references/inventory-worksheet.md.
Step 3, prove it on a slice
Before committing, take the hardest representative piece and make it work end to end against the target. Not the easiest piece. The one you are least sure about.
This finds the incompatibility that changes the plan, while changing the plan is still cheap.
Measure performance on real data volume. A target that is slower on the main query changes everything.
Step 4, choose the pattern
For data stores, dual write with shadow reads. Write to both, keep reading from the old one, read from the new one in parallel and compare without using the result. Report the mismatch rate, fix the causes, and only move reads when it is at zero for a sustained period. Then stop writing to the old one after a safety period during which returning is still possible.
For services and applications, put a routing layer in front and move one route, one feature or one cohort at a time. Each move is small, observable and reversible. The old system keeps serving everything not yet moved.
For frameworks and languages, run the new one alongside for new code and migrate modules at boundaries, rather than converting everything then testing everything.
For major version upgrades, upgrade dependencies first, fix deprecation warnings on the current version next, then move. Most of the work is usually in the deprecations, and doing it before the jump keeps the steps separate.
For providers, move stateless compute first, data last, and check the egress cost before starting, since moving data out is frequently the largest single line in the whole project.
For the dual write and shadow read sequence broken into the ordered stages that keep the exit open, see
references/dual-write-checklist.md.
Step 5, backfill carefully
In batches, with a pause between them, and resumable from where it stopped.
Record progress durably, so a restart does not begin again.
Run it against production load and watch the effect. A backfill can saturate the database and cause the outage the migration was meant to avoid.
Verify by comparing counts and checksums per batch, not only at the end.
Handle the records that fail, and keep a list of them rather than letting them disappear into a log.
Step 6, move traffic and keep the exit open
Move in increments with a wait at each, watching error rate, latency and the business metric that proves the system works.
Keep the ability to return until the old system is genuinely no longer needed, which is later than it feels.
Define the point of no return explicitly, and prepare for it specifically. Usually it is the moment writes stop going to the old system.
Step 7, finish it
Decommission on a date. Remove the dual write code, the comparison code, the routing shims and the flags. A migration that leaves its scaffolding behind has added complexity rather than removed it.
Update the documentation and the runbooks, since the old ones now describe a system that no longer exists.
Record what the migration actually cost against the estimate, because that is the only way the next estimate improves.
Self-audit
- The reason is written down, and upgrading in place was considered.
- Full inventory of dependants, including scripts and reports outside the main application.
- Undocumented behavioural dependencies listed and checked against the target.
- The hardest slice proven end to end before committing.
- Restore tested on this data.
- Comparison on live traffic with a reported mismatch rate.
- Backfill batched, resumable, and verified per batch.
- Every step reversible, with the point of no return named.
- Parallel running cost stated.
- Decommission date set, with scaffolding removal included.
Honest limits
This skill plans the path and keeps it reversible. It does not perform the individual cutover of each
slice. Moving traffic in increments, defining the abort condition, and versioning the change belong to
release-manage, and this plan assumes that machinery exists to switch a slice back.
It stops at reading the source's behaviour and the target's limits; the schema design, the query
shapes, and the index choices on the new store are data-layer work. The comparison on live traffic
needs somewhere to send the mismatch rate, which is observability-setup. The egress and parallel
running costs quoted here come from the project's own provider bill and volume figures, not from a
price sheet, so cost-control owns the number. When a slice fails mid transition and users are
affected, that is incident-response, and a major version jump inside the migration follows the
deprecation rules in release-manage.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

