FAILURE MAP
← Case archive

FA-67866 / Traffic signal timing plans / Open access

Webster cycle length: the cycle is not capped at the controller maximum · case 01

Webster cycle length returns a wrong result when the cycle is not capped at the controller maximum.

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

ROOT CAUSE

The min and max operators are swapped, so the result collapses to the minimum cycle bound whenever cmin < cmax.

VERIFIED REPAIR

Restore the cycle bounds clamp rule so that the step reads `max(x['cmin'], min(x['cmax'], int(c)))`.

Unsuccessful approach: Dropping the upper clamp fixes short cycles but still lets heavy volumes exceed cmax.

Case contract

Input {phases: per-phase lists of lane-group flows veh/h, sat: saturation flow per lane group, lost: lost seconds per phase, allred: extra all-red seconds per cycle, cmin, cmax}. Y is the sum over phases of the critical (largest) flow ratio; L = lost*phases + allred. If Y >= 0.9 return 'oversaturated'. Otherwise C0 = (1.5L + 5)/(1 - Y), rounded UP to a multiple of 5 s and clamped to [cmin, cmax]. Return {cycle, lost: L, y_milli: floor(1000Y)}.

Why this case matters

Signal timing arithmetic is exact and integer or rational; a wrong rule silently produces unsafe or inefficient timing plans.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(x):
    ph = x['phases']
    s = x['sat']
    Y = Fraction(0)
    for group in ph:
        Y += Fraction(max(group), s)
    L = x['lost'] * len(ph) + x['allred']
    if Y >= Fraction(9, 10):
        return 'oversaturated'
    c0 = (Fraction(3, 2) * L + 5) / (1 - Y)
    c = -(-c0 // 5) * 5
    c = min(x['cmin'], max(x['cmax'], int(c)))
    return {'cycle': c, 'lost': L, 'y_milli': int(Y * 1000)}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'phases': [[600, 750, 600], [120, 300, 840]], 'sat': 2000, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 90}, {'cycle': 90, 'lost': 10, 'y_milli': 795}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[450, 840], [690], [630, 270], [360, 570]], 'sat': 1900, 'lost': 4, 'allred': 2, 'cmin': 60, 'cmax': 90}, 'oversaturated'), ({'phases': [[510, 570], [420, 210, 90], [240, 780]], 'sat': 2000, 'lost': 5, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 19, 'y_milli': 885}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[870, 900, 270], [480]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 40, 'cmax': 120}, {'cycle': 95, 'lost': 16, 'y_milli': 690}), ({'phases': [[390], [750, 690], [750, 60, 720]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 60, 'cmax': 180}, 'oversaturated')], [({'phases': [[150, 330], [510, 690, 480]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 50, 'cmax': 120}, {'cycle': 50, 'lost': 12, 'y_milli': 510}), ({'phases': [[690, 570], [780, 570]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 12, 'y_milli': 735}), ({'phases': [[390], [510], [600, 840]], 'sat': 2000, 'lost': 5, 'allred': 2, 'cmin': 50, 'cmax': 90}, {'cycle': 90, 'lost': 17, 'y_milli': 870}), ({'phases': [[180], [150, 720, 810], [630, 690, 390]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 15, 'y_milli': 884}), ({'phases': [[660], [690], [480, 60], [630, 390, 510]], 'sat': 2000, 'lost': 4, 'allred': 6, 'cmin': 50, 'cmax': 90}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated')], [({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[90, 660, 150], [630, 300, 90], [450]], 'sat': 2000, 'lost': 3, 'allred': 6, 'cmin': 60, 'cmax': 120}, {'cycle': 120, 'lost': 15, 'y_milli': 870}), ({'phases': [[180, 450, 660], [330, 450], [120], [480]], 'sat': 2000, 'lost': 2, 'allred': 0, 'cmin': 40, 'cmax': 150}, {'cycle': 120, 'lost': 8, 'y_milli': 855}), ({'phases': [[600, 90, 150], [570, 390, 120], [360]], 'sat': 1800, 'lost': 4, 'allred': 1, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 13, 'y_milli': 850}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[420, 270, 510], [720], [540, 870, 300]], 'sat': 1900, 'lost': 2, 'allred': 0, 'cmin': 60, 'cmax': 180}, 'oversaturated'), ({'phases': [[720, 210, 690], [630], [780, 360, 60]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 50, 'cmax': 90}, 'oversaturated')], [({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[270], [510, 180], [120]], 'sat': 1800, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 50, 'lost': 13, 'y_milli': 500}), ({'phases': [[450, 660, 180], [870, 870, 540]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 16, 'y_milli': 765}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[330, 540], [780], [120], [780, 390, 600]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 120}, 'oversaturated'), ({'phases': [[240, 570], [720, 390, 900]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 50, 'cmax': 180}, {'cycle': 85, 'lost': 7, 'y_milli': 816}), ({'phases': [[720, 720, 270], [870, 90]], 'sat': 1800, 'lost': 3, 'allred': 2, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 8, 'y_milli': 883})], [({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[450, 90], [120, 480]], 'sat': 1800, 'lost': 3, 'allred': 5, 'cmin': 40, 'cmax': 180}, {'cycle': 45, 'lost': 11, 'y_milli': 516}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[360, 210], [150], [210, 120], [120, 420, 870]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 20, 'y_milli': 836}), ({'phases': [[360, 360, 60], [540], [420, 600]], 'sat': 1800, 'lost': 5, 'allred': 5, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 20, 'y_milli': 833}), ({'phases': [[180], [60, 480], [390], [60]], 'sat': 1800, 'lost': 3, 'allred': 3, 'cmin': 40, 'cmax': 90}, {'cycle': 75, 'lost': 15, 'y_milli': 616}), ({'phases': [[360], [90, 690, 420]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 40, 'cmax': 150}, {'cycle': 60, 'lost': 13, 'y_milli': 583})]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('timing oracle' + ' %d' % i, 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
timing oracle 0{'cycle': 40, 'lost': 10, 'y_milli': 795}{'cycle': 90, 'lost': 10, 'y_milli': 795}Failed
timing oracle 1oversaturatedoversaturatedPassed
timing oracle 2{'cycle': 40, 'lost': 10, 'y_milli': 583}{'cycle': 50, 'lost': 10, 'y_milli': 583}Failed
timing oracle 3oversaturatedoversaturatedPassed
timing oracle 4{'cycle': 50, 'lost': 19, 'y_milli': 885}{'cycle': 180, 'lost': 19, 'y_milli': 885}Failed
timing oracle 5{'cycle': 60, 'lost': 9, 'y_milli': 150}{'cycle': 60, 'lost': 9, 'y_milli': 150}Passed
timing oracle 6{'cycle': 40, 'lost': 16, 'y_milli': 690}{'cycle': 95, 'lost': 16, 'y_milli': 690}Failed
timing oracle 7oversaturatedoversaturatedPassed

SHA-256 / 85d305508983f1bae173440921c31bcd8733b4781c15a8446acd56dc27eda0ff

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(x):
    ph = x['phases']
    s = x['sat']
    Y = Fraction(0)
    for group in ph:
        Y += Fraction(max(group), s)
    L = x['lost'] * len(ph) + x['allred']
    if Y >= Fraction(9, 10):
        return 'oversaturated'
    c0 = (Fraction(3, 2) * L + 5) / (1 - Y)
    c = -(-c0 // 5) * 5
    c = max(x['cmin'], int(c))
    return {'cycle': c, 'lost': L, 'y_milli': int(Y * 1000)}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'phases': [[600, 750, 600], [120, 300, 840]], 'sat': 2000, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 90}, {'cycle': 90, 'lost': 10, 'y_milli': 795}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[450, 840], [690], [630, 270], [360, 570]], 'sat': 1900, 'lost': 4, 'allred': 2, 'cmin': 60, 'cmax': 90}, 'oversaturated'), ({'phases': [[510, 570], [420, 210, 90], [240, 780]], 'sat': 2000, 'lost': 5, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 19, 'y_milli': 885}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[870, 900, 270], [480]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 40, 'cmax': 120}, {'cycle': 95, 'lost': 16, 'y_milli': 690}), ({'phases': [[390], [750, 690], [750, 60, 720]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 60, 'cmax': 180}, 'oversaturated')], [({'phases': [[150, 330], [510, 690, 480]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 50, 'cmax': 120}, {'cycle': 50, 'lost': 12, 'y_milli': 510}), ({'phases': [[690, 570], [780, 570]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 12, 'y_milli': 735}), ({'phases': [[390], [510], [600, 840]], 'sat': 2000, 'lost': 5, 'allred': 2, 'cmin': 50, 'cmax': 90}, {'cycle': 90, 'lost': 17, 'y_milli': 870}), ({'phases': [[180], [150, 720, 810], [630, 690, 390]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 15, 'y_milli': 884}), ({'phases': [[660], [690], [480, 60], [630, 390, 510]], 'sat': 2000, 'lost': 4, 'allred': 6, 'cmin': 50, 'cmax': 90}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated')], [({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[90, 660, 150], [630, 300, 90], [450]], 'sat': 2000, 'lost': 3, 'allred': 6, 'cmin': 60, 'cmax': 120}, {'cycle': 120, 'lost': 15, 'y_milli': 870}), ({'phases': [[180, 450, 660], [330, 450], [120], [480]], 'sat': 2000, 'lost': 2, 'allred': 0, 'cmin': 40, 'cmax': 150}, {'cycle': 120, 'lost': 8, 'y_milli': 855}), ({'phases': [[600, 90, 150], [570, 390, 120], [360]], 'sat': 1800, 'lost': 4, 'allred': 1, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 13, 'y_milli': 850}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[420, 270, 510], [720], [540, 870, 300]], 'sat': 1900, 'lost': 2, 'allred': 0, 'cmin': 60, 'cmax': 180}, 'oversaturated'), ({'phases': [[720, 210, 690], [630], [780, 360, 60]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 50, 'cmax': 90}, 'oversaturated')], [({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[270], [510, 180], [120]], 'sat': 1800, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 50, 'lost': 13, 'y_milli': 500}), ({'phases': [[450, 660, 180], [870, 870, 540]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 16, 'y_milli': 765}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[330, 540], [780], [120], [780, 390, 600]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 120}, 'oversaturated'), ({'phases': [[240, 570], [720, 390, 900]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 50, 'cmax': 180}, {'cycle': 85, 'lost': 7, 'y_milli': 816}), ({'phases': [[720, 720, 270], [870, 90]], 'sat': 1800, 'lost': 3, 'allred': 2, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 8, 'y_milli': 883})], [({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[450, 90], [120, 480]], 'sat': 1800, 'lost': 3, 'allred': 5, 'cmin': 40, 'cmax': 180}, {'cycle': 45, 'lost': 11, 'y_milli': 516}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[360, 210], [150], [210, 120], [120, 420, 870]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 20, 'y_milli': 836}), ({'phases': [[360, 360, 60], [540], [420, 600]], 'sat': 1800, 'lost': 5, 'allred': 5, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 20, 'y_milli': 833}), ({'phases': [[180], [60, 480], [390], [60]], 'sat': 1800, 'lost': 3, 'allred': 3, 'cmin': 40, 'cmax': 90}, {'cycle': 75, 'lost': 15, 'y_milli': 616}), ({'phases': [[360], [90, 690, 420]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 40, 'cmax': 150}, {'cycle': 60, 'lost': 13, 'y_milli': 583})]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('timing oracle' + ' %d' % i, 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
timing oracle 0{'cycle': 100, 'lost': 10, 'y_milli': 795}{'cycle': 90, 'lost': 10, 'y_milli': 795}Failed
timing oracle 1oversaturatedoversaturatedPassed
timing oracle 2{'cycle': 50, 'lost': 10, 'y_milli': 583}{'cycle': 50, 'lost': 10, 'y_milli': 583}Passed
timing oracle 3oversaturatedoversaturatedPassed
timing oracle 4{'cycle': 295, 'lost': 19, 'y_milli': 885}{'cycle': 180, 'lost': 19, 'y_milli': 885}Failed
timing oracle 5{'cycle': 60, 'lost': 9, 'y_milli': 150}{'cycle': 60, 'lost': 9, 'y_milli': 150}Passed
timing oracle 6{'cycle': 95, 'lost': 16, 'y_milli': 690}{'cycle': 95, 'lost': 16, 'y_milli': 690}Passed
timing oracle 7oversaturatedoversaturatedPassed

SHA-256 / 601c7e6573380722495ea7db264a36b5ae0a9b891102e4a9da8d90a2ecfa8f2d

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(x):
    ph = x['phases']
    s = x['sat']
    Y = Fraction(0)
    for group in ph:
        Y += Fraction(max(group), s)
    L = x['lost'] * len(ph) + x['allred']
    if Y >= Fraction(9, 10):
        return 'oversaturated'
    c0 = (Fraction(3, 2) * L + 5) / (1 - Y)
    c = -(-c0 // 5) * 5
    c = max(x['cmin'], min(x['cmax'], int(c)))
    return {'cycle': c, 'lost': L, 'y_milli': int(Y * 1000)}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'phases': [[600, 750, 600], [120, 300, 840]], 'sat': 2000, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 90}, {'cycle': 90, 'lost': 10, 'y_milli': 795}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[450, 840], [690], [630, 270], [360, 570]], 'sat': 1900, 'lost': 4, 'allred': 2, 'cmin': 60, 'cmax': 90}, 'oversaturated'), ({'phases': [[510, 570], [420, 210, 90], [240, 780]], 'sat': 2000, 'lost': 5, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 19, 'y_milli': 885}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[870, 900, 270], [480]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 40, 'cmax': 120}, {'cycle': 95, 'lost': 16, 'y_milli': 690}), ({'phases': [[390], [750, 690], [750, 60, 720]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 60, 'cmax': 180}, 'oversaturated')], [({'phases': [[150, 330], [510, 690, 480]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 50, 'cmax': 120}, {'cycle': 50, 'lost': 12, 'y_milli': 510}), ({'phases': [[690, 570], [780, 570]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 12, 'y_milli': 735}), ({'phases': [[390], [510], [600, 840]], 'sat': 2000, 'lost': 5, 'allred': 2, 'cmin': 50, 'cmax': 90}, {'cycle': 90, 'lost': 17, 'y_milli': 870}), ({'phases': [[180], [150, 720, 810], [630, 690, 390]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 15, 'y_milli': 884}), ({'phases': [[660], [690], [480, 60], [630, 390, 510]], 'sat': 2000, 'lost': 4, 'allred': 6, 'cmin': 50, 'cmax': 90}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated')], [({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[90, 660, 150], [630, 300, 90], [450]], 'sat': 2000, 'lost': 3, 'allred': 6, 'cmin': 60, 'cmax': 120}, {'cycle': 120, 'lost': 15, 'y_milli': 870}), ({'phases': [[180, 450, 660], [330, 450], [120], [480]], 'sat': 2000, 'lost': 2, 'allred': 0, 'cmin': 40, 'cmax': 150}, {'cycle': 120, 'lost': 8, 'y_milli': 855}), ({'phases': [[600, 90, 150], [570, 390, 120], [360]], 'sat': 1800, 'lost': 4, 'allred': 1, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 13, 'y_milli': 850}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[420, 270, 510], [720], [540, 870, 300]], 'sat': 1900, 'lost': 2, 'allred': 0, 'cmin': 60, 'cmax': 180}, 'oversaturated'), ({'phases': [[720, 210, 690], [630], [780, 360, 60]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 50, 'cmax': 90}, 'oversaturated')], [({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[270], [510, 180], [120]], 'sat': 1800, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 50, 'lost': 13, 'y_milli': 500}), ({'phases': [[450, 660, 180], [870, 870, 540]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 16, 'y_milli': 765}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[330, 540], [780], [120], [780, 390, 600]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 120}, 'oversaturated'), ({'phases': [[240, 570], [720, 390, 900]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 50, 'cmax': 180}, {'cycle': 85, 'lost': 7, 'y_milli': 816}), ({'phases': [[720, 720, 270], [870, 90]], 'sat': 1800, 'lost': 3, 'allred': 2, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 8, 'y_milli': 883})], [({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[450, 90], [120, 480]], 'sat': 1800, 'lost': 3, 'allred': 5, 'cmin': 40, 'cmax': 180}, {'cycle': 45, 'lost': 11, 'y_milli': 516}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[360, 210], [150], [210, 120], [120, 420, 870]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 20, 'y_milli': 836}), ({'phases': [[360, 360, 60], [540], [420, 600]], 'sat': 1800, 'lost': 5, 'allred': 5, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 20, 'y_milli': 833}), ({'phases': [[180], [60, 480], [390], [60]], 'sat': 1800, 'lost': 3, 'allred': 3, 'cmin': 40, 'cmax': 90}, {'cycle': 75, 'lost': 15, 'y_milli': 616}), ({'phases': [[360], [90, 690, 420]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 40, 'cmax': 150}, {'cycle': 60, 'lost': 13, 'y_milli': 583})]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('timing oracle' + ' %d' % i, 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
timing oracle 0{'cycle': 90, 'lost': 10, 'y_milli': 795}{'cycle': 90, 'lost': 10, 'y_milli': 795}Passed
timing oracle 1oversaturatedoversaturatedPassed
timing oracle 2{'cycle': 50, 'lost': 10, 'y_milli': 583}{'cycle': 50, 'lost': 10, 'y_milli': 583}Passed
timing oracle 3oversaturatedoversaturatedPassed
timing oracle 4{'cycle': 180, 'lost': 19, 'y_milli': 885}{'cycle': 180, 'lost': 19, 'y_milli': 885}Passed
timing oracle 5{'cycle': 60, 'lost': 9, 'y_milli': 150}{'cycle': 60, 'lost': 9, 'y_milli': 150}Passed
timing oracle 6{'cycle': 95, 'lost': 16, 'y_milli': 690}{'cycle': 95, 'lost': 16, 'y_milli': 690}Passed
timing oracle 7oversaturatedoversaturatedPassed

SHA-256 / e85c80c8ed935cdb09d2c6aa87e2aeec3f72c0e2acdec076a4d2fbb9265a5d0a

Verification & scope

A deterministic, bounded toy model with a stipulated contract; it makes no claim of conformance to any agency manual or standard. 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:47:56.923230+00:00.

Case digest / 0175fa041fbbb72ea525a0a6c54125ea49ecefa62f3add443df4417eaf4c8715