FA-85311 / Fantasy sports scoring / Open access
Overtime clock subtracts projection · case 01
During overtime a player's projected total drops below his actual points.
ROOT CAUSE
Negative seconds left in overtime are used directly.
VERIFIED REPAIR
Clamp remaining seconds at zero.
Unsuccessful approach: Taking the absolute value adds projection back for overtime.
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
elif status == 'live':
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: overtime negative clock',
[[[207, 95, 'live', -300], [75, 120, 'live', -300], [-13, 0, 'live', 1800], [18, 95, 'pre', 900]]], 364),
('partial repair probe: overtime negative clock',
[[[128, 180, 'live', -300], [35, 95, 'live', 1800], [164, 95, 'pre', 0]]], 305),
('second regression',
[[[165, 180, 'live', 0], [31, 180, 'live', 1], [138, 120, 'final', 900], [2, 180, 'ppd', 3600],
[-18, 120, 'ppd', -300], [250, 180, 'live', -300]]],
584),
('normal control 1', [[[178, 120, 'live', 3600], [139, 0, 'live', 3600]]], 437),
('normal control 2',
[[[211, 95, 'ppd', 1800], [138, 0, 'ppd', 0], [-6, 180, 'final', 1800], [151, 95, 'live', 0]]], 145),
('normal control 3', [[[190, 120, 'ppd', 1800], [4, 95, 'live', 3600], [237, 0, 'live', 1]]], 336),
('normal control 4', [[[73, 180, 'ppd', 1800], [40, 180, 'pre', 1800], [244, 0, 'live', 3600]]], 424)],
[('regression: overtime negative clock',
[[[11, 95, 'live', -300], [220, 0, 'live', 3600], [139, 95, 'ppd', 3600], [206, 180, 'final', 3600],
[219, 120, 'pre', 1800]]],
557),
('partial repair probe: overtime negative clock',
[[[246, 180, 'live', -300], [9, 0, 'live', 3600], [166, 95, 'live', 1800], [79, 95, 'live', 1],
[69, 95, 'ppd', 0], [205, 180, 'ppd', 3600]]],
547),
('second regression',
[[[193, 0, 'final', 900], [128, 180, 'live', 0], [93, 120, 'pre', 0], [153, 95, 'final', 900],
[245, 180, 'pre', -300], [5, 180, 'live', -300]]],
779),
('normal control 1', [[[107, 120, 'live', 1], [225, 180, 'final', 0]]], 332),
('normal control 2',
[[[152, 120, 'live', 3600], [-16, 120, 'ppd', -300], [68, 180, 'live', 0], [207, 95, 'live', 1],
[104, 120, 'live', 0]]],
651),
('normal control 3',
[[[143, 95, 'ppd', 0], [155, 120, 'live', 900], [109, 0, 'live', -300], [233, 0, 'ppd', 0]]], 294),
('normal control 4', [[[192, 180, 'live', 900], [181, 0, 'pre', 3600]]], 237)],
[('regression: overtime negative clock',
[[[62, 95, 'live', 3600], [141, 180, 'live', -300], [243, 0, 'live', 900], [73, 95, 'live', 1800]]], 661),
('partial repair probe: overtime negative clock', [[[88, 180, 'live', -300], [194, 0, 'live', 1800]]], 282),
('second regression', [[[-4, 0, 'ppd', 0], [118, 120, 'live', -300]]], 118),
('normal control 1',
[[[-15, 180, 'live', 0], [-3, 180, 'final', 900], [96, 0, 'ppd', 1800], [45, 120, 'live', 900]]], 57),
('normal control 2',
[[[176, 95, 'final', 900], [89, 0, 'live', 1], [198, 0, 'final', -300], [232, 120, 'live', 1],
[81, 120, 'live', 900]]],
806),
('normal control 3',
[[[143, 120, 'ppd', 900], [202, 180, 'live', 900], [65, 120, 'pre', 900], [183, 120, 'live', 1800]]],
610),
('normal control 4',
[[[181, 120, 'ppd', 0], [227, 180, 'live', 3600], [116, 180, 'live', 3600], [158, 180, 'live', 1800],
[195, 0, 'final', 0], [86, 120, 'live', 3600]]],
1352)],
[('regression: overtime negative clock',
[[[207, 0, 'final', 0], [122, 0, 'final', -300], [188, 120, 'live', 900], [240, 180, 'live', -300]]],
787),
('partial repair probe: overtime negative clock',
[[[179, 120, 'pre', -300], [197, 0, 'final', -300], [41, 95, 'live', -300]]], 358),
('second regression',
[[[206, 120, 'live', 1], [79, 0, 'live', 0], [225, 120, 'live', -300], [20, 0, 'ppd', 0],
[7, 95, 'final', 0]]],
517),
('normal control 1',
[[[18, 0, 'final', 0], [213, 95, 'pre', 3600], [138, 95, 'ppd', 3600], [65, 95, 'live', 900]]], 201),
('normal control 2', [[[129, 120, 'ppd', 0], [225, 180, 'live', 1]]], 225),
('normal control 3',
[[[14, 0, 'final', 3600], [21, 0, 'live', 1], [159, 120, 'live', 0], [47, 120, 'pre', 0],
[87, 95, 'ppd', 3600]]],
314),
('normal control 4', [[[215, 0, 'final', 1800], [2, 180, 'ppd', -300]]], 215)],
[('regression: overtime negative clock',
[[[47, 180, 'live', 900], [228, 0, 'ppd', -300], [232, 180, 'live', 900], [170, 0, 'ppd', 0],
[60, 120, 'live', -300], [178, 0, 'live', -300]]],
607),
('partial repair probe: overtime negative clock', [[[176, 180, 'pre', 0], [29, 95, 'live', -300]]], 209),
('second regression',
[[[17, 120, 'final', -300], [38, 95, 'ppd', -300], [89, 120, 'live', 1800], [74, 120, 'pre', 0],
[100, 180, 'live', -300], [71, 0, 'live', 1]]],
457),
('normal control 1',
[[[78, 0, 'pre', 900], [84, 0, 'ppd', 1], [73, 180, 'live', 0], [94, 0, 'ppd', -300], [95, 95, 'pre', 0],
[230, 95, 'live', 1800]]],
445),
('normal control 2', [[[142, 0, 'pre', 1], [96, 180, 'live', 1]]], 96),
('normal control 3',
[[[111, 0, 'pre', -300], [199, 95, 'live', 1800], [152, 180, 'ppd', 1], [130, 95, 'live', 1800]]], 423),
('normal control 4',
[[[133, 0, 'live', -300], [200, 0, 'ppd', -300], [44, 95, 'live', 0], [152, 180, 'ppd', 0],
[32, 0, 'pre', -300]]],
177)]]
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: overtime negative clock | 346 | 364 | Failed |
| partial repair probe: overtime negative clock | 290 | 305 | Failed |
| second regression | 569 | 584 | Failed |
| normal control 1 | 437 | 437 | Passed |
| normal control 2 | 145 | 145 | Passed |
| normal control 3 | 336 | 336 | Passed |
| normal control 4 | 424 | 424 | Passed |
SHA-256 / 30a6c355c37efa13121848add37ac49999c6218555599cfbe50a7f7c4e45a5cb
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 == 'pre':
total += proj
elif status == 'live':
left = abs(left)
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: overtime negative clock',
[[[207, 95, 'live', -300], [75, 120, 'live', -300], [-13, 0, 'live', 1800], [18, 95, 'pre', 900]]], 364),
('partial repair probe: overtime negative clock',
[[[128, 180, 'live', -300], [35, 95, 'live', 1800], [164, 95, 'pre', 0]]], 305),
('second regression',
[[[165, 180, 'live', 0], [31, 180, 'live', 1], [138, 120, 'final', 900], [2, 180, 'ppd', 3600],
[-18, 120, 'ppd', -300], [250, 180, 'live', -300]]],
584),
('normal control 1', [[[178, 120, 'live', 3600], [139, 0, 'live', 3600]]], 437),
('normal control 2',
[[[211, 95, 'ppd', 1800], [138, 0, 'ppd', 0], [-6, 180, 'final', 1800], [151, 95, 'live', 0]]], 145),
('normal control 3', [[[190, 120, 'ppd', 1800], [4, 95, 'live', 3600], [237, 0, 'live', 1]]], 336),
('normal control 4', [[[73, 180, 'ppd', 1800], [40, 180, 'pre', 1800], [244, 0, 'live', 3600]]], 424)],
[('regression: overtime negative clock',
[[[11, 95, 'live', -300], [220, 0, 'live', 3600], [139, 95, 'ppd', 3600], [206, 180, 'final', 3600],
[219, 120, 'pre', 1800]]],
557),
('partial repair probe: overtime negative clock',
[[[246, 180, 'live', -300], [9, 0, 'live', 3600], [166, 95, 'live', 1800], [79, 95, 'live', 1],
[69, 95, 'ppd', 0], [205, 180, 'ppd', 3600]]],
547),
('second regression',
[[[193, 0, 'final', 900], [128, 180, 'live', 0], [93, 120, 'pre', 0], [153, 95, 'final', 900],
[245, 180, 'pre', -300], [5, 180, 'live', -300]]],
779),
('normal control 1', [[[107, 120, 'live', 1], [225, 180, 'final', 0]]], 332),
('normal control 2',
[[[152, 120, 'live', 3600], [-16, 120, 'ppd', -300], [68, 180, 'live', 0], [207, 95, 'live', 1],
[104, 120, 'live', 0]]],
651),
('normal control 3',
[[[143, 95, 'ppd', 0], [155, 120, 'live', 900], [109, 0, 'live', -300], [233, 0, 'ppd', 0]]], 294),
('normal control 4', [[[192, 180, 'live', 900], [181, 0, 'pre', 3600]]], 237)],
[('regression: overtime negative clock',
[[[62, 95, 'live', 3600], [141, 180, 'live', -300], [243, 0, 'live', 900], [73, 95, 'live', 1800]]], 661),
('partial repair probe: overtime negative clock', [[[88, 180, 'live', -300], [194, 0, 'live', 1800]]], 282),
('second regression', [[[-4, 0, 'ppd', 0], [118, 120, 'live', -300]]], 118),
('normal control 1',
[[[-15, 180, 'live', 0], [-3, 180, 'final', 900], [96, 0, 'ppd', 1800], [45, 120, 'live', 900]]], 57),
('normal control 2',
[[[176, 95, 'final', 900], [89, 0, 'live', 1], [198, 0, 'final', -300], [232, 120, 'live', 1],
[81, 120, 'live', 900]]],
806),
('normal control 3',
[[[143, 120, 'ppd', 900], [202, 180, 'live', 900], [65, 120, 'pre', 900], [183, 120, 'live', 1800]]],
610),
('normal control 4',
[[[181, 120, 'ppd', 0], [227, 180, 'live', 3600], [116, 180, 'live', 3600], [158, 180, 'live', 1800],
[195, 0, 'final', 0], [86, 120, 'live', 3600]]],
1352)],
[('regression: overtime negative clock',
[[[207, 0, 'final', 0], [122, 0, 'final', -300], [188, 120, 'live', 900], [240, 180, 'live', -300]]],
787),
('partial repair probe: overtime negative clock',
[[[179, 120, 'pre', -300], [197, 0, 'final', -300], [41, 95, 'live', -300]]], 358),
('second regression',
[[[206, 120, 'live', 1], [79, 0, 'live', 0], [225, 120, 'live', -300], [20, 0, 'ppd', 0],
[7, 95, 'final', 0]]],
517),
('normal control 1',
[[[18, 0, 'final', 0], [213, 95, 'pre', 3600], [138, 95, 'ppd', 3600], [65, 95, 'live', 900]]], 201),
('normal control 2', [[[129, 120, 'ppd', 0], [225, 180, 'live', 1]]], 225),
('normal control 3',
[[[14, 0, 'final', 3600], [21, 0, 'live', 1], [159, 120, 'live', 0], [47, 120, 'pre', 0],
[87, 95, 'ppd', 3600]]],
314),
('normal control 4', [[[215, 0, 'final', 1800], [2, 180, 'ppd', -300]]], 215)],
[('regression: overtime negative clock',
[[[47, 180, 'live', 900], [228, 0, 'ppd', -300], [232, 180, 'live', 900], [170, 0, 'ppd', 0],
[60, 120, 'live', -300], [178, 0, 'live', -300]]],
607),
('partial repair probe: overtime negative clock', [[[176, 180, 'pre', 0], [29, 95, 'live', -300]]], 209),
('second regression',
[[[17, 120, 'final', -300], [38, 95, 'ppd', -300], [89, 120, 'live', 1800], [74, 120, 'pre', 0],
[100, 180, 'live', -300], [71, 0, 'live', 1]]],
457),
('normal control 1',
[[[78, 0, 'pre', 900], [84, 0, 'ppd', 1], [73, 180, 'live', 0], [94, 0, 'ppd', -300], [95, 95, 'pre', 0],
[230, 95, 'live', 1800]]],
445),
('normal control 2', [[[142, 0, 'pre', 1], [96, 180, 'live', 1]]], 96),
('normal control 3',
[[[111, 0, 'pre', -300], [199, 95, 'live', 1800], [152, 180, 'ppd', 1], [130, 95, 'live', 1800]]], 423),
('normal control 4',
[[[133, 0, 'live', -300], [200, 0, 'ppd', -300], [44, 95, 'live', 0], [152, 180, 'ppd', 0],
[32, 0, 'pre', -300]]],
177)]]
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: overtime negative clock | 381 | 364 | Failed |
| partial repair probe: overtime negative clock | 320 | 305 | Failed |
| second regression | 599 | 584 | Failed |
| normal control 1 | 437 | 437 | Passed |
| normal control 2 | 145 | 145 | Passed |
| normal control 3 | 336 | 336 | Passed |
| normal control 4 | 424 | 424 | Passed |
SHA-256 / 2cad162144391736f7bea6270b061a3863dfc1e5dcab10bb538e84c4cc92338f
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: overtime negative clock',
[[[207, 95, 'live', -300], [75, 120, 'live', -300], [-13, 0, 'live', 1800], [18, 95, 'pre', 900]]], 364),
('partial repair probe: overtime negative clock',
[[[128, 180, 'live', -300], [35, 95, 'live', 1800], [164, 95, 'pre', 0]]], 305),
('second regression',
[[[165, 180, 'live', 0], [31, 180, 'live', 1], [138, 120, 'final', 900], [2, 180, 'ppd', 3600],
[-18, 120, 'ppd', -300], [250, 180, 'live', -300]]],
584),
('normal control 1', [[[178, 120, 'live', 3600], [139, 0, 'live', 3600]]], 437),
('normal control 2',
[[[211, 95, 'ppd', 1800], [138, 0, 'ppd', 0], [-6, 180, 'final', 1800], [151, 95, 'live', 0]]], 145),
('normal control 3', [[[190, 120, 'ppd', 1800], [4, 95, 'live', 3600], [237, 0, 'live', 1]]], 336),
('normal control 4', [[[73, 180, 'ppd', 1800], [40, 180, 'pre', 1800], [244, 0, 'live', 3600]]], 424)],
[('regression: overtime negative clock',
[[[11, 95, 'live', -300], [220, 0, 'live', 3600], [139, 95, 'ppd', 3600], [206, 180, 'final', 3600],
[219, 120, 'pre', 1800]]],
557),
('partial repair probe: overtime negative clock',
[[[246, 180, 'live', -300], [9, 0, 'live', 3600], [166, 95, 'live', 1800], [79, 95, 'live', 1],
[69, 95, 'ppd', 0], [205, 180, 'ppd', 3600]]],
547),
('second regression',
[[[193, 0, 'final', 900], [128, 180, 'live', 0], [93, 120, 'pre', 0], [153, 95, 'final', 900],
[245, 180, 'pre', -300], [5, 180, 'live', -300]]],
779),
('normal control 1', [[[107, 120, 'live', 1], [225, 180, 'final', 0]]], 332),
('normal control 2',
[[[152, 120, 'live', 3600], [-16, 120, 'ppd', -300], [68, 180, 'live', 0], [207, 95, 'live', 1],
[104, 120, 'live', 0]]],
651),
('normal control 3',
[[[143, 95, 'ppd', 0], [155, 120, 'live', 900], [109, 0, 'live', -300], [233, 0, 'ppd', 0]]], 294),
('normal control 4', [[[192, 180, 'live', 900], [181, 0, 'pre', 3600]]], 237)],
[('regression: overtime negative clock',
[[[62, 95, 'live', 3600], [141, 180, 'live', -300], [243, 0, 'live', 900], [73, 95, 'live', 1800]]], 661),
('partial repair probe: overtime negative clock', [[[88, 180, 'live', -300], [194, 0, 'live', 1800]]], 282),
('second regression', [[[-4, 0, 'ppd', 0], [118, 120, 'live', -300]]], 118),
('normal control 1',
[[[-15, 180, 'live', 0], [-3, 180, 'final', 900], [96, 0, 'ppd', 1800], [45, 120, 'live', 900]]], 57),
('normal control 2',
[[[176, 95, 'final', 900], [89, 0, 'live', 1], [198, 0, 'final', -300], [232, 120, 'live', 1],
[81, 120, 'live', 900]]],
806),
('normal control 3',
[[[143, 120, 'ppd', 900], [202, 180, 'live', 900], [65, 120, 'pre', 900], [183, 120, 'live', 1800]]],
610),
('normal control 4',
[[[181, 120, 'ppd', 0], [227, 180, 'live', 3600], [116, 180, 'live', 3600], [158, 180, 'live', 1800],
[195, 0, 'final', 0], [86, 120, 'live', 3600]]],
1352)],
[('regression: overtime negative clock',
[[[207, 0, 'final', 0], [122, 0, 'final', -300], [188, 120, 'live', 900], [240, 180, 'live', -300]]],
787),
('partial repair probe: overtime negative clock',
[[[179, 120, 'pre', -300], [197, 0, 'final', -300], [41, 95, 'live', -300]]], 358),
('second regression',
[[[206, 120, 'live', 1], [79, 0, 'live', 0], [225, 120, 'live', -300], [20, 0, 'ppd', 0],
[7, 95, 'final', 0]]],
517),
('normal control 1',
[[[18, 0, 'final', 0], [213, 95, 'pre', 3600], [138, 95, 'ppd', 3600], [65, 95, 'live', 900]]], 201),
('normal control 2', [[[129, 120, 'ppd', 0], [225, 180, 'live', 1]]], 225),
('normal control 3',
[[[14, 0, 'final', 3600], [21, 0, 'live', 1], [159, 120, 'live', 0], [47, 120, 'pre', 0],
[87, 95, 'ppd', 3600]]],
314),
('normal control 4', [[[215, 0, 'final', 1800], [2, 180, 'ppd', -300]]], 215)],
[('regression: overtime negative clock',
[[[47, 180, 'live', 900], [228, 0, 'ppd', -300], [232, 180, 'live', 900], [170, 0, 'ppd', 0],
[60, 120, 'live', -300], [178, 0, 'live', -300]]],
607),
('partial repair probe: overtime negative clock', [[[176, 180, 'pre', 0], [29, 95, 'live', -300]]], 209),
('second regression',
[[[17, 120, 'final', -300], [38, 95, 'ppd', -300], [89, 120, 'live', 1800], [74, 120, 'pre', 0],
[100, 180, 'live', -300], [71, 0, 'live', 1]]],
457),
('normal control 1',
[[[78, 0, 'pre', 900], [84, 0, 'ppd', 1], [73, 180, 'live', 0], [94, 0, 'ppd', -300], [95, 95, 'pre', 0],
[230, 95, 'live', 1800]]],
445),
('normal control 2', [[[142, 0, 'pre', 1], [96, 180, 'live', 1]]], 96),
('normal control 3',
[[[111, 0, 'pre', -300], [199, 95, 'live', 1800], [152, 180, 'ppd', 1], [130, 95, 'live', 1800]]], 423),
('normal control 4',
[[[133, 0, 'live', -300], [200, 0, 'ppd', -300], [44, 95, 'live', 0], [152, 180, 'ppd', 0],
[32, 0, 'pre', -300]]],
177)]]
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: overtime negative clock | 364 | 364 | Passed |
| partial repair probe: overtime negative clock | 305 | 305 | Passed |
| second regression | 584 | 584 | Passed |
| normal control 1 | 437 | 437 | Passed |
| normal control 2 | 145 | 145 | Passed |
| normal control 3 | 336 | 336 | Passed |
| normal control 4 | 424 | 424 | Passed |
SHA-256 / f6e020177c56713309ec3104b91f527dd5f5fb61e28bb17a63a91e4bf2c3669e
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.205787+00:00.
Case digest / 938bbda9e91e520a6e30aaa414b38268d60aa9cc9ecc06c4cf81f85c836d2c0a