diff --git a/scripts/make_fixtures.sh b/scripts/make_fixtures.sh new file mode 100755 index 0000000..201a97e --- /dev/null +++ b/scripts/make_fixtures.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# make_fixtures.sh — regenerate the committed replay fixtures. +# +# TRACES: VR-001 | PR-002 +# +# CI never calls a model (see docs/requirements.md, "CI never calls a model"): +# the embedder is impractical on the N100 CI host, so inference happens HERE, on +# a machine with a GPU, and CI consumes the HDF5 dumps as data. Everything +# downstream of embedding — tracking, presence windows, belief accumulation, +# expansion — is cheap CPU maths and replays from these files. +# +# Reproducibility is a requirement, not a nicety. A fixture whose provenance is +# unknown is worse than no fixture, because it will be trusted. Every parameter +# that affects the output is pinned below rather than left to a default, and the +# dumps carry the embedder identity and SHA-256 (GR-004) so a replay cannot be +# silently scored against the wrong gallery. +# +# These are byte-reproducible only because node outputs block rather than drop +# on a full channel (AR-004). Before that fix the same command produced +# different dumps run to run, since what got dropped depended on timing. +# +# Source: bali/ — Road to Bali (1952), public domain. That matters: derived +# fixtures can be committed, where anything cut from a copyrighted title could +# not live in the repository at all. +set -euo pipefail + +REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +CLIPS="${CLIPS:-$REPO/../bali}" +GALLERY="${GALLERY:-$REPO/gallery_lvface.h5}" +BIN="${BIN:-$REPO/build/scene_analyze}" +OUT="$REPO/tests/fixtures/dumps" + +# Pinned. Changing either invalidates every committed fixture. +# fps 5 — 1 fps over a 77 s clip is 77 frames, too thin to exercise an +# extinction window measured in tens of seconds. +# min-face — 32 px, the VR-005 measured floor (98.1% TPI). The corpus is +# 480x360, so a stricter value would reject most faces present. +FPS=5 +MIN_FACE_PX=32 + +[[ -x "$BIN" ]] || { echo "no scene_analyze at $BIN (set BIN=)" >&2; exit 1; } +[[ -f "$GALLERY" ]] || { echo "no gallery at $GALLERY (set GALLERY=)" >&2; exit 1; } +[[ -d "$CLIPS" ]] || { echo "no clips at $CLIPS (set CLIPS=)" >&2; exit 1; } + +mkdir -p "$OUT" + +for clip in "$CLIPS"/Road_To_Bali-*.webm; do + n="$(basename "$clip" .webm)"; n="${n##*-}" + echo "── bali_$n" + "$BIN" --movie "$clip" --gallery "$GALLERY" \ + --fps "$FPS" --min-face-px "$MIN_FACE_PX" \ + --dump-embeddings "$OUT/bali_$n.h5" \ + --output /dev/null 2>&1 | grep -E "wrote|dropped" || true +done + +echo +echo "Regenerated in $OUT — verify the diff is empty if nothing upstream changed." +echo "A non-empty diff means detection, alignment or embedding moved. That is" +echo "either a regression or a deliberate change, and either way the golden" +echo "outputs derived from these fixtures need reviewing."