FA-66996 / Railway interlocking logic / Open access
Level crossing warning timeline: arrival speed units · case 01
The predicted train arrival is far too early or rounded later than the train can arrive.
ROOT CAUSE
Distance in metres is divided by speed in km/h without the 3.6 conversion.
VERIFIED REPAIR
Compute arrival from distance*3.6/speed and round down to the earliest possible second.
Unsuccessful approach: Rounding the arrival up predicts a later arrival than the train can achieve.
Case contract
Strike-in at t0 starts amber; red follows 3 s later; entrance barriers are down 4 s after red plus lower_s; exit barriers 4 s after that. Half-barrier crossings are proven at entrance-down, four-quadrant crossings at exit-down. Train arrival is t0 + floor(distance*3.6/speed). The protecting signal clears at max(proven, obstacle clear) and never without an obstacle confirmation (None). warning_ok needs arrival-red >= min_warning_s and a clear time no later than arrival - sighting_s.
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):
t0 = x['strike_in_s']
arrive = t0 + x['distance_m'] // x['speed_kmh']
red = t0 + 3
entry_down = red + 4 + x['lower_s']
exit_down = entry_down + 4
proved = exit_down if x['four_quadrant'] else entry_down
obstacle = x['obstacle_clear_s']
clear_sig = max(proved, obstacle) if obstacle is not None else None
warning = arrive - red
ok = warning >= x['min_warning_s'] and clear_sig is not None and clear_sig <= arrive - x['sighting_s']
return {'arrive': arrive, 'proved': proved, 'signal_clear': clear_sig, 'warning_ok': ok}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('regression: obstacle detector silent', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': None, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False}), ('sampled regression 8', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 35, 'sighting_s': 15}, {'arrive': 42, 'proved': 18, 'signal_clear': 30, 'warning_ok': False}), ('regression: arrival rounding', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True}), ('regression: four-quadrant proving', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True}), ('sampled regression 1', {'strike_in_s': 5, 'distance_m': 800, 'speed_kmh': 60, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 40, 'min_warning_s': 20, 'sighting_s': 10}, {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True}), ('sampled regression 4', {'strike_in_s': 0, 'distance_m': 2400, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 60, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True}), ('sampled regression 7', {'strike_in_s': 30, 'distance_m': 2000, 'speed_kmh': 160, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 40, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True})], [('regression: arrival rounding', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 3', {'strike_in_s': 5, 'distance_m': 2400, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 221, 'proved': 22, 'signal_clear': 22, 'warning_ok': True}), ('sampled regression 27', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 117, 'proved': 18, 'signal_clear': 30, 'warning_ok': True}), ('regression: four-quadrant proving', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True}), ('sampled regression 12', {'strike_in_s': 12, 'distance_m': 800, 'speed_kmh': 60, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 5}, {'arrive': 60, 'proved': 31, 'signal_clear': 31, 'warning_ok': True}), ('sampled regression 15', {'strike_in_s': 5, 'distance_m': 2000, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 30, 'min_warning_s': 27, 'sighting_s': 15}, {'arrive': 65, 'proved': 24, 'signal_clear': 30, 'warning_ok': True}), ('sampled regression 18', {'strike_in_s': 30, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 15}, {'arrive': 52, 'proved': 43, 'signal_clear': 43, 'warning_ok': False})], [('regression: four-quadrant proving', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 10', {'strike_in_s': 5, 'distance_m': 1000, 'speed_kmh': 40, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 95, 'proved': 26, 'signal_clear': 26, 'warning_ok': True}), ('sampled regression 69', {'strike_in_s': 12, 'distance_m': 1250, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 124, 'proved': 25, 'signal_clear': 25, 'warning_ok': True}), ('regression: obstacle confirmed at strike-in', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': 15, 'warning_ok': True}), ('sampled regression 23', {'strike_in_s': 0, 'distance_m': 800, 'speed_kmh': 60, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': None, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 48, 'proved': 17, 'signal_clear': None, 'warning_ok': False}), ('sampled regression 26', {'strike_in_s': 0, 'distance_m': 1500, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 10}, {'arrive': 33, 'proved': 17, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 29', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 60, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 42, 'proved': 24, 'signal_clear': 60, 'warning_ok': False})], [('regression: obstacle detector silent', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': None, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 17', {'strike_in_s': 0, 'distance_m': 1500, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 135, 'proved': 17, 'signal_clear': 20, 'warning_ok': True}), ('sampled regression 14', {'strike_in_s': 12, 'distance_m': 1500, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 20, 'sighting_s': 15}, {'arrive': 45, 'proved': 33, 'signal_clear': 33, 'warning_ok': False}), ('regression: clear exactly at the sighting point', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 40, 'proved': 15, 'signal_clear': 30, 'warning_ok': True}), ('sampled regression 34', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 20, 'sighting_s': 5}, {'arrive': 45, 'proved': 17, 'signal_clear': 20, 'warning_ok': True}), ('sampled regression 37', {'strike_in_s': 30, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 40, 'min_warning_s': 35, 'sighting_s': 15}, {'arrive': 48, 'proved': 49, 'signal_clear': 49, 'warning_ok': False}), ('sampled regression 40', {'strike_in_s': 12, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 40, 'min_warning_s': 35, 'sighting_s': 15}, {'arrive': 30, 'proved': 29, 'signal_clear': 40, 'warning_ok': False})], [('regression: obstacle confirmed at strike-in', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': 15, 'warning_ok': True}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 24', {'strike_in_s': 0, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 27, 'sighting_s': 15}, {'arrive': 18, 'proved': 15, 'signal_clear': 15, 'warning_ok': False}), ('sampled regression 29', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 60, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 42, 'proved': 24, 'signal_clear': 60, 'warning_ok': False}), ('regression: arrival rounding', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True}), ('sampled regression 45', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 90, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 40, 'proved': 17, 'signal_clear': 17, 'warning_ok': True}), ('sampled regression 48', {'strike_in_s': 30, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 20, 'sighting_s': 15}, {'arrive': 48, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('sampled regression 51', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 20, 'sighting_s': 5}, {'arrive': 50, 'proved': 21, 'signal_clear': 21, 'warning_ok': True})]]
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: fast train on a short approach | {'arrive': 6, 'proved': 15, 'signal_clear': 25, 'warning_ok': False} | {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False} | Failed |
| regression: obstacle detector silent | {'arrive': 22, 'proved': 15, 'signal_clear': None, 'warning_ok': False} | {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False} | Failed |
| sampled regression 8 | {'arrive': 15, 'proved': 18, 'signal_clear': 30, 'warning_ok': False} | {'arrive': 42, 'proved': 18, 'signal_clear': 30, 'warning_ok': False} | Failed |
| regression: arrival rounding | {'arrive': 13, 'proved': 15, 'signal_clear': 25, 'warning_ok': False} | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | Failed |
| regression: four-quadrant proving | {'arrive': 22, 'proved': 19, 'signal_clear': 25, 'warning_ok': False} | {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True} | Failed |
| sampled regression 1 | {'arrive': 18, 'proved': 26, 'signal_clear': 40, 'warning_ok': False} | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | Failed |
| sampled regression 4 | {'arrive': 20, 'proved': 21, 'signal_clear': 60, 'warning_ok': False} | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | Failed |
| sampled regression 7 | {'arrive': 42, 'proved': 43, 'signal_clear': 43, 'warning_ok': False} | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | Failed |
SHA-256 / f77a5799457feae8d93eb9118148825564f7996576281f99246591b137071c8c
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
t0 = x['strike_in_s']
arrive = t0 + -(-x['distance_m'] * 36 // (x['speed_kmh'] * 10))
red = t0 + 3
entry_down = red + 4 + x['lower_s']
exit_down = entry_down + 4
proved = exit_down if x['four_quadrant'] else entry_down
obstacle = x['obstacle_clear_s']
clear_sig = max(proved, obstacle) if obstacle is not None else None
warning = arrive - red
ok = warning >= x['min_warning_s'] and clear_sig is not None and clear_sig <= arrive - x['sighting_s']
return {'arrive': arrive, 'proved': proved, 'signal_clear': clear_sig, 'warning_ok': ok}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('regression: obstacle detector silent', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': None, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False}), ('sampled regression 8', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 35, 'sighting_s': 15}, {'arrive': 42, 'proved': 18, 'signal_clear': 30, 'warning_ok': False}), ('regression: arrival rounding', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True}), ('regression: four-quadrant proving', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True}), ('sampled regression 1', {'strike_in_s': 5, 'distance_m': 800, 'speed_kmh': 60, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 40, 'min_warning_s': 20, 'sighting_s': 10}, {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True}), ('sampled regression 4', {'strike_in_s': 0, 'distance_m': 2400, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 60, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True}), ('sampled regression 7', {'strike_in_s': 30, 'distance_m': 2000, 'speed_kmh': 160, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 40, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True})], [('regression: arrival rounding', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 3', {'strike_in_s': 5, 'distance_m': 2400, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 221, 'proved': 22, 'signal_clear': 22, 'warning_ok': True}), ('sampled regression 27', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 117, 'proved': 18, 'signal_clear': 30, 'warning_ok': True}), ('regression: four-quadrant proving', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True}), ('sampled regression 12', {'strike_in_s': 12, 'distance_m': 800, 'speed_kmh': 60, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 5}, {'arrive': 60, 'proved': 31, 'signal_clear': 31, 'warning_ok': True}), ('sampled regression 15', {'strike_in_s': 5, 'distance_m': 2000, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 30, 'min_warning_s': 27, 'sighting_s': 15}, {'arrive': 65, 'proved': 24, 'signal_clear': 30, 'warning_ok': True}), ('sampled regression 18', {'strike_in_s': 30, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 15}, {'arrive': 52, 'proved': 43, 'signal_clear': 43, 'warning_ok': False})], [('regression: four-quadrant proving', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 10', {'strike_in_s': 5, 'distance_m': 1000, 'speed_kmh': 40, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 95, 'proved': 26, 'signal_clear': 26, 'warning_ok': True}), ('sampled regression 69', {'strike_in_s': 12, 'distance_m': 1250, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 124, 'proved': 25, 'signal_clear': 25, 'warning_ok': True}), ('regression: obstacle confirmed at strike-in', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': 15, 'warning_ok': True}), ('sampled regression 23', {'strike_in_s': 0, 'distance_m': 800, 'speed_kmh': 60, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': None, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 48, 'proved': 17, 'signal_clear': None, 'warning_ok': False}), ('sampled regression 26', {'strike_in_s': 0, 'distance_m': 1500, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 10}, {'arrive': 33, 'proved': 17, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 29', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 60, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 42, 'proved': 24, 'signal_clear': 60, 'warning_ok': False})], [('regression: obstacle detector silent', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': None, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 17', {'strike_in_s': 0, 'distance_m': 1500, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 135, 'proved': 17, 'signal_clear': 20, 'warning_ok': True}), ('sampled regression 14', {'strike_in_s': 12, 'distance_m': 1500, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 20, 'sighting_s': 15}, {'arrive': 45, 'proved': 33, 'signal_clear': 33, 'warning_ok': False}), ('regression: clear exactly at the sighting point', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 40, 'proved': 15, 'signal_clear': 30, 'warning_ok': True}), ('sampled regression 34', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 20, 'sighting_s': 5}, {'arrive': 45, 'proved': 17, 'signal_clear': 20, 'warning_ok': True}), ('sampled regression 37', {'strike_in_s': 30, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 40, 'min_warning_s': 35, 'sighting_s': 15}, {'arrive': 48, 'proved': 49, 'signal_clear': 49, 'warning_ok': False}), ('sampled regression 40', {'strike_in_s': 12, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 40, 'min_warning_s': 35, 'sighting_s': 15}, {'arrive': 30, 'proved': 29, 'signal_clear': 40, 'warning_ok': False})], [('regression: obstacle confirmed at strike-in', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': 15, 'warning_ok': True}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 24', {'strike_in_s': 0, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 27, 'sighting_s': 15}, {'arrive': 18, 'proved': 15, 'signal_clear': 15, 'warning_ok': False}), ('sampled regression 29', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 60, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 42, 'proved': 24, 'signal_clear': 60, 'warning_ok': False}), ('regression: arrival rounding', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True}), ('sampled regression 45', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 90, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 40, 'proved': 17, 'signal_clear': 17, 'warning_ok': True}), ('sampled regression 48', {'strike_in_s': 30, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 20, 'sighting_s': 15}, {'arrive': 48, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('sampled regression 51', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 20, 'sighting_s': 5}, {'arrive': 50, 'proved': 21, 'signal_clear': 21, 'warning_ok': True})]]
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: fast train on a short approach | {'arrive': 23, 'proved': 15, 'signal_clear': 25, 'warning_ok': False} | {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False} | Failed |
| regression: obstacle detector silent | {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False} | {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False} | Passed |
| sampled regression 8 | {'arrive': 43, 'proved': 18, 'signal_clear': 30, 'warning_ok': False} | {'arrive': 42, 'proved': 18, 'signal_clear': 30, 'warning_ok': False} | Failed |
| regression: arrival rounding | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | Passed |
| regression: four-quadrant proving | {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True} | {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True} | Passed |
| sampled regression 1 | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | Passed |
| sampled regression 4 | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | Passed |
| sampled regression 7 | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | Passed |
SHA-256 / 2ffeb2b23beeaa627c2ef8f46f48849650ae51b98570d1310c04f7f89ef16559
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
t0 = x['strike_in_s']
arrive = t0 + (x['distance_m'] * 36) // (x['speed_kmh'] * 10)
red = t0 + 3
entry_down = red + 4 + x['lower_s']
exit_down = entry_down + 4
proved = exit_down if x['four_quadrant'] else entry_down
obstacle = x['obstacle_clear_s']
clear_sig = max(proved, obstacle) if obstacle is not None else None
warning = arrive - red
ok = warning >= x['min_warning_s'] and clear_sig is not None and clear_sig <= arrive - x['sighting_s']
return {'arrive': arrive, 'proved': proved, 'signal_clear': clear_sig, 'warning_ok': ok}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('regression: obstacle detector silent', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': None, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False}), ('sampled regression 8', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 35, 'sighting_s': 15}, {'arrive': 42, 'proved': 18, 'signal_clear': 30, 'warning_ok': False}), ('regression: arrival rounding', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True}), ('regression: four-quadrant proving', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True}), ('sampled regression 1', {'strike_in_s': 5, 'distance_m': 800, 'speed_kmh': 60, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 40, 'min_warning_s': 20, 'sighting_s': 10}, {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True}), ('sampled regression 4', {'strike_in_s': 0, 'distance_m': 2400, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 60, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True}), ('sampled regression 7', {'strike_in_s': 30, 'distance_m': 2000, 'speed_kmh': 160, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 40, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True})], [('regression: arrival rounding', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 3', {'strike_in_s': 5, 'distance_m': 2400, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 221, 'proved': 22, 'signal_clear': 22, 'warning_ok': True}), ('sampled regression 27', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 117, 'proved': 18, 'signal_clear': 30, 'warning_ok': True}), ('regression: four-quadrant proving', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True}), ('sampled regression 12', {'strike_in_s': 12, 'distance_m': 800, 'speed_kmh': 60, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 5}, {'arrive': 60, 'proved': 31, 'signal_clear': 31, 'warning_ok': True}), ('sampled regression 15', {'strike_in_s': 5, 'distance_m': 2000, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 30, 'min_warning_s': 27, 'sighting_s': 15}, {'arrive': 65, 'proved': 24, 'signal_clear': 30, 'warning_ok': True}), ('sampled regression 18', {'strike_in_s': 30, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 15}, {'arrive': 52, 'proved': 43, 'signal_clear': 43, 'warning_ok': False})], [('regression: four-quadrant proving', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 10', {'strike_in_s': 5, 'distance_m': 1000, 'speed_kmh': 40, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 95, 'proved': 26, 'signal_clear': 26, 'warning_ok': True}), ('sampled regression 69', {'strike_in_s': 12, 'distance_m': 1250, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 124, 'proved': 25, 'signal_clear': 25, 'warning_ok': True}), ('regression: obstacle confirmed at strike-in', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': 15, 'warning_ok': True}), ('sampled regression 23', {'strike_in_s': 0, 'distance_m': 800, 'speed_kmh': 60, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': None, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 48, 'proved': 17, 'signal_clear': None, 'warning_ok': False}), ('sampled regression 26', {'strike_in_s': 0, 'distance_m': 1500, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 10}, {'arrive': 33, 'proved': 17, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 29', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 60, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 42, 'proved': 24, 'signal_clear': 60, 'warning_ok': False})], [('regression: obstacle detector silent', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': None, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 17', {'strike_in_s': 0, 'distance_m': 1500, 'speed_kmh': 40, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 135, 'proved': 17, 'signal_clear': 20, 'warning_ok': True}), ('sampled regression 14', {'strike_in_s': 12, 'distance_m': 1500, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 20, 'sighting_s': 15}, {'arrive': 45, 'proved': 33, 'signal_clear': 33, 'warning_ok': False}), ('regression: clear exactly at the sighting point', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 40, 'proved': 15, 'signal_clear': 30, 'warning_ok': True}), ('sampled regression 34', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 20, 'sighting_s': 5}, {'arrive': 45, 'proved': 17, 'signal_clear': 20, 'warning_ok': True}), ('sampled regression 37', {'strike_in_s': 30, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 40, 'min_warning_s': 35, 'sighting_s': 15}, {'arrive': 48, 'proved': 49, 'signal_clear': 49, 'warning_ok': False}), ('sampled regression 40', {'strike_in_s': 12, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 40, 'min_warning_s': 35, 'sighting_s': 15}, {'arrive': 30, 'proved': 29, 'signal_clear': 40, 'warning_ok': False})], [('regression: obstacle confirmed at strike-in', {'strike_in_s': 0, 'distance_m': 2000, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 80, 'proved': 15, 'signal_clear': 15, 'warning_ok': True}), ('regression: fast train on a short approach', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('sampled regression 24', {'strike_in_s': 0, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 27, 'sighting_s': 15}, {'arrive': 18, 'proved': 15, 'signal_clear': 15, 'warning_ok': False}), ('sampled regression 29', {'strike_in_s': 5, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': True, 'obstacle_clear_s': 60, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 42, 'proved': 24, 'signal_clear': 60, 'warning_ok': False}), ('regression: arrival rounding', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True}), ('sampled regression 45', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 90, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 0, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 40, 'proved': 17, 'signal_clear': 17, 'warning_ok': True}), ('sampled regression 48', {'strike_in_s': 30, 'distance_m': 800, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 20, 'sighting_s': 15}, {'arrive': 48, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('sampled regression 51', {'strike_in_s': 0, 'distance_m': 1250, 'speed_kmh': 90, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 20, 'min_warning_s': 20, 'sighting_s': 5}, {'arrive': 50, 'proved': 21, 'signal_clear': 21, 'warning_ok': True})]]
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: fast train on a short approach | {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False} | {'arrive': 22, 'proved': 15, 'signal_clear': 25, 'warning_ok': False} | Passed |
| regression: obstacle detector silent | {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False} | {'arrive': 80, 'proved': 15, 'signal_clear': None, 'warning_ok': False} | Passed |
| sampled regression 8 | {'arrive': 42, 'proved': 18, 'signal_clear': 30, 'warning_ok': False} | {'arrive': 42, 'proved': 18, 'signal_clear': 30, 'warning_ok': False} | Passed |
| regression: arrival rounding | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | Passed |
| regression: four-quadrant proving | {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True} | {'arrive': 80, 'proved': 19, 'signal_clear': 25, 'warning_ok': True} | Passed |
| sampled regression 1 | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | Passed |
| sampled regression 4 | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | Passed |
| sampled regression 7 | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | Passed |
SHA-256 / d2fe302048686ef62ce72376b01b8424b7b279dceeb12bd8fec1621b9d336ffe
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:48.775669+00:00.
Case digest / bdb9dc2d792ac31d22df29af352010c6125a3573103cab8c9deae2c4b3308eb0