New gate tests/kb-update/test-screenshots-manifest.test.mjs. The screenshot runner will write playground/screenshots/MANIFEST.json (output directory, sha256 per PNG, sha256 of the demo state it rendered). The gate fails when a PNG in the tree is not in the manifest, an entry is missing or changed, the demo state changed after the run, or a doc points at another screenshot directory.
Chose a manifest written by run.mjs over a hand-kept hash list, because the runner is the only thing that can vouch for its own output, and the demo hash turns screenshots older than the demo into a failing test instead of a review finding.
Red on 715950b: 4/4 fail, 100 of 100 PNGs unlisted, manifest missing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>