Player event claims — methodology

Every event-derived claim on a CricketStudio player profile — how it's computed, what data backs it, the sample-size floor, and known limitations. One section per metric.

At a glance. 11 derived claim types ship on every IPL 2026 player profile. All derive from the ball-by-ball capture at 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)

metricId: season_potm_total · Pillar: P2 · Floor: ≥1 award

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.

2. Best Bowling in Innings (BBI)

metricId: season_bbi · Pillar: P2 · Floor: ≥2 wickets

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.

3. Five-wicket haul

metricId: season_5w_total · Pillar: P2 · Floor: ≥5 wickets in a single innings (self-floored milestone)

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.

4. IPL 2026 debut

metricId: season_debut_fixture · Pillar: P1 · Floor: universal (always emitted when player has any captured appearance)

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).

5. Matches captained

metricId: season_captaincy_total · Pillar: P3 · Floor: ≥1 match 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.

6. Best opening (1st-wicket) partnership

metricId: season_best_opening_partnership · Pillar: P2 · Floor: ≥30 runs partnered

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.

7. Best non-opening partnership (wicket-index ≥ 2)

metricId: season_best_non_opening_partnership · Pillar: P2 · Floor: ≥30 runs partnered

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.

8. Top opponent (batting)

metricId: season_best_opp_runs · Pillar: P3 · Floor: ≥2 matches vs the opponent AND ≥30 runs aggregated

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).

9. Top opponent (bowling)

metricId: season_best_opp_wickets · Pillar: P3 · Floor: ≥2 matches vs the opponent AND ≥3 wickets aggregated

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).

10. Impact (par-score shift)

metricId: season_best_impact · Pillar: P3 · Floor: ≥30 runs in the innings + venue has ≥3 captured first-innings sample

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.

11. All-rounder usage

metricId: season_usage_all_rounder · Pillar: P3 · Floor: BOTH ≥10% (batting balls faced AND bowling balls bowled)

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.

What's NOT here