Speed is not the enemy of quality. Undeclared debt is. A short note on how we decide what to do properly and what to defer.
Every team we meet has been told to move fast, and most of them have. The trouble is rarely the speed. It is that nobody wrote down which corners were cut, so six months later the corners are load-bearing.
Debt you declare is a decision. Debt you don't is a surprise.
We keep a single file in every repository called DEFERRED.md. It holds one line per shortcut: what we skipped, why it was reasonable at the time, and the condition that makes it urgent. Not a backlog — a set of tripwires.
## Single-region Postgres
Why: one market at launch, latency budget is fine.
Trip: first paying customer outside APAC, or p95 read > 180ms.
## No background job retries
Why: volume is 40/day, failures are visible in Slack.
Trip: > 500/day, or one silent failure reaches a customer.The discipline is not in the file. It is in reading it at the start of every planning cycle and being honest about which tripwires have been crossed.
What we never defer
- The data model. Renaming a column is cheap; reshaping a domain after 200,000 rows is not.
- Auth and tenancy boundaries. Retrofitting isolation is a rewrite wearing a migration's clothing.
- An audit trail on money movement. You cannot reconstruct history you never recorded.
- One end-to-end test through the critical path, from the first week.
A first version should be small, not shoddy. Those are different axes, and confusing them is what costs the second year.
Cut scope aggressively. Cut features, markets, edge cases, whole surfaces. What you should not cut is the small set of decisions that are expensive to reverse. Everything else can wait until the tripwire trips.