Most of the day went into A Wine App, and the interesting part is what the scanner learned to refuse. A barcode that scanned fine but resolved to nothing turned out to be three gates closing on the same state. Fixing it led somewhere better: for houses like Krug, where the edition number is the wine’s name, a near-miss is worse than no answer, so the matcher refuses ties and asks on screen instead of guessing. Three TestFlight builds went out chasing that. Bottle photos got a week-long cache, so a cellar with no signal still draws them, and Firestore’s KNN measured 160 ms on our own prints — flat where the linear scan wasn’t.
chesslab was the other big lane, +12k lines and much of it thrown away again. The policy targets were being stored after the sampling temperature, which past move 24 means training the policy head toward a one-hot argmax for two thirds of every game. Fixed, the replay windowed, the encoder rebuilt. Then things only measurable once the dashboard showed them: batching gate matches, and keeping the played move’s subtree instead of rebuilding each ply.
Foreman discovered its memory gate had been reading free swap — on macOS a file’s headroom, not the machine’s — and had refused every spawn. Plus small passes on Hermes setup, The Cloudy Brain and the mywineapp-website, and a heavy day in the ideas repo.
Tonight: the scanner asks instead of guessing, and Foreman can actually start a worker.