A migration is the same decision, a few hundred times.
Most call sites are mechanical. The handful that disagree with the plan are the migration, and they are what a fresh agent session throws away.
How Skyflo runs a framework or dependency migration with AI coding agents across multiple repositories, keeping the plan, the exceptions, and the reasoning attached to one objective.
Migration ledger
mg-208 · logging API v2 · 5 registered checkouts
applied
Direct replacement. Matched the plan exactly.
applied
Direct replacement. Matched the plan exactly.
exception
Old API is called before the config loads. Ordering fix agreed in the plan review.
exception
Public surface. Deprecation shim kept for one minor version.
open
No test coverage on the code path. Flagged rather than changed silently.
Two rows are still open. Both keep their reasoning for the next pass.
Where the cost actually is.
A migration produces two things: a large diff, and a small set of exceptions that took real thought. Coding agents are good at the first. The second is what disappears when the session ends.
By the fortieth call site you have decided three things that were not in the original plan: this wrapper keeps a deprecation shim, that module has to move before the config loads, this path has no coverage so it gets flagged rather than quietly changed.
Those decisions are the migration. Start a fresh session for the next repository and you re-derive them badly, or you skip them and the two halves of the change disagree.
The mission keeps the approved plan and exceptions between passes. Its state survives the session, and the plan remains the boundary specialists work inside instead of being re-derived from the original instructions.
What the next pass inherits.
Accepted, source-linked personal memory is retrieved when it is relevant to a later mission, so the reasoning behind an exception is available the next time something touches that code.
Every record carries the work that produced it. When later work returns to an open call site, the reason the SDK kept its shim is attached to the SDK, with a link to the change that established it.
Memory is reviewable: you can accept a record, dismiss it, or forget it. A migration produces a lot of decisions, and not all of them deserve to outlive the migration.
A migration you already owe
Run the migration as one objective.
One mission, one approved plan, and a ledger that keeps the exceptions between passes instead of losing them.
Free. macOS 14+. Apple silicon and Intel.