FA-67296 / Railway interlocking logic / Open access
Automatic route setting arbitration: lookahead window · case 01
An overdue train or one arriving exactly at the horizon gets no route.
ROOT CAUSE
The window excludes overdue trains and its far edge is exclusive.
THE FAILURE
The window excludes overdue trains and its far edge is exclusive.
Unsuccessful approach: Filtering on the scheduled time sets routes for late trains that are still far away.
Case contract
Trains whose eta is at most lookahead_s after now are candidates, including overdue trains (eta before now). Candidates are ordered by class (1 highest), then scheduled time, then id. Routes are granted greedily in that order; a candidate is skipped if its route equals or conflicts with (conflict pairs are unordered) any route already granted. Return granted train ids in grant order.
Why this case matters
Interlocking logic decides whether trains may be given authority; a wrong decision at this point either grants unsafe movements or strands traffic.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
now = x['now']
cand = [t for t in x['trains'] if 0 <= t['eta'] - now < x['lookahead_s']]
cand.sort(key=lambda t: (t['cls'], t['sched'], t['id']))
pairs = set()
for a, b in x['conflicts']:
pairs.add((a, b))
pairs.add((b, a))
granted = []
routes = []
for t in cand:
if any(t['route'] == r or (t['route'], r) in pairs for r in routes):
continue
granted.append(t['id'])
routes.append(t['route'])
return granted
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: eta exactly at the lookahead', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R1'}]}, ['1A01']), ('control 1', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '6A00', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R1'}, {'id': '7A01', 'cls': 1, 'sched': 120, 'eta': 220, 'route': 'R2'}], 'conflicts': [['R4', 'R3'], ['R2', 'R3'], ['R4', 'R5'], ['R2', 'R1']]}, []), ('sampled regression 4', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R3'}, {'id': '8A01', 'cls': 1, 'sched': 100, 'eta': 80, 'route': 'R5'}, {'id': '7A02', 'cls': 3, 'sched': 100, 'eta': 80, 'route': 'R2'}], 'conflicts': [['R1', 'R5'], ['R1', 'R2'], ['R3', 'R2'], ['R4', 'R5']]}, ['8A01', '2A00']), ('control 2', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '1A00', 'cls': 3, 'sched': 100, 'eta': 160, 'route': 'R2'}, {'id': '7A01', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R2'}, {'id': '7A02', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R2'}], 'conflicts': [['R5', 'R4'], ['R4', 'R3'], ['R2', 'R1'], ['R3', 'R2']]}, ['1A00']), ('regression: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('control 7', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R5'}, {'id': '9A01', 'cls': 3, 'sched': 100, 'eta': 160, 'route': 'R1'}], 'conflicts': [['R3', 'R2']]}, ['9A01']), ('sampled regression 10', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '1A00', 'cls': 1, 'sched': 200, 'eta': 220, 'route': 'R1'}, {'id': '6A01', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R5'}, {'id': '7A02', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R2'}, {'id': '4A03', 'cls': 3, 'sched': 100, 'eta': 220, 'route': 'R4'}, {'id': '1A04', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R4'}, {'id': '8A05', 'cls': 3, 'sched': 150, 'eta': 400, 'route': 'R4'}], 'conflicts': [['R2', 'R1'], ['R3', 'R4'], ['R5', 'R4']]}, ['1A04', '1A00']), ('sampled regression 13', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '2A00', 'cls': 3, 'sched': 200, 'eta': 80, 'route': 'R4'}, {'id': '3A01', 'cls': 1, 'sched': 200, 'eta': 400, 'route': 'R4'}, {'id': '2A02', 'cls': 3, 'sched': 120, 'eta': 160, 'route': 'R5'}, {'id': '9A03', 'cls': 2, 'sched': 100, 'eta': 80, 'route': 'R5'}, {'id': '3A04', 'cls': 2, 'sched': 100, 'eta': 80, 'route': 'R4'}], 'conflicts': [['R3', 'R2'], ['R1', 'R2'], ['R4', 'R5']]}, ['3A04'])], [('regression: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('control 2', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '1A00', 'cls': 3, 'sched': 100, 'eta': 160, 'route': 'R2'}, {'id': '7A01', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R2'}, {'id': '7A02', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R2'}], 'conflicts': [['R5', 'R4'], ['R4', 'R3'], ['R2', 'R1'], ['R3', 'R2']]}, ['1A00']), ('sampled regression 16', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '9A00', 'cls': 3, 'sched': 100, 'eta': 220, 'route': 'R2'}, {'id': '3A01', 'cls': 2, 'sched': 150, 'eta': 400, 'route': 'R2'}, {'id': '8A02', 'cls': 2, 'sched': 200, 'eta': 130, 'route': 'R1'}, {'id': '3A03', 'cls': 1, 'sched': 100, 'eta': 100, 'route': 'R1'}], 'conflicts': [['R1', 'R5']]}, ['3A03', '9A00']), ('control 11', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '1A00', 'cls': 3, 'sched': 120, 'eta': 180, 'route': 'R3'}, {'id': '3A01', 'cls': 3, 'sched': 150, 'eta': 220, 'route': 'R2'}, {'id': '5A02', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R5'}, {'id': '1A03', 'cls': 2, 'sched': 200, 'eta': 100, 'route': 'R1'}, {'id': '3A04', 'cls': 2, 'sched': 100, 'eta': 220, 'route': 'R4'}], 'conflicts': [['R2', 'R1'], ['R1', 'R5'], ['R4', 'R5'], ['R2', 'R3']]}, ['1A03']), ('boundary: class beats schedule', {'now': 100, 'lookahead_s': 60, 'conflicts': [['R1', 'R2']], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 100, 'eta': 110, 'route': 'R1'}, {'id': '1A02', 'cls': 1, 'sched': 150, 'eta': 150, 'route': 'R2'}]}, ['1A02']), ('sampled regression 12', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '8A00', 'cls': 1, 'sched': 100, 'eta': 180, 'route': 'R3'}, {'id': '8A01', 'cls': 2, 'sched': 100, 'eta': 220, 'route': 'R2'}], 'conflicts': [['R3', 'R4']]}, ['8A00', '8A01']), ('sampled regression 15', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 200, 'eta': 180, 'route': 'R5'}, {'id': '6A01', 'cls': 3, 'sched': 150, 'eta': 80, 'route': 'R2'}, {'id': '7A02', 'cls': 3, 'sched': 100, 'eta': 130, 'route': 'R5'}, {'id': '5A03', 'cls': 3, 'sched': 120, 'eta': 160, 'route': 'R1'}], 'conflicts': [['R2', 'R1'], ['R4', 'R5'], ['R1', 'R5']]}, ['7A02', '6A01']), ('sampled regression 18', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '9A00', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R4'}, {'id': '8A01', 'cls': 2, 'sched': 100, 'eta': 80, 'route': 'R3'}], 'conflicts': [['R5', 'R4'], ['R1', 'R2'], ['R4', 'R3']]}, ['9A00'])], [('regression: eta exactly at the lookahead', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R1'}]}, ['1A01']), ('sampled regression 5', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '3A00', 'cls': 1, 'sched': 200, 'eta': 180, 'route': 'R5'}, {'id': '4A01', 'cls': 2, 'sched': 200, 'eta': 100, 'route': 'R2'}], 'conflicts': [['R2', 'R1'], ['R4', 'R5'], ['R2', 'R3']]}, ['3A00', '4A01']), ('sampled regression 28', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '2A00', 'cls': 3, 'sched': 120, 'eta': 400, 'route': 'R4'}, {'id': '6A01', 'cls': 3, 'sched': 100, 'eta': 80, 'route': 'R3'}, {'id': '3A02', 'cls': 2, 'sched': 150, 'eta': 100, 'route': 'R1'}], 'conflicts': [['R3', 'R4'], ['R2', 'R1'], ['R2', 'R3']]}, ['3A02', '6A01']), ('sampled regression 19', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 150, 'eta': 80, 'route': 'R3'}, {'id': '8A01', 'cls': 1, 'sched': 120, 'eta': 160, 'route': 'R3'}, {'id': '7A02', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R1'}, {'id': '8A03', 'cls': 1, 'sched': 200, 'eta': 80, 'route': 'R5'}], 'conflicts': [['R1', 'R2'], ['R2', 'R3'], ['R4', 'R5'], ['R3', 'R4']]}, ['8A01', '8A03']), ('boundary: reverse-listed conflict granted in reverse', {'now': 100, 'lookahead_s': 60, 'conflicts': [['R3', 'R2']], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R2'}]}, ['1A01']), ('sampled regression 23', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '9A00', 'cls': 1, 'sched': 200, 'eta': 180, 'route': 'R4'}, {'id': '1A01', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R2'}, {'id': '5A02', 'cls': 2, 'sched': 120, 'eta': 160, 'route': 'R5'}, {'id': '2A03', 'cls': 2, 'sched': 150, 'eta': 80, 'route': 'R2'}], 'conflicts': [['R1', 'R5'], ['R2', 'R1']]}, ['9A00', '5A02', '2A03']), ('control 26', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '9A00', 'cls': 1, 'sched': 120, 'eta': 160, 'route': 'R2'}, {'id': '7A01', 'cls': 2, 'sched': 100, 'eta': 220, 'route': 'R4'}, {'id': '2A02', 'cls': 1, 'sched': 150, 'eta': 180, 'route': 'R2'}, {'id': '1A03', 'cls': 3, 'sched': 150, 'eta': 130, 'route': 'R1'}, {'id': '7A04', 'cls': 2, 'sched': 120, 'eta': 100, 'route': 'R1'}, {'id': '1A05', 'cls': 2, 'sched': 150, 'eta': 400, 'route': 'R3'}], 'conflicts': [['R1', 'R5']]}, ['9A00', '7A04']), ('sampled regression 29', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '6A00', 'cls': 2, 'sched': 200, 'eta': 80, 'route': 'R5'}, {'id': '8A01', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R1'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R1'}, {'id': '2A03', 'cls': 1, 'sched': 200, 'eta': 400, 'route': 'R3'}], 'conflicts': [['R5', 'R4'], ['R4', 'R3'], ['R2', 'R1'], ['R3', 'R2']]}, ['6A00'])], [('regression: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('control 7', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R5'}, {'id': '9A01', 'cls': 3, 'sched': 100, 'eta': 160, 'route': 'R1'}], 'conflicts': [['R3', 'R2']]}, ['9A01']), ('sampled regression 42', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '8A00', 'cls': 1, 'sched': 150, 'eta': 130, 'route': 'R5'}, {'id': '2A01', 'cls': 2, 'sched': 150, 'eta': 80, 'route': 'R4'}, {'id': '6A02', 'cls': 2, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '4A03', 'cls': 1, 'sched': 100, 'eta': 80, 'route': 'R5'}, {'id': '1A04', 'cls': 1, 'sched': 150, 'eta': 180, 'route': 'R4'}, {'id': '7A05', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R5'}], 'conflicts': [['R2', 'R1'], ['R4', 'R3']]}, ['4A03', '1A04']), ('control 27', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '8A00', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R5'}, {'id': '4A01', 'cls': 3, 'sched': 150, 'eta': 130, 'route': 'R1'}], 'conflicts': [['R3', 'R4'], ['R2', 'R3']]}, ['4A01']), ('boundary: conflict with an earlier grant', {'now': 100, 'lookahead_s': 60, 'conflicts': [['R1', 'R5']], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R1'}, {'id': '1A02', 'cls': 1, 'sched': 110, 'eta': 120, 'route': 'R4'}, {'id': '1A03', 'cls': 1, 'sched': 130, 'eta': 130, 'route': 'R5'}]}, ['1A01', '1A02']), ('control 34', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 150, 'eta': 160, 'route': 'R5'}, {'id': '6A01', 'cls': 2, 'sched': 200, 'eta': 130, 'route': 'R5'}], 'conflicts': [['R4', 'R3']]}, ['2A00']), ('control 37', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '4A00', 'cls': 3, 'sched': 120, 'eta': 400, 'route': 'R4'}, {'id': '1A01', 'cls': 1, 'sched': 150, 'eta': 100, 'route': 'R4'}, {'id': '6A02', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R4'}, {'id': '3A03', 'cls': 2, 'sched': 150, 'eta': 220, 'route': 'R5'}, {'id': '1A04', 'cls': 3, 'sched': 120, 'eta': 220, 'route': 'R2'}, {'id': '6A05', 'cls': 3, 'sched': 120, 'eta': 180, 'route': 'R1'}], 'conflicts': [['R1', 'R5'], ['R2', 'R1'], ['R3', 'R4']]}, ['1A01']), ('control 40', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 120, 'eta': 180, 'route': 'R4'}, {'id': '2A01', 'cls': 1, 'sched': 100, 'eta': 400, 'route': 'R4'}, {'id': '8A02', 'cls': 1, 'sched': 150, 'eta': 100, 'route': 'R3'}, {'id': '1A03', 'cls': 2, 'sched': 200, 'eta': 100, 'route': 'R3'}, {'id': '8A04', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R4'}, {'id': '3A05', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R5'}], 'conflicts': [['R1', 'R5'], ['R2', 'R3'], ['R1', 'R2'], ['R3', 'R4']]}, ['8A02', '3A05'])], [('regression: eta exactly at the lookahead', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R1'}]}, ['1A01']), ('sampled regression 9', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '9A00', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R4'}, {'id': '7A01', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '7A02', 'cls': 1, 'sched': 100, 'eta': 400, 'route': 'R2'}, {'id': '1A03', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R2'}, {'id': '1A04', 'cls': 3, 'sched': 120, 'eta': 220, 'route': 'R3'}], 'conflicts': [['R2', 'R1']]}, ['1A03', '1A04', '7A01', '9A00']), ('sampled regression 56', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '8A00', 'cls': 1, 'sched': 150, 'eta': 180, 'route': 'R4'}, {'id': '1A01', 'cls': 1, 'sched': 200, 'eta': 220, 'route': 'R1'}, {'id': '3A02', 'cls': 2, 'sched': 200, 'eta': 400, 'route': 'R4'}, {'id': '1A03', 'cls': 2, 'sched': 120, 'eta': 100, 'route': 'R5'}], 'conflicts': [['R1', 'R2'], ['R3', 'R2'], ['R5', 'R1']]}, ['8A00', '1A03']), ('control 37', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '4A00', 'cls': 3, 'sched': 120, 'eta': 400, 'route': 'R4'}, {'id': '1A01', 'cls': 1, 'sched': 150, 'eta': 100, 'route': 'R4'}, {'id': '6A02', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R4'}, {'id': '3A03', 'cls': 2, 'sched': 150, 'eta': 220, 'route': 'R5'}, {'id': '1A04', 'cls': 3, 'sched': 120, 'eta': 220, 'route': 'R2'}, {'id': '6A05', 'cls': 3, 'sched': 120, 'eta': 180, 'route': 'R1'}], 'conflicts': [['R1', 'R5'], ['R2', 'R1'], ['R3', 'R4']]}, ['1A01']), ('regression: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('sampled regression 45', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '6A00', 'cls': 3, 'sched': 150, 'eta': 180, 'route': 'R1'}, {'id': '2A01', 'cls': 3, 'sched': 120, 'eta': 80, 'route': 'R1'}, {'id': '2A02', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R1'}, {'id': '5A03', 'cls': 1, 'sched': 120, 'eta': 160, 'route': 'R2'}, {'id': '9A04', 'cls': 3, 'sched': 200, 'eta': 130, 'route': 'R1'}, {'id': '5A05', 'cls': 1, 'sched': 120, 'eta': 130, 'route': 'R1'}], 'conflicts': [['R5', 'R4'], ['R3', 'R2'], ['R1', 'R5'], ['R3', 'R4']]}, ['5A03', '5A05']), ('control 48', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '5A00', 'cls': 2, 'sched': 120, 'eta': 100, 'route': 'R1'}, {'id': '2A01', 'cls': 3, 'sched': 100, 'eta': 100, 'route': 'R3'}], 'conflicts': [['R4', 'R5'], ['R3', 'R4'], ['R1', 'R2']]}, ['5A00', '2A01']), ('control 51', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '5A00', 'cls': 3, 'sched': 150, 'eta': 220, 'route': 'R4'}, {'id': '6A01', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R2'}, {'id': '3A02', 'cls': 2, 'sched': 120, 'eta': 160, 'route': 'R4'}, {'id': '6A03', 'cls': 2, 'sched': 100, 'eta': 400, 'route': 'R2'}], 'conflicts': [['R3', 'R2'], ['R4', 'R5']]}, ['3A02'])]]
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: eta exactly at the lookahead | [] | ['1A01'] | Failed |
| control 1 | [] | [] | Passed |
| sampled regression 4 | [] | ['8A01', '2A00'] | Failed |
| control 2 | ['1A00'] | ['1A00'] | Passed |
| regression: overdue train | [] | ['2A01'] | Failed |
| control 7 | ['9A01'] | ['9A01'] | Passed |
| sampled regression 10 | ['6A01'] | ['1A04', '1A00'] | Failed |
| sampled regression 13 | ['2A02'] | ['3A04'] | Failed |
SHA-256 / 611da3b4dc072eb4a6034e2409c49b4f0632efdbd178bf0da464405231662a8d
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
now = x['now']
cand = [t for t in x['trains'] if t['sched'] - now <= x['lookahead_s']]
cand.sort(key=lambda t: (t['cls'], t['sched'], t['id']))
pairs = set()
for a, b in x['conflicts']:
pairs.add((a, b))
pairs.add((b, a))
granted = []
routes = []
for t in cand:
if any(t['route'] == r or (t['route'], r) in pairs for r in routes):
continue
granted.append(t['id'])
routes.append(t['route'])
return granted
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: eta exactly at the lookahead', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R1'}]}, ['1A01']), ('control 1', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '6A00', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R1'}, {'id': '7A01', 'cls': 1, 'sched': 120, 'eta': 220, 'route': 'R2'}], 'conflicts': [['R4', 'R3'], ['R2', 'R3'], ['R4', 'R5'], ['R2', 'R1']]}, []), ('sampled regression 4', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R3'}, {'id': '8A01', 'cls': 1, 'sched': 100, 'eta': 80, 'route': 'R5'}, {'id': '7A02', 'cls': 3, 'sched': 100, 'eta': 80, 'route': 'R2'}], 'conflicts': [['R1', 'R5'], ['R1', 'R2'], ['R3', 'R2'], ['R4', 'R5']]}, ['8A01', '2A00']), ('control 2', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '1A00', 'cls': 3, 'sched': 100, 'eta': 160, 'route': 'R2'}, {'id': '7A01', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R2'}, {'id': '7A02', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R2'}], 'conflicts': [['R5', 'R4'], ['R4', 'R3'], ['R2', 'R1'], ['R3', 'R2']]}, ['1A00']), ('regression: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('control 7', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R5'}, {'id': '9A01', 'cls': 3, 'sched': 100, 'eta': 160, 'route': 'R1'}], 'conflicts': [['R3', 'R2']]}, ['9A01']), ('sampled regression 10', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '1A00', 'cls': 1, 'sched': 200, 'eta': 220, 'route': 'R1'}, {'id': '6A01', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R5'}, {'id': '7A02', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R2'}, {'id': '4A03', 'cls': 3, 'sched': 100, 'eta': 220, 'route': 'R4'}, {'id': '1A04', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R4'}, {'id': '8A05', 'cls': 3, 'sched': 150, 'eta': 400, 'route': 'R4'}], 'conflicts': [['R2', 'R1'], ['R3', 'R4'], ['R5', 'R4']]}, ['1A04', '1A00']), ('sampled regression 13', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '2A00', 'cls': 3, 'sched': 200, 'eta': 80, 'route': 'R4'}, {'id': '3A01', 'cls': 1, 'sched': 200, 'eta': 400, 'route': 'R4'}, {'id': '2A02', 'cls': 3, 'sched': 120, 'eta': 160, 'route': 'R5'}, {'id': '9A03', 'cls': 2, 'sched': 100, 'eta': 80, 'route': 'R5'}, {'id': '3A04', 'cls': 2, 'sched': 100, 'eta': 80, 'route': 'R4'}], 'conflicts': [['R3', 'R2'], ['R1', 'R2'], ['R4', 'R5']]}, ['3A04'])], [('regression: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('control 2', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '1A00', 'cls': 3, 'sched': 100, 'eta': 160, 'route': 'R2'}, {'id': '7A01', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R2'}, {'id': '7A02', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R2'}], 'conflicts': [['R5', 'R4'], ['R4', 'R3'], ['R2', 'R1'], ['R3', 'R2']]}, ['1A00']), ('sampled regression 16', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '9A00', 'cls': 3, 'sched': 100, 'eta': 220, 'route': 'R2'}, {'id': '3A01', 'cls': 2, 'sched': 150, 'eta': 400, 'route': 'R2'}, {'id': '8A02', 'cls': 2, 'sched': 200, 'eta': 130, 'route': 'R1'}, {'id': '3A03', 'cls': 1, 'sched': 100, 'eta': 100, 'route': 'R1'}], 'conflicts': [['R1', 'R5']]}, ['3A03', '9A00']), ('control 11', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '1A00', 'cls': 3, 'sched': 120, 'eta': 180, 'route': 'R3'}, {'id': '3A01', 'cls': 3, 'sched': 150, 'eta': 220, 'route': 'R2'}, {'id': '5A02', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R5'}, {'id': '1A03', 'cls': 2, 'sched': 200, 'eta': 100, 'route': 'R1'}, {'id': '3A04', 'cls': 2, 'sched': 100, 'eta': 220, 'route': 'R4'}], 'conflicts': [['R2', 'R1'], ['R1', 'R5'], ['R4', 'R5'], ['R2', 'R3']]}, ['1A03']), ('boundary: class beats schedule', {'now': 100, 'lookahead_s': 60, 'conflicts': [['R1', 'R2']], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 100, 'eta': 110, 'route': 'R1'}, {'id': '1A02', 'cls': 1, 'sched': 150, 'eta': 150, 'route': 'R2'}]}, ['1A02']), ('sampled regression 12', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '8A00', 'cls': 1, 'sched': 100, 'eta': 180, 'route': 'R3'}, {'id': '8A01', 'cls': 2, 'sched': 100, 'eta': 220, 'route': 'R2'}], 'conflicts': [['R3', 'R4']]}, ['8A00', '8A01']), ('sampled regression 15', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 200, 'eta': 180, 'route': 'R5'}, {'id': '6A01', 'cls': 3, 'sched': 150, 'eta': 80, 'route': 'R2'}, {'id': '7A02', 'cls': 3, 'sched': 100, 'eta': 130, 'route': 'R5'}, {'id': '5A03', 'cls': 3, 'sched': 120, 'eta': 160, 'route': 'R1'}], 'conflicts': [['R2', 'R1'], ['R4', 'R5'], ['R1', 'R5']]}, ['7A02', '6A01']), ('sampled regression 18', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '9A00', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R4'}, {'id': '8A01', 'cls': 2, 'sched': 100, 'eta': 80, 'route': 'R3'}], 'conflicts': [['R5', 'R4'], ['R1', 'R2'], ['R4', 'R3']]}, ['9A00'])], [('regression: eta exactly at the lookahead', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R1'}]}, ['1A01']), ('sampled regression 5', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '3A00', 'cls': 1, 'sched': 200, 'eta': 180, 'route': 'R5'}, {'id': '4A01', 'cls': 2, 'sched': 200, 'eta': 100, 'route': 'R2'}], 'conflicts': [['R2', 'R1'], ['R4', 'R5'], ['R2', 'R3']]}, ['3A00', '4A01']), ('sampled regression 28', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '2A00', 'cls': 3, 'sched': 120, 'eta': 400, 'route': 'R4'}, {'id': '6A01', 'cls': 3, 'sched': 100, 'eta': 80, 'route': 'R3'}, {'id': '3A02', 'cls': 2, 'sched': 150, 'eta': 100, 'route': 'R1'}], 'conflicts': [['R3', 'R4'], ['R2', 'R1'], ['R2', 'R3']]}, ['3A02', '6A01']), ('sampled regression 19', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 150, 'eta': 80, 'route': 'R3'}, {'id': '8A01', 'cls': 1, 'sched': 120, 'eta': 160, 'route': 'R3'}, {'id': '7A02', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R1'}, {'id': '8A03', 'cls': 1, 'sched': 200, 'eta': 80, 'route': 'R5'}], 'conflicts': [['R1', 'R2'], ['R2', 'R3'], ['R4', 'R5'], ['R3', 'R4']]}, ['8A01', '8A03']), ('boundary: reverse-listed conflict granted in reverse', {'now': 100, 'lookahead_s': 60, 'conflicts': [['R3', 'R2']], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R2'}]}, ['1A01']), ('sampled regression 23', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '9A00', 'cls': 1, 'sched': 200, 'eta': 180, 'route': 'R4'}, {'id': '1A01', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R2'}, {'id': '5A02', 'cls': 2, 'sched': 120, 'eta': 160, 'route': 'R5'}, {'id': '2A03', 'cls': 2, 'sched': 150, 'eta': 80, 'route': 'R2'}], 'conflicts': [['R1', 'R5'], ['R2', 'R1']]}, ['9A00', '5A02', '2A03']), ('control 26', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '9A00', 'cls': 1, 'sched': 120, 'eta': 160, 'route': 'R2'}, {'id': '7A01', 'cls': 2, 'sched': 100, 'eta': 220, 'route': 'R4'}, {'id': '2A02', 'cls': 1, 'sched': 150, 'eta': 180, 'route': 'R2'}, {'id': '1A03', 'cls': 3, 'sched': 150, 'eta': 130, 'route': 'R1'}, {'id': '7A04', 'cls': 2, 'sched': 120, 'eta': 100, 'route': 'R1'}, {'id': '1A05', 'cls': 2, 'sched': 150, 'eta': 400, 'route': 'R3'}], 'conflicts': [['R1', 'R5']]}, ['9A00', '7A04']), ('sampled regression 29', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '6A00', 'cls': 2, 'sched': 200, 'eta': 80, 'route': 'R5'}, {'id': '8A01', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R1'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R1'}, {'id': '2A03', 'cls': 1, 'sched': 200, 'eta': 400, 'route': 'R3'}], 'conflicts': [['R5', 'R4'], ['R4', 'R3'], ['R2', 'R1'], ['R3', 'R2']]}, ['6A00'])], [('regression: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('control 7', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R5'}, {'id': '9A01', 'cls': 3, 'sched': 100, 'eta': 160, 'route': 'R1'}], 'conflicts': [['R3', 'R2']]}, ['9A01']), ('sampled regression 42', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '8A00', 'cls': 1, 'sched': 150, 'eta': 130, 'route': 'R5'}, {'id': '2A01', 'cls': 2, 'sched': 150, 'eta': 80, 'route': 'R4'}, {'id': '6A02', 'cls': 2, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '4A03', 'cls': 1, 'sched': 100, 'eta': 80, 'route': 'R5'}, {'id': '1A04', 'cls': 1, 'sched': 150, 'eta': 180, 'route': 'R4'}, {'id': '7A05', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R5'}], 'conflicts': [['R2', 'R1'], ['R4', 'R3']]}, ['4A03', '1A04']), ('control 27', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '8A00', 'cls': 2, 'sched': 120, 'eta': 220, 'route': 'R5'}, {'id': '4A01', 'cls': 3, 'sched': 150, 'eta': 130, 'route': 'R1'}], 'conflicts': [['R3', 'R4'], ['R2', 'R3']]}, ['4A01']), ('boundary: conflict with an earlier grant', {'now': 100, 'lookahead_s': 60, 'conflicts': [['R1', 'R5']], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R1'}, {'id': '1A02', 'cls': 1, 'sched': 110, 'eta': 120, 'route': 'R4'}, {'id': '1A03', 'cls': 1, 'sched': 130, 'eta': 130, 'route': 'R5'}]}, ['1A01', '1A02']), ('control 34', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 150, 'eta': 160, 'route': 'R5'}, {'id': '6A01', 'cls': 2, 'sched': 200, 'eta': 130, 'route': 'R5'}], 'conflicts': [['R4', 'R3']]}, ['2A00']), ('control 37', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '4A00', 'cls': 3, 'sched': 120, 'eta': 400, 'route': 'R4'}, {'id': '1A01', 'cls': 1, 'sched': 150, 'eta': 100, 'route': 'R4'}, {'id': '6A02', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R4'}, {'id': '3A03', 'cls': 2, 'sched': 150, 'eta': 220, 'route': 'R5'}, {'id': '1A04', 'cls': 3, 'sched': 120, 'eta': 220, 'route': 'R2'}, {'id': '6A05', 'cls': 3, 'sched': 120, 'eta': 180, 'route': 'R1'}], 'conflicts': [['R1', 'R5'], ['R2', 'R1'], ['R3', 'R4']]}, ['1A01']), ('control 40', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 120, 'eta': 180, 'route': 'R4'}, {'id': '2A01', 'cls': 1, 'sched': 100, 'eta': 400, 'route': 'R4'}, {'id': '8A02', 'cls': 1, 'sched': 150, 'eta': 100, 'route': 'R3'}, {'id': '1A03', 'cls': 2, 'sched': 200, 'eta': 100, 'route': 'R3'}, {'id': '8A04', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R4'}, {'id': '3A05', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R5'}], 'conflicts': [['R1', 'R5'], ['R2', 'R3'], ['R1', 'R2'], ['R3', 'R4']]}, ['8A02', '3A05'])], [('regression: eta exactly at the lookahead', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R1'}]}, ['1A01']), ('sampled regression 9', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '9A00', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R4'}, {'id': '7A01', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '7A02', 'cls': 1, 'sched': 100, 'eta': 400, 'route': 'R2'}, {'id': '1A03', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R2'}, {'id': '1A04', 'cls': 3, 'sched': 120, 'eta': 220, 'route': 'R3'}], 'conflicts': [['R2', 'R1']]}, ['1A03', '1A04', '7A01', '9A00']), ('sampled regression 56', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '8A00', 'cls': 1, 'sched': 150, 'eta': 180, 'route': 'R4'}, {'id': '1A01', 'cls': 1, 'sched': 200, 'eta': 220, 'route': 'R1'}, {'id': '3A02', 'cls': 2, 'sched': 200, 'eta': 400, 'route': 'R4'}, {'id': '1A03', 'cls': 2, 'sched': 120, 'eta': 100, 'route': 'R5'}], 'conflicts': [['R1', 'R2'], ['R3', 'R2'], ['R5', 'R1']]}, ['8A00', '1A03']), ('control 37', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '4A00', 'cls': 3, 'sched': 120, 'eta': 400, 'route': 'R4'}, {'id': '1A01', 'cls': 1, 'sched': 150, 'eta': 100, 'route': 'R4'}, {'id': '6A02', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R4'}, {'id': '3A03', 'cls': 2, 'sched': 150, 'eta': 220, 'route': 'R5'}, {'id': '1A04', 'cls': 3, 'sched': 120, 'eta': 220, 'route': 'R2'}, {'id': '6A05', 'cls': 3, 'sched': 120, 'eta': 180, 'route': 'R1'}], 'conflicts': [['R1', 'R5'], ['R2', 'R1'], ['R3', 'R4']]}, ['1A01']), ('regression: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('sampled regression 45', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '6A00', 'cls': 3, 'sched': 150, 'eta': 180, 'route': 'R1'}, {'id': '2A01', 'cls': 3, 'sched': 120, 'eta': 80, 'route': 'R1'}, {'id': '2A02', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R1'}, {'id': '5A03', 'cls': 1, 'sched': 120, 'eta': 160, 'route': 'R2'}, {'id': '9A04', 'cls': 3, 'sched': 200, 'eta': 130, 'route': 'R1'}, {'id': '5A05', 'cls': 1, 'sched': 120, 'eta': 130, 'route': 'R1'}], 'conflicts': [['R5', 'R4'], ['R3', 'R2'], ['R1', 'R5'], ['R3', 'R4']]}, ['5A03', '5A05']), ('control 48', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '5A00', 'cls': 2, 'sched': 120, 'eta': 100, 'route': 'R1'}, {'id': '2A01', 'cls': 3, 'sched': 100, 'eta': 100, 'route': 'R3'}], 'conflicts': [['R4', 'R5'], ['R3', 'R4'], ['R1', 'R2']]}, ['5A00', '2A01']), ('control 51', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '5A00', 'cls': 3, 'sched': 150, 'eta': 220, 'route': 'R4'}, {'id': '6A01', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R2'}, {'id': '3A02', 'cls': 2, 'sched': 120, 'eta': 160, 'route': 'R4'}, {'id': '6A03', 'cls': 2, 'sched': 100, 'eta': 400, 'route': 'R2'}], 'conflicts': [['R3', 'R2'], ['R4', 'R5']]}, ['3A02'])]]
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: eta exactly at the lookahead | ['1A01'] | ['1A01'] | Passed |
| control 1 | ['6A00'] | [] | Failed |
| sampled regression 4 | ['8A01', '2A00'] | ['8A01', '2A00'] | Passed |
| control 2 | ['7A01'] | ['1A00'] | Failed |
| regression: overdue train | ['2A01'] | ['2A01'] | Passed |
| control 7 | ['2A00', '9A01'] | ['9A01'] | Failed |
| sampled regression 10 | ['7A02', '1A04'] | ['1A04', '1A00'] | Failed |
| sampled regression 13 | ['3A01'] | ['3A04'] | Failed |
SHA-256 / 9d187747f47c8e1b9a5fcb073c456062180e96b1313accdcf85c01b460c6dc22
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗Verification & scope
Stipulated toy interlocking contract for a bounded teaching model; it makes no claim of conformance to any railway signalling standard and omits real safety cases. 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:51.550344+00:00.
Case digest / 60918058b2282a42e484a8459f0df586cf745512dd92a4be099ad979d187e3f5