The important thing is that no single sensor measures correctness. Each sensor measures one thing. Coverage measures execution. Mutation measures test sensitivity. Types measure a particular class of structural inconsistency. Contracts measure boundary assumptions. Observability measures what actually happened and preserves enough dimensionality to investigate unknown unknowns.

The question becomes: what independent observations would cause us to update our belief that this software is correct?

01

Oracle strength

How confidently does it know that something is wrong?

compiler error
maximum
type error
maximum
test assertion
high
mutation
high
linter
medium
coverage
low
complexity
minimum
code review
medium

A compiler has maximum oracle strength because the implementation cannot argue with it. A complexity metric has minimum oracle strength because high complexity doesn't prove anything is wrong — it just suggests increased risk. The scale is ordinal (minimum → low → medium → high → maximum): a sensor two rungs up is stronger, not "twice as strong."

Mutation's oracle is derivative. Mutation testing's high oracle is bounded by the test assertions underneath it — it only detects mutations that the test suite's oracle would catch. The strength reflects the test assertion's oracle, applied to a perturbation.
"Type checker" spans a range. Structural type systems (TypeScript) catch a limited class of mismatches. Ownership and lifetime types (Rust) catch memory-safety bugs the compiler refuses to allow. Refinement types and SMT-backed verifiers (Dafny) can prove full correctness properties — the solver either confirms the invariant or produces a counterexample. The maximum rating applies to the strong end of that spectrum.
02

Independence

Can the thing being evaluated manipulate the sensor?

This is extremely important for agents. A model writing tests/ is allowed to write tests that make itself pass. The producer and evaluator should be separated wherever possible.

An instruction saying "verify this" is weaker than a gate that literally refuses to proceed unless the verification command succeeded. Computational controls rather than prose rules.
03

Scope

What level of the system does it tell us about?

Line A single line of code
Function A single function or method
Module A package or module
Service A single service or component
System The whole system, across services
User journey What the user experiences end-to-end
04

Feedback latency

How long until the sensor tells you something?

compilermilliseconds
unit testsseconds
integrationminutes
mutationminutes / hours
canaryminutes
productionhours / days
incidentweeks
05

Actionability

Does it merely say "bad" or does it tell you what to fix?

Three values, in order of how much the feedback directs the next action:

Blocking A binary gate: pass or fail. The pipeline stops on failure, but the sensor does not say what to fix — a compiler error, a failing invariant gate, a smoke test that halts a rollout.
Exploratory A signal to investigate, not a verdict. It narrows where to look but prescribes nothing — a hotspot, a trace, a coverage gap on unchanged lines.
Guiding The feedback itself directs the next action. A mutation report shows the exact untested mutation; a linter diagnostic names the rule and the fix; a type error points at the expression and the expected type.

In Böckeler's framing, the interesting frontier is guiding sensors, where the feedback itself tells the agent what to do next.

06

Predictive vs retrospective

"This is wrong" or "this looks like things that became wrong before"?

Predictive sensors fire before the code ships — a compiler error, a failed test, a mutation that survives. Retrospective sensors fire after — they tell you that past changes look like changes that caused trouble before: revert rate, incident correlation, escaped defect rate.

This dimension is when the signal arrives, not what kind of feedback it gives. That is a separate axis — actionability: blocking, exploratory, guiding. The two are correlated but not the same: most predictive sensors gate (a compiler error blocks the build), and most retrospective sensors warn (revert rate is a signal, not a gate). But the correlation is not a rule. Build provenance & SBOM is retrospective — it fires after the build — and blocking: an unattested artifact does not ship. A retrospective sensor can gate; a predictive sensor can merely warn. Read the two dimensions independently.

You don't need to understand FooManagerFactoryImpl. You can observe: 27 changes in six months, 8 reverts, 4 incidents, touched by 11 teams. That's a retrospective signal — a black-box sensor of maintainability.

The catalog splits roughly evenly: predictive sensors catch bugs before they ship; retrospective sensors tell you where the bugs came from. Both matter — a sensor stack with only predictive sensors has no feedback loop; one with only retrospective sensors has no gate.

Combining sensors

Does a second sensor add anything?

The intuitive model of a sensor stack is additive: every green check is a little more evidence that the system is correct, so more sensors mean more confidence. The safety-case literature tested that model and it failed. Knight and Leveson had 27 versions of one program written independently from the same specification and ran a million tests against them. Each version was reliable on its own, but they failed together far more often than independence predicts, because their authors had misread the specification in the same ways. Littlewood and Wright showed the stranger case formally: a second line of evidence that entirely supports the first can leave you less confident than the first alone, because of what it reveals about an assumption the two share.

The catalog has its own instance. Line coverage and branch coverage sit in the same family, at the same rung of the stack, reading the same instrument. Counting them as two sensors is counting one sensor twice. The independence dimension does not catch this, and is not meant to: it asks whether the producer can manipulate the sensor, not whether two sensors share a blind spot.

So the composition rule this catalog uses is not accumulation. It is what the assurance-case field calls eliminative induction: confidence comes from ruling out specific ways the system could be wrong, and a check that rules out nothing new adds nothing, however green it is. The question to ask of every sensor in a stack is what doubt does this eliminate that the others leave open? Each entry opens by naming what it measures, and its "What it cannot detect" section names the doubts it leaves live. A stack is read from the second list, not the first. The what each sensor proves draws that answer for the whole catalog: 19 doubts, and for each one the sensors that close it, the sensors that only reveal it afterwards, and the sensors whose green reading is mistaken for closing it.

The same literature backs the meta-signal that most entries name at the end of "How it gets gamed": the second-order reading that shows a sensor going blind while its first-order reading stays green. Rushby's Bayesian model of a test-and-verify argument finds that a higher pass rate moves belief about the test oracle more than belief about the system: green tests are mostly evidence that the tests are in good shape. That is why a sensor that has stopped eliminating its doubt still reads green, and why the catalog tracks the reading that shows it going blind.

Knight & Leveson, An Experimental Evaluation of the Assumption of Independence in Multiversion Programming, IEEE TSE SE-12(1), 1986. Littlewood & Wright, The Use of Multi-legged Arguments to Increase Confidence in Safety Claims for Software-based Systems, IEEE TSE 33(5), 2007. Rushby, The Interpretation and Evaluation of Assurance Cases, SRI-CSL-15-01, 2015. Weinstock, Goodenough & Klein, Measuring Assurance Case Confidence using Baconian Probabilities, SEI, 2013.