#!/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: hero/ — SuperHero, from the TRECVID DVU development set. Chosen over # SuperHero on face scale: Bali reference crops had a median detected face of # 27 px against a 69 px maximum, so every reference was upscaled far past what # the embedder was trained for. SuperHero is 69 px median, 241 px max. 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/../hero}" 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. This is a *fixture* setting, deliberately below AR-002's # production floor of 40 px (VR-013, measured end to end): the # corpus is 480x360, where faces run 40-80 px, so pinning at 40 # would thin the dumps for reasons unrelated to what they test. # 32 px is where VR-005 still shows 98.1% TPI, so the faces kept # are identifiable; it is not the threshold the pipeline ships. 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"/SuperHero-*.webm; do n="$(basename "$clip" .webm)"; n="${n##*-}" echo "── superhero_$n" "$BIN" --movie "$clip" --gallery "$GALLERY" \ --fps "$FPS" --min-face-px "$MIN_FACE_PX" \ --dump-embeddings "$OUT/superhero_$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."