FAILURE MAP
← Case archive

FA-85316 / Fantasy sports scoring / Open access

Postponed game treated as live · case 01

Players in postponed games keep contributing projected points.

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

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 fixtureActualExpectedOutcome
regression: postponed games574272Failed
partial repair probe: postponed games548514Failed
second regression1670Failed
normal control 1292292Passed
normal control 2655655Passed
normal control 3227227Passed
normal control 4144144Passed

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 fixtureActualExpectedOutcome
regression: postponed games632272Failed
partial repair probe: postponed games694514Failed
second regression1200Failed
normal control 1292292Passed
normal control 2655655Passed
normal control 3227227Passed
normal control 4144144Passed

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 fixtureActualExpectedOutcome
regression: postponed games272272Passed
partial repair probe: postponed games514514Passed
second regression00Passed
normal control 1292292Passed
normal control 2655655Passed
normal control 3227227Passed
normal control 4144144Passed

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