clay-borg/tools
tegwick 1edb10d5a3 CB-WP-0024 T01/T02: the ending control says what it does, and the piles are objects
T01. The maintainer asked why the button says "I need to read this" and
why nothing closes. Two defects behind one control: the label described a
reading while the control STOPS THE SERVER (hotseat.rs reads `done` and
breaks its loop), and acknowledging it changed nothing on screen -- the
tab kept a live table and a `play again` pointing at a closed port.

Label is now "end session -- stops the game server". The reply says the
session has ended and the tab can be closed. The script seals the page on
a `closed` reply: removeAttribute('data-drop') on every control, so they
stop being droppable by the same rule that made them droppable. CSS is how
that reads, not the mechanism. removeAttribute rather than
setAttribute(_, null) -- the latter writes the truthy string "null" in a
browser, so the control would stay live while the stub called it sealed.

THE REPLY PATH HAD NEVER BEEN EXECUTABLE IN A TEST. jsrun's fetch stub
returned {then: function(){return this}}, which never invoked its
callbacks, so every line of the script reacting to the server was
unreachable from every test in this project. That is why the defect
survived: a page ignoring the server looked identical to one acting on it.
The stub now delivers a real then-chain and gesture_with_reply reports
which controls survive. The seal is mutation-proven -- deleting the
`closed` branch turns exactly one test red -- and a negative control
asserts an `ok: dealing` reply does NOT seal, since a seal that fired on
every reply would pass the first test and break `play again`.

T02. Draw and discard drawn as offset stacks with their counts. The
shuffle question the task required answering is settled and the answer is
that it already works: games/ground/src/lib.rs:1419-1435 implements the U4
default -- deterministic reshuffle of the discard seeded from seed ^ round,
skip the draw if both are empty -- and ground-game CONFIRMED U4 on
2026-08-03. A ruled rule, not an invented one, nothing to raise. The event
already reads out in the log; what the piles add is the state before it
fires, which is derivable from the view. A claim that a reshuffle HAS
happened would not be, and is not made.

The coverage gate caught its own probe going stale when the "17 remaining"
text was replaced. The count now lives in the pile's <title> -- a stable
probe and what a screen reader announces, where the on-canvas numeral
could be any number on the page.

39 tests pass; cb-play 22 including play_again_deals_a_second_game.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 17:23:09 +02:00
..
cb-play CB-WP-0024 T01/T02: the ending control says what it does, and the piles are objects 2026-08-05 17:23:09 +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