Slopapalooza

What it is

A migration announced as a destination, not a route. Postgres to Mongo, Express to NestJS, REST to GraphQL, on-prem to AWS, Vue to React. AI cheerfully ports files. The dev cheerfully accepts them. The new system “works” — until the cutover, when the things nobody migrated start surfacing.

How it happens

The team starts with the obvious files. AI is genuinely good at line-by-line translation. Routes port. Tests port. The dashboard renders against the new stack. Confidence climbs file by file. But nobody enumerated the unseen layer: the implicit behaviors of the old system (auto-commit semantics, default timezones, NULL ordering, the way the ORM coerced types), the integrations the old system silently satisfied (webhooks no service owns, observability that piggy-backs on a specific log format, the cron that runs against the old hostname), and the features whose correctness depends on framework-specific behavior that doesn’t translate.

AI happily produces “the equivalent” code because at the line level there is an equivalent. At the semantic level there isn’t one, and the AI doesn’t know the semantic level exists for your specific system. The translation looks complete because the visible parts are.

Why it’s dangerous

A half-migration is worse than no migration. You can’t go back — effort sunk, decisions made, the old stack de-staffed. You can’t go forward — the remaining 20% is the 80% of the actual work. The cutover incident becomes the audit: customers see the wrong timezone in their invoices, the report job emits silently empty CSVs, the webhook that an external partner depends on returns 404 because nobody knew it existed.

The AI-era hinge: AI made the easy 80% so fast that nobody felt the natural friction that would have triggered planning. Pre-AI, a port took long enough that the unseen parts surfaced during the slog. Post-AI, the slog is gone, and so is the discovery. The cost of skipping the plan now lands at the moment rollback is most expensive.

How to prevent it

Inventory before translation. Before the first file ports, list the semantic differences between old and new, every integration the old system implicitly satisfies, the features whose behavior can’t be verified by reading the new code, and the cutover sequence with an explicit rollback path. AI is unusually good at this kind of inventory work — point it at the old system and ask “what could break that won’t be obvious from a file-by-file translation?” The list it produces is the migration plan you skipped.

Scale to stakes: a library upgrade isn’t a database swap isn’t a platform migration. The friction signal is the moment someone says “we’re mostly done” without being able to name what’s left.

The serious team fix

Three things, reinforcing each other:

  1. A written cutover plan before any file moves. Names the semantic differences, the integration points, the cutover sequence, and the rollback path. AI drafts it; humans interrogate it; the team commits to it. The plan’s existence is the precondition for translation work, not a deliverable after the fact.
  2. An AI-leveraged differences scout. A slash command or agent that compares the semantic behavior of the two systems — type coercion, timezone defaults, NULL handling, ordering, encoding, error shapes — and produces a list of “works in old, breaks in new” cases. The AI does the exhaustive enumeration; the human decides which differences become tests, which become migration scripts, and which are acceptable.
  3. Shadow traffic or parallel-run comparison. Real workload (or a real sample of it) runs against both systems and the outputs are compared. Drift becomes observable, not hypothetical. Cutover happens when the diff is empty for a real window — not when the team feels it ought to be. The infrastructure makes the unseen parts visible.

The shift is: the 80% AI ports for you isn’t the migration. The 20% you couldn’t see is. Make the unseen part observable before you cut over — everything else is throat-clearing.

Related anti-patterns

Back to all anti-patterns