L2 — Player vs Bowler-Type × Phase
Period: IPL 2026. Sample-size floor: ≥20 balls faced. Suppressed cells render the URI with the parent L1 link instead of metrics.
Conditioning dimensions
- bowler_type — pre-classified from each ball's recorded bowling style on the live ball-by-ball feed (per-delivery, not the player roster). Falls back to "unknown" for unparseable styles; unknown is surfaced as a separate bucket, never silently merged.
- phase — powerplay (overs 1-6), middle (7-15), death (16-20). Classified from each ball's over-position on the live feed.
Sample-size floor + rationale
≥20 balls faced per cell.
Suppression rule
URIs stable across versions per the extension doc §5.2. Below floor: page renders the suppression message, MCP + REST APIs return `suppressed: true` + `metrics: null`. Above floor: positive claim with metrics.
Update cadence
Recomputed after every captured fixture (auto-capture cron) + daily full rebuild as a safety net.
Known limitations
- Phase A period is single-season IPL 2026. Sample sizes roughly double when Phase B widens the period to include IPL 2025 historical (CricketMind integration).
- Bowler "unknown" bucket captures unparseable styles — surfaced separately so the share is visible.
- §10.5 distribution check: ~16.5% of cells clear the ≥20 balls floor in the Phase A corpus. Remaining cells render as suppressed URIs (URI stability preserved per §5.2).
Change log
- 2026-05-13
Consumed by
UC1: /players/{slug}/vs/{bowler-type}/phase/{phase}/