retro: the agreed result, plus the cue-suppression matrix it came out of
Agreed retro with the Decoder at docs/agents/RETRO-2026-08-31-agreed.md; their own review is at docs/agents/RETRO-2026-08-31.md on auto/frame-blend-draw-path. Twelve rules, of which the ones neither of us had: a refutation whose instrument is one of our renderers is not a refutation but "our renderer disagrees" (this cost weeks, both ways); a negative must carry a positive control, which no "undecodable with reach" page either of us has written ever did; and a disagreement is evidence about the chain disc -> decode -> render -> capture, not about the link being looked at. The gap underneath our controls, stated: they verified capability, not configuration. My additive material passed every control because they tested whether the method detects a blend difference, not whether this run had blend_mode set -- it was Godot's default MIX. Their vertex dump passed every control because they tested the NDC conversion, not whether it captured all six quads. Nothing applied to PROTOCOL.md. The register re-classification changes the file both agents read to decide what not to try, and two agents agreeing is not the right authority for that. Also committing the work that was pending when the stop came: verify-menu-audio now settles cue presence by suppression -- silence one cue's .ogg, re-record the same walk, and require its own correlation to collapse. All three cues sound (+0.158 / +0.637 / +0.526). The bed-only margin no longer renders a verdict: it called `move` NOT FOUND on three runs at 0.109-0.131 while the cue was demonstrably sounding, and across runs the same cue reads 0.131 and 0.158, so the threshold was never a property of the cue. The off-diagonal is reported as masking rather than asserted: silencing confirm raises back by 0.468 because the game plays them 90 ms apart under a 0.15 s template. An assertion there would fail forever on correct audio.
This commit is contained in:
@@ -49,6 +49,29 @@ run walk down,down,accept,cancel,up
|
||||
run ctrl wait,wait,wait,wait,wait
|
||||
run noop left,left,left,left,left
|
||||
|
||||
# 🔴 AND A PER-CUE KNOWN NEGATIVE, because the bed-only control could not settle
|
||||
# what it was being asked. `move` reported NOT FOUND on three consecutive runs at
|
||||
# margins 0.109/0.120/0.131 against a 0.15 line that a documented earlier run had
|
||||
# cleared at 0.185. Two readings fit that -- the cue stopped playing, or the
|
||||
# threshold sits above the quietest cue's true signal -- and A MARGIN CANNOT
|
||||
# SEPARATE THEM, because both produce a small number.
|
||||
#
|
||||
# So each cue now gets its own negative: the SAME walk, with only that cue's .ogg
|
||||
# replaced by silence through the mod tree. Silencing a cue that is playing must
|
||||
# collapse its correlation and leave the other two alone, which is a 3x3 matrix
|
||||
# with six off-diagonal controls rather than one number to compare against a
|
||||
# threshold.
|
||||
for c in move confirm back; do
|
||||
d="$OUT/sup_$c"; mkdir -p "$d/audio/se"
|
||||
ffmpeg -v error -f lavfi -i anullsrc=r=44100:cl=stereo \
|
||||
-t "$(ffprobe -v error -show_entries format=duration -of csv=p=0 export/audio/se/$c.ogg)" \
|
||||
-c:a libvorbis "$d/audio/se/$c.ogg" -y
|
||||
SYLPHEED_MODS="$d" run "sup_$c" down,down,accept,cancel,up
|
||||
grep -q "^mod: audio/se/$c.ogg" "$OUT/sup_$c.log" || {
|
||||
echo "the $c override was never read -- the matrix below would be meaningless" >&2
|
||||
exit 2; }
|
||||
done
|
||||
|
||||
python3 - "$OUT" <<'PYEOF'
|
||||
import array, math, subprocess, sys
|
||||
O = sys.argv[1]; SR = 44100
|
||||
@@ -123,19 +146,54 @@ def slide(tpl, hay, step=16):
|
||||
return best
|
||||
|
||||
found = []
|
||||
tpls = {}
|
||||
for cue in ("move", "confirm", "back"):
|
||||
tpl = dec("export/audio/se/%s.ogg" % cue, "%s/%s.raw" % (O, cue))[:int(0.15*SR)]
|
||||
tpls[cue] = tpl
|
||||
rw, tw = slide(tpl, walk)
|
||||
rc, _ = slide(tpl, ctrl)
|
||||
# 🔴 NO VERDICT ON THIS LINE ANY MORE. It used to print PRESENT/NOT FOUND on
|
||||
# `margin > 0.15`, and it called `move` NOT FOUND on three consecutive runs at
|
||||
# 0.109/0.120/0.131 while the cue was DEMONSTRABLY SOUNDING -- silencing its
|
||||
# .ogg collapses it to the bed floor. The bed-only control is a DIFFERENT RUN,
|
||||
# so its margin carries every difference between two runs; the threshold that
|
||||
# once cleared 0.185 was never a property of the cue. The number is still worth
|
||||
# printing. The verdict now comes from the suppression matrix below.
|
||||
hit = rw - rc > 0.15
|
||||
found.append((cue, tw, hit))
|
||||
print("%-8s walk r=%.3f at %5.2fs | bed-only r=%.3f | margin %+.3f %s"
|
||||
% (cue, rw, tw, rc, rw-rc, "PRESENT" if hit else "NOT FOUND"))
|
||||
print("%-8s walk r=%.3f at %5.2fs | bed-only r=%.3f | margin %+.3f"
|
||||
% (cue, rw, tw, rc, rw-rc))
|
||||
|
||||
# 3. The ORDER is the strongest evidence here and it is free: the correlator is
|
||||
# never told where to look, so three templates landing in script order --
|
||||
# move (step 1) before confirm (step 3) before back (step 4) -- is three
|
||||
# independent searches agreeing with the log.
|
||||
# 3b. THE SUPPRESSION MATRIX. Row = the cue silenced, column = the template
|
||||
# searched for. The diagonal is the only cell that should move.
|
||||
sup = {c: dec("%s/sup_%s.wav" % (O, c), "%s/sup_%s.raw" % (O, c))
|
||||
for c in ("move", "confirm", "back")}
|
||||
base = {c: slide(tpls[c], walk)[0] for c in tpls}
|
||||
print("\nsuppression matrix -- drop in r when one cue's .ogg is silenced")
|
||||
print(" " + "".join("%9s" % c for c in ("move", "confirm", "back")))
|
||||
ok = True
|
||||
for row in ("move", "confirm", "back"):
|
||||
drops = {col: base[col] - slide(tpls[col], sup[row])[0] for col in ("move", "confirm", "back")}
|
||||
print(" silence %-6s" % row + "".join("%+9.3f" % drops[c] for c in ("move", "confirm", "back")))
|
||||
if drops[row] <= 0.05:
|
||||
ok = False
|
||||
print(" 🔴 silencing %s did not remove %s -- that cue is NOT SOUNDING" % (row, row))
|
||||
print(" => %s" % ("all three cues SOUND: silencing each one collapses its own signal"
|
||||
if ok else "at least one cue is not sounding"))
|
||||
# 🔴 THE VERDICT IS THE DIAGONAL ONLY, and the first version of this asserted the
|
||||
# off-diagonal too -- "silencing a cue must not move the others". That failed, and
|
||||
# the material is why: `confirm` lands at 1.12 s and `back` at 1.21 s, 0.09 s apart
|
||||
# under a 0.15 s template, so the two windows OVERLAP. Silencing `confirm` raises
|
||||
# `back` by 0.468 because confirm was masking it. That is a fact about two cues the
|
||||
# game plays 90 ms apart, not a fault, and an assertion that calls it one would
|
||||
# fail forever on correct audio.
|
||||
print(" (off-diagonal is MASKING between overlapping cues, not an error --")
|
||||
print(" confirm at 1.12 s and back at 1.21 s share a 0.15 s window)")
|
||||
|
||||
times = [t for _, t, hit in found if hit]
|
||||
print("cue order vs script order : %s"
|
||||
% ("CONSISTENT" if times == sorted(times) and len(times) == 3
|
||||
|
||||
Reference in New Issue
Block a user