# Paper experiments — one command per table Reproduces every number in the report's tables, **deterministically and offline**: the per-frame VLM decisions (holdout videos) and all LLM-judge results are shipped as caches, so a rerun makes **zero API calls** and needs **no keys**. ## Setup (once) ```bash pip install -e . # from the repo root; the run itself is fully offline (embeddings ship as a cache) ``` ## Run ```bash python paper_experiments/run.py table1 # Table 1 — main progression (score AND cost) python paper_experiments/run.py table2 # Table 2 — ensemble ablation (calls per frame) python paper_experiments/run.py table3 # Table 3 — dedup ablation python paper_experiments/run.py gate # Table 4 — perception-gate cost/score frontier python paper_experiments/run.py sensitivity # few-shot example-sensitivity check python paper_experiments/run.py all ``` Each line prints `score` (0.9·PAUC + 0.1·(1−dup)), `PAUC`, `dup`, mean emissions per video, and the cost: mean **VLM calls per video** (+ an approximate US$ figure at our measured ≈$25 / 17.3k calls). Runs in a few minutes on CPU. ## What is shipped, and why the numbers are exact | file | content | |---|---| | `data/gold_holdout.json` | the 100 untouched holdout items (public WEB split, items 400–499) | | `caches/web_{base,comp,exh,fs,fs_alt}.jsonl` | per-frame VLM decisions for each prompt (temperature 0), holdout videos only | | `caches/judge_cache.json` | every LLM-judge / entailment result, keyed by input hash | | `caches/emb_cache.{npy,keys.json}` | MiniLM embeddings of every cached draft (the cosine-dedup prefilter), so the replay never loads — or downloads — the embedder | `run.py` replays the cached decisions through the *same* merge + entailment-dedup code the live system runs (`humomni.phase1.dedup.EntailmentGuard`), then scores with the official-protocol harness (`humomni.tuning.faithful_eval`). Since the VLM decisions, judge results, and dedup logic are all deterministic replays, the printed numbers match the report exactly. To regenerate the VLM caches from scratch instead (paid; OpenRouter + Vertex keys in `.env`): `python -m humomni.tuning.cache --func vlm` with the corresponding prompt — see the repo README. Prompt naming: EXH / COMP / FS in the report = `v5` / `v3` / `v8` in the code; `fs_alt` = `v10` (the example-swapped variant used in the sensitivity check).