FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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