sots-re/verify/harness/cb/README.md
alex 954f3cec63 CB: the turn-command stream, captured and bound to the autosave it produced
Canonical pair turn2->turn3: the complete block set, the three heap payloads no
previous capture could read (route [272], list-10 [1728], the 24-byte Population
body), the three AI client seeds, and both output autosaves -- byte-identical to the
published oracle AND to this lane's own hooks=off control, so the stream and the save
come from the same run and the instrument did not change the turn it recorded.

Creation turn turn1->turn2: three runs. Pinning the AI client seeds to the values an
earlier run observed made a DIFFERENT process reproduce that run's block -- including
the research pick that varies -- and its autosave byte for byte. The workload three
lanes could not reproduce is reproducible given the seeds.

Two corrections to lane L4's list-23 reading (no trailing int; the body is not
turn-dependent) and one to my own list-5 record, the latter found by lane RB while
consuming this capture.

Format: JSON (raw words are ground truth, decoded is a typing) plus lane RB's own .tcb
grammar with the heap payloads filled in, so RB's reader consumes it unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARBgSooAfokKUy6wKUKEyZ
2026-09-08 19:18:57 -04:00

36 lines
2.1 KiB
Markdown

# Lane CB's VM harness
Driving VM146 from WSL. Two lab facts these scripts exist to encode, both of which cost this lane
a run before they were understood:
**1. The vmwatch wall caches frames for 5 seconds, and a cached frame is indistinguishable from a
click that did nothing.** Four clicks were diagnosed as "not registering" when every one of them
had worked and the screenshot was simply older than the click. Every screendump here goes through
`vmshot.py --ssh`, which bypasses the service and costs ~4 s.
**2. The >60 s startup is real** (five confirmations on the board now). `cbmenu.py` polls the
framebuffer for the main menu's red button column and refuses to return until it is up. Never
sleep-and-click.
A third, less certain: `cbfull.sh` chains the whole path with fixed gaps and **lost the Load-dialog
OK on one run** — the click helper is fired by `schtasks /Run`, which is asynchronous, so batches
issued back to back can overlap and one gets dropped. Driving the path one `cbstep.sh` call per
click, with a screendump between, did not fail once. Prefer `cbstep.sh` + `cbdo.sh` over `cbfull.sh`
until that is understood.
| script | what |
|---|---|
| `cbstep.ps1` (on the guest, `C:\SOTS\cb\`) | one click-helper batch; lines joined with `;;` so PowerShell argument splitting cannot break `sleep 500` into two arguments — which it silently does |
| `cbstep.sh` | send one batch |
| `cbdo.sh` | send one batch, then a fresh screendump |
| `cbmenu.py` | poll until the main menu is up |
| `cbload.sh` | the Load-dialog steps |
| `cbfull.sh` | the whole path (see the caveat above) |
On the guest: `cbdeploy.ps1 -Tag <cfg>` (stop, install DLL + cfg, clear autosaves and logs, launch),
`cbgrab.ps1 -Name <run>` (collect autosaves + logs + cfg into `C:\SOTS\cb\<run>\` and print sha256s).
Row geometry: `cbdeploy.ps1` deletes the three autosaves, so the Load dialog always lists the same
**six** files at y = 262, 291, 320, 349, 378, 407. `ref-turn2` is row 4 (**y=349**), `turn1-state`
is row 5 (**y=378**). Selecting a row expands a preview panel that moves every row below it, so
select from a collapsed list or re-read the geometry from a screendump.