diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 304abf00..94524210 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -227 sections. Search this before re-deriving anything. +228 sections. Search this before re-deriving anything. * [P0 — the exporter, 2026-08-28](#p0--the-exporter-2026-08-28) * [P1 — Godot draws the screen, 2026-08-28](#p1--godot-draws-the-screen-2026-08-28) @@ -238,6 +238,7 @@ dies, which is what this file is for. * [Building the withdrawal-time hook — the thing we agreed neither of us was about to close](#building-the-withdrawal-time-hook--the-thing-we-agreed-neither-of-us-was-about-to-close) * [Applying "a correction is a new claim" to my own most recent correction](#applying-a-correction-is-a-new-claim-to-my-own-most-recent-correction) * [P0 gate — recorded at last, and the gap it belongs to](#p0-gate--recorded-at-last-and-the-gap-it-belongs-to) +* [Their sufficiency gap, run on `authored/` — clean, after I nearly reported 35 false positives](#their-sufficiency-gap-run-on-authored--clean-after-i-nearly-reported-35-false-positives) ## P0 — the exporter, 2026-08-28 @@ -11940,3 +11941,39 @@ existed, the gate record did not. Same failure, different object. 📌 So: two of the three closed with artifacts, one left open **by its own terms**. Their line about P5 is the right one — *the right kind of thing to leave standing rather than quietly satisfy.* + +## Their sufficiency gap, run on `authored/` — clean, after I nearly reported 35 false positives + +Their audit found 48 citations resolving and 0 missing, with the caveat that +matters: *"it cannot see data a page should have cited and did not — a page citing +nothing would have passed as 0 missing. Existence and substance, never +sufficiency."* + +The port-side analogue is exact. My earlier audit checked **what a MEASURED stamp +cited**; it could not see an authored value carrying **no `why` at all**, which +passes every such check by being absent. The mission requires *every authored +entry carries a `why`*, so that absence is the thing to look for. + +🔴 **First pass: 35 of 131 values flagged as bare.** Inspecting before reporting — +every sample was a false positive: + +* `ptbtn01`'s `label` and `goto` have no `why` key, and the object carries + **five** `*_why` siblings (`skipped_chain_why`, `then_video_why`, + `unobserved_why`, `skippable_why`) plus a `blocked` explanation. +* `/voice/stream_weights/…/position` is covered by a `_` key **one level above + it**, which my check only looked for in the same object. + +✅ **Ancestor-aware, the real number: 126 values, 0 uncovered.** Every authored +scalar has a `why`, `_` or `*_why` in its own object or an ancestor. + +📌 **35 was the instrument's resolution, not a finding** — and this is the third +instance in one exchange: their 9 raw hits → 2 real, my 33 hook candidates against +a real shortfall of a few, and now 35 → 0. **A first count from a new detector is +a measurement of the detector.** All three of us stopped and inspected rather than +publishing the raw number, which is the only reason none of them became a claim. + +⚠️ **And their caveat transfers unchanged, so I will state it rather than enjoy the +clean result:** this tests that a `why` exists **in scope**, not that it *explains +that value*. A parent `_` covering twenty values may say nothing about any one of +them. Existence and scope, never sufficiency — the same limit they named, and I +have no better instrument for it either.