Built and run by one person.

Validations

Cricket data · the data behind db-mcp.tigzig.com

Everything tallies, end to end

Served-data checks last run 19 Oct 2026, 11:20 IST (05:50 UTC). Refreshed twice a day, and every run is published, pass or fail.

The chain, in the order the data travels

1. Cricsheet to masterThe pipeline downloads the source, builds a master file, and runs its own checks before it lets the new master replace the old one.
all 52 checks passed · 15 Oct 2026, 10:08 IST (04:38 UTC)
2. Master to servedA separate guard compares what db-mcp serves against what the pipeline says it wrote, slice by slice, so a stalled or half-applied refresh cannot look green.
all 21 comparisons tally · 19 Oct 2026, 11:05 IST (05:35 UTC)
3. Served data, over the public APIThis battery runs against what the API actually returns, on both engines, and publishes every result below.
all 22 checks passed

1. Cricsheet to master

Last build that loaded new data: 15 Oct 2026, 10:08 IST (04:38 UTC), 46 matches added, 52 of 52 checks passed. Since then the pipeline has run 9 more times and found nothing new at the source; the latest was 19 Oct 2026, 10:08 IST (04:38 UTC).

ResultCheckExpectedActual
PASSZIP vs DB match count (T20)58105810
PASSZIP vs DB match count (ODI)32133213
PASSZIP vs DB match count (TEST)920920
PASSZIP vs DB match count (IPL)12431243
INFOCricsheet duplicate player-of-match rowsreported as filed, not corrected1 match(es) list the same player twice: 1394759
PASSCricsheet published counts tallyour counts within 5 of cricsheet's published figuresexact tally on every format and gender
PASSSource CSV matches DB values (sampled)0 mismatches over 150 matches / 604,568 field comparisonsverbatim match
PASSNo unknown cricsheet info keys37 consumed + 0 declinedno unknown keys
INFONon-match files in zips are skipped, not ingestedreported, not judged1 skipped: ['IPL:all_matches.csv']
The other 43 checks the pipeline ran on that build, by family

Integrity of the master

ResultCheckExpectedActual
PASSNo orphan ball_by_ball match_ids00
PASSNo NULL match_type / start_date0type=0 date=0
PASSNo NULL team1/team200
PASSNo teams lost131 old teams all present131 teams, missing: none
PASSWinner is team1/team2/NULL00
PASSToss winner is team1/team2/NULL00
PASSNo duplicate match_ids00
PASSNo negative runs_off_bat00
PASSAll wicket types recognizedknown types onlyall known
PASSSchema identical (column names, order, types)staging schema == live schemaidentical
PASSAll expected tables present in staging4 tables: ['match_info', 'ball_by_ball', 'match_players', 'people']all present

Cricket rules in the master

ResultCheckExpectedActual
PASSInnings domain valid per formatTEST 1-4; ODI/T20 innings>2 only as a short super over0 violations; max innings {'T20': 8, 'ODI': 4, 'TEST': 4, 'IPL': 6}
PASSNo innings exceeds 10 dismissalsmax 10 per innings0 innings over 10; observed max 10
PASSNo-result share per format in band{'TEST': (12.0, 28.0), 'ODI': (2.0, 10.0), 'T20': (1.0, 8.0), 'IPL': (0.5, 8.0)}in band: {'T20': 2.9, 'ODI': 4.9, 'TEST': 19.5, 'IPL': 2.0}
PASSDuplicate ball slots explained by long overs00 duplicate slots not inside a 10+ delivery over
PASSMulti-value fields ordered and consistent0 on every invariantall consistent

Nothing lost since the previous run

ResultCheckExpectedActual
PASSMatch counts by type+gender never regressall segments new >= oldnone
PASSDelivery counts by type never regressall types new >= oldnone
PASSMax date per type extends or staysnew max >= old max ({'T20': '2026-10-07', 'ODI': '2026-10-05', 'TEST': '2026-09-09', 'IPL': '2026-05-31'}){'T20': '2026-10-14', 'ODI': '2026-10-14', 'TEST': '2026-10-09', 'IPL': '2026-05-31'}
PASSAll old match_ids preserved11140 old ids all presentlost: 0
PASSSpot-check: 50 old matches identical delivery counts0 mismatches0 mismatches
PASSRetained matches: per-delivery values unchangedidentical sums over 11140 retained matchesno drift
PASSRetained matches: metadata values unchangedidentical team/winner/toss/venue/date/gender profileno drift

Player registry

ResultCheckExpectedActual
PASSEvery match has a full player registry0 matches with fewer than 12 named people0 thin/absent
PASSPlayer identifiers are 8-char hex00
PASSOne row per person per match0 duplicate names, 0 duplicate idsnames=0 ids=0
PASSPlayer role values recognizedparts drawn from ['match_referee', 'player', 'reserve_umpire', 'tv_umpire', 'umpire']all recognized
INFORegistry names cricsheet does not placereported, not judged1542 rows with no role
INFONamed officials absent from the match registryreported, not judged5 rows with no identifier
PASSBall-by-ball names resolve in the match registry>= 99.95% of name references resolve99.9937% (977 of 15,516,679 unresolved)

Player master

ResultCheckExpectedActual
PASSPeople identifiers unique00
PASSPeople row count in band14,000 - 30,00018,651
PASSEvery match identifier exists in people00

Plausibility bands

ResultCheckExpectedActual
PASSAvg deliveries/match in expected band{'TEST': (1000, 2500), 'ODI': (300, 700), 'T20': (150, 400)}all in band
PASSICC classification distribution stableper-class change <= 102 appearances{"Full Member": 11463, "Associate": 6402, "null": 2486, "Associate-ODI": 2021}
PASSAdded match volume plausible<= 1500 added46

Post-deploy: live counts equal what was built

ResultCheckExpectedActual
PASSPost-deploy: live match counts == staging{"IPL|male": 1243, "ODI|female": 617, "ODI|male": 2596, "T20|female": 2183, "T20|male": 3627, "TEST|female": 24, "TEST|male": 896}{"IPL|male": 1243, "ODI|female": 617, "ODI|male": 2596, "T20|female": 2183, "T20|male": 3627, "TEST|female": 24, "TEST|male": 896}
PASSPost-deploy: live delivery count == staging50804315080431
PASSPost-deploy: live match_players count == staging296267296267
PASSPost-deploy: live people count == staging1865118651

Reported, not judged

ResultCheckExpectedActual
INFOLow-delivery matches (<20, abandoned)17
INFOVenue/city qualityvenues 608->608, null city 634

Changes to matches already published

ResultCheckExpectedActual
PASSOld matches changed by this build (every column)0 changed (observed only, never blocks)no old match changed in any column

Changes to matches already published

Each build compares every match already in the master with the new build, column by column, in every table. When cricsheet corrects a match it published earlier, such as a player's name, a venue or a scorecard entry, the change is listed here with the old and new value. Corrections are applied, not held back. The last five builds are shown.

15 Oct 2026, 10:08 IST (04:38 UTC) · no match already published was changed; 46 new matches added
08 Oct 2026, 16:16 IST (10:46 UTC) · 5 matches already published changed; 62 new matches added
MatchTableColumnRowsOld valueNew value
Portugal v Norway, 2025-04-07, T20 femaleball_by_ballnon_striker29S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-07, T20 femaleball_by_ballplayer_dismissed1S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-07, T20 femaleball_by_ballstriker40S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-07, T20 femalematch_playersidentifier15ba89b1141f8d757
Portugal v Norway, 2025-04-07, T20 femalematch_playersperson_name1S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-08, T20 femaleball_by_ballfielder_12S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-08, T20 femaleball_by_ballnon_striker71S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-08, T20 femaleball_by_ballstriker59S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-08, T20 femalematch_playersidentifier15ba89b1141f8d757
Portugal v Norway, 2025-04-08, T20 femalematch_playersperson_name1S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femaleball_by_ballfielder_13S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femaleball_by_ballnon_striker66S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femaleball_by_ballstriker53S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femalematch_infoplayer_of_match11S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femalematch_playersidentifier15ba89b1141f8d757
Norway v Portugal, 2025-04-09, T20 femalematch_playersperson_name1S Foo-RylandSV Collyer
Portugal v France, 2026-04-06, T20 maleball_by_ballfielder_11Deep HarianH Khuttan
Portugal v France, 2026-04-06, T20 malematch_playersidentifier179a292799c48bdee
Portugal v France, 2026-04-06, T20 malematch_playersperson_name1Deep HarianH Khuttan
Sweden v Indonesia, 2026-04-11, T20 maleball_by_ballbowler13Deep HarianIda Bagus Nara
Sweden v Indonesia, 2026-04-11, T20 maleball_by_ballplayer_dismissed1Deep HarianIda Bagus Nara
Sweden v Indonesia, 2026-04-11, T20 maleball_by_ballstriker1Deep HarianIda Bagus Nara
Sweden v Indonesia, 2026-04-11, T20 malematch_infovenue1Udayana Cricket GroundUdayana Cricket Ground, Bali
Sweden v Indonesia, 2026-04-11, T20 malematch_playersperson_name1Deep HarianIda Bagus Nara
08 Oct 2026, 10:08 IST (04:38 UTC) · 5 matches already published changed; 62 new matches added; this build was held back by the pipeline's checks
MatchTableColumnRowsOld valueNew value
Portugal v Norway, 2025-04-07, T20 femaleball_by_ballnon_striker29S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-07, T20 femaleball_by_ballplayer_dismissed1S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-07, T20 femaleball_by_ballstriker40S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-07, T20 femalematch_playersidentifier15ba89b1141f8d757
Portugal v Norway, 2025-04-07, T20 femalematch_playersperson_name1S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-08, T20 femaleball_by_ballfielder_12S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-08, T20 femaleball_by_ballnon_striker71S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-08, T20 femaleball_by_ballstriker59S Foo-RylandSV Collyer
Portugal v Norway, 2025-04-08, T20 femalematch_playersidentifier15ba89b1141f8d757
Portugal v Norway, 2025-04-08, T20 femalematch_playersperson_name1S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femaleball_by_ballfielder_13S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femaleball_by_ballnon_striker66S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femaleball_by_ballstriker53S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femalematch_infoplayer_of_match11S Foo-RylandSV Collyer
Norway v Portugal, 2025-04-09, T20 femalematch_playersidentifier15ba89b1141f8d757
Norway v Portugal, 2025-04-09, T20 femalematch_playersperson_name1S Foo-RylandSV Collyer
Portugal v France, 2026-04-06, T20 maleball_by_ballfielder_11Deep HarianH Khuttan
Portugal v France, 2026-04-06, T20 malematch_playersidentifier179a292799c48bdee
Portugal v France, 2026-04-06, T20 malematch_playersperson_name1Deep HarianH Khuttan
Sweden v Indonesia, 2026-04-11, T20 maleball_by_ballbowler13Deep HarianIda Bagus Nara
Sweden v Indonesia, 2026-04-11, T20 maleball_by_ballplayer_dismissed1Deep HarianIda Bagus Nara
Sweden v Indonesia, 2026-04-11, T20 maleball_by_ballstriker1Deep HarianIda Bagus Nara
Sweden v Indonesia, 2026-04-11, T20 malematch_infovenue1Udayana Cricket GroundUdayana Cricket Ground, Bali
Sweden v Indonesia, 2026-04-11, T20 malematch_playersperson_name1Deep HarianIda Bagus Nara
26 Sep 2026, 16:13 IST (10:43 UTC) · built before this log existed
18 Sep 2026, 10:08 IST (04:38 UTC) · built before this log existed; 35 new matches added

2. Master to served

Checked 19 Oct 2026, 11:05 IST (05:35 UTC) against pipeline build 20261015_043812. Every published slice of the served copy is compared with the count the pipeline recorded when it wrote the master, in both directions.

ResultSliceMasterServed
PASSmatches, IPL men1,2431,243
PASSmatches, ODI women617617
PASSmatches, ODI men2,5962,596
PASSmatches, T20 women2,1832,183
PASSmatches, T20 men3,6273,627
PASSmatches, TEST women2424
PASSmatches, TEST men896896
PASSmatches total11,18611,186
PASSdeliveries, IPL295,732295,732
PASSdeliveries, ODI1,700,3551,700,355
PASSdeliveries, T201,312,7371,312,737
PASSdeliveries, TEST1,771,6071,771,607
PASSdeliveries total5,080,4315,080,431
PASSmax date, IPL2026-05-312026-05-31
PASSmax date, ODI2026-10-142026-10-14
PASSmax date, T202026-10-142026-10-14
PASSmax date, TEST2026-10-092026-10-09
PASSmatch players total296,267296,267
PASSpeople total18,65118,651
PASSnull gender rows00
PASSnull team type rows00

3. Served data, over the public API

✓ passed   ✗ needs review   • reported as filed   — could not be checked

What it provesResultEnginesCheck
The two engines behind the API hold identical ball data for everything added recently.✓both agree · 5 rowsengine_parity_recent
The column list and its order have not changed, on any of the four published tables.•both agree · 104 rowsschema_published_tables
Table sizes, match counts and the date span they cover.•DuckDB only · 2 rowsrow_counts
Format and gender mix, and the date span of each.•both agree · 7 rowsmatches_by_type
No ball and no squad entry belongs to a match that does not exist.✓both agree · 2 rowsorphan_balls
Every match has ball-by-ball data behind it.✓both agree · 4 rowsmatches_without_balls
Every player named in a squad exists in the player master.✓both agree · 1 rowsquad_integrity
Every player in the player master has one unique identifier.✓both agree · 1 rowreference_table_counts
No missing venue, bowler, striker, runs or season.✓DuckDB only · 4 rowsnull_density
Innings numbering and the ten-wicket ceiling hold in every format.✓DuckDB only · 4 rowsformat_shape_validity
No T20 or IPL innings past over 19, no ODI innings past over 49.✓DuckDB only · 1 rowover_index_bounds
No delivery scores below 0 or above 8 runs.✓DuckDB only · 1 rownegative_or_absurd_runs
Each delivery can be pinned to one over and one ball within it, with no gaps and no duplicates.✓DuckDB only · 1 rowdelivery_numbering
Every match records the toss, and the toss winner was playing in it.✓both agree · 4 rowstoss_recorded_and_valid
Every result is won by runs or by wickets, never both.•both agree · 4 rowsresult_margin_shape
Every match is exactly one of won, drawn, tied or no result, and a super-over decision sits inside tied rather than beside it.✓both agree · 4 rowsoutcome_partition
A super-over or bowl-out winner is always one of the two teams playing, and only ever appears on a tied match.✓both agree · 1 rowtiebreak_fields_sane
Recent matches are present, so the twice-daily refresh is running.•both agree · 34 rowsrecent_matches
Test matches are current in the match table.•both agree · 5 rowsrecent_test
Deliveries per over stay in a plausible range.•DuckDB only · 8 rowsballs_per_over_extremes
Innings counts per match are 1, 2, or a super over.•DuckDB only · 15 rowsinnings_per_match
How often one delivery slot carries more than one row.•DuckDB only · 4 rowsrepeated_delivery_address

Previous runs of the served-data checks

RunChecksFailed
19 Oct 2026, 11:20 IST (05:50 UTC)220
18 Oct 2026, 23:20 IST (17:50 UTC)220
18 Oct 2026, 11:20 IST (05:50 UTC)220
17 Oct 2026, 23:20 IST (17:50 UTC)220
17 Oct 2026, 19:41 IST (14:11 UTC)220
17 Oct 2026, 19:23 IST (13:53 UTC)221
17 Oct 2026, 18:54 IST (13:24 UTC)220
17 Oct 2026, 11:20 IST (05:50 UTC)221
16 Oct 2026, 23:20 IST (17:50 UTC)221
16 Oct 2026, 11:20 IST (05:50 UTC)221

Anything found is published as found. On the first run of this battery the two engines disagreed by one row - a Test match present in one and missing from the other - because the refresh job's skip test looked only at ball-by-ball data and a Test match adds none. That was fixed, and published rather than quietly corrected.

Machine-readable: /index.md for this tab, /anomalies.md for the anomalies, /llms.txt for what this site is.