FAILURE MAP
← Case archive

FA-66911 / Railway interlocking logic / Open access

Point machine throw control: failed throw position · case 01

After a failed throw the point is still reported detected in a lie.

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

ROOT CAUSE

The failed throw keeps the previous position instead of out of correspondence.

VERIFIED REPAIR

A failed throw leaves the point out of correspondence (X).

Unsuccessful approach: Reporting the commanded position assumes the blades reached it.

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 None or det > x['limit_ms']:
        return {'pos': pos, '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: 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}), ('sampled regression 6', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 7000}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('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: 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: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('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}), ('regression: 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 43', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4500}, {'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}), ('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: 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}), ('sampled regression 48', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 3001}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 65', {'pos': 'X', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 4500}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('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}), ('boundary: already normal under a train', {'pos': 'N', 'cmd': 'N', 'route_locked': False, 'occupied': True, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'N', '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: 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}), ('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}), ('regression: 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: 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}), ('sampled regression 47', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 6000}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('regression: 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}), ('regression: 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 45', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2999}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 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 fixtureActualExpectedOutcome
regression: detection one ms late{'alarm': True, 'pos': 'N', 'result': 'no-detection'}{'alarm': True, 'pos': 'X', 'result': 'no-detection'}Failed
sampled regression 6{'alarm': True, 'pos': 'N', 'result': 'no-detection'}{'alarm': True, 'pos': 'X', 'result': 'no-detection'}Failed
regression: never detected{'alarm': True, 'pos': 'R', 'result': 'no-detection'}{'alarm': True, 'pos': 'X', 'result': 'no-detection'}Failed
boundary: detection exactly at the limit{'alarm': False, 'pos': 'R', 'result': 'moved'}{'alarm': False, 'pos': 'R', 'result': 'moved'}Passed
boundary: immediate detection{'alarm': False, 'pos': 'N', 'result': 'moved'}{'alarm': False, 'pos': 'N', 'result': 'moved'}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 / 4fe7be65ba3ebcccb1422d5d12ff3d346b10096211a8f65a6696a116249c951b

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 det is None or det > x['limit_ms']:
        return {'pos': cmd, '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: 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}), ('sampled regression 6', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 7000}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('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: 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: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('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}), ('regression: 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 43', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4500}, {'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}), ('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: 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}), ('sampled regression 48', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 3001}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 65', {'pos': 'X', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 4500}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('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}), ('boundary: already normal under a train', {'pos': 'N', 'cmd': 'N', 'route_locked': False, 'occupied': True, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'N', '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: 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}), ('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}), ('regression: 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: 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}), ('sampled regression 47', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 6000}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('regression: 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}), ('regression: 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 45', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2999}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 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 fixtureActualExpectedOutcome
regression: detection one ms late{'alarm': True, 'pos': 'R', 'result': 'no-detection'}{'alarm': True, 'pos': 'X', 'result': 'no-detection'}Failed
sampled regression 6{'alarm': True, 'pos': 'R', 'result': 'no-detection'}{'alarm': True, 'pos': 'X', 'result': 'no-detection'}Failed
regression: never detected{'alarm': True, 'pos': 'N', 'result': 'no-detection'}{'alarm': True, 'pos': 'X', 'result': 'no-detection'}Failed
boundary: detection exactly at the limit{'alarm': False, 'pos': 'R', 'result': 'moved'}{'alarm': False, 'pos': 'R', 'result': 'moved'}Passed
boundary: immediate detection{'alarm': False, 'pos': 'N', 'result': 'moved'}{'alarm': False, 'pos': 'N', 'result': 'moved'}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 / 3547b0ed92924981f65e7a09819d45a97291ee4baa0c6438baad49c150bf1158

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: 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}), ('sampled regression 6', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 6000, 'detected_ms': 7000}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('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: 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: immediate detection', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 0}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('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}), ('regression: 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 43', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 4500}, {'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}), ('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: 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}), ('sampled regression 48', {'pos': 'N', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 3001}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('control 65', {'pos': 'X', 'cmd': 'R', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 4500}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('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}), ('boundary: already normal under a train', {'pos': 'N', 'cmd': 'N', 'route_locked': False, 'occupied': True, 'limit_ms': 4000, 'detected_ms': 2000}, {'pos': 'N', '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: 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}), ('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}), ('regression: 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: 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}), ('sampled regression 47', {'pos': 'R', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 3000, 'detected_ms': 6000}, {'pos': 'X', 'result': 'no-detection', 'alarm': True}), ('regression: 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}), ('regression: 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 45', {'pos': 'X', 'cmd': 'N', 'route_locked': False, 'occupied': False, 'limit_ms': 4000, 'detected_ms': 2999}, {'pos': 'N', 'result': 'moved', 'alarm': False}), ('sampled regression 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 fixtureActualExpectedOutcome
regression: detection one ms late{'alarm': True, 'pos': 'X', 'result': 'no-detection'}{'alarm': True, 'pos': 'X', 'result': 'no-detection'}Passed
sampled regression 6{'alarm': True, 'pos': 'X', 'result': 'no-detection'}{'alarm': True, 'pos': 'X', 'result': 'no-detection'}Passed
regression: never detected{'alarm': True, 'pos': 'X', 'result': 'no-detection'}{'alarm': True, 'pos': 'X', 'result': 'no-detection'}Passed
boundary: detection exactly at the limit{'alarm': False, 'pos': 'R', 'result': 'moved'}{'alarm': False, 'pos': 'R', 'result': 'moved'}Passed
boundary: immediate detection{'alarm': False, 'pos': 'N', 'result': 'moved'}{'alarm': False, 'pos': 'N', 'result': 'moved'}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 / fb091ed25dc5fbc6906e01209dc59208bdc019b2e59c9ae6b969b113da15a3b0

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.108514+00:00.

Case digest / d9ea6a9a227ec86f8d9089fd6212053e9de917fcf7b3b238b8925fbe5d3f287c