diff --git a/authored/audio.json b/authored/audio.json index af38e3fb..65a26763 100644 --- a/authored/audio.json +++ b/authored/audio.json @@ -130,8 +130,19 @@ "value was not guessable -- linear back-extrapolation said 9-13 s and linearity", "is refuted by a 4.4 % rate variation within one stream. What made the wait", "cheap was that the field EXISTED and the `-ss`/`-t` ordering had been proved", - "with a stand-in value, so arriving at 9.44 was a one-value edit." + "with a stand-in value, so arriving at 9.44 was a one-value edit.", + "", + "📌 CITATION ADDED 2026-09-01 -- found the moment this field got a `kind`. It", + "carried 1 041 characters describing two derivations and cited no file. The", + "numbers are in docs/re/data/menu-bgm-loop-start.txt, and the loop region's", + "wrap timing is in docs/re/data/menu-bgm-loop-measured.txt.", + "", + "⚠️ Second uncited MEASURED field in this one entry, after `loop_why`. Both", + "described their evidence carefully in prose and pointed at nothing. A why that", + "recounts a measurement reads as well-sourced precisely because it is detailed,", + "which is why neither looked wrong." ], + "loop_start_kind": "measured", "loop_end_s": 61.87, "loop_end_why": [ "MEASURED off the running game 2026-08-30, 240 s parked on the menu", @@ -209,7 +220,8 @@ "because it is the one with the loop's own endpoints under it; the", "autocorrelation never touched the wave and agreed to a tenth of a percent,", "which is what makes both worth having." - ] + ], + "loop_end_kind": "measured" } }, "voice": { @@ -303,8 +315,21 @@ "⚠️ THE FAILURE MODE HERE IS THAT IT SOUNDS FINE. A single stream decodes to", "clean audible dialogue, so nothing in the output reveals that two streams", "are missing. That is why the manifest says it in words on every voice entry", - "rather than leaving it to this file." + "rather than leaving it to this file.", + "", + "📌 WHERE THE OPEN QUESTION LIVES, added 2026-09-01 under this port's own rule:", + "an `authored` kind must cite the question it stands in for, or an invented", + "value and a placeholder for a measurement read identically. This one stands in", + "for the three-concurrent-streams problem, recorded in docs/port/BLOCKED.md and", + "delivered in docs/port/HANDOFF.md -- the game decodes all three at once, so", + "ANY single selection is missing two, and the export states that per movie", + "rather than choosing quietly.", + "", + "⚠️ 1 402 characters of careful reasoning and nothing openable until now. It is", + "the third uncited field in this file, and all three were detailed rather than", + "sloppy -- the detail is what made them look sourced." ], + "presentation_kind": "authored", "stream_weights": { "_": [ "Declared XMA `byte_size` -> the coefficient that stream's position takes in a", diff --git a/authored/flow.json b/authored/flow.json index 3d96423b..59a0e27f 100644 --- a/authored/flow.json +++ b/authored/flow.json @@ -357,6 +357,7 @@ "SELECT DATA" ], "skipped_chain_why": "THE PORT SKIPS TWO MEASURED SCREENS HERE, AND IT SAYS SO OUT LOUD RATHER THAN PRETENDING. The real chain is NEW GAME -> DIFFICULTY -> SELECT DATA -> (A) on a save slot -> ~4.5 s -> S00A. DIFFICULTY and SELECT DATA are MEASURED destinations (HANDOFF Q4) but neither is a GP_TITLE build, so there is no screen file to go to. The port jumps from NEW GAME to the one thing in that chain it has, and the runtime prints what it skipped on every run. This is a GAP, not a sequence: nobody may read the port's behaviour here as what the game does.", + "skipped_chain_kind": "measured", "then_video": "S00A", "then_video_why": "P7. HANDOFF Q9, DECODED from the movie manifest: MS00A -> S00A.wmv is the new-game intro, 93.9 s. Its POSITION is measured as well -- the movie starts ~4.5 s after (A) on the save slot, matched off the running game at 0.96-1.000 with a strictly monotone playhead over 25 consecutive 0.5 s samples.", "then_video_kind": "decoded", diff --git a/authored/rendering.json b/authored/rendering.json index 8e985218..9ce052a2 100644 --- a/authored/rendering.json +++ b/authored/rendering.json @@ -67,6 +67,7 @@ "What deletes this list: a decode covering those cases, or an oracle capture", "of title_jp." ], + "draw_leaf_kind": "decoded", "loop_leaf_on_screens": [ "title" ], @@ -100,5 +101,6 @@ "directions is a reason to scope, not to pick.", "", "What settles the menu: a direct capture of it, which the Decoder has offered." - ] + ], + "loop_leaf_kind": "measured" } diff --git a/authored/timing.json b/authored/timing.json index acf02951..e6fd0a66 100644 --- a/authored/timing.json +++ b/authored/timing.json @@ -72,6 +72,7 @@ "goes in `dwell` it is an extra hold in UNITS, and only for a screen that is", "measured to wait beyond its group." ], + "dwell_kind": "measured", "looping_focus_records": { "_": [ "WHICH focus records the port draws, unconditionally and on a loop, OVER the", @@ -187,6 +188,18 @@ "DO NOT key this per outgoing screen yet. Three outgoing screens with one", "value each restates the data rather than predicting it -- the same objection", "I raised against my own 16/16/18. Key it when a screen has more than one", - "measured value, and key it on the screen being LEFT." - ] + "measured value, and key it on the screen being LEFT.", + "", + "📌 CITATION ADDED 2026-09-01, and its absence propagated from the delivery.", + "This why carried over a thousand characters and NOTHING OPENABLE. The Decoder", + "sent the `(B)`-from-EXTRAS leg as an inline frame table with no file cited,", + "while docs/re/data/fade-four-transitions.txt -- which carries that leg and", + "eight others -- had been committed the whole time. They found it in their own", + "audit and cited it; it had already landed here uncited.", + "", + "⚠️ An uncited measurement propagates as an uncited value. The receiving end", + "cannot tell a summarised measurement from a recalled one, and both read as", + "prose." + ], + "black_hold_kind": "measured" } diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index dc008370..146ed298 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -303 sections. Search this before re-deriving anything. +304 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) @@ -314,6 +314,7 @@ dies, which is what this file is for. * [`audit-kinds` was auditing 16 of 71 authored justifications, and never said so](#audit-kinds-was-auditing-16-of-71-authored-justifications-and-never-said-so) * [Their failed detector, recorded so I do not rebuild it](#their-failed-detector-recorded-so-i-do-not-rebuild-it) * [Triaging the 52: thirteen were provenance claims, and two failed on sight](#triaging-the-52-thirteen-were-provenance-claims-and-two-failed-on-sight) +* [My own triage under-counted, and three uncited measurements surfaced behind it](#my-own-triage-under-counted-and-three-uncited-measurements-surfaced-behind-it) ## P0 — the exporter, 2026-08-28 @@ -15006,3 +15007,51 @@ never printed. Their three gaps are **unregistrable by construction** (bare identifiers like `+0x29d0` that would match every live mention), which is the same limit as my `1 of 3 streams` [refuted] collision. **We reached "report the ratio, do not demand it be 1" independently from 23 % and 97 %.** + +## My own triage under-counted, and three uncited measurements surfaced behind it + +Their audit found **9 of 57** HANDOFF sections asserting *measured* or +*undecodable-with-reach* citing nothing openable — **84 %** — including one they +had **sent me**: *"Ⓑ from EXTRAS DOES go black"*, delivered as an inline frame +table while `data/fade-four-transitions.txt` carrying that leg and eight others +had been committed the whole time. + +🔴 **It had already landed here uncited.** `timing.json`'s `black_hold_why` +carried over a thousand characters and **nothing openable**. **An uncited +measurement propagates as an uncited value** — the receiving end cannot tell a +summarised measurement from a recalled one, and both read as prose. + +### 🔴 And my triage had missed it, along with seven others + +Last iteration I reported **13** provenance claims among the 52 and labelled them. +The count was wrong: my sibling match was **literal**, so `black_hold_why` ↔ +`black_hold_units` did not match, nor did `loop_start_why` ↔ `loop_start_s`, +`dwell_why` ↔ `dwell_seconds`, `loop_leaf_why` ↔ `loop_leaf_on_screens`. **Eight +more, all hidden by a suffix.** It was **21**, and I stated 13 confidently. + +All eight labelled from their own text. Coverage **16 → 38**. + +### Three uncited MEASURED fields in one file, and the detail is why + +| field | | +|---|---| +| `loop_why` | 1 400 chars, nothing openable | +| `loop_start_why` | 1 041 chars, nothing openable | +| `voice/presentation_why` | 1 402 chars, `authored`, nothing openable | + +📌 **All three were detailed rather than sloppy — and the detail is what made them +look sourced.** A `why` that recounts a measurement carefully reads as +well-evidenced *because* it is careful. This is the quality-correlated blind spot +again, one level down: not "well-evidenced values never declared themselves" but +**"well-argued prose never cited anything."** + +✅ The `authored` one now cites the open question it stands in for, per the rule +that came out of this thread. + +### 🔴 A false positive in my own extractor, found by the same pass + +`presentation_why` was reported **DANGLING** on `1118268` and `1171516` — **byte +counts**, read as commit shas because they are 7 digits of valid hex characters. A +sha in this corpus always carries at least one of `a`–`f`; requiring that removes +the class without a length rule. **A wrong verdict for a fabricated reason**, +which is the family I have now hit four times, this time in the auditor. diff --git a/tools/port/audit-kinds b/tools/port/audit-kinds index 6da69f9f..9140dfe5 100755 --- a/tools/port/audit-kinds +++ b/tools/port/audit-kinds @@ -77,8 +77,14 @@ def citations(t): out = [] for p in re.findall(r"\b(?:docs|crates|port|tools|authored)/[\w./-]+\w", t): out.append(("path", p.rstrip(".,"))) - for s in re.findall(r"\b([0-9a-f]{7,40})\b", t): - out.append(("sha", s)) + for sha in re.findall(r"\b([0-9a-f]{7,40})\b", t): + # 🔴 A PURE-DECIMAL RUN IS NOT A SHA. `1118268` and `1171516` are byte + # counts in `voice/presentation_why`, and this reported them as + # unresolvable commits -- a DANGLING verdict on a why that cites + # nothing of the kind. A sha in this corpus always carries at least one + # of a-f; requiring that removes the whole class without a length rule. + if any(c in "abcdef" for c in sha): + out.append(("sha", sha)) for p in re.findall(r"\b([\w-]+\.(?:png|txt|tsv|wav))\b", t): out.append(("file", p)) # The corpus cites two things that are not paths and are still followable: