Levels and expectations
Done means verified
Tests, monitoring, a rollback path, and a check in production are part of done — not polish if there is time.
Owners do not treat tests, monitoring, and docs as "nice if there is time." For anything that can fail in production, done includes a way to tell that it works and a way to undo it. That is the bridge into production ownership.
You do not need a novel for every change. You need the next on-call — often future you — to not start from zero.
| Layer | Minimum bar |
|---|---|
| Correctness | Tests for the risky paths; edge cases named |
| Operability | Logs, metrics, or traces that answer "is it working?" |
| Rollback | Flag, config, or revert path understood |
| Knowledge | PR description or short note so the next person is not archaeology |
Trade-off
Ship skeletal vs polish forever. Owners bias to shipping with a clear follow-up list and owners on those follow-ups. Infinite polish that never reaches users is not quality — it is fear. Shipping a critical path with no metric and no alert is not speed — it is gambling.
Walking through the same feature
Same request from a PM: "Let users export their billing history as CSV." A junior implements the happy path, opens a PR, and marks the ticket done at merge. Guidance fills the gaps — that is appropriate. See engineering levels. An SDE2 clarifies limits, ships with a metric and a flag, verifies in production, and says done when users can actually export.
| Moment | Junior-ish | SDE2 ownership |
|---|---|---|
| Ambiguous req | Builds the happy path only | Clarifies limits and failure modes |
| Merge | Ticket → Done | Flag on, verified, monitored |
| Partial failure | Waits for a bug ticket | Notices the metric or user report, drives the fix |
| Deadline risk | Slips Friday quietly | Renegotiates Thursday with options |
Export works for accounts with under 10k line items. At 50k lines the request times out at 30s. An owner either ships async before calling it done for all users, or ships sync with an explicit product limit ("last 12 months or 10k rows") documented in the UI and support macros. Shipping sync with a silent timeout for large accounts is unfinished — even if the demo looked great.
Common mistakes
- CI green equals done. Users never saw it.
- Silent timeout for the large-account path. Demo-sized data is not the outcome.
- Polish that never ships. A follow-up list with owners is quality. Endless delay is fear.
Check yourself
The export PR merged. The flag is still off. Is it done?
No. Users cannot export. Verify in production before you say done.
50k-row accounts time out at 30s. You shipped sync with no documented limit. Finished?
No. Ship async, or name the 10k-row limit in the UI and support macros.
Key takeaways
- Done includes tests, a pulse in production, a rollback, and a note for the next person.
- SDE2 vs junior on the same feature is end-to-end outcome care, not coding speed.
- Ship thin with owned follow-ups. Do not ship a critical path with no alert.
Further learning
Next: proactive ownership.
Related
Ownership
Acting like an owner: close loops, care about outcomes, and be the person things do not fall through with.
Closing loops
Stay with the outcome, not the ticket. Every commitment ends done, cancelled, or deferred with an owner and a date.
Owning your code in production
On-call, alerts, runbooks, and the loop that makes you trustworthy — and better at building systems that survive users.