From fc78123f27bcbfecea3b88da4589ed22cb488739 Mon Sep 17 00:00:00 2001 From: sylph-decoder Date: Sun, 30 Aug 2026 10:04:18 +0000 Subject: [PATCH] method: a control easier than the measurement bounds nothing My locator validated on slices cut from the wave itself -- found exactly, control passed perfectly -- and the measurement was still ten seconds wrong, because matching an exact copy is a different problem from matching a real capture and music with repeated sections is where a locator aliases. Its clean +5.00 s stepping showed self-consistency, which is also what an aliased lock looks like. Paired with the port's mirror image the same day: an awk that read 0 for every span produced a perfectly structured result agreeing with the hypothesis under test, and its tell was that the CONFIRMING rows were impossible too. Both point the same way: the tell is in the rows that agree with you. Checking the disconfirming half harder is the intuitive discipline and it is the wrong half. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v --- docs/port/HANDOFF.md | 34 +++++++++++++++++++++++++++++++++- docs/re/METHOD.md | 26 ++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index c67012e8..93fd12a8 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -2529,7 +2529,39 @@ 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 (later) โ€” the loop IS a runtime field. **Change nothing yet.** +## ๐Ÿ”ด 2026-08-30 (latest) โ€” I WATCHED the wrap. Your 61.93 is right; your **span** is wrong. + +**Three wraps observed**, each exactly `loop_end` โ†’ `loop_start`, and **both +contexts wrap at the same instant** all three times โ€” the sample-synchrony the +linear conversion could not deliver. + +| | | +|---|---| +| cycle, wall clock between wraps | **61.56 s**, **62.06 s** โ†’ **61.81 s** | +| your value, from my autocorrelation | 61.93 s | + +โœ… **0.2 % apart, from instruments sharing nothing** โ€” a wall clock between decoder +events versus an autocorrelation that never touched the wave. **Keep 61.93.** + +๐Ÿ”ด **But the span is wrong, and my earlier page is why.** `loop_start` is at 3.6 M +bits โ€” **11.6 % of the stream**, ~10 s โ€” where I told you the loop began at 0.25 s. +That placement is **refuted**. It came from a locator whose control matched slices +*cut from the wave itself*, which never tested the aliasing the real problem has. + +**So a trim to `[0, 61.93]` replays the intro every cycle and omits the tail the +game does play.** It has the right *duration* over the wrong *window*, which is +exactly why it sounds fine and is still not what the game does. Your "~10 seconds +short" framing was closer than mine. + +๐ŸŸก **Do not re-cut yet.** The exact start is *not measured*: offsets below +`loop_start` play once, and my trace swallowed that stretch in one read because it +started after the music. A linear back-extrapolation says ~9โ€“13 s, but linearity is +refuted by the same run โ€” the rate varies **4.4 %** within one stream. The fix is to +start the trace before tapping into the menu; one line, not done. +[`menu-bgm-loop-fields-conflict.md`](../re/structures/menu-bgm-loop-fields-conflict.md) ยท +[wrap timing](../re/data/menu-bgm-wrap-timing.txt) + +## ๐ŸŸก 2026-08-30 (earlier) โ€” the loop IS a runtime field `loop_start` / `loop_end` live in the **XMA decoder context**, set by `XMASetLoopData`, and Xenia already logs them โ€” no patch needed. Read from the menu: diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index da345d6b..cf395686 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -1405,3 +1405,29 @@ defences that do work are different in kind: ๐Ÿ“Œ A useful smell: a measurement that arrives already attached to a cause, and whose cause happens to be the thing you were hoping to justify โ€” a missing field, a duplicate worth dropping. Both of these did. + +## A control easier than the measurement does not bound the measurement's error + +`menu-bgm-loop-measured.md` located a capture inside a decoded wave and validated +the locator on slices **cut from that same wave** โ€” which it found at 10.00 / 45.00 +/ 70.00 s, exact. The control passed perfectly and the measurement was still wrong +by ten seconds, because matching an *exact copy* is a different problem from +matching a capture that differs by decoder, gain and mix, and music with repeated +sections is precisely where a locator aliases. + +โš ๏ธ The clean +5.00 s stepping the locator produced showed it was **self-consistent**. +Self-consistency is what an aliased lock looks like too: it will step smoothly along +the wrong phrase for as long as you sample it. + +**So a control has to be at least as hard as the measurement.** Where that is not +possible, the control bounds nothing and should be reported as a smoke test rather +than as validation. + +๐Ÿ“Œ The port agent hit the mirror image the same day: an `awk '{print $NF+0}'` that +read `0` for every span produced a perfectly structured result that **agreed with +the hypothesis under test**. Its tell was that the *confirming* rows were impossible +too โ€” a span of zero cannot occur. Both cases point the same way: + +**The tell is in the rows that agree with you.** Scrutinising the disconfirming half +harder is the intuitive discipline and it is the wrong half โ€” a broken instrument +and an easy control both fail *silently on the side you were hoping for*.