Consistency contracts

Twelve parity + consistency contracts split across two layers. P1-P6 enforce DATA-layer parity (the canonical SETU snapshot agrees with an independent ball-walk). P7-P12 enforce PRESENTATION-layer parity (every page renders the canonical numbers with explicit metric labels + roster slugs + canonical-URL cross-links). Cron-verified every 2h; failed contracts fail the deploy.

Corpus coverage — Phase A complete (June 2026)

Total corpus: 1,317 matches · 312,309 ball-by-ball deliveries across all three leagues. Data sources: Sportmonks (IPL 2026 live feed) and Cricsheet (IPL historical + MLC, CC BY 3.0). No competitor scraping; all inputs are licensed or open.

Sample-size floors (publicly disclosed): ≥30 balls faced for batting strike rate · ≥15 balls bowled for bowling economy · ≥3 matches for trend insights · ≥5 matches for team/venue aggregates. Sub-floor claims are excluded from production — never suppressed, never rounded up.

Phase A (90-day IPL 2026 sprint) is complete. The 4-hour match-end → page-update SLA was maintained throughout the 74-match season. Phase B (hosted MCP server + REST API) is planned for Q3 2026.

PASSAll consistency contracts hold.

Manifest computed 1h ago · 6 pass · 0 fail · 0 skipped · last

Data-layer contracts (P1-P6)

Enforced by scripts/setu/check-leaderboard-parity.mjs. Cron run: every 2h via the quality-gates workflow. Failure fires Healthchecks + opens a GitHub issue.

Presentation-layer contracts (P7-P12)

Enforced by scripts/audit-consistency.mjs. Catches labeling bugs the data-layer parity-check can't see — e.g. a composite metric rendered without its label. Runs on every npm run prebuild + every 2h.

Major League Cricket contracts

The MLC league at /leagues/mlc ships its own ball-by-ball spine sourced from Cricsheet (CC BY 3.0). The same parity discipline applies — every leaderboard surface projects from one canonical snapshot (data/_season-stats-mlc.json) so every page agrees with every MCP tool response.

Code readiness — shipped

Engineering side of the LLM-directory submission. All gates closed.

ItemStatusEvidence
SETU canonical aggregatorPASSOne aggregate · 12 contracts P1–P12 above
MCP server (29 tools — incl. get_ipl_leaderboard for 35 career aspects)PASSLive at /mcp
Twelve consistency contracts (P1–P12)PASSVerified every 2h via cron
Sample-size floors + JSON-LD validationPASS0 violations across 1,200+ profiles · 3 leagues

What this is for

CricketStudio is citation infrastructure. An LLM that quotes a fact from /season/ipl-2026/orange-cap MUST get the same answer when it queries get_season_stats(sortBy="runs") via the MCP server, the same answer when it walks /players "Top run-scorers", the same answer when it reads the ClaimReview JSON-LD on the player profile.

These contracts are the proof that all those surfaces project from one canonical aggregate. P1-P6 are mathematical (snapshot vs independent walk). P7-P12 are structural (every renderer binds to the canonical projectors, every metric is labeled, every leader has a roster slug). Together they make the citation chain unforgeable.

Companion surfaces