FA-68031 / Traffic signal timing plans / Open access
Coordinated local cycle timer: end-of-green offsets are shifted in the wrong direction · case 01
Coordinated local cycle timer returns a wrong result when end-of-green offsets are shifted in the wrong direction.
ROOT CAUSE
Converting an end-of-green reference subtracts the coordinated green instead of adding it.
VERIFIED REPAIR
Restore the offset reference point rule so that the step reads `lc = (lc + sp[0][1] - y - r) % C`.
Unsuccessful approach: Adding the whole split includes the yellow and all-red, overshooting by the clearance time.
Case contract
Input {cycle, offset, master, splits: [[phase, split s]] in sequence starting with the coordinated phase, yellow, red, ref}. Splits must sum to the cycle, else 'bad-splits'. Local time = (master - offset) mod cycle, where the offset marks the start of coordinated green (ref 'begin') or the end of coordinated green (ref 'end'). Each split is green then yellow then all-red. Return [phase, interval, seconds remaining].
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
N = 1
observations = []
def solve(x):
C = x['cycle']
sp = x['splits']
y, r = x['yellow'], x['red']
if sum(s for _, s in sp) != C:
return 'bad-splits'
lc = (x['master'] - x['offset']) % C
if x['ref'] == 'end':
lc = (lc - sp[0][1] + y + r) % C
start = 0
for ph, s in sp:
ge = start + s - y - r
if lc < ge:
return [ph, 'green', ge - lc]
if lc < ge + y:
return [ph, 'yellow', ge + y - lc]
if lc < start + s:
return [ph, 'red', start + s - lc]
start += s
return ['free', 'dark', 0]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'cycle': 105, 'offset': 35, 'master': 4, 'splits': [[2, 37], [4, 29], [6, 39]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 26]), ({'cycle': 116, 'offset': 95, 'master': 503, 'splits': [[2, 32], [4, 37], [6, 31], [8, 16]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, [4, 'green', 5]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 46, 'offset': 4, 'master': 249, 'splits': [[2, 15], [4, 31]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, [4, 'green', 27]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 74, 'offset': 17, 'master': 890, 'splits': [[2, 21], [4, 29], [6, 24]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [2, 'green', 15]), ({'cycle': 126, 'offset': 79, 'master': 132, 'splits': [[2, 32], [4, 37], [6, 40], [8, 17]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [6, 'green', 24])], [({'cycle': 84, 'offset': 40, 'master': 210, 'splits': [[2, 39], [4, 14], [6, 31]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 32]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 39, 'offset': 16, 'master': 927, 'splits': [[2, 16], [4, 23]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [2, 'yellow', 1]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 44, 'offset': 26, 'master': 566, 'splits': [[2, 32], [4, 12]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'yellow', 4]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 94, 'offset': 81, 'master': 161, 'splits': [[2, 32], [4, 26], [6, 36]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [2, 'green', 14]), ({'cycle': 56, 'offset': 16, 'master': 493, 'splits': [[2, 27], [4, 29]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [4, 'green', 21])], [({'cycle': 69, 'offset': 41, 'master': 89, 'splits': [[2, 30], [4, 39]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [4, 'green', 16]), ({'cycle': 56, 'offset': 17, 'master': 73, 'splits': [[2, 25], [4, 31]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [2, 'yellow', 4]), ({'cycle': 105, 'offset': 65, 'master': 94, 'splits': [[2, 32], [4, 20], [6, 33], [8, 15]], 'yellow': 4, 'red': 1, 'ref': 'end'}, 'bad-splits'), ({'cycle': 43, 'offset': 9, 'master': 403, 'splits': [[2, 15], [4, 28]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [2, 'green', 3]), ({'cycle': 102, 'offset': 65, 'master': 146, 'splits': [[2, 29], [4, 16], [6, 27], [8, 30]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [2, 'green', 21]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25])], [({'cycle': 99, 'offset': 95, 'master': 689, 'splits': [[2, 39], [4, 32], [6, 28]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [2, 'green', 34]), ({'cycle': 69, 'offset': 37, 'master': 680, 'splits': [[2, 31], [4, 38]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [4, 'green', 16]), ({'cycle': 78, 'offset': 0, 'master': 597, 'splits': [[2, 27], [4, 16], [6, 35]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [6, 'green', 21]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 72, 'offset': 22, 'master': 392, 'splits': [[2, 23], [4, 30], [6, 19]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [4, 'green', 20]), ({'cycle': 72, 'offset': 34, 'master': 687, 'splits': [[2, 32], [4, 40]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [2, 'red', 1]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits')], [({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 70, 'offset': 26, 'master': 359, 'splits': [[2, 38], [4, 32]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [2, 'green', 17]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 112, 'offset': 45, 'master': 656, 'splits': [[2, 29], [4, 39], [6, 25], [8, 19]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [4, 'green', 11]), ({'cycle': 140, 'offset': 33, 'master': 792, 'splits': [[2, 35], [4, 37], [6, 35], [8, 33]], 'yellow': 3, 'red': 1, 'ref': 'end'}, [6, 'green', 13]), ({'cycle': 59, 'offset': 32, 'master': 537, 'splits': [[2, 21], [4, 18], [6, 20]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [4, 'green', 1]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 93, 'offset': 2, 'master': 972, 'splits': [[2, 40], [4, 36], [6, 17]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [4, 'red', 1])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| timing oracle 0 | [6, 'green', 26] | [6, 'green', 26] | Passed |
| timing oracle 1 | [4, 'green', 5] | [4, 'green', 5] | Passed |
| timing oracle 2 | [2, 'green', 25] | [2, 'green', 25] | Passed |
| timing oracle 3 | [4, 'green', 27] | [4, 'green', 27] | Passed |
| timing oracle 4 | [6, 'green', 15] | [4, 'green', 10] | Failed |
| timing oracle 5 | bad-splits | bad-splits | Passed |
| timing oracle 6 | [4, 'yellow', 4] | [2, 'green', 15] | Failed |
| timing oracle 7 | [2, 'green', 1] | [6, 'green', 24] | Failed |
SHA-256 / 5665023140ccdb01e131973464c8c4455a713e54962ec9c5af099f381661a7fb
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
C = x['cycle']
sp = x['splits']
y, r = x['yellow'], x['red']
if sum(s for _, s in sp) != C:
return 'bad-splits'
lc = (x['master'] - x['offset']) % C
if x['ref'] == 'end':
lc = (lc + sp[0][1]) % C
start = 0
for ph, s in sp:
ge = start + s - y - r
if lc < ge:
return [ph, 'green', ge - lc]
if lc < ge + y:
return [ph, 'yellow', ge + y - lc]
if lc < start + s:
return [ph, 'red', start + s - lc]
start += s
return ['free', 'dark', 0]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'cycle': 105, 'offset': 35, 'master': 4, 'splits': [[2, 37], [4, 29], [6, 39]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 26]), ({'cycle': 116, 'offset': 95, 'master': 503, 'splits': [[2, 32], [4, 37], [6, 31], [8, 16]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, [4, 'green', 5]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 46, 'offset': 4, 'master': 249, 'splits': [[2, 15], [4, 31]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, [4, 'green', 27]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 74, 'offset': 17, 'master': 890, 'splits': [[2, 21], [4, 29], [6, 24]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [2, 'green', 15]), ({'cycle': 126, 'offset': 79, 'master': 132, 'splits': [[2, 32], [4, 37], [6, 40], [8, 17]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [6, 'green', 24])], [({'cycle': 84, 'offset': 40, 'master': 210, 'splits': [[2, 39], [4, 14], [6, 31]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 32]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 39, 'offset': 16, 'master': 927, 'splits': [[2, 16], [4, 23]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [2, 'yellow', 1]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 44, 'offset': 26, 'master': 566, 'splits': [[2, 32], [4, 12]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'yellow', 4]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 94, 'offset': 81, 'master': 161, 'splits': [[2, 32], [4, 26], [6, 36]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [2, 'green', 14]), ({'cycle': 56, 'offset': 16, 'master': 493, 'splits': [[2, 27], [4, 29]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [4, 'green', 21])], [({'cycle': 69, 'offset': 41, 'master': 89, 'splits': [[2, 30], [4, 39]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [4, 'green', 16]), ({'cycle': 56, 'offset': 17, 'master': 73, 'splits': [[2, 25], [4, 31]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [2, 'yellow', 4]), ({'cycle': 105, 'offset': 65, 'master': 94, 'splits': [[2, 32], [4, 20], [6, 33], [8, 15]], 'yellow': 4, 'red': 1, 'ref': 'end'}, 'bad-splits'), ({'cycle': 43, 'offset': 9, 'master': 403, 'splits': [[2, 15], [4, 28]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [2, 'green', 3]), ({'cycle': 102, 'offset': 65, 'master': 146, 'splits': [[2, 29], [4, 16], [6, 27], [8, 30]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [2, 'green', 21]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25])], [({'cycle': 99, 'offset': 95, 'master': 689, 'splits': [[2, 39], [4, 32], [6, 28]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [2, 'green', 34]), ({'cycle': 69, 'offset': 37, 'master': 680, 'splits': [[2, 31], [4, 38]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [4, 'green', 16]), ({'cycle': 78, 'offset': 0, 'master': 597, 'splits': [[2, 27], [4, 16], [6, 35]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [6, 'green', 21]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 72, 'offset': 22, 'master': 392, 'splits': [[2, 23], [4, 30], [6, 19]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [4, 'green', 20]), ({'cycle': 72, 'offset': 34, 'master': 687, 'splits': [[2, 32], [4, 40]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [2, 'red', 1]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits')], [({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 70, 'offset': 26, 'master': 359, 'splits': [[2, 38], [4, 32]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [2, 'green', 17]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 112, 'offset': 45, 'master': 656, 'splits': [[2, 29], [4, 39], [6, 25], [8, 19]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [4, 'green', 11]), ({'cycle': 140, 'offset': 33, 'master': 792, 'splits': [[2, 35], [4, 37], [6, 35], [8, 33]], 'yellow': 3, 'red': 1, 'ref': 'end'}, [6, 'green', 13]), ({'cycle': 59, 'offset': 32, 'master': 537, 'splits': [[2, 21], [4, 18], [6, 20]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [4, 'green', 1]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 93, 'offset': 2, 'master': 972, 'splits': [[2, 40], [4, 36], [6, 17]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [4, 'red', 1])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| timing oracle 0 | [6, 'green', 26] | [6, 'green', 26] | Passed |
| timing oracle 1 | [4, 'green', 5] | [4, 'green', 5] | Passed |
| timing oracle 2 | [2, 'green', 25] | [2, 'green', 25] | Passed |
| timing oracle 3 | [4, 'green', 27] | [4, 'green', 27] | Passed |
| timing oracle 4 | [4, 'green', 5] | [4, 'green', 10] | Failed |
| timing oracle 5 | bad-splits | bad-splits | Passed |
| timing oracle 6 | [2, 'green', 9] | [2, 'green', 15] | Failed |
| timing oracle 7 | [6, 'green', 19] | [6, 'green', 24] | Failed |
SHA-256 / b18f15f78d9116152d4c9c938d890e4014bca1634da8a477c84bbd84c02694cb
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
C = x['cycle']
sp = x['splits']
y, r = x['yellow'], x['red']
if sum(s for _, s in sp) != C:
return 'bad-splits'
lc = (x['master'] - x['offset']) % C
if x['ref'] == 'end':
lc = (lc + sp[0][1] - y - r) % C
start = 0
for ph, s in sp:
ge = start + s - y - r
if lc < ge:
return [ph, 'green', ge - lc]
if lc < ge + y:
return [ph, 'yellow', ge + y - lc]
if lc < start + s:
return [ph, 'red', start + s - lc]
start += s
return ['free', 'dark', 0]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'cycle': 105, 'offset': 35, 'master': 4, 'splits': [[2, 37], [4, 29], [6, 39]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 26]), ({'cycle': 116, 'offset': 95, 'master': 503, 'splits': [[2, 32], [4, 37], [6, 31], [8, 16]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, [4, 'green', 5]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 46, 'offset': 4, 'master': 249, 'splits': [[2, 15], [4, 31]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, [4, 'green', 27]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 74, 'offset': 17, 'master': 890, 'splits': [[2, 21], [4, 29], [6, 24]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [2, 'green', 15]), ({'cycle': 126, 'offset': 79, 'master': 132, 'splits': [[2, 32], [4, 37], [6, 40], [8, 17]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [6, 'green', 24])], [({'cycle': 84, 'offset': 40, 'master': 210, 'splits': [[2, 39], [4, 14], [6, 31]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 32]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 39, 'offset': 16, 'master': 927, 'splits': [[2, 16], [4, 23]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [2, 'yellow', 1]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 44, 'offset': 26, 'master': 566, 'splits': [[2, 32], [4, 12]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'yellow', 4]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 94, 'offset': 81, 'master': 161, 'splits': [[2, 32], [4, 26], [6, 36]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [2, 'green', 14]), ({'cycle': 56, 'offset': 16, 'master': 493, 'splits': [[2, 27], [4, 29]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [4, 'green', 21])], [({'cycle': 69, 'offset': 41, 'master': 89, 'splits': [[2, 30], [4, 39]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [4, 'green', 16]), ({'cycle': 56, 'offset': 17, 'master': 73, 'splits': [[2, 25], [4, 31]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [2, 'yellow', 4]), ({'cycle': 105, 'offset': 65, 'master': 94, 'splits': [[2, 32], [4, 20], [6, 33], [8, 15]], 'yellow': 4, 'red': 1, 'ref': 'end'}, 'bad-splits'), ({'cycle': 43, 'offset': 9, 'master': 403, 'splits': [[2, 15], [4, 28]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [2, 'green', 3]), ({'cycle': 102, 'offset': 65, 'master': 146, 'splits': [[2, 29], [4, 16], [6, 27], [8, 30]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [2, 'green', 21]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25])], [({'cycle': 99, 'offset': 95, 'master': 689, 'splits': [[2, 39], [4, 32], [6, 28]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [2, 'green', 34]), ({'cycle': 69, 'offset': 37, 'master': 680, 'splits': [[2, 31], [4, 38]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [4, 'green', 16]), ({'cycle': 78, 'offset': 0, 'master': 597, 'splits': [[2, 27], [4, 16], [6, 35]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [6, 'green', 21]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 72, 'offset': 22, 'master': 392, 'splits': [[2, 23], [4, 30], [6, 19]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [4, 'green', 20]), ({'cycle': 72, 'offset': 34, 'master': 687, 'splits': [[2, 32], [4, 40]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [2, 'red', 1]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits')], [({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 70, 'offset': 26, 'master': 359, 'splits': [[2, 38], [4, 32]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [2, 'green', 17]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 112, 'offset': 45, 'master': 656, 'splits': [[2, 29], [4, 39], [6, 25], [8, 19]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [4, 'green', 11]), ({'cycle': 140, 'offset': 33, 'master': 792, 'splits': [[2, 35], [4, 37], [6, 35], [8, 33]], 'yellow': 3, 'red': 1, 'ref': 'end'}, [6, 'green', 13]), ({'cycle': 59, 'offset': 32, 'master': 537, 'splits': [[2, 21], [4, 18], [6, 20]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [4, 'green', 1]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 93, 'offset': 2, 'master': 972, 'splits': [[2, 40], [4, 36], [6, 17]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [4, 'red', 1])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| timing oracle 0 | [6, 'green', 26] | [6, 'green', 26] | Passed |
| timing oracle 1 | [4, 'green', 5] | [4, 'green', 5] | Passed |
| timing oracle 2 | [2, 'green', 25] | [2, 'green', 25] | Passed |
| timing oracle 3 | [4, 'green', 27] | [4, 'green', 27] | Passed |
| timing oracle 4 | [4, 'green', 10] | [4, 'green', 10] | Passed |
| timing oracle 5 | bad-splits | bad-splits | Passed |
| timing oracle 6 | [2, 'green', 15] | [2, 'green', 15] | Passed |
| timing oracle 7 | [6, 'green', 24] | [6, 'green', 24] | Passed |
SHA-256 / ec54c61642aee47ac5d768313aa9cfb9b779880f0fcbf0d0b3161be64c70f8bf
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:58.454029+00:00.
Case digest / e095272e04a3f601f6533720092e96d1fd330c1806e64e2d5c809e439d972ff9