The seven-question failure-mode checklist
coreintermediateFailure mode analysis is the practice of deliberately asking, for every component in a design, a fixed list of "what if" questions rather than only designing for the case where everything works — most design reviews default to describing the happy path in detail and mentioning failure handling as an afterthought, if at all. The seven questions are concrete and apply to almost any component: what if it times out (the caller waits and gets nothing back in time)? What if it returns invalid data (a malformed or logically wrong response, not an error)? What if it goes down entirely (hard failure, connection refused)? What if it duplicates work (the same operation runs twice, e.g. from a retry)? What if it becomes slow rather than failing outright (a partial, harder-to-detect degradation)? What if it loses data (an acknowledged write that never actually persisted)? And what if it becomes unreachable (a network partition, distinct from the component itself being down)? Running through all seven for a given component surfaces failure modes that a single generic "what if it fails" question does not, because "it fails" collapses seven meaningfully different situations — each needing a different mitigation — into one vague case that is easy to wave away with "we'll add error handling."
Think of it as
Think of a pre-flight checklist a pilot runs before every takeoff: it is not "check that the plane works," which is too vague to act on, it is a fixed list of specific, separately-checked items — fuel, flaps, instruments, communications — precisely because a vague check gets skipped or rushed while a specific one gets actually verified. The seven failure-mode questions are the same kind of checklist applied to a system component: "what if it fails" is the vague version everyone already nominally does; "what if it times out, specifically, versus what if it returns wrong data, specifically" is the version that produces a concrete answer for each case rather than a shrug.
What we're doing: Apply all seven questions to one component — an inventory service called during checkout.
- 3
- This is the failure mode most designs miss entirely, because nothing about it looks like a failure — no timeout, no error, no down connection, just a wrong answer returned successfully, which is exactly why it needs an explicit question rather than being caught incidentally by handling for "the call fails."
- 5
- This is a direct, concrete instance of the retry-amplification and idempotency risk covered in full in Retry Strategy and Delivery Semantics — the checklist's job here is just to surface that this component needs that treatment, not to re-derive the mechanism.
Why this works: A review that only asks "what if inventory-service fails" produces a single fallback plan (probably: fail the checkout), which is the right answer for exactly one of these seven cases (goes down) and the wrong or incomplete answer for the other six — running the full checklist is what turns one vague plan into seven specific, correct ones.
Designing failure handling only for "the service is down"
Wrong
Better
What you see: The incident review after an oversold-inventory event finds that the code has a `try/except ConnectionError` and nothing else — no timeout, no idempotency key, no validation of the response — because "handle the failure" was interpreted narrowly as "handle the service being down," which was the only failure mode anyone explicitly designed for.
Why: ConnectionError is the easiest failure mode to imagine because it is the loudest and most obviously a failure — the other six modes either look like success (invalid data), only show up under retry conditions (duplicated work), or only show up under load (becomes slow), so a design that stops at "handle the down case" has quietly skipped six-sevenths of the checklist without anyone deciding to.
- Times out — caller waits, gets nothing back in time
- Returns invalid data — a response arrives, but is wrong
- Goes down — hard failure, connection refused
- Duplicates work — same operation runs twice
- Becomes slow — degraded, not failing outright
- Loses data — an acknowledged write never persists
- Becomes unreachable — network partition, not the same as down
The seven failure modes and a typical mitigation for each
Remember: Ask all seven questions — times out, returns invalid data, goes down, duplicates work, becomes slow, loses data, becomes unreachable — for every component in a design, not just the ones that feel risky, and not collapsed into one vague "what if it fails." Each question surfaces a distinct failure mode with a distinct mitigation; a design that only plans for "goes down" has answered one of seven questions.
See also: designing for partial failure · mapping critical vs optional dependencies · transient vs permanent errors · idempotent consumer design

