FA-67081 / Railway interlocking logic / Open access
ATP braking curve supervision: warning threshold boundary · case 01
A train running exactly at the warning margin is warned.
ROOT CAUSE
The warning comparison is inclusive.
THE FAILURE
The warning comparison is inclusive.
Unsuccessful approach: Warning on any overspeed ignores the warning margin.
Case contract
Permitted speed at the train is sqrt(vt^2 + 2*a*d) with vt the target speed in m/s, a = decel_cms2/100 m/s^2 and d = max(distance - safety margin, 0); convert back to km/h, truncate to an integer (never round up) and cap at line speed. Action is brake if speed > permitted + brake margin, else warning if speed > permitted + warn margin, else none.
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
import math
N = 1
observations = []
def solve(x):
vt = x['target_kmh'] / 3.6
d = max(x['distance_m'] - x['safety_margin_m'], 0)
a = x['decel_cms2'] / 100
vp = math.sqrt(vt * vt + 2 * a * d) * 3.6
permitted = min(int(vp), x['line_kmh'])
v = x['speed_kmh']
if v > permitted + x['brake_margin_kmh']:
action = 'brake'
elif v >= permitted + x['warn_margin_kmh']:
action = 'warning'
else:
action = 'none'
return {'permitted': permitted, 'action': action}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: target speed release', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 44, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('boundary: stop target inside the margin', {'target_kmh': 0, 'distance_m': 40, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 10, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 0, 'action': 'warning'}), ('boundary: curve above line speed', {'target_kmh': 0, 'distance_m': 2500, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 150, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 120, 'action': 'brake'}), ('control 1', {'target_kmh': 0, 'distance_m': 0, 'safety_margin_m': 0, 'decel_cms2': 100, 'line_kmh': 160, 'speed_kmh': 139, 'warn_margin_kmh': 5, 'brake_margin_kmh': 15}, {'permitted': 0, 'action': 'brake'}), ('control 4', {'target_kmh': 0, 'distance_m': 100, 'safety_margin_m': 20, 'decel_cms2': 100, 'line_kmh': 80, 'speed_kmh': 136, 'warn_margin_kmh': 5, 'brake_margin_kmh': 15}, {'permitted': 45, 'action': 'brake'}), ('control 7', {'target_kmh': 40, 'distance_m': 2500, 'safety_margin_m': 20, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 59, 'warn_margin_kmh': 3, 'brake_margin_kmh': 10}, {'permitted': 160, 'action': 'none'})], [('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('sampled regression 25', {'target_kmh': 0, 'distance_m': 2500, 'safety_margin_m': 20, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 163, 'warn_margin_kmh': 3, 'brake_margin_kmh': 8}, {'permitted': 160, 'action': 'none'}), ('boundary: curve above line speed', {'target_kmh': 0, 'distance_m': 2500, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 150, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 120, 'action': 'brake'}), ('boundary: brake boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 50, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'warning'}), ('control 12', {'target_kmh': 40, 'distance_m': 600, 'safety_margin_m': 20, 'decel_cms2': 100, 'line_kmh': 160, 'speed_kmh': 133, 'warn_margin_kmh': 3, 'brake_margin_kmh': 15}, {'permitted': 128, 'action': 'warning'}), ('control 15', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 20, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 43, 'warn_margin_kmh': 3, 'brake_margin_kmh': 10}, {'permitted': 102, 'action': 'none'}), ('control 18', {'target_kmh': 60, 'distance_m': 1200, 'safety_margin_m': 20, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 6, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 120, 'action': 'none'})], [('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('sampled regression 50', {'target_kmh': 20, 'distance_m': 40, 'safety_margin_m': 20, 'decel_cms2': 70, 'line_kmh': 80, 'speed_kmh': 32, 'warn_margin_kmh': 5, 'brake_margin_kmh': 8}, {'permitted': 27, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('boundary: brake boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 50, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'warning'}), ('boundary: between warning and brake', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 48, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'warning'}), ('control 23', {'target_kmh': 60, 'distance_m': 100, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 80, 'speed_kmh': 13, 'warn_margin_kmh': 5, 'brake_margin_kmh': 8}, {'permitted': 67, 'action': 'none'}), ('control 26', {'target_kmh': 60, 'distance_m': 2500, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 86, 'warn_margin_kmh': 3, 'brake_margin_kmh': 10}, {'permitted': 160, 'action': 'none'}), ('control 29', {'target_kmh': 0, 'distance_m': 250, 'safety_margin_m': 0, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 4, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 67, 'action': 'none'})], [('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: target speed release', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 44, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('boundary: between warning and brake', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 48, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'warning'}), ('boundary: fractional permitted speed', {'target_kmh': 20, 'distance_m': 100, 'safety_margin_m': 0, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 60, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 47, 'action': 'brake'}), ('control 34', {'target_kmh': 0, 'distance_m': 0, 'safety_margin_m': 0, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 96, 'warn_margin_kmh': 5, 'brake_margin_kmh': 15}, {'permitted': 0, 'action': 'brake'}), ('control 37', {'target_kmh': 20, 'distance_m': 2500, 'safety_margin_m': 20, 'decel_cms2': 70, 'line_kmh': 80, 'speed_kmh': 168, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 80, 'action': 'brake'}), ('control 40', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 70, 'warn_margin_kmh': 5, 'brake_margin_kmh': 15}, {'permitted': 84, 'action': 'none'})], [('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('sampled regression 25', {'target_kmh': 0, 'distance_m': 2500, 'safety_margin_m': 20, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 163, 'warn_margin_kmh': 3, 'brake_margin_kmh': 8}, {'permitted': 160, 'action': 'none'}), ('boundary: stop target inside the margin', {'target_kmh': 0, 'distance_m': 40, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 10, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 0, 'action': 'warning'}), ('boundary: target speed release', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 44, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('control 45', {'target_kmh': 20, 'distance_m': 40, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 80, 'speed_kmh': 133, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 20, 'action': 'brake'}), ('control 48', {'target_kmh': 40, 'distance_m': 100, 'safety_margin_m': 20, 'decel_cms2': 100, 'line_kmh': 160, 'speed_kmh': 75, 'warn_margin_kmh': 3, 'brake_margin_kmh': 15}, {'permitted': 60, 'action': 'warning'}), ('control 51', {'target_kmh': 60, 'distance_m': 600, 'safety_margin_m': 0, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 8, 'warn_margin_kmh': 5, 'brake_margin_kmh': 8}, {'permitted': 106, 'action': 'none'})]]
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: warning boundary | {'action': 'warning', 'permitted': 40} | {'action': 'none', 'permitted': 40} | Failed |
| boundary: target speed release | {'action': 'none', 'permitted': 40} | {'action': 'none', 'permitted': 40} | Passed |
| boundary: curve below line speed | {'action': 'none', 'permitted': 99} | {'action': 'none', 'permitted': 99} | Passed |
| boundary: stop target inside the margin | {'action': 'warning', 'permitted': 0} | {'action': 'warning', 'permitted': 0} | Passed |
| boundary: curve above line speed | {'action': 'brake', 'permitted': 120} | {'action': 'brake', 'permitted': 120} | Passed |
| control 1 | {'action': 'brake', 'permitted': 0} | {'action': 'brake', 'permitted': 0} | Passed |
| control 4 | {'action': 'brake', 'permitted': 45} | {'action': 'brake', 'permitted': 45} | Passed |
| control 7 | {'action': 'none', 'permitted': 160} | {'action': 'none', 'permitted': 160} | Passed |
SHA-256 / 0249991cbe789d52e6148178bcb4f15f39f07802df262169e00a3b6ca49d523c
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
vt = x['target_kmh'] / 3.6
d = max(x['distance_m'] - x['safety_margin_m'], 0)
a = x['decel_cms2'] / 100
vp = math.sqrt(vt * vt + 2 * a * d) * 3.6
permitted = min(int(vp), x['line_kmh'])
v = x['speed_kmh']
if v > permitted + x['brake_margin_kmh']:
action = 'brake'
elif v > permitted:
action = 'warning'
else:
action = 'none'
return {'permitted': permitted, 'action': action}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: target speed release', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 44, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('boundary: stop target inside the margin', {'target_kmh': 0, 'distance_m': 40, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 10, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 0, 'action': 'warning'}), ('boundary: curve above line speed', {'target_kmh': 0, 'distance_m': 2500, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 150, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 120, 'action': 'brake'}), ('control 1', {'target_kmh': 0, 'distance_m': 0, 'safety_margin_m': 0, 'decel_cms2': 100, 'line_kmh': 160, 'speed_kmh': 139, 'warn_margin_kmh': 5, 'brake_margin_kmh': 15}, {'permitted': 0, 'action': 'brake'}), ('control 4', {'target_kmh': 0, 'distance_m': 100, 'safety_margin_m': 20, 'decel_cms2': 100, 'line_kmh': 80, 'speed_kmh': 136, 'warn_margin_kmh': 5, 'brake_margin_kmh': 15}, {'permitted': 45, 'action': 'brake'}), ('control 7', {'target_kmh': 40, 'distance_m': 2500, 'safety_margin_m': 20, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 59, 'warn_margin_kmh': 3, 'brake_margin_kmh': 10}, {'permitted': 160, 'action': 'none'})], [('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('sampled regression 25', {'target_kmh': 0, 'distance_m': 2500, 'safety_margin_m': 20, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 163, 'warn_margin_kmh': 3, 'brake_margin_kmh': 8}, {'permitted': 160, 'action': 'none'}), ('boundary: curve above line speed', {'target_kmh': 0, 'distance_m': 2500, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 150, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 120, 'action': 'brake'}), ('boundary: brake boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 50, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'warning'}), ('control 12', {'target_kmh': 40, 'distance_m': 600, 'safety_margin_m': 20, 'decel_cms2': 100, 'line_kmh': 160, 'speed_kmh': 133, 'warn_margin_kmh': 3, 'brake_margin_kmh': 15}, {'permitted': 128, 'action': 'warning'}), ('control 15', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 20, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 43, 'warn_margin_kmh': 3, 'brake_margin_kmh': 10}, {'permitted': 102, 'action': 'none'}), ('control 18', {'target_kmh': 60, 'distance_m': 1200, 'safety_margin_m': 20, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 6, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 120, 'action': 'none'})], [('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('sampled regression 50', {'target_kmh': 20, 'distance_m': 40, 'safety_margin_m': 20, 'decel_cms2': 70, 'line_kmh': 80, 'speed_kmh': 32, 'warn_margin_kmh': 5, 'brake_margin_kmh': 8}, {'permitted': 27, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('boundary: brake boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 50, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'warning'}), ('boundary: between warning and brake', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 48, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'warning'}), ('control 23', {'target_kmh': 60, 'distance_m': 100, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 80, 'speed_kmh': 13, 'warn_margin_kmh': 5, 'brake_margin_kmh': 8}, {'permitted': 67, 'action': 'none'}), ('control 26', {'target_kmh': 60, 'distance_m': 2500, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 86, 'warn_margin_kmh': 3, 'brake_margin_kmh': 10}, {'permitted': 160, 'action': 'none'}), ('control 29', {'target_kmh': 0, 'distance_m': 250, 'safety_margin_m': 0, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 4, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 67, 'action': 'none'})], [('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: target speed release', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 44, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('boundary: between warning and brake', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 48, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'warning'}), ('boundary: fractional permitted speed', {'target_kmh': 20, 'distance_m': 100, 'safety_margin_m': 0, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 60, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 47, 'action': 'brake'}), ('control 34', {'target_kmh': 0, 'distance_m': 0, 'safety_margin_m': 0, 'decel_cms2': 70, 'line_kmh': 120, 'speed_kmh': 96, 'warn_margin_kmh': 5, 'brake_margin_kmh': 15}, {'permitted': 0, 'action': 'brake'}), ('control 37', {'target_kmh': 20, 'distance_m': 2500, 'safety_margin_m': 20, 'decel_cms2': 70, 'line_kmh': 80, 'speed_kmh': 168, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 80, 'action': 'brake'}), ('control 40', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 70, 'warn_margin_kmh': 5, 'brake_margin_kmh': 15}, {'permitted': 84, 'action': 'none'})], [('regression: warning boundary', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 45, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('boundary: curve below line speed', {'target_kmh': 0, 'distance_m': 600, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 100, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 99, 'action': 'none'}), ('sampled regression 25', {'target_kmh': 0, 'distance_m': 2500, 'safety_margin_m': 20, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 163, 'warn_margin_kmh': 3, 'brake_margin_kmh': 8}, {'permitted': 160, 'action': 'none'}), ('boundary: stop target inside the margin', {'target_kmh': 0, 'distance_m': 40, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 10, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 0, 'action': 'warning'}), ('boundary: target speed release', {'target_kmh': 40, 'distance_m': 0, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 160, 'speed_kmh': 44, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 40, 'action': 'none'}), ('control 45', {'target_kmh': 20, 'distance_m': 40, 'safety_margin_m': 50, 'decel_cms2': 70, 'line_kmh': 80, 'speed_kmh': 133, 'warn_margin_kmh': 5, 'brake_margin_kmh': 10}, {'permitted': 20, 'action': 'brake'}), ('control 48', {'target_kmh': 40, 'distance_m': 100, 'safety_margin_m': 20, 'decel_cms2': 100, 'line_kmh': 160, 'speed_kmh': 75, 'warn_margin_kmh': 3, 'brake_margin_kmh': 15}, {'permitted': 60, 'action': 'warning'}), ('control 51', {'target_kmh': 60, 'distance_m': 600, 'safety_margin_m': 0, 'decel_cms2': 50, 'line_kmh': 160, 'speed_kmh': 8, 'warn_margin_kmh': 5, 'brake_margin_kmh': 8}, {'permitted': 106, 'action': 'none'})]]
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: warning boundary | {'action': 'warning', 'permitted': 40} | {'action': 'none', 'permitted': 40} | Failed |
| boundary: target speed release | {'action': 'warning', 'permitted': 40} | {'action': 'none', 'permitted': 40} | Failed |
| boundary: curve below line speed | {'action': 'warning', 'permitted': 99} | {'action': 'none', 'permitted': 99} | Failed |
| boundary: stop target inside the margin | {'action': 'warning', 'permitted': 0} | {'action': 'warning', 'permitted': 0} | Passed |
| boundary: curve above line speed | {'action': 'brake', 'permitted': 120} | {'action': 'brake', 'permitted': 120} | Passed |
| control 1 | {'action': 'brake', 'permitted': 0} | {'action': 'brake', 'permitted': 0} | Passed |
| control 4 | {'action': 'brake', 'permitted': 45} | {'action': 'brake', 'permitted': 45} | Passed |
| control 7 | {'action': 'none', 'permitted': 160} | {'action': 'none', 'permitted': 160} | Passed |
SHA-256 / c6ef0b502444263e20ad6341e59211579b085170425d65ac889f30b5fc4a4787
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:49.445019+00:00.
Case digest / f49871878328811770338c5cd34331af5b55899cdf5875ed500cb6f45afabdbb