FA-66901 / Railway interlocking logic / Open access
Point machine throw control: missing detection · case 01
A point that never regains detection is reported as moved.
ROOT CAUSE
A missing detection time is treated as success instead of as a failure.
VERIFIED REPAIR
Treat None as no detection and fail the throw.
Unsuccessful approach: Using falsiness also treats an immediate (0 ms) detection as a failure.
Case contract
A point command is answered as in-position when already detected in the commanded lie (even if locked or occupied). Otherwise route locking refuses (route-locked), then track locking refuses (track-locked); the alarm flag on refusals is raised only when the point has lost detection (X). A throw that fails to regain detection within limit_ms (inclusive; None means never) leaves the point X with alarm; otherwise it lies in the commanded position. detected_ms of 0 means detection was immediate.
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):
pos, cmd = x['pos'], x['cmd']
if pos == cmd:
return {'pos': pos, 'result': 'in-position', 'alarm': False}
if x['route_locked']:
return {'pos': pos, 'result': 'route-locked', 'alarm': pos == 'X'}
if x['occupied']:
return {'pos': pos, 'result': 'track-locked', 'alarm': pos == 'X'}
det = x['detected_ms']
if det is not None and det > x['limit_ms']:
return {'pos': 'X', 'result': 'no-detection', 'alarm': True}
return {'pos': cmd, 'result': 'moved', 'alarm': False}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 34', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('boundary: detection exactly at the limit', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4000}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('boundary: detection one ms late', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4001}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 1', {'pos': 'X', 'cmd': 'R', 'route_locked': True, 'occupied': True, 'limit_ms': 3000, 'detected_ms': 4500}, {'pos': 'X', 'result': 'route-locked', 'alarm': True}), ('control 4', {'pos': 'N', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 6000}, {'pos': 'N', 'result': 'in-position', 'alarm': False}), ('control 7', {'pos': 'R', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 6000}, {'pos': 'R', 'result': 'in-position', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 24', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 79', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('boundary: already reverse while route locked', {'pos': 'R', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'R', 'result': 'in-position', 'alarm': False}), ('control 12', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': True, 'limit_ms': 4000, 'detected_ms': 4000}, {'pos': 'N', 'result': 'route-locked', 'alarm': False}), ('control 15', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': True, 'limit_ms': 3000, 'detected_ms': 3999}, {'pos': 'N', 'result': 'route-locked', 'alarm': False}), ('control 18', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 6000, 'detected_ms': None}, {'pos': 'N', 'result': 'route-locked', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 71', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 60', {'pos': 'X', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 0}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('boundary: already reverse while route locked', {'pos': 'R', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'R', 'result': 'in-position', 'alarm': False}), ('control 23', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 6000}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('control 26', {'pos': 'N', 'cmd': 'N', 'route_locked': False, 'occupied': True, 'limit_ms': 4000, 'detected_ms': 1500}, {'pos': 'N', 'result': 'in-position', 'alarm': False}), ('control 29', {'pos': 'R', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': None}, {'pos': 'R', 'result': 'in-position', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 36', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('boundary: out of correspondence and locked', {'pos': 'X', 'cmd': 'N', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'X', 'result': 'route-locked', 'alarm': True}), ('boundary: normal point locked by a route', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'N', 'result': 'route-locked', 'alarm': False}), ('control 34', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 37', {'pos': 'R', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 4000}, {'pos': 'R', 'result': 'in-position', 'alarm': False}), ('control 40', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 7000}, {'pos': 'N', 'result': 'route-locked', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 24', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: failed throw from normal', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 9000}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: detection exactly at the limit', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4000}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('control 45', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2999}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 48', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 3001}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 51', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 0}, {'pos': 'R', 'result': 'moved', 'alarm': False})]]
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: never detected | {'alarm': False, 'pos': 'N', 'result': 'moved'} | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | Failed |
| boundary: immediate detection | {'alarm': False, 'pos': 'N', 'result': 'moved'} | {'alarm': False, 'pos': 'N', 'result': 'moved'} | Passed |
| control 34 | {'alarm': False, 'pos': 'N', 'result': 'moved'} | {'alarm': False, 'pos': 'N', 'result': 'moved'} | Passed |
| boundary: detection exactly at the limit | {'alarm': False, 'pos': 'R', 'result': 'moved'} | {'alarm': False, 'pos': 'R', 'result': 'moved'} | Passed |
| boundary: detection one ms late | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | Passed |
| control 1 | {'alarm': True, 'pos': 'X', 'result': 'route-locked'} | {'alarm': True, 'pos': 'X', 'result': 'route-locked'} | Passed |
| control 4 | {'alarm': False, 'pos': 'N', 'result': 'in-position'} | {'alarm': False, 'pos': 'N', 'result': 'in-position'} | Passed |
| control 7 | {'alarm': False, 'pos': 'R', 'result': 'in-position'} | {'alarm': False, 'pos': 'R', 'result': 'in-position'} | Passed |
SHA-256 / dd86c27747cc3473c75d27a26f5f4f2569d04d7c831e3c8a1f74b2c79664f23e
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
pos, cmd = x['pos'], x['cmd']
if pos == cmd:
return {'pos': pos, 'result': 'in-position', 'alarm': False}
if x['route_locked']:
return {'pos': pos, 'result': 'route-locked', 'alarm': pos == 'X'}
if x['occupied']:
return {'pos': pos, 'result': 'track-locked', 'alarm': pos == 'X'}
det = x['detected_ms']
if not det or det > x['limit_ms']:
return {'pos': 'X', 'result': 'no-detection', 'alarm': True}
return {'pos': cmd, 'result': 'moved', 'alarm': False}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 34', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('boundary: detection exactly at the limit', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4000}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('boundary: detection one ms late', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4001}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 1', {'pos': 'X', 'cmd': 'R', 'route_locked': True, 'occupied': True, 'limit_ms': 3000, 'detected_ms': 4500}, {'pos': 'X', 'result': 'route-locked', 'alarm': True}), ('control 4', {'pos': 'N', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 6000}, {'pos': 'N', 'result': 'in-position', 'alarm': False}), ('control 7', {'pos': 'R', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 6000}, {'pos': 'R', 'result': 'in-position', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 24', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 79', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('boundary: already reverse while route locked', {'pos': 'R', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'R', 'result': 'in-position', 'alarm': False}), ('control 12', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': True, 'limit_ms': 4000, 'detected_ms': 4000}, {'pos': 'N', 'result': 'route-locked', 'alarm': False}), ('control 15', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': True, 'limit_ms': 3000, 'detected_ms': 3999}, {'pos': 'N', 'result': 'route-locked', 'alarm': False}), ('control 18', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 6000, 'detected_ms': None}, {'pos': 'N', 'result': 'route-locked', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 71', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 60', {'pos': 'X', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 0}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('boundary: already reverse while route locked', {'pos': 'R', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'R', 'result': 'in-position', 'alarm': False}), ('control 23', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 6000}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('control 26', {'pos': 'N', 'cmd': 'N', 'route_locked': False, 'occupied': True, 'limit_ms': 4000, 'detected_ms': 1500}, {'pos': 'N', 'result': 'in-position', 'alarm': False}), ('control 29', {'pos': 'R', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': None}, {'pos': 'R', 'result': 'in-position', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 36', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('boundary: out of correspondence and locked', {'pos': 'X', 'cmd': 'N', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'X', 'result': 'route-locked', 'alarm': True}), ('boundary: normal point locked by a route', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'N', 'result': 'route-locked', 'alarm': False}), ('control 34', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 37', {'pos': 'R', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 4000}, {'pos': 'R', 'result': 'in-position', 'alarm': False}), ('control 40', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 7000}, {'pos': 'N', 'result': 'route-locked', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 24', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: failed throw from normal', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 9000}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: detection exactly at the limit', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4000}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('control 45', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2999}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 48', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 3001}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 51', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 0}, {'pos': 'R', 'result': 'moved', 'alarm': False})]]
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: never detected | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | Passed |
| boundary: immediate detection | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | {'alarm': False, 'pos': 'N', 'result': 'moved'} | Failed |
| control 34 | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | {'alarm': False, 'pos': 'N', 'result': 'moved'} | Failed |
| boundary: detection exactly at the limit | {'alarm': False, 'pos': 'R', 'result': 'moved'} | {'alarm': False, 'pos': 'R', 'result': 'moved'} | Passed |
| boundary: detection one ms late | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | Passed |
| control 1 | {'alarm': True, 'pos': 'X', 'result': 'route-locked'} | {'alarm': True, 'pos': 'X', 'result': 'route-locked'} | Passed |
| control 4 | {'alarm': False, 'pos': 'N', 'result': 'in-position'} | {'alarm': False, 'pos': 'N', 'result': 'in-position'} | Passed |
| control 7 | {'alarm': False, 'pos': 'R', 'result': 'in-position'} | {'alarm': False, 'pos': 'R', 'result': 'in-position'} | Passed |
SHA-256 / 0acf3fb4439fa48cbd1e55d3fea80eb4e489f63f33b41de50e043081c2f08ca2
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
pos, cmd = x['pos'], x['cmd']
if pos == cmd:
return {'pos': pos, 'result': 'in-position', 'alarm': False}
if x['route_locked']:
return {'pos': pos, 'result': 'route-locked', 'alarm': pos == 'X'}
if x['occupied']:
return {'pos': pos, 'result': 'track-locked', 'alarm': pos == 'X'}
det = x['detected_ms']
if det is None or det > x['limit_ms']:
return {'pos': 'X', 'result': 'no-detection', 'alarm': True}
return {'pos': cmd, 'result': 'moved', 'alarm': False}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 34', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('boundary: detection exactly at the limit', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4000}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('boundary: detection one ms late', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4001}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 1', {'pos': 'X', 'cmd': 'R', 'route_locked': True, 'occupied': True, 'limit_ms': 3000, 'detected_ms': 4500}, {'pos': 'X', 'result': 'route-locked', 'alarm': True}), ('control 4', {'pos': 'N', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 6000}, {'pos': 'N', 'result': 'in-position', 'alarm': False}), ('control 7', {'pos': 'R', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 6000}, {'pos': 'R', 'result': 'in-position', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 24', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 79', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('boundary: already reverse while route locked', {'pos': 'R', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'R', 'result': 'in-position', 'alarm': False}), ('control 12', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': True, 'limit_ms': 4000, 'detected_ms': 4000}, {'pos': 'N', 'result': 'route-locked', 'alarm': False}), ('control 15', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': True, 'limit_ms': 3000, 'detected_ms': 3999}, {'pos': 'N', 'result': 'route-locked', 'alarm': False}), ('control 18', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 6000, 'detected_ms': None}, {'pos': 'N', 'result': 'route-locked', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 71', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 60', {'pos': 'X', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 0}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('boundary: already reverse while route locked', {'pos': 'R', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'R', 'result': 'in-position', 'alarm': False}), ('control 23', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 6000}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('control 26', {'pos': 'N', 'cmd': 'N', 'route_locked': False, 'occupied': True, 'limit_ms': 4000, 'detected_ms': 1500}, {'pos': 'N', 'result': 'in-position', 'alarm': False}), ('control 29', {'pos': 'R', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': None}, {'pos': 'R', 'result': 'in-position', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 36', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('boundary: out of correspondence and locked', {'pos': 'X', 'cmd': 'N', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'X', 'result': 'route-locked', 'alarm': True}), ('boundary: normal point locked by a route', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'N', 'result': 'route-locked', 'alarm': False}), ('control 34', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 37', {'pos': 'R', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 4000}, {'pos': 'R', 'result': 'in-position', 'alarm': False}), ('control 40', {'pos': 'N', 'cmd': 'R', 'route_locked': True, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 7000}, {'pos': 'N', 'result': 'route-locked', 'alarm': False})], [('regression: never detected', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 24', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': None}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: failed throw from normal', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 9000}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('boundary: detection exactly at the limit', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4000}, {'pos': 'R', 'result': 'moved', 'alarm': False}), ('control 45', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2999}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('control 48', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 3001}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 51', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 0}, {'pos': 'R', 'result': 'moved', 'alarm': False})]]
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: never detected | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | Passed |
| boundary: immediate detection | {'alarm': False, 'pos': 'N', 'result': 'moved'} | {'alarm': False, 'pos': 'N', 'result': 'moved'} | Passed |
| control 34 | {'alarm': False, 'pos': 'N', 'result': 'moved'} | {'alarm': False, 'pos': 'N', 'result': 'moved'} | Passed |
| boundary: detection exactly at the limit | {'alarm': False, 'pos': 'R', 'result': 'moved'} | {'alarm': False, 'pos': 'R', 'result': 'moved'} | Passed |
| boundary: detection one ms late | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | {'alarm': True, 'pos': 'X', 'result': 'no-detection'} | Passed |
| control 1 | {'alarm': True, 'pos': 'X', 'result': 'route-locked'} | {'alarm': True, 'pos': 'X', 'result': 'route-locked'} | Passed |
| control 4 | {'alarm': False, 'pos': 'N', 'result': 'in-position'} | {'alarm': False, 'pos': 'N', 'result': 'in-position'} | Passed |
| control 7 | {'alarm': False, 'pos': 'R', 'result': 'in-position'} | {'alarm': False, 'pos': 'R', 'result': 'in-position'} | Passed |
SHA-256 / 18abc7bcb2faa09803e000b0b82a3a9f020d2e64d06caa58610458d2b3bec08b
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.022954+00:00.
Case digest / f4d0eefcb05530302b9aa4768206843c74fa21914b3f0cf248286704b974fec8