FA-85316 / Fantasy sports scoring / Open access
Postponed game treated as live · case 01
Players in postponed games keep contributing projected points.
ROOT CAUSE
Every non-final, non-pre status is handled as a live game.
VERIFIED REPAIR
Count postponed games as 0 by handling only the live status.
Unsuccessful approach: Counting postponed games at full projection still projects points that will never be scored.
Case contract
Projected final lineup score in tenths. Each player is [actual, full-game projection, status, game seconds left]. Final games count actual points; not-started games count the full projection; live games count actual plus the projection prorated by remaining time over 3600 seconds (floored per player; overtime reports negative seconds, treated as 0 remaining); postponed (ppd) games count 0.
Why this case matters
Live projections are shown to millions of users during games; status handling and proration must be exact.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(players):
total = 0
for actual, proj, status, left in players:
if status == 'final':
total += actual
elif status == 'pre':
total += proj
else:
left = max(left, 0)
total += actual + proj * left // 3600
return total
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: postponed games',
[[[6, 180, 'ppd', 1], [206, 180, 'ppd', 1800], [128, 95, 'pre', 0], [85, 95, 'final', 1800],
[92, 0, 'final', 900]]],
272),
('partial repair probe: postponed games',
[[[39, 120, 'live', 900], [50, 95, 'live', 1800], [34, 180, 'ppd', 0], [29, 180, 'live', 3600],
[109, 120, 'live', 900]]],
514),
('second regression', [[[-6, 0, 'pre', 3600], [47, 120, 'ppd', 3600]]], 0),
('normal control 1', [[[72, 180, 'live', 900], [175, 120, 'final', 3600]]], 292),
('normal control 2',
[[[246, 95, 'live', -300], [195, 180, 'live', 0], [113, 120, 'pre', 0], [-4, 120, 'final', 0],
[98, 120, 'final', 1]]],
655),
('normal control 3', [[[233, 120, 'pre', 1800], [58, 95, 'live', 1], [49, 180, 'final', -300]]], 227),
('normal control 4', [[[49, 95, 'final', 900], [13, 95, 'pre', 1]]], 144)],
[('regression: postponed games',
[[[37, 180, 'final', 1800], [-18, 180, 'ppd', -300], [229, 120, 'live', 3600], [-12, 180, 'final', 1800]]],
374),
('partial repair probe: postponed games',
[[[163, 0, 'final', 900], [169, 95, 'ppd', -300], [149, 120, 'live', 900]]], 342),
('second regression',
[[[248, 0, 'pre', 900], [98, 0, 'ppd', 1], [120, 180, 'live', 900], [20, 180, 'live', 1],
[157, 180, 'live', -300]]],
342),
('normal control 1',
[[[208, 95, 'pre', 1800], [129, 180, 'pre', 3600], [233, 120, 'final', 3600], [68, 0, 'pre', 1]]], 508),
('normal control 2',
[[[119, 180, 'live', 1], [137, 120, 'final', 900], [217, 95, 'live', 1], [69, 120, 'final', 0],
[84, 120, 'final', 1]]],
626),
('normal control 3', [[[108, 120, 'live', -300], [31, 95, 'live', 1], [55, 95, 'final', 900]]], 194),
('normal control 4', [[[118, 95, 'live', -300], [3, 180, 'final', 0], [213, 120, 'pre', -300]]], 241)],
[('regression: postponed games',
[[[213, 120, 'ppd', 3600], [110, 120, 'live', 1], [211, 95, 'pre', -300], [137, 0, 'ppd', 3600],
[86, 180, 'live', -300], [-12, 120, 'final', -300]]],
279),
('partial repair probe: postponed games',
[[[241, 0, 'final', 3600], [107, 0, 'pre', 3600], [13, 180, 'ppd', 0], [201, 120, 'live', 1]]], 442),
('second regression', [[[-17, 0, 'ppd', 900], [185, 95, 'live', 0]]], 185),
('normal control 1', [[[112, 95, 'pre', 900], [241, 180, 'live', 900], [234, 180, 'live', 900]]], 660),
('normal control 2',
[[[156, 180, 'live', 3600], [80, 95, 'live', 0], [30, 180, 'live', 3600], [76, 120, 'live', 3600],
[164, 0, 'pre', 1]]],
822),
('normal control 3',
[[[246, 0, 'live', 3600], [200, 180, 'final', 1], [9, 95, 'pre', 3600], [53, 0, 'live', 1],
[145, 0, 'final', 1]]],
739),
('normal control 4', [[[14, 180, 'pre', -300], [31, 120, 'pre', 3600], [196, 120, 'pre', 900]]], 420)],
[('regression: postponed games',
[[[245, 120, 'final', 900], [215, 95, 'live', 3600], [128, 180, 'pre', 1800], [14, 0, 'final', 900],
[157, 180, 'ppd', 1], [198, 120, 'final', 900]]],
947),
('partial repair probe: postponed games', [[[212, 120, 'live', -300], [176, 95, 'ppd', 1800]]], 212),
('second regression',
[[[237, 180, 'pre', 900], [211, 0, 'live', 1], [100, 180, 'pre', 900], [208, 180, 'ppd', 1],
[92, 180, 'ppd', -300]]],
571),
('normal control 1',
[[[156, 95, 'live', 1], [190, 0, 'final', 3600], [119, 180, 'final', 3600], [173, 120, 'final', 1800],
[10, 95, 'live', 3600]]],
743),
('normal control 2',
[[[213, 95, 'live', 3600], [95, 120, 'pre', 3600], [126, 0, 'pre', 900], [62, 180, 'final', 0],
[93, 95, 'final', 1]]],
583),
('normal control 3', [[[174, 120, 'live', 1800], [35, 0, 'live', 1800], [17, 95, 'live', 1800]]], 333),
('normal control 4', [[[191, 0, 'live', 0], [-11, 120, 'pre', 1]]], 311)],
[('regression: postponed games', [[[231, 120, 'final', 3600], [132, 180, 'pre', 0], [132, 95, 'ppd', 1]]],
411),
('partial repair probe: postponed games', [[[99, 95, 'live', -300], [20, 95, 'ppd', 3600]]], 99),
('second regression', [[[66, 0, 'live', 3600], [115, 120, 'ppd', 900], [199, 95, 'live', 0]]], 265),
('normal control 1',
[[[169, 120, 'pre', -300], [16, 95, 'live', 1], [88, 180, 'pre', 0], [-12, 0, 'live', 0],
[55, 120, 'live', 900]]],
389),
('normal control 2', [[[232, 120, 'final', 3600], [161, 180, 'live', 3600], [172, 120, 'pre', 1800]]], 693),
('normal control 3',
[[[45, 95, 'live', 0], [120, 120, 'live', 3600], [242, 120, 'live', 3600], [246, 95, 'live', 3600],
[22, 0, 'live', 3600]]],
1010),
('normal control 4', [[[-4, 95, 'live', 1], [13, 120, 'pre', -300], [120, 95, 'pre', 3600]]], 211)]]
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: postponed games | 574 | 272 | Failed |
| partial repair probe: postponed games | 548 | 514 | Failed |
| second regression | 167 | 0 | Failed |
| normal control 1 | 292 | 292 | Passed |
| normal control 2 | 655 | 655 | Passed |
| normal control 3 | 227 | 227 | Passed |
| normal control 4 | 144 | 144 | Passed |
SHA-256 / f538523dc9d42fff10b8313b034fa3340448f6f72a7592e415cacdf0c613dead
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(players):
total = 0
for actual, proj, status, left in players:
if status == 'final':
total += actual
elif status in ('pre', 'ppd'):
total += proj
elif status == 'live':
left = max(left, 0)
total += actual + proj * left // 3600
return total
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: postponed games',
[[[6, 180, 'ppd', 1], [206, 180, 'ppd', 1800], [128, 95, 'pre', 0], [85, 95, 'final', 1800],
[92, 0, 'final', 900]]],
272),
('partial repair probe: postponed games',
[[[39, 120, 'live', 900], [50, 95, 'live', 1800], [34, 180, 'ppd', 0], [29, 180, 'live', 3600],
[109, 120, 'live', 900]]],
514),
('second regression', [[[-6, 0, 'pre', 3600], [47, 120, 'ppd', 3600]]], 0),
('normal control 1', [[[72, 180, 'live', 900], [175, 120, 'final', 3600]]], 292),
('normal control 2',
[[[246, 95, 'live', -300], [195, 180, 'live', 0], [113, 120, 'pre', 0], [-4, 120, 'final', 0],
[98, 120, 'final', 1]]],
655),
('normal control 3', [[[233, 120, 'pre', 1800], [58, 95, 'live', 1], [49, 180, 'final', -300]]], 227),
('normal control 4', [[[49, 95, 'final', 900], [13, 95, 'pre', 1]]], 144)],
[('regression: postponed games',
[[[37, 180, 'final', 1800], [-18, 180, 'ppd', -300], [229, 120, 'live', 3600], [-12, 180, 'final', 1800]]],
374),
('partial repair probe: postponed games',
[[[163, 0, 'final', 900], [169, 95, 'ppd', -300], [149, 120, 'live', 900]]], 342),
('second regression',
[[[248, 0, 'pre', 900], [98, 0, 'ppd', 1], [120, 180, 'live', 900], [20, 180, 'live', 1],
[157, 180, 'live', -300]]],
342),
('normal control 1',
[[[208, 95, 'pre', 1800], [129, 180, 'pre', 3600], [233, 120, 'final', 3600], [68, 0, 'pre', 1]]], 508),
('normal control 2',
[[[119, 180, 'live', 1], [137, 120, 'final', 900], [217, 95, 'live', 1], [69, 120, 'final', 0],
[84, 120, 'final', 1]]],
626),
('normal control 3', [[[108, 120, 'live', -300], [31, 95, 'live', 1], [55, 95, 'final', 900]]], 194),
('normal control 4', [[[118, 95, 'live', -300], [3, 180, 'final', 0], [213, 120, 'pre', -300]]], 241)],
[('regression: postponed games',
[[[213, 120, 'ppd', 3600], [110, 120, 'live', 1], [211, 95, 'pre', -300], [137, 0, 'ppd', 3600],
[86, 180, 'live', -300], [-12, 120, 'final', -300]]],
279),
('partial repair probe: postponed games',
[[[241, 0, 'final', 3600], [107, 0, 'pre', 3600], [13, 180, 'ppd', 0], [201, 120, 'live', 1]]], 442),
('second regression', [[[-17, 0, 'ppd', 900], [185, 95, 'live', 0]]], 185),
('normal control 1', [[[112, 95, 'pre', 900], [241, 180, 'live', 900], [234, 180, 'live', 900]]], 660),
('normal control 2',
[[[156, 180, 'live', 3600], [80, 95, 'live', 0], [30, 180, 'live', 3600], [76, 120, 'live', 3600],
[164, 0, 'pre', 1]]],
822),
('normal control 3',
[[[246, 0, 'live', 3600], [200, 180, 'final', 1], [9, 95, 'pre', 3600], [53, 0, 'live', 1],
[145, 0, 'final', 1]]],
739),
('normal control 4', [[[14, 180, 'pre', -300], [31, 120, 'pre', 3600], [196, 120, 'pre', 900]]], 420)],
[('regression: postponed games',
[[[245, 120, 'final', 900], [215, 95, 'live', 3600], [128, 180, 'pre', 1800], [14, 0, 'final', 900],
[157, 180, 'ppd', 1], [198, 120, 'final', 900]]],
947),
('partial repair probe: postponed games', [[[212, 120, 'live', -300], [176, 95, 'ppd', 1800]]], 212),
('second regression',
[[[237, 180, 'pre', 900], [211, 0, 'live', 1], [100, 180, 'pre', 900], [208, 180, 'ppd', 1],
[92, 180, 'ppd', -300]]],
571),
('normal control 1',
[[[156, 95, 'live', 1], [190, 0, 'final', 3600], [119, 180, 'final', 3600], [173, 120, 'final', 1800],
[10, 95, 'live', 3600]]],
743),
('normal control 2',
[[[213, 95, 'live', 3600], [95, 120, 'pre', 3600], [126, 0, 'pre', 900], [62, 180, 'final', 0],
[93, 95, 'final', 1]]],
583),
('normal control 3', [[[174, 120, 'live', 1800], [35, 0, 'live', 1800], [17, 95, 'live', 1800]]], 333),
('normal control 4', [[[191, 0, 'live', 0], [-11, 120, 'pre', 1]]], 311)],
[('regression: postponed games', [[[231, 120, 'final', 3600], [132, 180, 'pre', 0], [132, 95, 'ppd', 1]]],
411),
('partial repair probe: postponed games', [[[99, 95, 'live', -300], [20, 95, 'ppd', 3600]]], 99),
('second regression', [[[66, 0, 'live', 3600], [115, 120, 'ppd', 900], [199, 95, 'live', 0]]], 265),
('normal control 1',
[[[169, 120, 'pre', -300], [16, 95, 'live', 1], [88, 180, 'pre', 0], [-12, 0, 'live', 0],
[55, 120, 'live', 900]]],
389),
('normal control 2', [[[232, 120, 'final', 3600], [161, 180, 'live', 3600], [172, 120, 'pre', 1800]]], 693),
('normal control 3',
[[[45, 95, 'live', 0], [120, 120, 'live', 3600], [242, 120, 'live', 3600], [246, 95, 'live', 3600],
[22, 0, 'live', 3600]]],
1010),
('normal control 4', [[[-4, 95, 'live', 1], [13, 120, 'pre', -300], [120, 95, 'pre', 3600]]], 211)]]
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: postponed games | 632 | 272 | Failed |
| partial repair probe: postponed games | 694 | 514 | Failed |
| second regression | 120 | 0 | Failed |
| normal control 1 | 292 | 292 | Passed |
| normal control 2 | 655 | 655 | Passed |
| normal control 3 | 227 | 227 | Passed |
| normal control 4 | 144 | 144 | Passed |
SHA-256 / 0d52bc97666cd0cc4007a3e35f7cfdc03003f45b93046c5c0176a63767fef91e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(players):
total = 0
for actual, proj, status, left in players:
if status == 'final':
total += actual
elif status == 'pre':
total += proj
elif status == 'live':
left = max(left, 0)
total += actual + proj * left // 3600
return total
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: postponed games',
[[[6, 180, 'ppd', 1], [206, 180, 'ppd', 1800], [128, 95, 'pre', 0], [85, 95, 'final', 1800],
[92, 0, 'final', 900]]],
272),
('partial repair probe: postponed games',
[[[39, 120, 'live', 900], [50, 95, 'live', 1800], [34, 180, 'ppd', 0], [29, 180, 'live', 3600],
[109, 120, 'live', 900]]],
514),
('second regression', [[[-6, 0, 'pre', 3600], [47, 120, 'ppd', 3600]]], 0),
('normal control 1', [[[72, 180, 'live', 900], [175, 120, 'final', 3600]]], 292),
('normal control 2',
[[[246, 95, 'live', -300], [195, 180, 'live', 0], [113, 120, 'pre', 0], [-4, 120, 'final', 0],
[98, 120, 'final', 1]]],
655),
('normal control 3', [[[233, 120, 'pre', 1800], [58, 95, 'live', 1], [49, 180, 'final', -300]]], 227),
('normal control 4', [[[49, 95, 'final', 900], [13, 95, 'pre', 1]]], 144)],
[('regression: postponed games',
[[[37, 180, 'final', 1800], [-18, 180, 'ppd', -300], [229, 120, 'live', 3600], [-12, 180, 'final', 1800]]],
374),
('partial repair probe: postponed games',
[[[163, 0, 'final', 900], [169, 95, 'ppd', -300], [149, 120, 'live', 900]]], 342),
('second regression',
[[[248, 0, 'pre', 900], [98, 0, 'ppd', 1], [120, 180, 'live', 900], [20, 180, 'live', 1],
[157, 180, 'live', -300]]],
342),
('normal control 1',
[[[208, 95, 'pre', 1800], [129, 180, 'pre', 3600], [233, 120, 'final', 3600], [68, 0, 'pre', 1]]], 508),
('normal control 2',
[[[119, 180, 'live', 1], [137, 120, 'final', 900], [217, 95, 'live', 1], [69, 120, 'final', 0],
[84, 120, 'final', 1]]],
626),
('normal control 3', [[[108, 120, 'live', -300], [31, 95, 'live', 1], [55, 95, 'final', 900]]], 194),
('normal control 4', [[[118, 95, 'live', -300], [3, 180, 'final', 0], [213, 120, 'pre', -300]]], 241)],
[('regression: postponed games',
[[[213, 120, 'ppd', 3600], [110, 120, 'live', 1], [211, 95, 'pre', -300], [137, 0, 'ppd', 3600],
[86, 180, 'live', -300], [-12, 120, 'final', -300]]],
279),
('partial repair probe: postponed games',
[[[241, 0, 'final', 3600], [107, 0, 'pre', 3600], [13, 180, 'ppd', 0], [201, 120, 'live', 1]]], 442),
('second regression', [[[-17, 0, 'ppd', 900], [185, 95, 'live', 0]]], 185),
('normal control 1', [[[112, 95, 'pre', 900], [241, 180, 'live', 900], [234, 180, 'live', 900]]], 660),
('normal control 2',
[[[156, 180, 'live', 3600], [80, 95, 'live', 0], [30, 180, 'live', 3600], [76, 120, 'live', 3600],
[164, 0, 'pre', 1]]],
822),
('normal control 3',
[[[246, 0, 'live', 3600], [200, 180, 'final', 1], [9, 95, 'pre', 3600], [53, 0, 'live', 1],
[145, 0, 'final', 1]]],
739),
('normal control 4', [[[14, 180, 'pre', -300], [31, 120, 'pre', 3600], [196, 120, 'pre', 900]]], 420)],
[('regression: postponed games',
[[[245, 120, 'final', 900], [215, 95, 'live', 3600], [128, 180, 'pre', 1800], [14, 0, 'final', 900],
[157, 180, 'ppd', 1], [198, 120, 'final', 900]]],
947),
('partial repair probe: postponed games', [[[212, 120, 'live', -300], [176, 95, 'ppd', 1800]]], 212),
('second regression',
[[[237, 180, 'pre', 900], [211, 0, 'live', 1], [100, 180, 'pre', 900], [208, 180, 'ppd', 1],
[92, 180, 'ppd', -300]]],
571),
('normal control 1',
[[[156, 95, 'live', 1], [190, 0, 'final', 3600], [119, 180, 'final', 3600], [173, 120, 'final', 1800],
[10, 95, 'live', 3600]]],
743),
('normal control 2',
[[[213, 95, 'live', 3600], [95, 120, 'pre', 3600], [126, 0, 'pre', 900], [62, 180, 'final', 0],
[93, 95, 'final', 1]]],
583),
('normal control 3', [[[174, 120, 'live', 1800], [35, 0, 'live', 1800], [17, 95, 'live', 1800]]], 333),
('normal control 4', [[[191, 0, 'live', 0], [-11, 120, 'pre', 1]]], 311)],
[('regression: postponed games', [[[231, 120, 'final', 3600], [132, 180, 'pre', 0], [132, 95, 'ppd', 1]]],
411),
('partial repair probe: postponed games', [[[99, 95, 'live', -300], [20, 95, 'ppd', 3600]]], 99),
('second regression', [[[66, 0, 'live', 3600], [115, 120, 'ppd', 900], [199, 95, 'live', 0]]], 265),
('normal control 1',
[[[169, 120, 'pre', -300], [16, 95, 'live', 1], [88, 180, 'pre', 0], [-12, 0, 'live', 0],
[55, 120, 'live', 900]]],
389),
('normal control 2', [[[232, 120, 'final', 3600], [161, 180, 'live', 3600], [172, 120, 'pre', 1800]]], 693),
('normal control 3',
[[[45, 95, 'live', 0], [120, 120, 'live', 3600], [242, 120, 'live', 3600], [246, 95, 'live', 3600],
[22, 0, 'live', 3600]]],
1010),
('normal control 4', [[[-4, 95, 'live', 1], [13, 120, 'pre', -300], [120, 95, 'pre', 3600]]], 211)]]
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: postponed games | 272 | 272 | Passed |
| partial repair probe: postponed games | 514 | 514 | Passed |
| second regression | 0 | 0 | Passed |
| normal control 1 | 292 | 292 | Passed |
| normal control 2 | 655 | 655 | Passed |
| normal control 3 | 227 | 227 | Passed |
| normal control 4 | 144 | 144 | Passed |
SHA-256 / 5fb1eb56ade80b24f47e147a0df23810ad4c3e8b7b603acba5831a74ec7425b9
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:39.249157+00:00.
Case digest / 5b5ff7baf39924f1aad46bb741233b917569b365e4f23065943e783f9da18c76