There is a moment in every struggling codebase where the team stops proposing fixes and starts proposing a rewrite. It's not laziness — it's exhaustion. The system has stopped rewarding careful work, so a clean slate feels like the only honest path forward.
The problem is arithmetic. A rewrite pauses customer-visible progress for as long as it takes, and it takes longer than anyone estimates. In this case: eighteen months against nine months of runway.
Nobody funds a rewrite. Everybody funds shipping faster. Those are usually the same project described differently.
We mapped the system by revenue instead of by module. Seventy percent of the pain lived in three seams: authentication, the billing sync, and a reporting job that had grown into a second application.
You don't need a clean slate. You need three clean seams.
Over four months we strangled those three seams — new code behind the same interfaces, old code deleted the week it stopped serving traffic. Nothing froze. Nothing paused. Two of the three engineers who had been threatening to quit stayed.
