From 54254a86e177c3071cd9a9113299c3619d94bcac Mon Sep 17 00:00:00 2001 From: sylph-decoder Date: Sun, 30 Aug 2026 12:38:44 +0000 Subject: [PATCH] method: correct 'cannot adjudicate against the incumbent' -- it needed a discriminator The entry said a candidate-vs-incumbent comparison is the wrong shape of experiment. Too strong. Two iterations later the same comparison adjudicated with no new oracle, once a structural property was added that says which side is wrong per disagreement -- does the chosen run contain the settle instant. Control 3072 of 3072; disagreements attributed 1036 of 1036. Corrected rule: a bare comparison cannot adjudicate because a disagreement is symmetric; it becomes decisive the moment a property breaks the symmetry per case. Reach for an oracle when no such property exists, not as the first move. With the tell that I had one available and did not look: I recorded the residual as 'ambiguous by construction' and moved on TWICE without asking what would make it un-ambiguous. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v --- docs/port/HANDOFF.md | 21 +++++++++++++++++++++ docs/re/METHOD.md | 29 ++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index cc9f0b1d..2be243c0 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -2533,6 +2533,27 @@ whatever it returns — the same reason a truncated log and a t=0 render both lo fine from inside. Template matching against the exported cue with a bed-only control has no such knob, which is the right fix rather than a better threshold. +## ✅ 2026-08-30 — the residual is explained, and it is entirely `rest()`'s + +The 21.9 % I called *"ambiguous by construction"* is not ambiguous. + +| | | +|---|---| +| **control** — one plateau, covering the settle instant | **3 072 / 3 072 agree (100 %)** | +| test — more than one plateau | 1 622 elements, agree on 586 | +| of the **1 036** disagreements, `rest()` on a run **not covering** the settle instant | **1 036 — all** | + +`rest_plateau()` picks the **longest** run, which need not be the one the screen is +sitting in. **Both poses are genuinely held** — these are plateau cases, not +transients — so it is `rest()` returning a pose the screen has **already left**. + +**That completes the case for the proposal**, alongside your three oracle screens and +my one: control exact, and every disagreement attributed to the incumbent. +⚠️ **I am still not changing `rest()` in this pinned crate** — the evidence is now +strong enough that a human should decide, which is a different thing from me landing +it. +[`plateau-choice.txt`](../re/data/plateau-choice.txt) + ## ✅ 2026-08-30 — the gap you named is closed: `settle_time()` ITSELF beats `rest()` You tested the port's settled pose, not `UiBuild::settle_time()`, and flagged the diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index 70649c90..41b7826b 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -1612,7 +1612,9 @@ last keyframe is visible; 87.8 % of all elements end at `a = 0` *because of that exit ramp*, so the split was near-uninformative. I ran that control only because the port had just been bitten by it. -## A candidate cannot be adjudicated against the incumbent it is meant to replace +## A candidate cannot be adjudicated against the incumbent **by the comparison alone** + +🔴 **This entry was written too strongly and is corrected below.** Proposing that the settled pose come from the **screen's** settle instant rather than each element's `rest()`, the obvious validation is: where `rest()` is already @@ -1628,6 +1630,31 @@ control moved the number and did not change that. **oracle** — the same two poses scored against a capture of the game, 0.01 % against 0.75 % differing. That is a third party neither rule authored. +### 🔴 …and that conclusion was too strong. What was missing was a DISCRIMINATOR. + +Two iterations later the same comparison **did** adjudicate, without any new oracle. +The addition was a structural property that says, for each disagreement, +*which side is wrong*: **does the pose `rest()` chose lie in a run that contains the +settle instant?** + +| | | +|---|---| +| control — one plateau, covering the settle instant | **3 072 / 3 072 agree** | +| disagreements attributable to the incumbent | **1 036 / 1 036** | + +Every disagreement had `rest()` on a run the screen has already left. That is not a +tie the comparison cannot break — it is a decision, and the incumbent loses all of +them. + +⚠️ **So the corrected rule is:** a *bare* candidate-vs-incumbent comparison cannot +adjudicate, because a disagreement is symmetric. It becomes decisive the moment you +can name a property that **breaks the symmetry per case**. Reach for an oracle when +no such property exists — not as the first move. + +📌 The tell that I had one available and had not looked: I recorded the residual as +*"ambiguous by construction"* and moved on **twice**, in two separate iterations, +without asking what would make it un-ambiguous. + 📌 Related and worth keeping together: **any statistic keyed on "where does an element's visibility end" is near information-free on this corpus.** A screen's exit ramp drives every element to `a = 0`, so **12 278 of 13 991 (87.8 %)** end there.