# 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 ` (stop, install DLL + cfg, clear autosaves and logs, launch), `cbgrab.ps1 -Name ` (collect autosaves + logs + cfg into `C:\SOTS\cb\\` 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.