Tool

What detects each failure, and how fast?

Full FMEA is heavyweight enough that software teams skip it, so the failures nothing watches for stay undiscovered until one happens. This is the twenty-minute version, and it scores the two things a risk register leaves out: how long detection takes, and where the safe state is enforced.

The failures

List what can go wrong, how often, and what actually notices. Frequency can be a guess; the ranking is far less sensitive to it than to whether anything detects the failure at all. Start with what has happened, then add what somebody has worried about out loud.

FailurePer yearConsequenceDetected byDetect in minSafe stateRemove
6 rows
Enforced below the failure means the safe state is applied by something the failing component cannot influence. A behaviour the broken component chooses to invoke is not a safe state.
This calculator runs entirely in your browser. Nothing you type is sent anywhere unless you ask for the result by email at the bottom of the page.
What is covered
FailurePer yearConsequenceDetected byDetect inSafe stateCoverage
Upstream dependency times out800DegradedAn alert2.0 minSame layer52%
Model returns a partial result as complete300DegradedNothingneverNone0%
Retry after partial success double-executes6UnsafeA metric24 hSame layer8%
Tool call hangs indefinitely12OutageA person45 minNone3%
Deployed artifact differs from evaluated2OutageNothingneverNone0%
Nested call tree exceeds spend budget24ContainedAn alert15 minEnforced below61%
Ordered by exposure, which is frequency times consequence times what coverage leaves uncovered. Detection latency discounts the credit a detector earns: a failure found by a complaint a week later is barely detected.
Risk-weighted coverage
35%
Nothing detects
2 of 6
No safe state
3 of 6
Cheapest change
+7%
Alert on the top undetected failure
Risk-weighted coverage is 35%. 2 of 6 failures have nothing watching for them at all.
The single highest-return change is an alert on model returns a partial result as complete, which moves coverage from 35% to 42%. Detection is almost always cheaper to add than a safe state, and it is what turns a silent failure into one somebody can act on.
1 failure has a serious consequence and a safe state defined in the same layer that fails. That is advisory rather than enforced: if the component that is wrong is the component that decides to enter the safe state, there is no safe state.
Send me this coverage map

Your failure list goes with it. If most of the exposure sits in failures nothing detects, the useful first conversation is about instrumentation rather than about architecture.

Your inputs are included so the reply can be specific.

Detection and safe state, by failure class

Ten failure classes that recur across production systems, with what actually detects each and what the safe state should be. The right-hand column is the pattern worth internalising: in most of these the obvious instrument is structurally unable to see the failure.

Failure classWhat detects itSafe stateWhy the obvious instrument misses it
Hangs indefinitelyWall clock outside the loopAbandon and report gave-upThe counter freezes; only a clock catches it
Spins without progressRemaining-work measure stallingAbandon at the stall thresholdThe clock catches it only at full cost
Returns a partial result as completeType-level distinction at the callerRefuse rather than returnSilent by construction; nothing alerts
Silently falls back to a defaultA counter on the fallback pathMark the value as degradedReturns HTTP 200; the dashboard stays green
Double-executes after a retryReconciliation against an outside recordIdempotency key at the effectPrevention fails silently; only comparison sees it
Deployed artifact differs from evaluatedHash comparison in the deploy pathRefuse to startVersion strings lie; compare bytes
Input distribution has movedDrift monitor on the inputsRefuse out-of-distribution inputsAccuracy metrics cannot see it without labels
A node goes silentTime since last successful contactMark unknown, never assume healthyAbsence is not a signal; it must be constructed
Dependency degrades but respondsLatency percentile, not error rateCircuit break to the deterministic pathError-rate alerts never fire
Correlated failure across a shared resourceBlast-radius grouping in alertsPer-tenant or per-zone limitsLooks like many incidents, is one

Every row in the last column is a case where a reasonable-looking monitor reports health while the failure is occurring. That is why coverage has to be scored on what the detector can see rather than on whether a detector exists.

A worked example

Six failure modes on an agent platform, which is roughly what a team produces in twenty minutes when asked what can go wrong. Two have alerts, one has a metric somebody reads, and three have nothing.

Risk-weighted coverage comes out at 35 percent, with two of six failures detected by nothing and three of six having no safe state at all. But the useful part is the ordering, and it is not what anyone expects.

The largest exposure is upstream dependency timeouts, at 800 a year. That row is already 52 percent covered: there is an alert, it fires in two minutes, and there is a defined fallback. It tops the list purely on frequency. Acting on it would be the obvious move and close to the least useful one, because most of what can be recovered there already has been.

Second is the model returning a partial result as complete, three hundred times a year at zero percent coverage. Nothing detects it and there is nowhere safe to go. That is where the cheapest improvement lives: an alert on that path alone takes overall coverage from 35 to 42 percent. Not a rewrite, not a safe state, just a counter and a threshold on a path that currently returns success.

The third finding is in the safe-state column and it is the one a spreadsheet hides. The double-execution row has a safe state defined in the same layer that fails, which reads as covered on any risk register. It is not: if the component that is wrong is the component that decides to enter the safe state, there is no safe state. The tool flags those separately from the ones with nothing at all, because they look identical in a list and behave completely differently.

The arithmetic, so you can check it

Risk per failure is frequency x consequence weight, where the weights are 1 for contained, 3 for degraded, 8 for an outage and 25 for unsafe. Coverage per failure is detection x latency discount x (0.35 + 0.65 x safe state). The floor of 0.35 exists because knowing about a failure is worth something even with nowhere safe to go.

The latency discount is 1 / (1 + log2(1 + minutes / 60)), floored at 0.25, so a detector that takes an hour keeps most of its credit and one that takes a week keeps a quarter of it. Overall coverage is exposure-weighted rather than a simple average, since a well-covered rare failure should not offset an uncovered frequent one.

The honest limit

The weights are a judgement, not a measurement, and yours may differ. What the tool is really doing is forcing three questions to be answered explicitly per failure, and the ranking is far more robust than the absolute coverage number. Treat the percentage as a way to compare before and after a change rather than as a score to report. It also assumes failures are independent, which correlated infrastructure failures are not.

The reasoning is in your green dashboard is not evidence and human in the loop or safe state. For sizing the fuses that back these up, use the fuse sizing tool.

Questions

What is a lightweight FMEA for a software system?

A list of what can fail, how often, what it costs, what detects it, how long detection takes, and what safe state follows. Full FMEA is heavyweight enough that software teams skip it entirely, which means the failures nothing watches for stay undiscovered until one of them happens. Six rows and twenty minutes finds most of what a formal process would.

Why does detection latency matter as much as detection?

Because a failure found by a customer complaint a week later is barely detected. The exposure that matters is what accumulates between the failure occurring and somebody knowing, so a detector that takes a day earns a fraction of the credit an in-line check earns. This tool discounts detection by latency for that reason.

What does it mean for a safe state to be enforced below the failure?

That the safe action is applied by something the failing component cannot influence. If the component that is wrong is also the component that decides to enter the safe state, there is no safe state, only an intention. That is why an envelope limit in a controller counts and a check inside the code that might be broken does not.

How accurate do the frequency estimates need to be?

Much less than people expect. The ranking is dominated by whether anything detects the failure and whether a safe state exists, and both of those are yes-or-no. An order of magnitude on frequency rarely changes which failure sits at the top of the list, so guess and move on rather than stalling on the number.

What should I do with the result?

Add detection to the highest-exposure failure that nothing watches. Detection is nearly always cheaper than a safe state, and it converts a silent failure into one somebody can act on, which is the larger part of the improvement. The tool computes what that single change does to coverage so the trade is visible before you spend anything.