FA-85186 / Fantasy sports scoring / Open access
Ten-ball innings excluded from strike-rate scoring · case 01
A 10-ball 25 earns no strike-rate bonus.
ROOT CAUSE
The minimum-balls test is strict greater-than.
VERIFIED REPAIR
Apply strike-rate scoring from 10 balls faced.
Unsuccessful approach: Dropping the role condition applies strike-rate penalties to bowlers.
Case contract
Score a T20 batting innings: 1 per run, +1 per four, +2 per six; only the highest milestone bonus applies (30+ -> 4, 50+ -> 8, 100+ -> 16). A duck (-2) applies when the batter is out for 0 after facing at least one ball, except for BOWL-role players. Strike-rate bonus for non-BOWL players with at least 10 balls, using exact runs*100 vs balls: >170 +6, >150 +4, >=130 +2, >=70 0, >=60 -2, >=50 -4, below -6.
Why this case matters
Cricket fantasy contests hinge on exclusive milestones, duck eligibility and strike-rate bands evaluated exactly.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(inn):
pts = inn['runs'] + inn['fours'] + inn['sixes'] * 2
if inn['runs'] >= 100:
pts += 16
elif inn['runs'] >= 50:
pts += 8
elif inn['runs'] >= 30:
pts += 4
if inn['out'] and inn['runs'] == 0 and inn['balls'] >= 1 and inn['role'] != 'BOWL':
pts -= 2
if inn['balls'] > 10 and inn['role'] != 'BOWL':
r, b = inn['runs'] * 100, inn['balls']
if r > 170 * b:
pts += 6
elif r > 150 * b:
pts += 4
elif r >= 130 * b:
pts += 2
elif r >= 70 * b:
pass
elif r >= 60 * b:
pts -= 2
elif r >= 50 * b:
pts -= 4
else:
pts -= 6
return pts
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 0, 'out': True, 'role': 'AR', 'runs': 17, 'sixes': 2}], 25),
('partial repair probe: strike-rate eligibility',
[{'balls': 11, 'fours': 0, 'out': True, 'role': 'BOWL', 'runs': 0, 'sixes': 0}], 0),
('second regression', [{'balls': 35, 'fours': 1, 'out': True, 'role': 'BOWL', 'runs': 60, 'sixes': 2}], 73),
('normal control 1', [{'balls': 33, 'fours': 9, 'out': False, 'role': 'BAT', 'runs': 57, 'sixes': 3}], 86),
('normal control 2', [{'balls': 38, 'fours': 16, 'out': True, 'role': 'WK', 'runs': 65, 'sixes': 0}], 95),
('normal control 3', [{'balls': 0, 'fours': 0, 'out': True, 'role': 'WK', 'runs': 0, 'sixes': 0}], 0),
('normal control 4', [{'balls': 1, 'fours': 6, 'out': True, 'role': 'BOWL', 'runs': 30, 'sixes': 0}], 40)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 5, 'out': True, 'role': 'BAT', 'runs': 29, 'sixes': 0}], 40),
('partial repair probe: strike-rate eligibility',
[{'balls': 11, 'fours': 3, 'out': True, 'role': 'BOWL', 'runs': 15, 'sixes': 0}], 18),
('second regression', [{'balls': 47, 'fours': 10, 'out': False, 'role': 'BOWL', 'runs': 83, 'sixes': 3}],
107),
('normal control 1', [{'balls': 36, 'fours': 6, 'out': True, 'role': 'BOWL', 'runs': 34, 'sixes': 0}], 44),
('normal control 2', [{'balls': 9, 'fours': 0, 'out': False, 'role': 'BOWL', 'runs': 17, 'sixes': 1}], 19),
('normal control 3', [{'balls': 35, 'fours': 7, 'out': False, 'role': 'AR', 'runs': 46, 'sixes': 2}], 63),
('normal control 4', [{'balls': 0, 'fours': 0, 'out': False, 'role': 'BAT', 'runs': 0, 'sixes': 0}], 0)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 5, 'out': False, 'role': 'BAT', 'runs': 51, 'sixes': 2}], 74),
('partial repair probe: strike-rate eligibility',
[{'balls': 37, 'fours': 3, 'out': False, 'role': 'BOWL', 'runs': 52, 'sixes': 0}], 63),
('second regression', [{'balls': 47, 'fours': 5, 'out': True, 'role': 'BOWL', 'runs': 94, 'sixes': 9}],
125),
('normal control 1', [{'balls': 1, 'fours': 12, 'out': False, 'role': 'BOWL', 'runs': 51, 'sixes': 0}], 71),
('normal control 2', [{'balls': 11, 'fours': 2, 'out': True, 'role': 'AR', 'runs': 17, 'sixes': 0}], 23),
('normal control 3', [{'balls': 32, 'fours': 10, 'out': True, 'role': 'AR', 'runs': 70, 'sixes': 0}], 94),
('normal control 4', [{'balls': 9, 'fours': 0, 'out': False, 'role': 'WK', 'runs': 30, 'sixes': 5}], 44)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 18, 'out': True, 'role': 'BAT', 'runs': 88, 'sixes': 2}], 124),
('partial repair probe: strike-rate eligibility',
[{'balls': 20, 'fours': 3, 'out': True, 'role': 'BOWL', 'runs': 30, 'sixes': 1}], 39),
('second regression', [{'balls': 13, 'fours': 4, 'out': True, 'role': 'BOWL', 'runs': 23, 'sixes': 0}], 27),
('normal control 1', [{'balls': 11, 'fours': 3, 'out': True, 'role': 'WK', 'runs': 19, 'sixes': 1}], 30),
('normal control 2', [{'balls': 0, 'fours': 0, 'out': False, 'role': 'BAT', 'runs': 0, 'sixes': 0}], 0),
('normal control 3', [{'balls': 47, 'fours': 0, 'out': True, 'role': 'AR', 'runs': 29, 'sixes': 4}], 35),
('normal control 4', [{'balls': 1, 'fours': 0, 'out': True, 'role': 'BAT', 'runs': 0, 'sixes': 0}], -2)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 16, 'out': True, 'role': 'AR', 'runs': 100, 'sixes': 5}], 148),
('partial repair probe: strike-rate eligibility',
[{'balls': 20, 'fours': 7, 'out': True, 'role': 'BOWL', 'runs': 29, 'sixes': 0}], 36),
('second regression', [{'balls': 10, 'fours': 9, 'out': True, 'role': 'AR', 'runs': 51, 'sixes': 1}], 76),
('normal control 1', [{'balls': 11, 'fours': 3, 'out': True, 'role': 'WK', 'runs': 33, 'sixes': 3}], 52),
('normal control 2', [{'balls': 1, 'fours': 4, 'out': True, 'role': 'WK', 'runs': 29, 'sixes': 2}], 37),
('normal control 3', [{'balls': 20, 'fours': 0, 'out': True, 'role': 'AR', 'runs': 0, 'sixes': 0}], -8),
('normal control 4', [{'balls': 23, 'fours': 11, 'out': False, 'role': 'BAT', 'runs': 100, 'sixes': 8}],
149)]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: strike-rate eligibility | 21 | 25 | Failed |
| partial repair probe: strike-rate eligibility | 0 | 0 | Passed |
| second regression | 73 | 73 | Passed |
| normal control 1 | 86 | 86 | Passed |
| normal control 2 | 95 | 95 | Passed |
| normal control 3 | 0 | 0 | Passed |
| normal control 4 | 40 | 40 | Passed |
SHA-256 / 5ca87baa253bcc1b1e66a5b96beedbec323ed3be1af7e5b3c92fa0c965c556d9
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(inn):
pts = inn['runs'] + inn['fours'] + inn['sixes'] * 2
if inn['runs'] >= 100:
pts += 16
elif inn['runs'] >= 50:
pts += 8
elif inn['runs'] >= 30:
pts += 4
if inn['out'] and inn['runs'] == 0 and inn['balls'] >= 1 and inn['role'] != 'BOWL':
pts -= 2
if inn['balls'] >= 10:
r, b = inn['runs'] * 100, inn['balls']
if r > 170 * b:
pts += 6
elif r > 150 * b:
pts += 4
elif r >= 130 * b:
pts += 2
elif r >= 70 * b:
pass
elif r >= 60 * b:
pts -= 2
elif r >= 50 * b:
pts -= 4
else:
pts -= 6
return pts
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 0, 'out': True, 'role': 'AR', 'runs': 17, 'sixes': 2}], 25),
('partial repair probe: strike-rate eligibility',
[{'balls': 11, 'fours': 0, 'out': True, 'role': 'BOWL', 'runs': 0, 'sixes': 0}], 0),
('second regression', [{'balls': 35, 'fours': 1, 'out': True, 'role': 'BOWL', 'runs': 60, 'sixes': 2}], 73),
('normal control 1', [{'balls': 33, 'fours': 9, 'out': False, 'role': 'BAT', 'runs': 57, 'sixes': 3}], 86),
('normal control 2', [{'balls': 38, 'fours': 16, 'out': True, 'role': 'WK', 'runs': 65, 'sixes': 0}], 95),
('normal control 3', [{'balls': 0, 'fours': 0, 'out': True, 'role': 'WK', 'runs': 0, 'sixes': 0}], 0),
('normal control 4', [{'balls': 1, 'fours': 6, 'out': True, 'role': 'BOWL', 'runs': 30, 'sixes': 0}], 40)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 5, 'out': True, 'role': 'BAT', 'runs': 29, 'sixes': 0}], 40),
('partial repair probe: strike-rate eligibility',
[{'balls': 11, 'fours': 3, 'out': True, 'role': 'BOWL', 'runs': 15, 'sixes': 0}], 18),
('second regression', [{'balls': 47, 'fours': 10, 'out': False, 'role': 'BOWL', 'runs': 83, 'sixes': 3}],
107),
('normal control 1', [{'balls': 36, 'fours': 6, 'out': True, 'role': 'BOWL', 'runs': 34, 'sixes': 0}], 44),
('normal control 2', [{'balls': 9, 'fours': 0, 'out': False, 'role': 'BOWL', 'runs': 17, 'sixes': 1}], 19),
('normal control 3', [{'balls': 35, 'fours': 7, 'out': False, 'role': 'AR', 'runs': 46, 'sixes': 2}], 63),
('normal control 4', [{'balls': 0, 'fours': 0, 'out': False, 'role': 'BAT', 'runs': 0, 'sixes': 0}], 0)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 5, 'out': False, 'role': 'BAT', 'runs': 51, 'sixes': 2}], 74),
('partial repair probe: strike-rate eligibility',
[{'balls': 37, 'fours': 3, 'out': False, 'role': 'BOWL', 'runs': 52, 'sixes': 0}], 63),
('second regression', [{'balls': 47, 'fours': 5, 'out': True, 'role': 'BOWL', 'runs': 94, 'sixes': 9}],
125),
('normal control 1', [{'balls': 1, 'fours': 12, 'out': False, 'role': 'BOWL', 'runs': 51, 'sixes': 0}], 71),
('normal control 2', [{'balls': 11, 'fours': 2, 'out': True, 'role': 'AR', 'runs': 17, 'sixes': 0}], 23),
('normal control 3', [{'balls': 32, 'fours': 10, 'out': True, 'role': 'AR', 'runs': 70, 'sixes': 0}], 94),
('normal control 4', [{'balls': 9, 'fours': 0, 'out': False, 'role': 'WK', 'runs': 30, 'sixes': 5}], 44)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 18, 'out': True, 'role': 'BAT', 'runs': 88, 'sixes': 2}], 124),
('partial repair probe: strike-rate eligibility',
[{'balls': 20, 'fours': 3, 'out': True, 'role': 'BOWL', 'runs': 30, 'sixes': 1}], 39),
('second regression', [{'balls': 13, 'fours': 4, 'out': True, 'role': 'BOWL', 'runs': 23, 'sixes': 0}], 27),
('normal control 1', [{'balls': 11, 'fours': 3, 'out': True, 'role': 'WK', 'runs': 19, 'sixes': 1}], 30),
('normal control 2', [{'balls': 0, 'fours': 0, 'out': False, 'role': 'BAT', 'runs': 0, 'sixes': 0}], 0),
('normal control 3', [{'balls': 47, 'fours': 0, 'out': True, 'role': 'AR', 'runs': 29, 'sixes': 4}], 35),
('normal control 4', [{'balls': 1, 'fours': 0, 'out': True, 'role': 'BAT', 'runs': 0, 'sixes': 0}], -2)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 16, 'out': True, 'role': 'AR', 'runs': 100, 'sixes': 5}], 148),
('partial repair probe: strike-rate eligibility',
[{'balls': 20, 'fours': 7, 'out': True, 'role': 'BOWL', 'runs': 29, 'sixes': 0}], 36),
('second regression', [{'balls': 10, 'fours': 9, 'out': True, 'role': 'AR', 'runs': 51, 'sixes': 1}], 76),
('normal control 1', [{'balls': 11, 'fours': 3, 'out': True, 'role': 'WK', 'runs': 33, 'sixes': 3}], 52),
('normal control 2', [{'balls': 1, 'fours': 4, 'out': True, 'role': 'WK', 'runs': 29, 'sixes': 2}], 37),
('normal control 3', [{'balls': 20, 'fours': 0, 'out': True, 'role': 'AR', 'runs': 0, 'sixes': 0}], -8),
('normal control 4', [{'balls': 23, 'fours': 11, 'out': False, 'role': 'BAT', 'runs': 100, 'sixes': 8}],
149)]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: strike-rate eligibility | 25 | 25 | Passed |
| partial repair probe: strike-rate eligibility | -6 | 0 | Failed |
| second regression | 79 | 73 | Failed |
| normal control 1 | 86 | 86 | Passed |
| normal control 2 | 95 | 95 | Passed |
| normal control 3 | 0 | 0 | Passed |
| normal control 4 | 40 | 40 | Passed |
SHA-256 / e6a5d148858b0e8ef7a7015525bb28b65474c5cbbf45f5364793651e64d77b22
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(inn):
pts = inn['runs'] + inn['fours'] + inn['sixes'] * 2
if inn['runs'] >= 100:
pts += 16
elif inn['runs'] >= 50:
pts += 8
elif inn['runs'] >= 30:
pts += 4
if inn['out'] and inn['runs'] == 0 and inn['balls'] >= 1 and inn['role'] != 'BOWL':
pts -= 2
if inn['balls'] >= 10 and inn['role'] != 'BOWL':
r, b = inn['runs'] * 100, inn['balls']
if r > 170 * b:
pts += 6
elif r > 150 * b:
pts += 4
elif r >= 130 * b:
pts += 2
elif r >= 70 * b:
pass
elif r >= 60 * b:
pts -= 2
elif r >= 50 * b:
pts -= 4
else:
pts -= 6
return pts
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 0, 'out': True, 'role': 'AR', 'runs': 17, 'sixes': 2}], 25),
('partial repair probe: strike-rate eligibility',
[{'balls': 11, 'fours': 0, 'out': True, 'role': 'BOWL', 'runs': 0, 'sixes': 0}], 0),
('second regression', [{'balls': 35, 'fours': 1, 'out': True, 'role': 'BOWL', 'runs': 60, 'sixes': 2}], 73),
('normal control 1', [{'balls': 33, 'fours': 9, 'out': False, 'role': 'BAT', 'runs': 57, 'sixes': 3}], 86),
('normal control 2', [{'balls': 38, 'fours': 16, 'out': True, 'role': 'WK', 'runs': 65, 'sixes': 0}], 95),
('normal control 3', [{'balls': 0, 'fours': 0, 'out': True, 'role': 'WK', 'runs': 0, 'sixes': 0}], 0),
('normal control 4', [{'balls': 1, 'fours': 6, 'out': True, 'role': 'BOWL', 'runs': 30, 'sixes': 0}], 40)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 5, 'out': True, 'role': 'BAT', 'runs': 29, 'sixes': 0}], 40),
('partial repair probe: strike-rate eligibility',
[{'balls': 11, 'fours': 3, 'out': True, 'role': 'BOWL', 'runs': 15, 'sixes': 0}], 18),
('second regression', [{'balls': 47, 'fours': 10, 'out': False, 'role': 'BOWL', 'runs': 83, 'sixes': 3}],
107),
('normal control 1', [{'balls': 36, 'fours': 6, 'out': True, 'role': 'BOWL', 'runs': 34, 'sixes': 0}], 44),
('normal control 2', [{'balls': 9, 'fours': 0, 'out': False, 'role': 'BOWL', 'runs': 17, 'sixes': 1}], 19),
('normal control 3', [{'balls': 35, 'fours': 7, 'out': False, 'role': 'AR', 'runs': 46, 'sixes': 2}], 63),
('normal control 4', [{'balls': 0, 'fours': 0, 'out': False, 'role': 'BAT', 'runs': 0, 'sixes': 0}], 0)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 5, 'out': False, 'role': 'BAT', 'runs': 51, 'sixes': 2}], 74),
('partial repair probe: strike-rate eligibility',
[{'balls': 37, 'fours': 3, 'out': False, 'role': 'BOWL', 'runs': 52, 'sixes': 0}], 63),
('second regression', [{'balls': 47, 'fours': 5, 'out': True, 'role': 'BOWL', 'runs': 94, 'sixes': 9}],
125),
('normal control 1', [{'balls': 1, 'fours': 12, 'out': False, 'role': 'BOWL', 'runs': 51, 'sixes': 0}], 71),
('normal control 2', [{'balls': 11, 'fours': 2, 'out': True, 'role': 'AR', 'runs': 17, 'sixes': 0}], 23),
('normal control 3', [{'balls': 32, 'fours': 10, 'out': True, 'role': 'AR', 'runs': 70, 'sixes': 0}], 94),
('normal control 4', [{'balls': 9, 'fours': 0, 'out': False, 'role': 'WK', 'runs': 30, 'sixes': 5}], 44)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 18, 'out': True, 'role': 'BAT', 'runs': 88, 'sixes': 2}], 124),
('partial repair probe: strike-rate eligibility',
[{'balls': 20, 'fours': 3, 'out': True, 'role': 'BOWL', 'runs': 30, 'sixes': 1}], 39),
('second regression', [{'balls': 13, 'fours': 4, 'out': True, 'role': 'BOWL', 'runs': 23, 'sixes': 0}], 27),
('normal control 1', [{'balls': 11, 'fours': 3, 'out': True, 'role': 'WK', 'runs': 19, 'sixes': 1}], 30),
('normal control 2', [{'balls': 0, 'fours': 0, 'out': False, 'role': 'BAT', 'runs': 0, 'sixes': 0}], 0),
('normal control 3', [{'balls': 47, 'fours': 0, 'out': True, 'role': 'AR', 'runs': 29, 'sixes': 4}], 35),
('normal control 4', [{'balls': 1, 'fours': 0, 'out': True, 'role': 'BAT', 'runs': 0, 'sixes': 0}], -2)],
[('regression: strike-rate eligibility',
[{'balls': 10, 'fours': 16, 'out': True, 'role': 'AR', 'runs': 100, 'sixes': 5}], 148),
('partial repair probe: strike-rate eligibility',
[{'balls': 20, 'fours': 7, 'out': True, 'role': 'BOWL', 'runs': 29, 'sixes': 0}], 36),
('second regression', [{'balls': 10, 'fours': 9, 'out': True, 'role': 'AR', 'runs': 51, 'sixes': 1}], 76),
('normal control 1', [{'balls': 11, 'fours': 3, 'out': True, 'role': 'WK', 'runs': 33, 'sixes': 3}], 52),
('normal control 2', [{'balls': 1, 'fours': 4, 'out': True, 'role': 'WK', 'runs': 29, 'sixes': 2}], 37),
('normal control 3', [{'balls': 20, 'fours': 0, 'out': True, 'role': 'AR', 'runs': 0, 'sixes': 0}], -8),
('normal control 4', [{'balls': 23, 'fours': 11, 'out': False, 'role': 'BAT', 'runs': 100, 'sixes': 8}],
149)]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: strike-rate eligibility | 25 | 25 | Passed |
| partial repair probe: strike-rate eligibility | 0 | 0 | Passed |
| second regression | 73 | 73 | Passed |
| normal control 1 | 86 | 86 | Passed |
| normal control 2 | 95 | 95 | Passed |
| normal control 3 | 0 | 0 | Passed |
| normal control 4 | 40 | 40 | Passed |
SHA-256 / dd9c3fa4b6491febdffa1f9b7630672f1acb2350e27f905ad9dd652d34f8eb20
Verification & scope
A deterministic toy scoring contract stipulated for this example; it is not the rulebook of any real fantasy platform. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:50:37.993202+00:00.
Case digest / 0a2d3487ba23294dd9a6ebf3c3b483f0b10391ceecf77cc714a05797393aeb5f