port: apply the measured positional weights, keyed by byte size

ADV's three chunks map onto the Decoder's contexts exactly, each a declared
byte_size plus the 60-byte RIFF header. authored/audio.json gains
voice.stream_weights keyed by SIZE, and the exporter weights only when every kept
stream matches, falling back to the divisor otherwise.

The key is the check: two weeks ago these same sizes did not fit the region the
resolver returned, which is how the 238-packet late start was found. Applied
positionally the weights would have gone onto the wrong streams silently. S00A
matches nothing and keeps the divisor. ADV mixes at 0.4142/0.2929/0.2929, -2.87.

Unlooked-for confirmation: the filter folds chunks 0 and 2 from two live channels
and chunk 1 from one, found independently by live_channels, matching their claim
that ctx1 is the only stream with a silent channel.

Also files an UNEXPLAINED regression: verify-menu-audio's dead-press check now
reports DIFFER across three runs, diverging at 0.085 s with different durations.
Not diagnosed, not the voice change, and left failing rather than silenced. The
check's premise is cross-run bit-determinism, which is what made it strong and
also what makes it brittle.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
Sylpheed port agent
2026-08-30 09:20:13 +00:00
parent 2712efe2f2
commit 73125074c6
5 changed files with 200 additions and 10 deletions

View File

@@ -674,3 +674,25 @@ What would settle it: **any capture of a loading screen with the ring mid-expans
The Decoder records these screens as unreachable from the title path, so this may
never become answerable, and that is an acceptable outcome — the entry now says
what is being withheld rather than implying the question is empty.
---
## `verify-menu-audio`'s dead-press check fails, cause unidentified
*Derived from HANDOFF `9ca1eb5`. Raised 2026-08-30 by the port. **Mine, not
anybody else's** — filed here so it is not lost, not because it needs an answer
from the Decoder.*
The check asserts that five presses bound to nothing (`left`, a measured no-op)
produce a Master bus bit-identical to five waits. It now reports DIFFER across
three consecutive runs: divergence at 0.085 s, 92 % of samples differing, and
recording durations of 1.300 s against 1.207 s where they were previously equal.
🔴 Not diagnosed. Candidates not separated: `formats-pin-2026-08-30`, the
plate-pulse draw path, the static-overlay clock. It is **not** the voice export
change — neither control run plays a voice.
⚠️ The check's premise is **cross-run bit-determinism**, which is what made it a
strong assertion with no threshold to tune, and also what makes it brittle:
nothing in it verifies that startup is still deterministic. Left failing rather
than silenced.

View File

@@ -9,7 +9,7 @@ dies, which is what this file is for.
<!-- INDEX: generated by tools/port/index-decisions -- do not hand-edit -->
130 sections. Search this before re-deriving anything.
132 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)
@@ -141,6 +141,8 @@ dies, which is what this file is for.
* [The resolver starts late, and my "duplicate tail" was a real stream all along](#the-resolver-starts-late-and-my-duplicate-tail-was-a-real-stream-all-along)
* [The export knew the voice was incomplete; the runtime did not say so](#the-export-knew-the-voice-was-incomplete-the-runtime-did-not-say-so)
* [The voice export is complete — new pin, and the cause was a "within one bank" cap](#the-voice-export-is-complete--new-pin-and-the-cause-was-a-within-one-bank-cap)
* [The positional weights are applied — keyed by byte size, so the key is a check](#the-positional-weights-are-applied--keyed-by-byte-size-so-the-key-is-a-check)
* [🔴 Unexplained: `verify-menu-audio`'s dead-press check has started failing](#unexplained-verify-menu-audios-dead-press-check-has-started-failing)
<!-- /INDEX -->
## P0 — the exporter, 2026-08-28
@@ -7595,3 +7597,62 @@ crate — but it is a different asset than the one the fix was derived on, and t
outcome was predicted before it was observed. Recorded as that and nothing more.
Oracle rows unmoved; MODDING rules pass.
## The positional weights are applied — keyed by byte size, so the key is a check
With the span fixed, `ADV`'s three chunks map onto the Decoder's contexts
**exactly** — each is a declared `byte_size` plus the 60-byte RIFF header
`to_xma_riffs` prepends:
| chunk | bytes | 60 | context | position | weight |
|---|---|---|---|---|---|
| 0 | 1 294 396 | 1 294 336 | ctx0 | FL/FR | **0.4142** |
| 1 | 1 118 268 | 1 118 208 | ctx1 | FC, LFE silent | **0.2929** |
| 2 | 1 171 516 | 1 171 456 | ctx2 | BL/BR | **0.2929** |
`authored/audio.json` gains `voice.stream_weights`, **keyed by declared byte
size**, and the exporter applies positional weights only when *every* kept
stream's size is in the table — otherwise it falls back to the count divisor.
🔴 **The key is the check.** Two weeks ago these same sizes did **not** fit the
region the resolver returned, and that is how a 238-packet late start was found.
Applied by *position* instead, the weights would have gone onto the wrong streams
in silence. `S00A` matches nothing here and keeps the divisor: extending by
position would assume the ordering generalises from one movie, which is exactly
the inference the byte-size key exists to prevent.
`ADV` now mixes at 0.4142 / 0.2929 / 0.2929 and lands at **2.87 dBFS**.
### ✅ An unlooked-for structural confirmation
The generated filter folds chunks 0 and 2 from **two** live channels
(`0.5*c0+0.5*c1`) and chunk 1 from **one** (`c0`). `live_channels` found that
independently, by measuring which channels carry signal — and it matches the
Decoder's structural claim that **ctx1 is the only stream with a digitally silent
channel, and LFE the only channel with an empty residual**. Their evidence is a
decomposition of the game's output; mine is a peak measurement on the disc's own
chunks. Different sides, same structure.
## 🔴 Unexplained: `verify-menu-audio`'s dead-press check has started failing
Its first assertion — five presses bound to nothing produce a Master bus
**bit-identical** to five waits — now reports DIFFER, reproducibly across three
runs. The two recordings diverge at **0.085 s**, differ on 92 % of samples, and
have different durations (1.300 s against 1.207 s) where they were previously
identical.
⚠️ **I have not identified the cause and am not guessing at one.** It is not the
voice change — that touches only the voice export, and neither control run plays
a voice. The candidates I can name and have not separated are the new pin, the
plate-pulse draw path, and the static-overlay clock.
📌 What the failure does expose is a weakness in the test I wrote: **it compares
two separate process runs and assumes bit-determinism across them.** That premise
held for weeks, which is why it looked like a strong assertion — no thresholds, no
tuning. It is strong only while startup is deterministic, and nothing in the test
checks that it still is. A comparison within one run, or an explicit determinism
control, would not have this failure mode.
Filed rather than patched: silencing it would remove the only check that a dead
press stays silent, and I would rather have a failing check than a passing one
whose premise I have stopped believing.