Status: Accepted Date: Phase 0
An earlier draft of this system was designed the usual way: architecture first, with the supporting figures filled in from plausible estimates and industry rules of thumb. Every number in it was confident and none of it was computed. The design that resulted was internally coherent and unfalsifiable, which is the worst combination available — it could not be wrong in a way that would show up before production.
Two specific claims from that draft are worth naming because both turned out to be wrong in the measurable direction:
- That the December 2024 CISA enrichment change caused roughly 80% of new CVEs to lose identity resolution. M2 measures the drop in NVD "analyzed" rate as (MEASURED) ~73% falling to (MEASURED) ~36–58%. A materially narrower failure than claimed, and one with a compensating mechanism the draft did not account for.
- That EPSS latency is what forces durable re-evaluation. M1 measures first-EPSS at an upper-bound median of (MEASURED) 8.5 days, with the true figure likely lower. The durability argument survives, but on entirely different grounds (see ADR-0005).
Had either claim gone unmeasured, the architecture built on it would have been wrong in a way no test would have caught.
Measurement precedes architecture, and a measurement is permitted to kill the design.
- Every quantitative claim carries one label:
MEASURED,DERIVED,SOURCE_FACT,LITERATURE,ASSUMED,SIMULATED,COUNTERFACTUAL. NoASSUMEDorSIMULATEDquantity may support a headline result. tools/check_claims.pyenforces this mechanically againstresults/*.jsonand runs inmake verify. It is a gate, not a linter.- Measurement code and the results JSON it produced land in the same commit, so any number traces to the run that made it.
- Findings documents are written after the results exist. Never scaffolded with expected values to be filled in later, which is the specific mechanism by which invented numbers survive into a final draft.
- Each phase carries a stated kill criterion. When one fires, work stops and is reported; it is not designed around.
- No component enters the system without a sentence naming the measurement that forces it. Queues, caches, workflow engines, additional agents and databases are all subject to this. Kubernetes, Kafka, multi-region and graph databases are refused by default.
Accepted: the project is slower to a demo. Phase 0 produced no running system at all, only a corpus and four measurements.
Accepted: some measurements return negative results and are published as such. M4 did
exactly this, and the finding stands in docs/findings/M4.md rather than being quietly
re-scoped. ADR-0007 records what was done about it.
Gained: every architectural claim in this repository is falsifiable by a reader with the committed corpus manifest and a network connection. That is the only property that distinguishes this from a well-written proposal.
Retrospective on the prior draft, plus M1 and M2, both of which contradicted a specific prior claim in a direction that changed the design.