Publish the dataset card and labeling guide from the manifest (#27)
Regression tests: npm test 229 pass; dataset-card 14, corpus-manifest 8, corpus-review 21, calibration-harness 19 OK.
On the CLI ingest path there is no raw pre-derivation copy at all, so the
caption asserted a deletion the recording never showed. The code deletes a raw
copy only when one exists under the dataset's raw/ directory, matched by digest.
The first recording of the card was legible but translucent, so the bottom nav
and the journal's body copy ghosted through its empty lower rows. The card is
now fully opaque and the on-screen proof rejects a background with any alpha, so
a future edit cannot reintroduce the bleed unnoticed.
Issue #25's corpus pipeline is a CLI with no app screen, so the demo runs the
real ingest and revoke commands against the committed synthetic fixture in a
throwaway dataset and draws the on-camera audit card from their actual output:
the provenance record, the deleted derived image, the kept original record, the
tombstone that drops labels and the subject key, zero active samples, and a
second revocation refused without appending anything.
The card is asserted on screen (fixed, topmost, unclipped) and the values on it
are read back from the run, so a build that stops recording provenance or stops
deleting bytes fails instead of recording a claim. build_release.py now runs
tests/corpus-manifest.test.py as a release gate and requires the four new
captions to have painted on camera.
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