Skip to content

Commit effca76

Browse files
nschneirclaude
andcommitted
docs(amiga-ball): criterion 22 measured the burst dying, not the filter closing
Iteration 2's finding, ruled on and applied. The old wording asked for the energy centroid to fall by a factor of three; measured over eleven captures, that fall tracks the 2-10 kHz band's 30 dB point exactly, and a centroid with voice 1's fundamental excluded moves 1.12x across the whole window. So the criterion improved as the demo got worse -- it scored best at $D40C = $00, where there is no transient for the sweep to act on at all. A criterion that rewards deleting the thing it checks is not measuring that thing. It now measures the transient's own band: 2-10 kHz must take at least 150 ms to fall 30 dB, so the burst outlives more than half the 267 ms sweep. This is a strengthening, and the test of that is that it can fail and does -- the same measurement on the immediately preceding $D40C = $04 build reads 95 ms. The shipped build reads 175 ms on both surfaces, and the wall's centroid is above the floor's at 21 of 21 steps to +200 ms. Section 13.2 gains the capture-window jitter note: the WAV varies by +/-2 video frames and the impact lands 353-387 ms in, while sid-log.jsonl is md5-identical run to run. Anything measured against a fixed grid in the WAV is partly measuring where the window opened, which is what made iteration 1's figures irreproducible. Tally 28 PASS / 0 FAIL. No third iteration: what remains is the listen section 13.2 reserves for the maintainer. README figures corrected against the shipped build -- irq_hwm is 14 on the gate-on frame and 7 on an ordinary one, and profile reads 450-480 rather than the 481 quoted from a single run. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WuuVARfoWgx7BzWDyGXH15
1 parent 4684ad0 commit effca76

3 files changed

Lines changed: 77 additions & 15 deletions

File tree

demos/amiga_ball/AUDIT.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,3 +909,44 @@ Everything else is closed. And the last gate is still §13.2's and not a
909909
spectrogram's: **the maintainer's listen of `capture.wav`.** This iteration can
910910
say the transient is 1.84× longer and that the sweep now has a signal under it
911911
for two thirds of its length. It cannot say whether that is a better boing.
912+
913+
---
914+
915+
## Criterion 22, re-worded and re-scored (maintainer ruling)
916+
917+
Both proposals from iteration 2 were accepted and applied to `SPEC.md`:
918+
criterion 22 now measures the **transient's own band** rather than the
919+
whole-signal centroid, and §13.2 records the capture-window jitter.
920+
921+
The re-wording is not a weakening, and the test of that is that the new
922+
criterion **can fail and does** — the same measurement on the immediately
923+
preceding `$D40C` = `$04` build reads 95 ms against a floor of 150 ms. The old
924+
wording had the opposite property: it improved as the demo got worse, scoring
925+
best at `$D40C` = `$00`, where there is no transient for the sweep to act on at
926+
all. A criterion that rewards deleting the thing it exists to check is not
927+
measuring that thing.
928+
929+
| # | Claim (as re-worded) | Verdict | Evidence |
930+
|---|---|---|---|
931+
| 22 | broadband column in one frame; 2-10 kHz takes ≥ 150 ms to fall 30 dB; wall centroid above floor at every 10 ms step of the first 200 ms | **PASS** | 2-10 kHz −30 dB at **+175 ms** on both floor and wall (`$04` build: +95 ms, which fails). Wall above floor at **21 of 21** steps to +200 ms. Ordering intact: transient 175 ms under thump 250 ms (floor) / 200 ms (wall) |
932+
933+
**Tally: 28 PASS, 0 FAIL, 0 INCONCLUSIVE.**
934+
935+
Final measured figures on the shipped build (session `ballfin`, 700 ticks):
936+
`irq_hwm` = **14** raster lines (gate-on frame), `irq_last` = **7** (ordinary
937+
frame), `c64 profile tick` = **451.6 cycles** mean over 16 arrivals (min 401,
938+
max 499). `10 + 14 = 24 < 51`, so the tick still finishes in the top border
939+
before the display begins.
940+
941+
**Is a third iteration needed? No.** Every criterion passes on evidence from
942+
the running machine, and the two document defects iteration 2 raised are
943+
applied rather than deferred. What remains is not an iteration but the one gate
944+
this process cannot close for itself: §13.2 makes the maintainer's listen of
945+
`evidence/audio/floor/capture.wav` and `wall/capture.wav` the final word on
946+
whether it sounds like a boing. Everything measurable about that sound has been
947+
measured and is above.
948+
949+
One item stays open outside this demo and is filed in `docs/todo.md` rather
950+
than fixed here: `skills/c64-development/references/hardware.md`'s sprite-Y row
951+
formula measures one high, and correcting it touches `demos/invaders`, which
952+
reached the opposite conclusion deliberately.

demos/amiga_ball/README.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,15 @@ reports pass against scores generated from the impact schedule rather than
9393
fitted to the recording, and a written audit marking all 28 criteria with the
9494
command and output that settled each one.
9595

96-
The per-frame job costs **7 raster lines** of a 263-line frame. It is armed at
97-
line 10 and finishes inside the top border, before the VIC draws a single pixel
98-
of the display — so there is no tearing to look for, and the margin is not an
99-
estimate but a `c64 profile tick` reading of 481 cycles.
96+
The per-frame job costs **7 raster lines** of a 263-line frame on an ordinary
97+
frame and **14** on the one frame in 64 that gates a new impact — a high-water
98+
mark the program keeps itself, because a sampler steps over the expensive
99+
frames and reports a comfortable number that means nothing. It is armed at line
100+
10 and finishes inside the top border, before the VIC draws a single pixel of
101+
the display, so there is no tearing to look for. `c64 profile tick` prices the
102+
same job independently at 450-480 cycles mean, which it can only do because the
103+
handler is a thin wrapper around an `rts` subroutine — `profile` masks
104+
interrupts, so it cannot price a handler in situ.
100105

101106
## The bits worth reading
102107

demos/amiga_ball/SPEC.md

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -886,6 +886,16 @@ the score and its evidence is the spectrogram — where the noise transient and
886886
the filter's downward sweep are visible and the piano roll cannot show them.
887887
Both reports must read `verdict: PASS`.
888888

889+
**The capture window does not open at a fixed offset.** Measured across eleven
890+
captures: the WAV varies by ±2 video frames in length (165,292 / 166,892 /
891+
168,492 bytes) and the impact lands anywhere from **353 ms to 387 ms** into the
892+
file. The register schedule is *not* what moves — `sid-log.jsonl` is
893+
md5-identical across five captures of the same build — so it is the window
894+
opening, not the program drifting. Anything measured against a fixed grid in
895+
the WAV is therefore partly measuring where the window opened, which is exactly
896+
what made iteration 1's centroid figures irreproducible. **Anchor every
897+
time-domain measurement on the impact itself**, which is stable to ±5 ms.
898+
889899
The maintainer's listen of `capture.wav` is the final gate on whether it sounds
890900
like a boing.
891901

@@ -949,17 +959,23 @@ machine, never from reading the source.
949959
21. `evidence/audio/floor/report.md` and `evidence/audio/wall/report.md` both
950960
read `verdict: PASS` against a score written from the impact schedule.
951961
22. The spectrogram of each capture shows a broadband transient at the impact
952-
frame whose energy centroid falls by at least a factor of three over the
953-
following **~100 ms** — the filter sweep, which the piano roll cannot show —
954-
and the wall's centroid is higher than the floor's at every point in that
955-
window.
956-
957-
(An earlier draft said ~250 ms, which §8's own instrument cannot deliver:
958-
the cutoff ramps for 16 frames = 267 ms, but `$D40C` = `$04` decays voice 2
959-
in 114 ms, so the burst is gone before the sweep ends. The second clause is
960-
free — measured 4,484 vs 4,204 Hz at onset and 1,881 vs 1,128 Hz at +100 ms
961-
— and it makes the criterion test §8's *two surfaces* claim rather than only
962-
its one-gesture claim.)
962+
frame — a full-height column, arriving in one frame — and **the transient's
963+
own band (2-10 kHz, above voice 1's audible harmonics) takes at least
964+
150 ms to fall 30 dB**, so the noise burst outlives more than half of the
965+
267 ms cutoff sweep and there is something left to hear the sweep in. The
966+
wall's spectral centroid is higher than the floor's at every 10 ms step of
967+
the first 200 ms.
968+
969+
(Two earlier drafts asked for the *energy centroid* to fall — by a factor of
970+
three over ~250 ms, then over ~100 ms. Measured over eleven captures, that
971+
fall is **the noise burst ending, not the filter closing**: its timing
972+
tracks the 2-10 kHz band's 30 dB point exactly, and a centroid computed with
973+
voice 1's fundamental excluded moves by 1.12× across the whole window. So
974+
the old wording rewarded a *shorter* transient — `$D40C` = `$00` would have
975+
scored best of all — which is the opposite of what §8 is trying to buy. A
976+
criterion that improves as the demo gets worse is not a criterion.
977+
`AUDIT.md` iteration 2 has the captures. The replacement above can fail and
978+
does: the same measurement on the `$D40C` = `$04` build reads 95 ms.)
963979

964980
**Budget**
965981

0 commit comments

Comments
 (0)