clay-borg/tools
tegwick 4fb506fcd1 CB-WP-0027 T01-T04: the commentary track
The meta view beside the table, and a note channel that provably cannot
carry a move.

T01 (ADR-0014). ADR-0007 D5 is SCOPED, NOT AMENDED, and the reason it was
easy is that PointerFact::parse already refuses any unrecognised field --
a comment could not reach the command path even by accident. So /command
carries pointer facts, /note carries text, and Note has no code path to
GroundCommand. Comments live in trials/<date>-<slug>.md, not in
ScenarioFile: a scenario is executed, replayed and hashed, and prose in it
is data the runner must ignore, which is how a format rots. The state hash
binds; round and step are for reading. And the retention question, decided
before any comment was written: RAW NOTES NEVER LEAVE clay-borg. A note
reaches ground-game only by being promoted to a register finding, by a
human, with the wording chosen then -- "the DARVO sequence is infuriating"
is useful signal and a bad way to open a message to the game's designer.

T02. CSS grid, minmax(0,1fr) on both tracks -- load-bearing, because a
grid child defaults to min-content width and without it the SVG table
refuses to shrink and pushes the meta column off-screen, looking correct
on the developer's monitor and broken everywhere else. Single-column
fallback under 64rem. The running tally moved into the panel so it is
visible WHILE PLAYING; it only appeared on the ending page before, and a
score you see once the game is over informs nothing.

T03. A plain <form method="post">, so the box works with the script
disabled; the command channel needs JavaScript because a drag is not a
form submission, a comment is one. 303 See Other so a reload does not
re-post. esc()'s first hostile input: <script>alert(1)</script> renders
escaped AND STILL READABLE -- escaping that eats the player's words is its
own defect. Verified over real HTTP: note posted 303, hostile note stored
as text, empty note refused 400, game did not advance.

T04. tools/trials.py and make trials. THE REPORT'S DESIGN CHANGED BECAUSE
I RAN IT: the first version called any note without a recording an orphan,
so a live session reported every note as broken -- the recording is only
written at game end. A metric that cries wolf is one nobody reads, which
is the exact failure this pass exists to prevent. Now ok / pending /
orphan, and only orphan is a target-0 number. The self-test exercises the
REPORTING path, not just the parser, because design-baseline.py had a
green self-test and an unexercised reporting path and that is where it
rotted.

And a latent Makefile defect surfaced: make trials did nothing, because
trials is also a directory and Make saw an up-to-date file. design,
difficulty and trials -- added by CB-WP-0022, CB-WP-0025 and this pass --
were ALL missing from .PHONY; only the one that collided revealed it.

make all: exit 0. 49 render tests, 26 cb-play, loop-lint clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 10:37:46 +02:00
..
cb-play CB-WP-0027 T01-T04: the commentary track 2026-08-06 10:37:46 +02:00
cb-sim CB-WP-0015: the two inert clauses, AM-7 scaling and AM-8 N=10 2026-08-02 14:07:08 +02:00
cb-cost.py CB-WP-0013-T02/T03: retire SH-3 as a gate; correct AM-4a and its target 2026-08-02 07:30:14 +02:00
dep-weight.py CB-WP-0019 T01/T02: AM-4b asks what a contributor acquires 2026-08-03 19:04:54 +02:00
design-baseline.py CB-WP-0026: collect the rulings -- ten answers that arrived and were never applied 2026-08-05 16:13:37 +02:00
design.py CB-WP-0026: collect the rulings -- ten answers that arrived and were never applied 2026-08-05 16:13:37 +02:00
edition-check.py CB-WP-0021 T01/T02/T05: the engine plays its own data — AM-7 blocks 2026-08-04 00:47:56 +02:00
facts.py CB-WP-0006 T07: implement K18, amend K14 2026-08-01 12:47:16 +02:00
gate-review.py CB-WP-0009-T02: gates.toml and make gate-review 2026-08-01 15:42:13 +02:00
loop-lint.py CB-WP-0019 T03/T04: the cost rule written down, and the lifecycle 2026-08-03 19:25:18 +02:00
mutation-check.py CB-WP-0021 T06: fix AM-7's measurement, not its floor 2026-08-04 01:10:38 +02:00
replay-test.py CB-WP-0006 T06: K10 replay bundles, --replay, and AM-7 re-earned 2026-08-01 11:05:37 +02:00
repo.py CB-WP-0004 T01: fix environment friction at the root 2026-07-31 10:13:52 +02:00
rule-coverage.py CB-WP-0026: collect the rulings -- ten answers that arrived and were never applied 2026-08-05 16:13:37 +02:00
runtime-metrics.py Fix the AM-5 instrument to measure quietly; the breach was not real 2026-08-01 10:37:25 +02:00
size-metrics.py CB-WP-0006 T02: instrument AM-2; report AM-3 blocked, with the argument 2026-07-31 18:38:15 +02:00
status.py status: a cancelled task is a closed one 2026-08-03 18:55:11 +02:00
task-done.py chore: mark T01/T02 done (measured: $2.33 + $1.68, 46 responses, opus-5) 2026-07-31 10:18:34 +02:00
trials.py CB-WP-0027 T01-T04: the commentary track 2026-08-06 10:37:46 +02:00