FA-67011 / Railway interlocking logic / Open access
Level crossing warning timeline: warning time reference · case 01
The road warning time is overstated.
ROOT CAUSE
Warning time is measured from amber rather than from the red lights.
VERIFIED REPAIR
Measure warning time from the start of the red lights.
Unsuccessful approach: Measuring from barriers down understates the warning and rejects valid crossings.
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'] * 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 - t0
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 = [[('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 19', {'strike_in_s': 5, 'distance_m': 2000, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 50, 'proved': 26, 'signal_clear': 26, 'warning_ok': True}), ('boundary: 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}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 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}), ('boundary: 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}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 39', {'strike_in_s': 12, 'distance_m': 800, 'speed_kmh': 90, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 10}, {'arrive': 44, 'proved': 29, 'signal_clear': 29, 'warning_ok': True}), ('boundary: 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}), ('boundary: warning measured from red', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 30, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 25', {'strike_in_s': 5, 'distance_m': 1500, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 50, 'proved': 22, 'signal_clear': 30, 'warning_ok': True}), ('boundary: late obstacle confirmation', {'strike_in_s': 5, 'distance_m': 2400, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 60, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 77, 'proved': 20, 'signal_clear': 60, 'warning_ok': True}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('boundary: 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}), ('boundary: 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}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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 |
|---|---|---|---|
| sampled regression 59 | {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': True} | {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False} | Failed |
| boundary: clear exactly at the sighting point | {'arrive': 40, 'proved': 15, 'signal_clear': 30, 'warning_ok': True} | {'arrive': 40, 'proved': 15, 'signal_clear': 30, 'warning_ok': True} | Passed |
| control 19 | {'arrive': 50, 'proved': 26, 'signal_clear': 26, 'warning_ok': True} | {'arrive': 50, 'proved': 26, 'signal_clear': 26, 'warning_ok': True} | Passed |
| boundary: 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 |
| boundary: arrival rounding | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | Passed |
| control 1 | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | Passed |
| control 4 | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | Passed |
| control 7 | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | Passed |
SHA-256 / 375e8ee942173f311d5d222d116df511aecde6f80705564b2c0024ee7fe0a121
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 - entry_down
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 = [[('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 19', {'strike_in_s': 5, 'distance_m': 2000, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 50, 'proved': 26, 'signal_clear': 26, 'warning_ok': True}), ('boundary: 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}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 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}), ('boundary: 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}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 39', {'strike_in_s': 12, 'distance_m': 800, 'speed_kmh': 90, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 10}, {'arrive': 44, 'proved': 29, 'signal_clear': 29, 'warning_ok': True}), ('boundary: 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}), ('boundary: warning measured from red', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 30, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 25', {'strike_in_s': 5, 'distance_m': 1500, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 50, 'proved': 22, 'signal_clear': 30, 'warning_ok': True}), ('boundary: late obstacle confirmation', {'strike_in_s': 5, 'distance_m': 2400, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 60, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 77, 'proved': 20, 'signal_clear': 60, 'warning_ok': True}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('boundary: 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}), ('boundary: 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}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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 |
|---|---|---|---|
| sampled regression 59 | {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False} | {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False} | Passed |
| boundary: clear exactly at the sighting point | {'arrive': 40, 'proved': 15, 'signal_clear': 30, 'warning_ok': False} | {'arrive': 40, 'proved': 15, 'signal_clear': 30, 'warning_ok': True} | Failed |
| control 19 | {'arrive': 50, 'proved': 26, 'signal_clear': 26, 'warning_ok': False} | {'arrive': 50, 'proved': 26, 'signal_clear': 26, 'warning_ok': True} | Failed |
| boundary: 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 |
| boundary: arrival rounding | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | Passed |
| control 1 | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | Passed |
| control 4 | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | Passed |
| control 7 | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | Passed |
SHA-256 / f7bf2a7f60b4b2d35b476e74b62328cc23b690c06abf7d5dd96c1aa2bb276d5c
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 = [[('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 19', {'strike_in_s': 5, 'distance_m': 2000, 'speed_kmh': 160, 'lower_s': 10, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 35, 'sighting_s': 10}, {'arrive': 50, 'proved': 26, 'signal_clear': 26, 'warning_ok': True}), ('boundary: 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}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 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}), ('boundary: 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}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 39', {'strike_in_s': 12, 'distance_m': 800, 'speed_kmh': 90, 'lower_s': 6, 'four_quadrant': True, 'obstacle_clear_s': 25, 'min_warning_s': 20, 'sighting_s': 10}, {'arrive': 44, 'proved': 29, 'signal_clear': 29, 'warning_ok': True}), ('boundary: 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}), ('boundary: warning measured from red', {'strike_in_s': 0, 'distance_m': 1000, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 25, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 30, 'proved': 15, 'signal_clear': 25, 'warning_ok': False}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('control 25', {'strike_in_s': 5, 'distance_m': 1500, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 30, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 50, 'proved': 22, 'signal_clear': 30, 'warning_ok': True}), ('boundary: late obstacle confirmation', {'strike_in_s': 5, 'distance_m': 2400, 'speed_kmh': 120, 'lower_s': 8, 'four_quadrant': False, 'obstacle_clear_s': 60, 'min_warning_s': 27, 'sighting_s': 10}, {'arrive': 77, 'proved': 20, 'signal_clear': 60, 'warning_ok': True}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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})], [('sampled regression 59', {'strike_in_s': 30, 'distance_m': 1250, 'speed_kmh': 120, 'lower_s': 10, 'four_quadrant': False, 'obstacle_clear_s': 20, 'min_warning_s': 35, 'sighting_s': 5}, {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False}), ('boundary: 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}), ('boundary: 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}), ('boundary: 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}), ('boundary: 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}), ('control 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}), ('control 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}), ('control 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 |
|---|---|---|---|
| sampled regression 59 | {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False} | {'arrive': 67, 'proved': 47, 'signal_clear': 47, 'warning_ok': False} | Passed |
| boundary: clear exactly at the sighting point | {'arrive': 40, 'proved': 15, 'signal_clear': 30, 'warning_ok': True} | {'arrive': 40, 'proved': 15, 'signal_clear': 30, 'warning_ok': True} | Passed |
| control 19 | {'arrive': 50, 'proved': 26, 'signal_clear': 26, 'warning_ok': True} | {'arrive': 50, 'proved': 26, 'signal_clear': 26, 'warning_ok': True} | Passed |
| boundary: 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 |
| boundary: arrival rounding | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | {'arrive': 50, 'proved': 15, 'signal_clear': 25, 'warning_ok': True} | Passed |
| control 1 | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | {'arrive': 53, 'proved': 26, 'signal_clear': 40, 'warning_ok': True} | Passed |
| control 4 | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | {'arrive': 72, 'proved': 21, 'signal_clear': 60, 'warning_ok': True} | Passed |
| control 7 | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | {'arrive': 75, 'proved': 43, 'signal_clear': 43, 'warning_ok': True} | Passed |
SHA-256 / a2b9c776814b1233aece7f57eda8544e8d37158b4481db9b5b8268eee56043f4
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.817799+00:00.
Case digest / bfdc690ddf6f52d5ac41f48f1313c19585e4ca321753838be8e4ff1c9985cf42