Skip to content

Super Bowl LI referee-announced player-foul timeline task - #77

Open
YashJayswal24 wants to merge 6 commits into
PhiloLabs:mainfrom
YashJayswal24:task/superbowl-li-penalty-timeline
Open

Super Bowl LI referee-announced player-foul timeline task#77
YashJayswal24 wants to merge 6 commits into
PhiloLabs:mainfrom
YashJayswal24:task/superbowl-li-penalty-timeline

Conversation

@YashJayswal24

@YashJayswal24 YashJayswal24 commented Jul 26, 2026

Copy link
Copy Markdown

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-cle worked example.

Verified so far (locally)

  • Media: youtube-noLK78Hgq0A.mp4, 1920×1080, 2h23m; SHA256 pinned in the Dockerfile (ba2281d6…4ba998, computed by streaming the file).
  • Scorer (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_media gate (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.
  • Audio intelligibility (design's single point of failure): the referee's announced jersey number transcribed cleanly on a small CPU ASR model for 4/4 sampled player fouls — No. 70 Matthews (Q3), No. 23 Alford (Q2), No. 34 Poole (Q2), No. 59 Campbell (OT PI).

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.py GROUND_TRUTH and the oracle solve.sh are 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 in PROVENANCE.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 own scripts/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. GPT 5.6 Sol / Codex / Antigravity rollouts + performance table + raw trajectories under calibration/. scores.md marks these _to run_.
  • Ablations. 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)

  • Declined fouls (3 of the 13) are included because the referee announces the number; accepted-only would give 10. Your call.
  • Event count is 13 vs 22 in the NBA example; widening to replay reviews / measurements would need a schema addition, so it is left open rather than silently included.

Review asks

  1. Is the scope rule (referee-announced player fouls; team fouls excluded because their fields are OCR-recoverable) the right boundary?
  2. With type + team conceded to OCR, is the compound-match-on-number+clock cross-modal argument sufficient, or do you want a stricter formulation?
  3. Anything you'd want changed in the task layout / scorer before the calibration spend?

Closes #60 once calibration lands (not with this draft).

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>
@YashJayswal24
YashJayswal24 marked this pull request as ready for review July 26, 2026 07:35
@YashJayswal24 YashJayswal24 changed the title [Draft] Super Bowl LI referee-announced player-foul timeline task Super Bowl LI referee-announced player-foul timeline task Jul 26, 2026
YashJayswal24 and others added 2 commits July 26, 2026 00:47
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>
@techgenmini

Copy link
Copy Markdown
Collaborator

Thanks for opening this pre-calibration. Please respond to the scope/clock audit request on #60 before spending on calibration. I’ve also left inline comments for the leaked examples and clock contract.

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
@YashJayswal24

Copy link
Copy Markdown
Author

Pushed fixes for the two concrete bugs (leaked GT examples in instruction.md, allow_internet) plus the restored clock rule — commit 1bb2aaf. Full scope/clock/audibility audit posted on #60: #60 (comment)

@techgenmini

Copy link
Copy Markdown
Collaborator

Hi @YashJayswal24 — thanks, this audit is enough to settle the task shape before calibration.

  • Keep the natural 13 referee-announced player-foul scope. Please do not pad it with reviews or measurements: they lack the audio/video jersey-number seam that makes this task valuable. A declined foul
    stays only if its number is individually audible.

  • Raw F1 cannot remain: one exact row currently scores 0.1429. Please use recall-weighted F2 instead of an arbitrary two-hit cliff. It keeps continuous partial credit, gives one exact row 0.0943, two exact
    rows 0.1852, and oracle 1.0. Add null / one-hit / two-hit / oracle regressions.

  • Complete a compact observability audit for all 13 rows before runs: the spoken-number timestamp and transcript, plus the last pre-announcement score-bug frame, displayed clock, Game Book clock, and delta.
    Drop any row that fails. Pin the exact official Game Book PDF URL, SHA256, and row references. This is best described as official-record-derived GT plus a broadcast audio/video audit.

  • Two small prompt fixes: the prose example “Holding, number 70, offense” is still a real GT pattern; make it generic. Also replace “clock at the moment the foul occurred” with “clock defined below,” since
    the binding rule is the pre-announcement score-bug frame.

  • The spoken number is load-bearing, but the image currently ships only ffmpeg while the evidence used local Whisper. Either bake/pin the intended ASR path, or demonstrate the permitted exact-image setup in
    the final traces. Keep allow_internet=true per the existing ruling; raw traces must distinguish dependency/model downloads from prohibited source lookups.

Once those land, run final-prompt no-media and modality ablations plus the required Codex CLI, Claude Code, and Antigravity traces. No n=3 campaign is needed unless a final result is near the gate.

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
@YashJayswal24

Copy link
Copy Markdown
Author

Pushed the rest of the punch list from the latest review — F1→F2 in judge.py (with checked regressions), the remaining prose leak ("number 70" example), and faster-whisper baked into the Dockerfile (build + offline transcription verified locally with --network none). Commit d7e5d1d. Details on #60: #60 (comment)

@YashJayswal24

Copy link
Copy Markdown
Author

@techgenmini can you check it out

@techgenmini

Copy link
Copy Markdown
Collaborator

Thanks — I checked d7e5d1d. The F2 implementation and expected regression values are coherent, the remaining prompt leak and clock wording are fixed, and the Dockerfile now includes the intended faster-
whisper setup. This was a static review; I did not independently rerun the Docker build or offline transcription.

I also see from your #60 update that the exact Game Book pin/references, full 13-row observability audit—including the three declined fouls—and final-prompt calibration are still in progress. Because that
audit may change the retained event set and scorer, I’ll treat this as a good progress checkpoint rather than a merge-ready re-review and wait for the completed batch.

One small reproducibility item to fold in before final runs: small.en is currently cached without an exact Hugging Face revision. Please pin its snapshot, or freeze and record the exact final image digest
used for calibration.

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Task Proposal] Super Bowl LI referee-announced player-foul timeline

2 participants