The demo injected its caption CSS with page.addStyleTag(), which writes into the current document
only. The first page.reload() in the recording stripped that stylesheet, so every later caption
rendered as unstyled body text clipped at the bottom of the frame and every touch indicator was
invisible, while the caption receipt still listed each string and the release gate accepted it.
- caption and touch nodes now carry inline styles, which no reload can remove
- caption() proves each caption is a fixed bar at the top of the viewport, on top of what is
beneath it, fully inside the frame, and that the caption band pixels change; the recording fails
rather than shipping a caption nobody can read
- the receipt records per-caption evidence and build_release.py requires every required caption,
including the release delta, to be pixel-verified
- the demo photo is a legible synthetic test card instead of a 1x1 white pixel that rendered on
camera as an empty box
- tests assert the inline styling and the pixel gate