FA-67051 / Railway interlocking logic / Open access
Absolute block bell-code working: tail lamp check · case 01
The block is released although the train arrived without its tail lamp.
ROOT CAUSE
An arrival without tail lamp is handled as a complete arrival after alarming.
THE FAILURE
An arrival without tail lamp is handled as a complete arrival after alarming.
Unsuccessful approach: Suppressing the alarm outside train_on_line hides a tail-missing report on an unexpected arrival.
Case contract
A block section between two boxes is normal, line_clear or train_on_line. An offer is accepted (line_clear) only from normal with the clearing point clear, otherwise alarm refused. A departure without line clear raises unauthorised-departure; any departure puts the train on line. arrive_complete returns train_on_line to normal; arrive_no_tail raises tail-missing and keeps the block occupied. cancel only withdraws line_clear. cp_blocked/cp_clear set the clearing point.
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):
state = 'normal'
cp = True
alarms = []
for ev in x['events']:
if ev == 'cp_blocked':
cp = False
elif ev == 'cp_clear':
cp = True
elif ev == 'offer':
if state == 'normal' and cp:
state = 'line_clear'
else:
alarms.append('refused')
elif ev == 'depart':
if state != 'line_clear':
alarms.append('unauthorised-departure')
state = 'train_on_line'
elif ev == 'arrive_complete':
if state == 'train_on_line':
state = 'normal'
elif ev == 'arrive_no_tail':
alarms.append('tail-missing')
state = 'normal'
elif ev == 'cancel':
if state == 'line_clear':
state = 'normal'
return {'state': state, 'alarms': alarms}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('sampled regression 2', {'events': ['offer', 'arrive_no_tail', 'depart', 'offer', 'cancel', 'cancel', 'depart', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'unauthorised-departure']}), ('sampled regression 4', {'events': ['cancel', 'arrive_no_tail', 'offer', 'offer', 'depart', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'tail-missing']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('boundary: second offer while line clear', {'events': ['offer', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('control 1', {'events': ['cp_blocked', 'depart', 'arrive_no_tail', 'cp_clear', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure']}), ('sampled regression 7', {'events': ['offer', 'arrive_no_tail', 'arrive_complete', 'cp_clear', 'cp_clear', 'arrive_no_tail']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'tail-missing']}), ('control 10', {'events': ['arrive_complete', 'cp_blocked', 'offer', 'arrive_complete', 'depart']}, {'state': 'train_on_line', 'alarms': ['refused', 'unauthorised-departure']})], [('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('sampled regression 4', {'events': ['cancel', 'arrive_no_tail', 'offer', 'offer', 'depart', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'tail-missing']}), ('sampled regression 35', {'events': ['cp_clear', 'depart', 'cancel', 'cp_blocked', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing']}), ('control 19', {'events': ['arrive_complete', 'cp_blocked', 'arrive_no_tail', 'depart', 'depart', 'offer', 'depart', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'unauthorised-departure']}), ('boundary: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('control 12', {'events': ['depart', 'cp_clear', 'arrive_complete', 'depart', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'unauthorised-departure']}), ('control 15', {'events': ['arrive_complete', 'cp_clear', 'cancel']}, {'state': 'normal', 'alarms': []}), ('control 18', {'events': ['cp_clear', 'depart', 'offer', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused']})], [('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 5', {'events': ['arrive_complete', 'cp_clear', 'offer', 'arrive_no_tail', 'cancel', 'depart', 'depart', 'arrive_complete', 'offer', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'unauthorised-departure', 'unauthorised-departure']}), ('sampled regression 64', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'cancel', 'depart', 'arrive_no_tail', 'offer', 'offer', 'offer']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'unauthorised-departure', 'tail-missing', 'refused', 'refused', 'refused']}), ('control 34', {'events': ['cp_blocked', 'arrive_no_tail', 'cancel', 'cp_clear', 'offer', 'arrive_complete', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing']}), ('boundary: cancel with train on line', {'events': ['offer', 'depart', 'cancel', 'offer']}, {'state': 'train_on_line', 'alarms': ['refused']}), ('sampled regression 23', {'events': ['depart', 'cp_blocked', 'arrive_no_tail', 'offer', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'refused']}), ('control 26', {'events': ['cp_clear', 'offer', 'cp_clear', 'cp_clear', 'cp_blocked', 'cp_clear', 'cp_blocked', 'depart']}, {'state': 'train_on_line', 'alarms': []}), ('control 29', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'arrive_complete', 'arrive_no_tail', 'cp_clear']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']})], [('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 6', {'events': ['arrive_no_tail', 'depart', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'refused']}), ('sampled regression 4', {'events': ['cancel', 'arrive_no_tail', 'offer', 'offer', 'depart', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'tail-missing']}), ('sampled regression 46', {'events': ['offer', 'offer', 'arrive_complete', 'arrive_no_tail', 'cp_clear', 'arrive_complete', 'cancel', 'arrive_no_tail', 'offer', 'arrive_no_tail']}, {'state': 'line_clear', 'alarms': ['refused', 'tail-missing', 'tail-missing', 'tail-missing']}), ('boundary: cancel of line clear', {'events': ['offer', 'cancel', 'offer']}, {'state': 'line_clear', 'alarms': []}), ('control 34', {'events': ['cp_blocked', 'arrive_no_tail', 'cancel', 'cp_clear', 'offer', 'arrive_complete', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing']}), ('control 37', {'events': ['offer', 'depart', 'cp_clear', 'cp_clear']}, {'state': 'train_on_line', 'alarms': []}), ('control 40', {'events': ['arrive_complete', 'cp_clear', 'arrive_no_tail']}, {'state': 'normal', 'alarms': ['tail-missing']})], [('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('sampled regression 7', {'events': ['offer', 'arrive_no_tail', 'arrive_complete', 'cp_clear', 'cp_clear', 'arrive_no_tail']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'tail-missing']}), ('sampled regression 35', {'events': ['cp_clear', 'depart', 'cancel', 'cp_blocked', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing']}), ('sampled regression 54', {'events': ['offer', 'arrive_no_tail', 'offer', 'depart', 'arrive_complete', 'offer', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'refused']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('control 45', {'events': ['depart', 'depart', 'depart', 'cp_blocked', 'depart', 'offer', 'arrive_complete', 'offer']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'refused']}), ('sampled regression 48', {'events': ['cp_clear', 'cp_blocked', 'arrive_no_tail', 'depart', 'offer', 'offer', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'refused', 'refused', 'tail-missing', 'refused']}), ('control 51', {'events': ['cp_clear', 'cp_blocked', 'offer']}, {'state': 'normal', 'alarms': ['refused']})]]
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: train arrives without tail lamp | {'alarms': ['tail-missing'], 'state': 'line_clear'} | {'alarms': ['tail-missing', 'refused'], 'state': 'train_on_line'} | Failed |
| sampled regression 2 | {'alarms': ['tail-missing', 'unauthorised-departure', 'refused', 'unauthorised-departure'], 'state': 'train_on_line'} | {'alarms': ['tail-missing', 'refused', 'unauthorised-departure'], 'state': 'train_on_line'} | Failed |
| sampled regression 4 | {'alarms': ['tail-missing', 'refused', 'tail-missing'], 'state': 'normal'} | {'alarms': ['tail-missing', 'refused', 'tail-missing'], 'state': 'train_on_line'} | Failed |
| boundary: offer with clearing point fouled | {'alarms': ['refused'], 'state': 'line_clear'} | {'alarms': ['refused'], 'state': 'line_clear'} | Passed |
| boundary: second offer while line clear | {'alarms': ['refused'], 'state': 'line_clear'} | {'alarms': ['refused'], 'state': 'line_clear'} | Passed |
| control 1 | {'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure'], 'state': 'train_on_line'} | {'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure'], 'state': 'train_on_line'} | Passed |
| sampled regression 7 | {'alarms': ['tail-missing', 'tail-missing'], 'state': 'normal'} | {'alarms': ['tail-missing', 'tail-missing'], 'state': 'line_clear'} | Failed |
| control 10 | {'alarms': ['refused', 'unauthorised-departure'], 'state': 'train_on_line'} | {'alarms': ['refused', 'unauthorised-departure'], 'state': 'train_on_line'} | Passed |
SHA-256 / 39f5ae7825aa0b010f08b60d574ab98aa70cae710bea012a7761f4dc7b4f32b9
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
state = 'normal'
cp = True
alarms = []
for ev in x['events']:
if ev == 'cp_blocked':
cp = False
elif ev == 'cp_clear':
cp = True
elif ev == 'offer':
if state == 'normal' and cp:
state = 'line_clear'
else:
alarms.append('refused')
elif ev == 'depart':
if state != 'line_clear':
alarms.append('unauthorised-departure')
state = 'train_on_line'
elif ev == 'arrive_complete':
if state == 'train_on_line':
state = 'normal'
elif ev == 'arrive_no_tail':
if state == 'train_on_line':
alarms.append('tail-missing')
elif ev == 'cancel':
if state == 'line_clear':
state = 'normal'
return {'state': state, 'alarms': alarms}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('sampled regression 2', {'events': ['offer', 'arrive_no_tail', 'depart', 'offer', 'cancel', 'cancel', 'depart', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'unauthorised-departure']}), ('sampled regression 4', {'events': ['cancel', 'arrive_no_tail', 'offer', 'offer', 'depart', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'tail-missing']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('boundary: second offer while line clear', {'events': ['offer', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('control 1', {'events': ['cp_blocked', 'depart', 'arrive_no_tail', 'cp_clear', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure']}), ('sampled regression 7', {'events': ['offer', 'arrive_no_tail', 'arrive_complete', 'cp_clear', 'cp_clear', 'arrive_no_tail']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'tail-missing']}), ('control 10', {'events': ['arrive_complete', 'cp_blocked', 'offer', 'arrive_complete', 'depart']}, {'state': 'train_on_line', 'alarms': ['refused', 'unauthorised-departure']})], [('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('sampled regression 4', {'events': ['cancel', 'arrive_no_tail', 'offer', 'offer', 'depart', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'tail-missing']}), ('sampled regression 35', {'events': ['cp_clear', 'depart', 'cancel', 'cp_blocked', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing']}), ('control 19', {'events': ['arrive_complete', 'cp_blocked', 'arrive_no_tail', 'depart', 'depart', 'offer', 'depart', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'unauthorised-departure']}), ('boundary: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('control 12', {'events': ['depart', 'cp_clear', 'arrive_complete', 'depart', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'unauthorised-departure']}), ('control 15', {'events': ['arrive_complete', 'cp_clear', 'cancel']}, {'state': 'normal', 'alarms': []}), ('control 18', {'events': ['cp_clear', 'depart', 'offer', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused']})], [('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 5', {'events': ['arrive_complete', 'cp_clear', 'offer', 'arrive_no_tail', 'cancel', 'depart', 'depart', 'arrive_complete', 'offer', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'unauthorised-departure', 'unauthorised-departure']}), ('sampled regression 64', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'cancel', 'depart', 'arrive_no_tail', 'offer', 'offer', 'offer']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'unauthorised-departure', 'tail-missing', 'refused', 'refused', 'refused']}), ('control 34', {'events': ['cp_blocked', 'arrive_no_tail', 'cancel', 'cp_clear', 'offer', 'arrive_complete', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing']}), ('boundary: cancel with train on line', {'events': ['offer', 'depart', 'cancel', 'offer']}, {'state': 'train_on_line', 'alarms': ['refused']}), ('sampled regression 23', {'events': ['depart', 'cp_blocked', 'arrive_no_tail', 'offer', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'refused']}), ('control 26', {'events': ['cp_clear', 'offer', 'cp_clear', 'cp_clear', 'cp_blocked', 'cp_clear', 'cp_blocked', 'depart']}, {'state': 'train_on_line', 'alarms': []}), ('control 29', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'arrive_complete', 'arrive_no_tail', 'cp_clear']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']})], [('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 6', {'events': ['arrive_no_tail', 'depart', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'refused']}), ('sampled regression 4', {'events': ['cancel', 'arrive_no_tail', 'offer', 'offer', 'depart', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'tail-missing']}), ('sampled regression 46', {'events': ['offer', 'offer', 'arrive_complete', 'arrive_no_tail', 'cp_clear', 'arrive_complete', 'cancel', 'arrive_no_tail', 'offer', 'arrive_no_tail']}, {'state': 'line_clear', 'alarms': ['refused', 'tail-missing', 'tail-missing', 'tail-missing']}), ('boundary: cancel of line clear', {'events': ['offer', 'cancel', 'offer']}, {'state': 'line_clear', 'alarms': []}), ('control 34', {'events': ['cp_blocked', 'arrive_no_tail', 'cancel', 'cp_clear', 'offer', 'arrive_complete', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing']}), ('control 37', {'events': ['offer', 'depart', 'cp_clear', 'cp_clear']}, {'state': 'train_on_line', 'alarms': []}), ('control 40', {'events': ['arrive_complete', 'cp_clear', 'arrive_no_tail']}, {'state': 'normal', 'alarms': ['tail-missing']})], [('regression: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('sampled regression 7', {'events': ['offer', 'arrive_no_tail', 'arrive_complete', 'cp_clear', 'cp_clear', 'arrive_no_tail']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'tail-missing']}), ('sampled regression 35', {'events': ['cp_clear', 'depart', 'cancel', 'cp_blocked', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing']}), ('sampled regression 54', {'events': ['offer', 'arrive_no_tail', 'offer', 'depart', 'arrive_complete', 'offer', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'refused']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('control 45', {'events': ['depart', 'depart', 'depart', 'cp_blocked', 'depart', 'offer', 'arrive_complete', 'offer']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'refused']}), ('sampled regression 48', {'events': ['cp_clear', 'cp_blocked', 'arrive_no_tail', 'depart', 'offer', 'offer', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'refused', 'refused', 'tail-missing', 'refused']}), ('control 51', {'events': ['cp_clear', 'cp_blocked', 'offer']}, {'state': 'normal', 'alarms': ['refused']})]]
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: train arrives without tail lamp | {'alarms': ['tail-missing', 'refused'], 'state': 'train_on_line'} | {'alarms': ['tail-missing', 'refused'], 'state': 'train_on_line'} | Passed |
| sampled regression 2 | {'alarms': ['refused', 'unauthorised-departure'], 'state': 'train_on_line'} | {'alarms': ['tail-missing', 'refused', 'unauthorised-departure'], 'state': 'train_on_line'} | Failed |
| sampled regression 4 | {'alarms': ['refused', 'tail-missing'], 'state': 'train_on_line'} | {'alarms': ['tail-missing', 'refused', 'tail-missing'], 'state': 'train_on_line'} | Failed |
| boundary: offer with clearing point fouled | {'alarms': ['refused'], 'state': 'line_clear'} | {'alarms': ['refused'], 'state': 'line_clear'} | Passed |
| boundary: second offer while line clear | {'alarms': ['refused'], 'state': 'line_clear'} | {'alarms': ['refused'], 'state': 'line_clear'} | Passed |
| control 1 | {'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure'], 'state': 'train_on_line'} | {'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure'], 'state': 'train_on_line'} | Passed |
| sampled regression 7 | {'alarms': [], 'state': 'line_clear'} | {'alarms': ['tail-missing', 'tail-missing'], 'state': 'line_clear'} | Failed |
| control 10 | {'alarms': ['refused', 'unauthorised-departure'], 'state': 'train_on_line'} | {'alarms': ['refused', 'unauthorised-departure'], 'state': 'train_on_line'} | Passed |
SHA-256 / 4e87bf5bf14f8b3f94a932d4c765e436ac8aa933ec5337f34375334a39e0eb7a
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.358152+00:00.
Case digest / e35a134c3430159048b8a9fca607f2bf767216647a97702f852e6f492b6d813c