Skip to main content
The Hard Parts.dev
FM-23 technical FM Failure Modes
Severity high Freq very common

Migration Debt

A planned migration starts well but stalls mid-execution, leaving the system permanently split across old and new states.

Severity
high
Frequency
very common
Lifecycle
build · operate
Recovery
hard
Confidence
high
At a glanceFM-23
Also known as

the half-migrated systemthe permanent transition statestranded migrationthe never-finished move

First noticed by

staff engineerarchitectdelivery lead

Mistaken for
work in progress
Often mistaken as
acceptable technical debt

Why it looks healthy

Concrete external tells that make the pattern read as responsible behavior.

  • Phase one shipped on time
  • The new system is visibly in production
  • The old system is in "legacy" mode
  • Leadership already celebrated the milestone

Definition

What it is

Blast radius code operations delivery team

A migration - to a new platform, database, cloud environment, or architecture - begins but never completes, creating an indefinite dual-state system.

How it unfolds

The arc of the pattern

  1. Starts

    A migration is planned, resourced, and begins with enthusiasm.

  2. Feels reasonable because

    The first phase is successful and the team moves on to other priorities.

  3. Escalates

    New features are built on both old and new systems. The old system receives patches. Completion keeps getting deprioritized.

  4. Ends

    Years later, the system has two data stores, two deployment models, or two infrastructure patterns - and nobody is sure how to finish.

Recognition

Warning signs by stage

Observable signals as the pattern progresses.

EARLY

Early

  • Migration has no explicit completion criteria.
  • No one owns the migration end state.
  • New features begin before old ones are migrated.

MID

Mid

  • Both old and new systems receive production traffic.
  • Migration progress is not tracked publicly.
  • The team cannot describe what remains to be migrated.

LATE

Late

  • The migration has been in progress for over a year.
  • New engineers learn both systems as permanent.
  • The completion is described as a future initiative rather than a current one.

Root causes

Why it happens

  • Completion criteria were not defined before starting
  • Business priorities shift mid-migration
  • The migration is harder than expected
  • No one owns the end state formally

Response

What to do

Immediate triage first, then structural fixes.

First move

Pick a retirement date for the old system, write it down, and put one specific owner on closing the gap to it.

Hard trade-off

Accept sunk cost on parts of the new system that will not be worth finishing, or accept operating both systems forever.

Recovery trap

Launching "phase three" to unblock phase two, which converts unfinished migration into a multi-phase program with no ending.

Immediate actions

  • Define what done looks like before the next phase begins
  • Freeze new development on the old system
  • Assign a named migration owner with authority to prioritize completion

Structural fixes

  • Track migration completion as a first-class metric
  • Set a retirement date for the old system before the new one is built
  • Treat dual-state as a temporary and expensive condition

What not to do

  • Do not accept indefinite dual-state as a stable operating condition
  • Do not start a migration without a named owner and completion criteria

AI impact

How AI distorts this pattern

Where AI-assisted workflows accelerate, hide, or help with this failure mode.

AI can help with

  • AI can help map what remains to be migrated, identify dependencies on the old system, and generate migration scripts for remaining cases.

AI can make worse by

  • AI can make working with both old and new systems easier, reducing the pain that would otherwise force completion of the migration.

Relationships

Connected patterns

Causal flows inside Failure Modes, and related entries across the site.

Easy to confuse with

Nearby patterns and how this one differs.

  • Friendly rewrite never defined an endpoint. Migration debt defined one and then stopped walking toward it.

  • Dependency fog is unclear ownership of commitments. Migration debt is clear ownership of a migration that is not finishing.

  • Adjacent concept Acceptable technical debt

    Debt with a plan and a date is managed. Migration debt is a permanent fork pretending to be a stage.

Heard in the wild

What it sounds like

The phrase that signals the pattern is about to start, and who tends to say it.

Heard in the wild

We're still in the middle of the migration to the new system.

Said byany engineer when asked about the current architecture

Notes from practice

What experienced people notice

Annotations from engineers who have worked this pattern before.

Best momentWhen intervention actually changes the trajectory.
When a migration has no defined completion criteria or owner
Counter moveThe specific action that breaks the pattern.
A migration without a retirement date is not a migration, it is a permanent fork.
False positiveWhen this pattern is actually the correct call.
Long migrations are sometimes genuinely complex. The failure mode is indefinite dual-state without a plan to end it.