- capture: an ownership marker (.gstack-motion-capture) replaces the
capture.json test, so the rerun after MOTION_CONTRACT_MISSING or a crash
works and a foreign --out is still refused; offscreen lazy images are made
eager and font/image loading is bounded at 30 s instead of hanging
- encode: refuse a capture.json whose fields are not what capture writes
(they reach ffmpeg args and paths); a cards overflow with no story frames
is a planning error, and a zero-frame job never passes
- tests: retry after a refused page, no-mask clean line, lazy image still,
manifest validator, empty story span
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
- capture: refuse an --out that holds a still or frames but no capture.json
instead of deleting them; --cycle must be a multiple of 0.05 s so the seam
frame lands exactly one cycle later for every PRE (nearest value round-trips)
- encode: a capture without a mask ends 'MOTION_RESULT: clean (overflow not checked)'
- skill: Step 5 names window.__mark in the capture contract
- tests: foreign/previous --out handling on real Chromium, cycle guard and PRE sweep
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>