Research · Phase 1 proof-of-concept
What public data supports today, and what it doesn't yet.
We built the corpus and a first pose-physics pipeline on public broadcast video. The corpus is large. The first features show no measurable separation between correct and incorrect calls at n=54. That is the result expected at this sample size and this tracking quality, so we report it as a null.
Public, graded, and large
Every row carries the league's own grade of the call. Public pages only, about one request per second, every download cached.
-
Last Two Minute events
79,974
3,893 games, 2017-18 to 2025-26. 96% have a downloadable broadcast clip.
-
Coach's challenges
5,990
2019-20, 2020-21, 2023-24, 2024-25, 2025-26. Overturn rate rose from 40% to 64%.
-
Clips processed
56 clips · 644 MB
14 each of CC / IC / CNC / INC. Shooting, personal and offensive fouls, 2024-25 and 2025-26.
| Decision | Meaning | Events |
|---|---|---|
| CNC | Correct non-call | 56,378 |
| CC | Correct call | 17,318 |
| INC | Incorrect non-call | 4,170 |
| IC | Incorrect call | 690 |
| blank | Unparsed or "undetectable" | 1,415 |
Incorrect calls are rare: 0.9% of graded events. That rarity drives the sample-size math below. 2015-16 and 2016-17 L2M index pages return 404. 2021-22 and 2022-23 challenge results were not found live or archived. Challenge clips: in progress (links collected, not yet downloaded). Season-by-season breakdowns of this corpus are on the Numbers page.
From a graded event to physics features
Broadcast video today; the pilot brings the arena feed. The pipeline stays the same and only the pose source changes.
Locate the event. L2M gives only the game clock. On-device OCR reads the scorebug and syncs the event to video time. This synced 34 of 56 clips; the other 22 use the median clip offset (event about 11.3 s in), the same rule for every decision class so timing can't leak the label.
Track pose. A 2D pose model with multi-object tracking over a four-second window around the event, with camera translation and shot cuts stored per frame.
Pick the contact pair. On-court players in different jerseys with feet at a similar image depth, closest skeleton gap within ±1.2 s of the event.
Measure. Camera-stabilised, in units of player height: approach speed, minimum skeleton gap, post-contact torso and head deviation, reaction latency, an embellishment ratio, and the defender's verticality.
Pose at the contact frame
The broadcast frame is blurred out; only the tracked skeletons are drawn. Trails show hip paths over ±0.6 s.
- Reactor (larger post-contact deviation)
- Initiator
- Other detections
-
Correct pairOffensive foul, correct non-call (CNC)A screen on a defender. The auto-picked pair is right. -
Correct pairShooting foul, incorrect non-call (INC)Contact on a shot that the review says should have been called. -
FailureIncorrect call (IC), wrong pairThe auto-pair picks a sideline person and a far player. This is the main failure mode.
Separation check: none at n=54
Labels come from the L2M review. Leave-one-out logistic regression on 6 features, 200-permutation null, bootstrap 95% CI.
No measurable separation between correct and incorrect calls at n=54.
The permutation p-values are the test, and none is below 0.60. LOO AUCs well below 0.5 are a known leave-one-out artifact on null data, not anti-prediction.
| Task | Question | n (pos) | LOO AUC | 95% CI | Permutation p |
|---|---|---|---|---|---|
| foul_truth | Did a foul occur? (CC+INC vs IC+CNC) | 54 (27) | 0.26 | 0.13–0.40 | 0.93 |
| cc_vs_ic | Among whistles, was it right? | 26 (13) | 0.33 | 0.13–0.55 | 0.60 |
| inc_vs_cnc | Among non-calls, was a foul missed? | 28 (14) | 0.09 | 0.00–0.23 | 0.98 |
Strongest single features: none survives 36 tests; the minimum p is 0.12. The two directional hints are physically sensible but within noise: on correct whistles the defender was more upright (3.5° vs 7.9° from vertical), and missed fouls show bigger post-contact head displacement. Two of 56 clips were dropped because the auto-picked pair was visibly wrong (one CC, one IC); the audit images showed the label, so the exclusion was not label-blind.
| Target AUC | Clips per class |
|---|---|
| 0.60 | 130 |
| 0.65 | 57 |
| 0.70 | 32 |
| 0.75 | 20 |
The corpus holds 690 IC and 4,170 INC events, so 150–300 clean clips per class is reachable from public data alone. The bottleneck is contact-pair accuracy, not data.
What this does not show
Read the result with these in mind.
- One broadcast angle, 2D.Depth is guessed from foot height in the image and camera zoom isn't compensated. Contact force, timing and the cylinder rule are 3D quantities; broadcast pose sees a projection at about 170 px per player.
- Heuristic pair and role identity.In a visual audit of 16 of 56 auto-picked pairs, 13 were ok, 1 partial and 2 wrong. Reactor and initiator are assigned by behaviour, not the L2M committing and disadvantaged player. Occlusion at contact causes tracking ID switches.
- Labels and sample.n=54. Incorrect calls are 0.9% of the corpus, and L2M grades only the last two minutes of close games. All 56 clips are from 2024-25 and 2025-26. Event time is ±0.5 s where the clock shows M:SS, and 22 clips use the median offset.
- Pooled play types.Shooting, personal and offensive fouls are pooled, though their physics differ: a charge is about position, a shooting foul about arm contact.
Open work
No numbers yet for any of these.
- Scale the labelled set to 150–300 clips per class from the existing corpusIn progress
- Fix identity first: jersey-number OCR plus team colour, and appearance re-identification to cut ID switchesIn progress
- Per-play-type models (block/charge, shooting arm contact, displacement fouls)In progress
- Coach's challenges as a second label source: an overturn means the on-floor call was wrongIn progress
- Separation result on a larger, label-blind audited setIn progress
Proof-of-concept in development on public data. Applying to NBA Launchpad 2027.