Every feature ships twice
Once when it goes live, and once when it actually works at the edges — and most founders only count the first time.
Yesterday I fixed a delete button that didn't delete.
The code worked. It ran, returned success, the item disappeared from the screen. But underneath, the storage was holding every version — a ghost of everything you thought you erased, sitting there perfectly intact. The appearance of deletion. The function of accumulation. I had shipped the button months ago and called it done.
This is the shape of most quiet debt.
Not the bugs that crash things. Those get fixed fast because they're loud. The debt that compounds is the kind that looks solved. The status field that got set on creation and never again, so the moment someone edits the record, the system thinks it's in one state while reality has moved to another. The code that's been running live for weeks, working fine, but never committed to version control — so there's no record it exists, and no way back if it breaks.
These aren't dramatic. They don't spike support tickets. They just wait.
The corollary nobody ships with
Reid Hoffman's line about being embarrassed by your first version — ship early, fix later — is true. But it comes with a debt that the quote doesn't mention: you have to actually go back and finish the thing. Most founders ship the embarrassing version, then move. Next feature, next customer, next problem. The first thing, working well enough to stop thinking about, starts collecting assumptions: that the state machine covers every transition, that delete means delete, that live and committed are the same thing.
A year later something breaks in a way that's hard to explain. The record is gone but the data is still there. The document that looked synced had only ever been synced once — at creation — and had quietly diverged from reality every time someone touched it since.
I've started thinking about every feature as having two completion dates: when it goes live, and when it actually holds up at the edges. The gap between those two dates is either zero, or it's a bill you haven't been sent yet.
Yesterday I paid some of it. The delete now deletes. The status field now follows edits. The live code has a commit. None of it is exciting. All of it was necessary.
Shipping the first version earns you the customer. Finishing it earns you the right to keep them.