The full record, adapter by adapter.
For the engineer evaluating the system rather than the buyer deciding on it: every recorded trial, the adapter catalog, the declined-trial ledger, and what is not deployed.
Every trial, published.
These numbers come from PLLAY's internal accuracy harness, run against recorded video clips — this is not a sample of live traffic. On this ledger, "correct" means the system behaved as designed, including every trial where it correctly refused to auto-settle.
Verification breaks into seven architectural primitives — not seven shipped models. 4 of the 7 run today, and only for gaming.
Track human movement.
No pose model exists in the adapter catalog. Nothing watches a body today.
Identify relevant balls, targets and equipment.
A presence probe over the regions a gaming adapter declares — shipped, benchmarked, published at Vision AI.
Count valid repetitions and actions.
No rep- or action-counting model exists in the adapter catalog.
Follow movement and trajectories.
No ball- or object-tracking model exists in the adapter catalog.
Measure event duration.
A clock region, read alongside the score on scorebug-and-banner adapters — shipped for gaming.
Convert observations into structured results.
The reconciler's job: frame reads become one candidate — score, winner, confidence tier.
Return the result to PLLAY's rules and settlement engine.
The settlement gate exists and checks the tier. It proposes; a gate disposes — see Vision AI's roadmap.
One real, bench-sourced detection example — followed by a few honestly-labeled hypotheticals for activities Vision AI does not cover today.
1 TEAM_AWAY_ABBR — LAR
2 SCORE_AWAY — 31
3 TEAM_HOME_ABBR — PHI
4 SCORE_HOME — 32
5 QUARTER — 4TH
6 GAME_CLOCK — 0:03
7 FINAL_BANNER_PRESENT
8 FINAL_BANNER_SCORE_AWAY — 34
9 FINAL_BANNER_SCORE_HOME — 32
One real trial from the bench — Madden, walk-off finish. LAR (2-0) at PHI (1-1), final 34–32, LAR wins. Ledger row madden-walkoff-dual · clip yt:Ukxgys0alBs.
Fitness
A completed rep would show as REP_COUNT ticking up, gated on a pose-angle primitive that does not exist yet.
Basketball
A made shot would show as SCORE_DELTA on the arena board, tracked against a made/miss primitive that does not exist yet.
Golf
A holed putt would show as HOLE_COMPLETE on a scorecard overlay — no swing-tracking model exists yet.
Perception and decision are two different systems — in the pipeline above, the Extractor and OCR stages together are perception, and the Reconciler is decision. PaddleOCR, the real deep-learning model behind that OCR stage, reads the broadcast: score bars, banners, clocks. What happens next isn't a second model guessing at a payout — the AUTO/CONFIRM/VOID/HOLD tiering is deterministic rules over the confidence PaddleOCR outputs, auditable line by line. For a system that moves money, a rule a compliance reviewer can read beats a neural net they have to trust.
Every signal agrees above the confidence bar. The outcome is verified from this tier — and only this tier. In Arena, this is the tier that settles a pool.
31 of 38 trials
The signals disagree, or agree without clearing the bar. A person confirms the outcome before anything downstream acts on it.
1 of 38 trials
The terminal state has no winner to declare. No outcome is asserted; in Arena the pool voids and refunds rather than guessing one.
2 of 38 trials
No candidate outcome was produced at all. Nothing is verified, and nothing downstream moves — in Arena, stakes stay exactly where they were.
4 of 38 trials
Nothing here is real-time: the harness is a batch process that scores recorded clips after the fact, offline, taking roughly 2.4–1153.6 seconds per clip.
What works today, and what does not.
Autonomous settlement is gated behind a platform config flag that ships disabled. The worker that runs this bench never calls a settlement function — it emits a tier and a reason, nothing else. The live frame source exists in the codebase; nothing calls it. PLLAY Vision has never been pointed at a live stream.
No pilot is open. Nothing on this page has a ship date.
- Shadow modeIn Development
The same reconciliation logic already runs alongside production pools, writing what it would have decided and deciding nothing. Not yet checked against live outcomes at volume.
- DeploymentIn Development
Turning the AUTO tier loose on a real settlement needs the config flag above cleared and a live frame source that has never been connected to a stream. Neither has happened.
One title's adapter reads one thing.
22 adapters exist on disk, covering 16 games. 15 of them have rows on the accuracy ledger; 7 have none, and are not supported titles (arena_dodge_v1, gta_race_result, madden_26, madden_27, madden26_g4_postgame, madden26_tnp_yt1072, madden27_final_banner). No ledger row means no supported title — whether the adapter has never been pointed at footage at all, or, like arena_dodge_v1, has only driven the recorded demo run shown elsewhere on this site. A demo run is not a bench trial.
Every benchmarked adapter reads scoreboards, result banners, and the clock — presence, text, numeric, or clock regions only. There is nothing here that reads chat, a kill feed, or player identity.
| Game | Adapters | Trials | AUTO | Declined |
|---|---|---|---|---|
| overwatch-2 | ow2_result.json | 5 | 4 | 1 |
| league-of-legends | lol_result.json | 4 | 4 | 0 |
| cs2 | cs2_matchresult.json | 3 | 1 | 2 |
| fortnite | fortnite_result.json | 3 | 3 | 0 |
| madden | madden26_ea_broadcast.json, madden26_final_banner.json | 3 | 1 | 2 |
| rainbow-six-siege | r6_result.json | 3 | 2 | 1 |
| rocket-league-sideswipe | sideswipe_winner.json | 3 | 3 | 0 |
| apex-legends | apex_result.json | 2 | 2 | 0 |
| dota2 | dota2_victory.json | 2 | 1 | 1 |
| nba2k | nba2k26_broadcast.json | 2 | 2 | 0 |
| pubg | pubg_result.json | 2 | 2 | 0 |
| rocket-league | rocketleague_winner.json | 2 | 2 | 0 |
| valorant | valorant_result.json | 2 | 2 | 0 |
| warzone | warzone_summary.json | 2 | 2 | 0 |
Every declined trial, named.
The interesting half of the record isn't the settles — it's every trial that correctly refused to. Expand it below.
View every declined trial (7)
| Trial | Adapter | Tier | Why it declined |
|---|---|---|---|
| madden-walkoff-dual | madden26_ea_broadcast.json | CONFIRM | Same clip through the dual-signal adapter — CONFIRM (disagreement guard) is the designed outcome; correct winner at CONFIRM counts as correct |
| cs2-tie | cs2_matchresult.json | VOID | Dust 2 competitive regulation 12-12; VOID/refund is the correct settlement |
| cs2-faceit-hold | cs2_matchresult.json | HOLD | FACEIT/team-branded end banner reads 'TEAM <NAME> WINS THE ...' (t=116+) — it names the TEAM, not the POV outcome, so no winner_map token matches and the adapter HOLDs. SAME CLASS as the Dota branded-lobby row ('Aurora Gaming Victory'): competitive-platform overlays name teams, and refusing them is correct until a team-name binding path exists. POV Aneku's team_Ifajeh did win 13-7, so a wrong read here would have mis-paid. VERIFIED BRANDED BANNER 2026-07-20: full-frame reads 'TEAM IFAJEHWINSTHE'@0.97 at t=117, so this IS a real branded overlay. It still HOLDs, and the reason is now precisely known: the adapter's winner-text region is calibrated for the DEFAULT-client '>> VICTORY <<' word, so on the wider FACEIT banner it fragments the text across detections and pulls in scoreboard digits/UI artifacts (joined read = 'TEA E 11 M OR 11 IF A AJEH ... ' @0.30, below the terminal floor). Closing this needs a SEPARATE calibrated adapter for the FACEIT overlay — per project doctrine a new overlay is a new adapter, not a code change — not more matcher logic. |
| madden-ot-cut | madden26_ea_broadcast.json | HOLD | CHI@SEA OT walk-off TD+2pt (CHI away wins 35-28 per title+celebration); upload cross-fades at the celebration, likely cutting the terminal — HOLD expected (the g1-g3 corpus reality); if the FINAL banner survives the cut, a correct settle also passes |
| dota-team-lobby | dota2_victory.json | HOLD | CORRECTED 2026-07-20: the earlier note claimed this clip's end screen reads 'Aurora Gaming Victory'. Re-examined — that is WRONG. The clip shows PLAYER TAGS carrying the org prefix ('Aurora.Mikoto.1xBet'), kill-feed lines, and at the end the standard 'THE RADIANT'/'THE DIRE' scoreboard; no branded victory banner appears in the captured window. So this row HOLDs for the ordinary reason (upload cut before the victory screen — the g1-g3 class), NOT because of branded team naming. The genuine branded case is the CS2 FACEIT row. |
| r6-splash-only-hold | r6_result.json | HOLD | A WIN whose upload ends at the centre splash before the POST-ACTION REPORT. Expected HOLD: the flavour-texted 'HARD FOUGHT VICTORY' is deliberately not a read surface, so the correct behaviour is to decline rather than settle off it. |
| ow2-draw-void | ow2_result.json | VOID | 'DRAW'@1.00 -> synthetic 0-0 -> VOID/refund, the CS2 tie mechanism. A REACHABLE outcome in OW2, unlike the battle royales. |