FAILURE MAP
← Case archive

FA-67311 / Railway interlocking logic / Open access

Automatic route setting arbitration: same route exclusion · case 01

The same route is granted to two trains.

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

ROOT CAUSE

Only explicit conflict pairs are checked, not a repeat of the same route.

THE FAILURE

Only explicit conflict pairs are checked, not a repeat of the same route.

Unsuccessful approach: Only comparing with the most recent grant misses a repeat further back.

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 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) 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: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('sampled regression 3', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '3A00', 'cls': 1, 'sched': 150, 'eta': 160, 'route': 'R1'}, {'id': '2A01', 'cls': 2, 'sched': 100, 'eta': 160, 'route': 'R4'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 100, 'route': 'R4'}, {'id': '1A03', 'cls': 3, 'sched': 150, 'eta': 80, 'route': 'R1'}, {'id': '9A04', 'cls': 3, 'sched': 100, 'eta': 220, 'route': 'R4'}, {'id': '7A05', 'cls': 3, 'sched': 120, 'eta': 220, 'route': 'R3'}], 'conflicts': [['R2', 'R1'], ['R1', 'R5'], ['R3', 'R4']]}, ['6A02', '3A00']), ('sampled regression 6', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '2A00', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '5A01', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R3'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 100, 'route': 'R3'}, {'id': '5A03', 'cls': 1, 'sched': 120, 'eta': 180, 'route': 'R5'}, {'id': '2A04', 'cls': 1, 'sched': 200, 'eta': 130, 'route': 'R4'}, {'id': '6A05', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R1'}], 'conflicts': [['R4', 'R3'], ['R2', 'R1'], ['R5', 'R1'], ['R3', 'R2']]}, ['5A03', '6A02']), ('boundary: eta exactly at the lookahead', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R1'}]}, ['1A01']), ('boundary: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('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']]}, []), ('control 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 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'])], [('regression: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('sampled regression 6', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '2A00', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '5A01', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R3'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 100, 'route': 'R3'}, {'id': '5A03', 'cls': 1, 'sched': 120, 'eta': 180, 'route': 'R5'}, {'id': '2A04', 'cls': 1, 'sched': 200, 'eta': 130, 'route': 'R4'}, {'id': '6A05', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R1'}], 'conflicts': [['R4', 'R3'], ['R2', 'R1'], ['R5', 'R1'], ['R3', 'R2']]}, ['5A03', '6A02']), ('sampled regression 22', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 150, 'eta': 80, 'route': 'R3'}, {'id': '5A01', 'cls': 2, 'sched': 120, 'eta': 180, 'route': 'R3'}], 'conflicts': [['R1', 'R2'], ['R5', 'R1']]}, ['5A01']), ('sampled regression 38', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '8A00', 'cls': 2, 'sched': 100, 'eta': 80, 'route': 'R4'}, {'id': '7A01', 'cls': 3, 'sched': 100, 'eta': 400, 'route': 'R5'}, {'id': '9A02', 'cls': 2, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '6A03', 'cls': 3, 'sched': 100, 'eta': 100, 'route': 'R2'}, {'id': '9A04', 'cls': 2, 'sched': 120, 'eta': 180, 'route': 'R1'}, {'id': '4A05', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R1'}], 'conflicts': [['R5', 'R4'], ['R2', 'R1']]}, ['4A05', '8A00']), ('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']), ('control 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']), ('control 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']), ('control 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: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('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 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']), ('sampled regression 69', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '4A00', 'cls': 3, 'sched': 200, 'eta': 100, 'route': 'R1'}, {'id': '9A01', 'cls': 2, 'sched': 200, 'eta': 130, 'route': 'R3'}, {'id': '4A02', 'cls': 3, 'sched': 200, 'eta': 130, 'route': 'R4'}, {'id': '9A03', 'cls': 1, 'sched': 150, 'eta': 180, 'route': 'R4'}, {'id': '9A04', 'cls': 1, 'sched': 150, 'eta': 160, 'route': 'R3'}, {'id': '1A05', 'cls': 1, 'sched': 200, 'eta': 100, 'route': 'R2'}], 'conflicts': [['R3', 'R4'], ['R1', 'R5'], ['R2', 'R3'], ['R5', 'R4']]}, ['9A03', '1A05', '4A00']), ('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']), ('control 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']), ('sampled regression 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']), ('control 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: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('sampled regression 17', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '9A00', 'cls': 1, 'sched': 120, 'eta': 160, 'route': 'R1'}, {'id': '9A01', 'cls': 3, 'sched': 200, 'eta': 160, 'route': 'R5'}, {'id': '4A02', 'cls': 3, 'sched': 200, 'eta': 160, 'route': 'R4'}, {'id': '3A03', 'cls': 3, 'sched': 100, 'eta': 100, 'route': 'R3'}, {'id': '1A04', 'cls': 1, 'sched': 200, 'eta': 400, 'route': 'R4'}, {'id': '4A05', 'cls': 3, 'sched': 150, 'eta': 130, 'route': 'R1'}], 'conflicts': [['R2', 'R3'], ['R5', 'R1'], ['R2', 'R1']]}, ['9A00', '3A03', '4A02']), ('sampled regression 59', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 150, 'eta': 220, 'route': 'R2'}, {'id': '3A01', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R3'}, {'id': '5A02', 'cls': 1, 'sched': 200, 'eta': 160, 'route': 'R3'}, {'id': '9A03', 'cls': 1, 'sched': 200, 'eta': 80, 'route': 'R3'}], 'conflicts': [['R2', 'R1']]}, ['5A02']), ('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']), ('boundary: late running train keeps schedule order', {'now': 100, 'lookahead_s': 60, 'conflicts': [['R1', 'R2']], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 150, 'route': 'R1'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 105, 'route': 'R2'}]}, ['1A01']), ('sampled regression 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']), ('sampled regression 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']), ('sampled regression 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: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('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']), ('sampled regression 78', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '6A00', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R2'}, {'id': '9A01', 'cls': 3, 'sched': 120, 'eta': 180, 'route': 'R2'}, {'id': '9A02', 'cls': 2, 'sched': 200, 'eta': 160, 'route': 'R3'}, {'id': '2A03', 'cls': 2, 'sched': 120, 'eta': 180, 'route': 'R3'}, {'id': '8A04', 'cls': 1, 'sched': 150, 'eta': 100, 'route': 'R3'}], 'conflicts': [['R3', 'R2'], ['R5', 'R4'], ['R4', 'R3']]}, ['8A04']), ('sampled regression 50', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '9A00', 'cls': 3, 'sched': 100, 'eta': 130, 'route': 'R5'}, {'id': '4A01', 'cls': 3, 'sched': 200, 'eta': 180, 'route': 'R4'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R3'}, {'id': '4A03', 'cls': 3, 'sched': 100, 'eta': 180, 'route': 'R3'}, {'id': '7A04', 'cls': 3, 'sched': 120, 'eta': 400, 'route': 'R1'}, {'id': '2A05', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R4'}], 'conflicts': [['R1', 'R2'], ['R1', 'R5'], ['R4', 'R3']]}, ['2A05', '9A00']), ('boundary: 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 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 fixtureActualExpectedOutcome
regression: two trains for one route['1A01', '1A02']['1A01']Failed
sampled regression 3['6A02', '3A00', '2A01', '1A03']['6A02', '3A00']Failed
sampled regression 6['5A03', '6A02', '2A00', '5A01']['5A03', '6A02']Failed
boundary: eta exactly at the lookahead['1A01']['1A01']Passed
boundary: overdue train['2A01']['2A01']Passed
control 1[][]Passed
control 4['8A01', '2A00']['8A01', '2A00']Passed
control 7['9A01']['9A01']Passed

SHA-256 / 0de20b6904182bfa4343985a04bef707cdd318bbc4e5d0fb53ca42ec3c3d64fd

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['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 routes[-1:] == [t['route']] or any((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: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('sampled regression 3', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '3A00', 'cls': 1, 'sched': 150, 'eta': 160, 'route': 'R1'}, {'id': '2A01', 'cls': 2, 'sched': 100, 'eta': 160, 'route': 'R4'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 100, 'route': 'R4'}, {'id': '1A03', 'cls': 3, 'sched': 150, 'eta': 80, 'route': 'R1'}, {'id': '9A04', 'cls': 3, 'sched': 100, 'eta': 220, 'route': 'R4'}, {'id': '7A05', 'cls': 3, 'sched': 120, 'eta': 220, 'route': 'R3'}], 'conflicts': [['R2', 'R1'], ['R1', 'R5'], ['R3', 'R4']]}, ['6A02', '3A00']), ('sampled regression 6', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '2A00', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '5A01', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R3'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 100, 'route': 'R3'}, {'id': '5A03', 'cls': 1, 'sched': 120, 'eta': 180, 'route': 'R5'}, {'id': '2A04', 'cls': 1, 'sched': 200, 'eta': 130, 'route': 'R4'}, {'id': '6A05', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R1'}], 'conflicts': [['R4', 'R3'], ['R2', 'R1'], ['R5', 'R1'], ['R3', 'R2']]}, ['5A03', '6A02']), ('boundary: eta exactly at the lookahead', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R1'}]}, ['1A01']), ('boundary: overdue train', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '2A01', 'cls': 2, 'sched': 60, 'eta': 70, 'route': 'R2'}]}, ['2A01']), ('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']]}, []), ('control 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 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'])], [('regression: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('sampled regression 6', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '2A00', 'cls': 3, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '5A01', 'cls': 3, 'sched': 150, 'eta': 160, 'route': 'R3'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 100, 'route': 'R3'}, {'id': '5A03', 'cls': 1, 'sched': 120, 'eta': 180, 'route': 'R5'}, {'id': '2A04', 'cls': 1, 'sched': 200, 'eta': 130, 'route': 'R4'}, {'id': '6A05', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R1'}], 'conflicts': [['R4', 'R3'], ['R2', 'R1'], ['R5', 'R1'], ['R3', 'R2']]}, ['5A03', '6A02']), ('sampled regression 22', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 150, 'eta': 80, 'route': 'R3'}, {'id': '5A01', 'cls': 2, 'sched': 120, 'eta': 180, 'route': 'R3'}], 'conflicts': [['R1', 'R2'], ['R5', 'R1']]}, ['5A01']), ('sampled regression 38', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '8A00', 'cls': 2, 'sched': 100, 'eta': 80, 'route': 'R4'}, {'id': '7A01', 'cls': 3, 'sched': 100, 'eta': 400, 'route': 'R5'}, {'id': '9A02', 'cls': 2, 'sched': 120, 'eta': 130, 'route': 'R5'}, {'id': '6A03', 'cls': 3, 'sched': 100, 'eta': 100, 'route': 'R2'}, {'id': '9A04', 'cls': 2, 'sched': 120, 'eta': 180, 'route': 'R1'}, {'id': '4A05', 'cls': 1, 'sched': 150, 'eta': 220, 'route': 'R1'}], 'conflicts': [['R5', 'R4'], ['R2', 'R1']]}, ['4A05', '8A00']), ('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']), ('control 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']), ('control 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']), ('control 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: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('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 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']), ('sampled regression 69', {'now': 100, 'lookahead_s': 120, 'trains': [{'id': '4A00', 'cls': 3, 'sched': 200, 'eta': 100, 'route': 'R1'}, {'id': '9A01', 'cls': 2, 'sched': 200, 'eta': 130, 'route': 'R3'}, {'id': '4A02', 'cls': 3, 'sched': 200, 'eta': 130, 'route': 'R4'}, {'id': '9A03', 'cls': 1, 'sched': 150, 'eta': 180, 'route': 'R4'}, {'id': '9A04', 'cls': 1, 'sched': 150, 'eta': 160, 'route': 'R3'}, {'id': '1A05', 'cls': 1, 'sched': 200, 'eta': 100, 'route': 'R2'}], 'conflicts': [['R3', 'R4'], ['R1', 'R5'], ['R2', 'R3'], ['R5', 'R4']]}, ['9A03', '1A05', '4A00']), ('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']), ('control 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']), ('sampled regression 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']), ('control 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: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('sampled regression 17', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '9A00', 'cls': 1, 'sched': 120, 'eta': 160, 'route': 'R1'}, {'id': '9A01', 'cls': 3, 'sched': 200, 'eta': 160, 'route': 'R5'}, {'id': '4A02', 'cls': 3, 'sched': 200, 'eta': 160, 'route': 'R4'}, {'id': '3A03', 'cls': 3, 'sched': 100, 'eta': 100, 'route': 'R3'}, {'id': '1A04', 'cls': 1, 'sched': 200, 'eta': 400, 'route': 'R4'}, {'id': '4A05', 'cls': 3, 'sched': 150, 'eta': 130, 'route': 'R1'}], 'conflicts': [['R2', 'R3'], ['R5', 'R1'], ['R2', 'R1']]}, ['9A00', '3A03', '4A02']), ('sampled regression 59', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '2A00', 'cls': 2, 'sched': 150, 'eta': 220, 'route': 'R2'}, {'id': '3A01', 'cls': 2, 'sched': 100, 'eta': 130, 'route': 'R3'}, {'id': '5A02', 'cls': 1, 'sched': 200, 'eta': 160, 'route': 'R3'}, {'id': '9A03', 'cls': 1, 'sched': 200, 'eta': 80, 'route': 'R3'}], 'conflicts': [['R2', 'R1']]}, ['5A02']), ('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']), ('boundary: late running train keeps schedule order', {'now': 100, 'lookahead_s': 60, 'conflicts': [['R1', 'R2']], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 150, 'route': 'R1'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 105, 'route': 'R2'}]}, ['1A01']), ('sampled regression 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']), ('sampled regression 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']), ('sampled regression 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: two trains for one route', {'now': 100, 'lookahead_s': 60, 'conflicts': [], 'trains': [{'id': '1A01', 'cls': 1, 'sched': 100, 'eta': 110, 'route': 'R3'}, {'id': '1A02', 'cls': 1, 'sched': 120, 'eta': 120, 'route': 'R3'}]}, ['1A01']), ('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']), ('sampled regression 78', {'now': 100, 'lookahead_s': 60, 'trains': [{'id': '6A00', 'cls': 2, 'sched': 200, 'eta': 220, 'route': 'R2'}, {'id': '9A01', 'cls': 3, 'sched': 120, 'eta': 180, 'route': 'R2'}, {'id': '9A02', 'cls': 2, 'sched': 200, 'eta': 160, 'route': 'R3'}, {'id': '2A03', 'cls': 2, 'sched': 120, 'eta': 180, 'route': 'R3'}, {'id': '8A04', 'cls': 1, 'sched': 150, 'eta': 100, 'route': 'R3'}], 'conflicts': [['R3', 'R2'], ['R5', 'R4'], ['R4', 'R3']]}, ['8A04']), ('sampled regression 50', {'now': 100, 'lookahead_s': 80, 'trains': [{'id': '9A00', 'cls': 3, 'sched': 100, 'eta': 130, 'route': 'R5'}, {'id': '4A01', 'cls': 3, 'sched': 200, 'eta': 180, 'route': 'R4'}, {'id': '6A02', 'cls': 1, 'sched': 120, 'eta': 400, 'route': 'R3'}, {'id': '4A03', 'cls': 3, 'sched': 100, 'eta': 180, 'route': 'R3'}, {'id': '7A04', 'cls': 3, 'sched': 120, 'eta': 400, 'route': 'R1'}, {'id': '2A05', 'cls': 1, 'sched': 100, 'eta': 160, 'route': 'R4'}], 'conflicts': [['R1', 'R2'], ['R1', 'R5'], ['R4', 'R3']]}, ['2A05', '9A00']), ('boundary: 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 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 fixtureActualExpectedOutcome
regression: two trains for one route['1A01']['1A01']Passed
sampled regression 3['6A02', '3A00', '2A01', '1A03']['6A02', '3A00']Failed
sampled regression 6['5A03', '6A02', '2A00', '5A01']['5A03', '6A02']Failed
boundary: eta exactly at the lookahead['1A01']['1A01']Passed
boundary: overdue train['2A01']['2A01']Passed
control 1[][]Passed
control 4['8A01', '2A00']['8A01', '2A00']Passed
control 7['9A01']['9A01']Passed

SHA-256 / 0539155443744a423e0e4537c99580de5d8e897fa149eb9a2861b9a9ad906ffd

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.761691+00:00.

Case digest / 774ec6edea5cf868ce82cc95a7e52db7db76fd9079f75e4b8f95d54a282c7453