Super Bowl LI referee-announced player-foul timeline task - #77
Super Bowl LI referee-announced player-foul timeline task#77YashJayswal24 wants to merge 6 commits into
Conversation
Cross-modal video-understanding task: reconstruct referee-announced player fouls (quarter, clock, type, jersey number, team) from the full broadcast. Jersey number is audio-only (ref mic), game clock is video-only (score bug); compound-match F1 scorer. Media pinned from archive.org with verified SHA256. Draft / pre-calibration: oracle=1.0, empty=0.0, no_media=0.0 verified locally; GROUND_TRUTH is the audio-verified 4-foul pilot subset; full Game Book parse and GPT 5.6 Sol calibration pending. See PhiloLabs#60. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the 4-foul audio-verified pilot subset with the full set of referee-announced player fouls, parsed from the official Super Bowl LI Game Book play-by-play. Jersey numbers are taken from the Game Book lineups (authoritative); the four audio-verified numbers (PhiloLabs#23, PhiloLabs#34, PhiloLabs#70, PhiloLabs#59) all match. GROUND_TRUTH (judge.py) and the oracle (solve.sh) updated in lockstep. Scope rule and the three no-number exclusions (delay of game, illegal formation, illegal touching) documented in PROVENANCE.md, per the maintainer guidance in PhiloLabs#60. Verified locally: oracle 13/13 -> 1.0, empty -> 0.0, partial -> 0.83. Still pending (agent/Harbor infra): GPT 5.6 Sol calibration, media ablations, check_task.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Ran the repo's own scripts/understanding/check_task.py: PASS on task structure, input video (143.1 min / 1080p, confirmed by its ffprobe), oracle == 1.0, baseline == 0.0. Agent-reward and ablation checks report SKIP (require the strong-agent stack). Resolution >=720p is now verified by the checker rather than assumed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Addresses techgenmini's review on PR PhiloLabs#77 / issue PhiloLabs#60: - instruction.md's example output block contained two verbatim GROUND_TRUTH rows; copying it scored 0.2667, well over the 0.10 anti-shortcut gate. Replaced with synthetic rows using infraction types that never appear in GROUND_TRUTH. Verified locally: oracle still 1.0, empty still 0.0, copied example now 0.0. - Restored the observable clock rule from the original issue PhiloLabs#60 proposal (last score-bug frame before the referee's announcement) into instruction.md and PROVENANCE.md; it had been dropped. - task.toml: allow_internet false -> true. The Game Book ground-truth source is public, so blocking the network was a false safeguard; the no-lookup instruction + trajectory audit is the real one. - PROVENANCE.md: added a per-row audio-verified column (surfaces that the 3 declined fouls kept in scope are not yet audio-verified, only the 4 accepted ones are) and an announcement-class enumeration table cross-checked against nflpenalties.com. - SPEC.md / calibration/scores.md: no_media and the plausible-guess run marked stale/PENDING -- both were measured against the prompt before the leak fix and need rerunning. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LJLFgU63BSkXkihThLfUFJ
|
Pushed fixes for the two concrete bugs (leaked GT examples in |
|
Second round of fixes per techgenmini's issue PhiloLabs#60 ruling: - judge.py: F1 -> F-beta (beta=2, recall-weighted), per the settled scoring decision. One lucky exact row no longer clears the 0.10 anti-shortcut gate (F1 gave 0.1429, F2 gives 0.0943). Added test_regressions.py checking null/one-hit/two-hit/oracle against the exact values from the review (0.0 / 0.0943 / 0.1852 / 1.0) -- verified locally, all four pass. - instruction.md: the prose example still said "number 70" (a real GROUND_TRUTH value, rows 10/11); made it generic. Also replaced "clock at the moment the foul occurred" with a pointer to the defined score-bug rule, removing the contradiction. - Dockerfile: baked faster-whisper==1.2.1 + pre-cached the small.en model at build time, so ASR is deterministic and available in every trial regardless of allow_internet, rather than relying on an agent to install its own. Verified: image builds clean, and the model loads and transcribes with --network none (genuinely offline, not just import-successful). - SPEC.md / PROVENANCE.md / calibration/scores.md: wording updated from F1 to F2 throughout; PROVENANCE.md's "open design questions" section rewritten as a settled scope/scoring ruling now that techgenmini has decided it; ground_truth tier reframed as official-record-derived + broadcast audit, not pure machine-truth. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LJLFgU63BSkXkihThLfUFJ
|
Pushed the rest of the punch list from the latest review — F1→F2 in |
|
@techgenmini can you check it out |
|
Per techgenmini's reproducibility ask: small.en was cached with no
pinned HF revision, so a rebuild months later could silently pull
different model weights if Systran/faster-whisper-small.en's "main"
moves -- unlike the video, which is already pinned by SHA256.
- Pin WHISPER_MODEL_REVISION to the exact commit hash (verified live
via the HF API: d1d751a5f8271d482d14ca55d9e2deeebbae577f).
- Add HF_HUB_OFFLINE=1 so every later load -- however the agent
invokes it -- resolves from the local cache with zero network
lookup, closing the gap a revision pin alone leaves at trial time
(allow_internet=true would otherwise still let an unpinned runtime
call re-resolve "main" over the network).
Caught and fixed a real bug while verifying this locally: caching
only the pinned-commit entry breaks a plain WhisperModel('small.en')
call once HF_HUB_OFFLINE is set, because that call resolves "main" by
default and finds no local ref for it. Fixed by also caching the
no-revision call while still online, so both paths resolve offline.
Verified end to end: built the image, then ran a plain (no explicit
revision) transcribe() call inside it with --network none -- works.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018V1vodJUoi4eaKdve4YA3a
Task: Super Bowl LI referee-announced player-foul timeline
Proposed and discussed in #60. Adds
tasks/agentic_vbench_understanding/ne-atl-2017-super-bowl-li-penalty-timeline/.Opened for design/code review — NOT yet calibration-complete, so it should not be merged until the calibration lands. Shared early per the proposal-first process, so the design, scorer, and ground truth can be reviewed before the (expensive) calibration stage.
What the task is
Reconstruct every referee-announced player foul from the full Super Bowl LI broadcast: quarter, game clock, infraction type, penalised player's jersey number, team. Cross-modal by construction — the jersey number is stated only by the referee's mic (audio), the game clock only by the on-screen score bug (video); neither channel alone yields a true positive. Ground truth = official NFL Game Book (machine-truth). Media pinned from archive.org (pin, not re-host), matching the
gsw-cleworked example.Verified so far (locally)
youtube-noLK78Hgq0A.mp4, 1920×1080, 2h23m; SHA256 pinned in the Dockerfile (ba2281d6…4ba998, computed by streaming the file).judge.py): deterministic compound-match F1. Local pilot: oracle → 1.0, empty → 0.0, plausible guess → 0.0, partial (clock off 3 s) → 0.57. Clock tolerance and wrong-number rejection behave as designed.no_mediagate (maintainer's step 1): indicative proxy run — a no-media, no-tools model reconstructed 0/13 penalties (F1 0.0). De-risks the fame concern; the official GPT 5.6 Sol run is still required.Now complete (update)
Full ground truth — DONE. Replaced the 4-foul pilot with 13 referee-announced player fouls parsed from the official NFL Game Book play-by-play; jersey numbers taken from the Game Book lineups (the 4 audio-verified numbers all match).
judge.pyGROUND_TRUTH and the oraclesolve.share in lockstep — locally oracle 13/13 → 1.0, empty → 0.0, partial → 0.83. Scope rule + the 3 no-number exclusions (delay of game, illegal formation, illegal touching) documented inPROVENANCE.md, per @christine1729's guidance in [Task Proposal] Super Bowl LI referee-announced player-foul timeline #60.check_task.py— PASSES (partial). Ran the repo's ownscripts/understanding/check_task.py: PASS on task structure, input video (143.1 min, 1080p — resolution now confirmed by its ffprobe, not assumed), oracle == 1.0, baseline == 0.0. The agent-reward / agent-turns / ablation inputs are reported SKIP (they need the strong-agent stack).Still pending (needs the agent/Harbor stack — same dependency as calibration)
calibration/.scores.mdmarks these_to run_.single_frame,video_only,audio_only,frame_dump_no_tools— each is a strong-agent run on degraded media, so it needs the same stack as calibration.Open design questions on the ground truth (see
PROVENANCE.md)Review asks
Closes #60 once calibration lands (not with this draft).