FAILURE MAP
← Case archive

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.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
regression: overtime negative clock346364Failed
partial repair probe: overtime negative clock290305Failed
second regression569584Failed
normal control 1437437Passed
normal control 2145145Passed
normal control 3336336Passed
normal control 4424424Passed

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 fixtureActualExpectedOutcome
regression: overtime negative clock381364Failed
partial repair probe: overtime negative clock320305Failed
second regression599584Failed
normal control 1437437Passed
normal control 2145145Passed
normal control 3336336Passed
normal control 4424424Passed

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 fixtureActualExpectedOutcome
regression: overtime negative clock364364Passed
partial repair probe: overtime negative clock305305Passed
second regression584584Passed
normal control 1437437Passed
normal control 2145145Passed
normal control 3336336Passed
normal control 4424424Passed

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