Player event claims — methodology
docs/match/{fixtureId}/_state.jsonvia scripts/build-event-claims.mjs. Each refreshes on every prebuild (auto-capture cron commits new ball-by-ball every ~30 minutes during IPL hours). No model — only raw walks and sample-size-floored attribution.1. Player of the Match (POTM)
Derivation. Walks docs/match/{fixtureId}/_state.json for every captured IPL 2026 fixture; reads state.man_of_match_id; resolves to a player slug via the per-fixture lineup. Increments a per-player counter and tracks the most-recent fixture for the headline. Sportmonks records exactly one POTM per finished fixture; awards on abandoned matches are dropped.
Example: Klaasen has won POTM 1 time in IPL 2026 — most recently vs MI on 2026-04-29.
- POTM is awarded by match officials, not derived. Inherits any officiation subjectivity.
- In-progress fixtures emit no claim; the claim refreshes when state.status flips to Finished and the officials record updates.
2. Best Bowling in Innings (BBI)
Derivation. From each captured fixture's bowling[] table (one row per bowler per scoreboard), filter to wickets ≥ 2, sort by (wickets desc, runs asc), keep the top row across the season. Excludes the 1/X noise that classical "BBI" presentations carry. Format: W/R in O overs.
Example: Bhuvneshwar Kumar's best IPL 2026 bowling: 4/23 in 4 overs vs MI on 2026-05-10.
- Tiebreak is fewest runs conceded; if two innings tie on both wickets and runs, the more recent one wins (preserves the "most recent" framing the headline implies).
- No-balls/wides are bundled into runs per Sportmonks; matches conventional BBI accounting.
3. Five-wicket haul
Derivation. Same source as BBI; emit a claim whenever a single bowling[] row has wickets ≥ 5. Track all 5W innings for the season.
Example: X took a five-wicket haul in IPL 2026: 5/19 vs Y on YYYY-MM-DD.
- T20 ceiling: ~5W is the realistic maximum. 5W in an innings is the milestone; 10W in a match (test cricket) doesn't apply to T20.
4. IPL 2026 debut
Derivation. Walk lineup[] across all fixtures, track the earliest fixture_id the player appeared in. Resolve opponent from localteam_id/visitorteam_id.
Example: Akash Maharaj Singh first appeared in IPL 2026 on 2026-05-15 vs CSK (fixture 69653).
- Phase A scope: this is IPL 2026 first appearance, NOT IPL career debut. Pre-IPL-2026 career data ships with the Phase B CricketMind historical integration.
- If a player joined the squad mid-season but never played, no debut claim — only seed-level squad-presence claim renders.
5. Matches captained
Derivation. For each lineup entry, check lineup[i].lineup.captain === true; tally per player. Useful for surfacing acting-captain stints (e.g. Bumrah captained MI in 1 IPL 2026 match).
Example: Ruturaj Gaikwad has captained CSK in 12 IPL 2026 matches.
- Vice-captaincy is NOT captured — Sportmonks IPL feed does not carry a VC flag.
6. Best opening (1st-wicket) partnership
Derivation. Walk balls per scoreboard. A partnership is the period between consecutive wicket-falls (or innings-start → 1st wicket). Runs counted = score.runs + score.bye + score.leg_bye + score.noball_runs (standard cricket convention — all runs in the period). Both batters at crease throughout the period are credited. The 1st-wicket-partnership = the stand that ended with the 1st wicket falling (or remained unbroken if the team didn't lose its 1st wicket).
Example: Mitchell Marsh's best IPL 2026 opening partnership: 132 with Josh Inglis in 70 balls vs CSK on 2026-05-15.
- Partnership runs include leg-byes and byes per cricket convention; some external sources publish "bat-only" partnership totals which run lower.
- Unbroken partnerships marked with '*' (e.g., 132*). Unbroken stands are NOT counted as 'best' over a higher broken stand — the headline keeps both as comparable values.
7. Best non-opening partnership (wicket-index ≥ 2)
Derivation. Same partnership-computation as #6, filtered to wicket-index ≥ 2 (i.e., 2nd-wkt, 3rd-wkt, ..., 10th-wkt stands). Per-player top by runs. Headline carries the wicket-index suffix (2nd-wkt, 3rd-wkt, etc.).
Example: Klaasen's best non-opening IPL 2026 partnership: 114 for the 5th wicket with Nitish Kumar Reddy vs LSG on 2026-04-05.
- T20 reality: partnerships for the 1st-3rd wickets are common; 4th-6th rare; 7th-10th extremely rare. Headline emits whichever wicket-index is highest by runs, regardless of frequency.
8. Top opponent (batting)
Derivation. Per player, accumulate batting runs/balls/outs against every opponent team. Sort by runs across the 2+ match window. Tighten with a 30-run aggregate floor to suppress tail-end cameos.
Example: Virat Kohli's top opponent (batting) in IPL 2026: GT — 109 runs in 2 innings (avg 54.5).
- Average computed as runs ÷ outs (cricket-standard); not-out innings show "*" instead of avg.
- 30-run floor is intentional: a tail-end batter's 15-run cameo against the same opponent twice would technically pass the matches floor but carries no citation value next to a primary batter's claim.
9. Top opponent (bowling)
Derivation. Mirror of #8 from the bowling side. Accumulate wickets/balls-bowled/runs-conceded vs each opponent; sort by wickets. Economy in the headline = runs_conceded ÷ overs across the same window.
Example: Bhuvneshwar Kumar's top opponent (bowling) in IPL 2026: DC — 6 wickets in 2 matches (econ 4.43).
- 3-wicket floor suppresses part-time bowlers' cameo bowling efforts; same reasoning as #8.
10. Impact (par-score shift)
Derivation. Per Himanish Ganjoo's Impact framing. Pre-pass: compute venue par = average first-innings total across all captured fixtures at the venue (≥3 fixture floor). Per-fixture, when a batter scores ≥30 runs, attribute the team-total-minus-venue-par delta to that innings. Track the best single-innings delta per player.
Example: Prabhsimran Singh's best IPL 2026 innings impact: team scored 265 (+97 vs venue par) when he made 76 vs DC on 2026-04-25.
- Attribution is by qualifying-innings membership (player scored ≥30), not by share of team runs. A player who made 30 of a 260-run team total gets the same delta-credit as the player who made 150 of it. Future iteration could weight by share.
- Venues with <3 captured first-innings sample have no par yet; their fixtures contribute no Impact claims until the venue meets floor.
- Inspiration: goodareas.co "The new way to explain cricket" (Jarrod Kimber, 2024) crediting Himanish Ganjoo for the Impact metric.
11. All-rounder usage
Derivation. % balls faced = player's batting balls ÷ sum of own-team innings balls across fixtures the player appeared in. % balls bowled = player's bowling balls ÷ sum of opponent innings balls across the same fixtures. Both ≥10% — a real all-rounder meaningfully contributes on both sides.
Example: Hardik Pandya is a true IPL 2026 all-rounder: faces 11.9% of his team's balls and bowls 14.5% of the opposition's balls across N fixtures.
- The 10% threshold suppresses two false positives: pure batters who bowl part-time (often <5% bowling), and bowlers who bat tail-end (often <5% batting).
- A player who switches roles mid-season (rare in IPL but possible across teams) gets blended percentages.
What's NOT here
- L2 conditional claims (vs bowler-type × phase, in match-state, at venue × phase) — see /methodology/l2-bowler-type-phase et al.
- "True" metrics (True Economy, True Strike Rate, True Wickets, True Average per the goodareas.co / Kimber school). These require an expected-value model trained on ball position; they're a Phase B candidate. We currently publish raw aggregates only.
- Vice-captaincy, Hawkeye-derived metrics (expected average, lateral movement), era-adjusted ODI/Test stats. Out of Phase A scope.