diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 16209782..bf4cff25 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -173 sections. Search this before re-deriving anything. +174 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) @@ -184,6 +184,7 @@ dies, which is what this file is for. * [Auditing the whole tree for "a deleted value that something still supplies"](#auditing-the-whole-tree-for-a-deleted-value-that-something-still-supplies) * [Counting the fallbacks instead of inspecting them — and one I had misjudged](#counting-the-fallbacks-instead-of-inspecting-them--and-one-i-had-misjudged) * [The oracle harness was nondeterministic, and I quoted its numbers for a dozen iterations](#the-oracle-harness-was-nondeterministic-and-i-quoted-its-numbers-for-a-dozen-iterations) +* [Answering "an unenumerated set" — don't enumerate, test](#answering-an-unenumerated-set--dont-enumerate-test) ## P0 — the exporter, 2026-08-28 @@ -9906,3 +9907,64 @@ own 1.2 flatness. **A margin only means something against the noise it sits on.* because the drift is 0.065 RMSE and the smallest margin any of them turned on was 0.14 % differing area. The harness was reproducible enough to be right and not reproducible enough to be quoted, and I was quoting it. + +## Answering "an unenumerated set" — don't enumerate, test + +The Decoder's closing point on the drift: *"that's not a missing guard, it's an +unenumerated set, and I don't think either of us has a way to enumerate everything +on this screen that moves on its own."* You do not need to. You need a test that +**fails when the set is non-empty**. + +### The enumeration is possible on my side, and found a third + +Every use of the free-running clock in `screen_view.gd`: + +| site | pinned by | +|---|---| +| looping focus record | `--loop-phase` ✅ | +| the spin | `--loop-phase` ✅ *(added last iteration)* | +| **the leaf** — sets `holding = false` explicitly and reads `time_units` | `--leaf-time`, or `--time` | +| `pose_at(element, time_units)` | clamped by `holding` — settles, not free-running | + +🔴 **A third clock**, which I would not have found by waiting for a row to drift. +It only bites on `loop_leaf_on_screens` — `["title"]`. + +### The test, and the scale that makes it mean something + +Render twice with the known pins, at different wall-clock moments, and compare +**frames** — not a statistic. + +* `--screen` + `--time` + `--loop-phase`, all 16 screens: **byte-identical.** + (`--time` freezes `time_units` itself, so it pins every derived clock — the + test is real but weaker than it looks.) +* `--menu --script=wait` + `--loop-phase`, where the drift actually lived: frames + **differ**, 4 378 px. + +⚠️ That difference is **not motion**: + +| | max per-channel | mean | +|---|---|---| +| two pinned runs | **2.86** | 0.0025 | +| a genuinely moving element (spin, phase 0 vs 30) | **158.4** | 0.037 | + +✅ 55× apart. Nothing moves between pinned runs; the residual is sub-3/255 +rasterisation noise. **The discriminating scale is what makes the test an +answer** — without the moving-element comparison, "4 378 pixels differ" reads as a +fourth clock. + +### 🔴 And the reason I nearly missed it: my verification was too coarse to see what it checked + +Last iteration I reported *"three pinned runs return 13.26 exactly"* and called the +harness reproducible. `verify-capture` prints RMSE to **two decimals**, and the +residual is **0.0565** — below its own resolution. The frames were never identical; +the statistic could not tell. + +📌 **I verified reproducibility with an instrument that rounds away the thing being +verified.** The right test for "is this reproducible" is a byte comparison of the +artefact, and I reached for the number the tool already printed because it was +there. Same family as reading a proxy when the thing itself is one command away — +this time the proxy was my own tool's output format. + +⚠️ Conclusion unchanged: 2.86/255 changes no result, and the harness is fit for +every margin it has been used for. What was wrong was the claim's basis, not the +claim.