FA-66991 / Railway interlocking logic / Open access
Track circuit pick-up delay: failure sample handling · case 01
A receiver failure sample counts towards clearing the section.
ROOT CAUSE
A None sample is treated as unshunted instead of as the restrictive state.
VERIFIED REPAIR
Treat a failed sample as occupied and restart the pick-up count.
Unsuccessful approach: Rewriting the same test with an explicit None guard still treats failures as unshunted.
Case contract
Samples arrive every period_ms: True is shunted, False unshunted, None a power or receiver failure. The section starts occupied. A shunt or a failure makes it occupied immediately and restarts the pick-up count; it becomes clear once consecutive unshunted samples span at least pickup_ms (count*period_ms >= pickup_ms). Output the state after every sample.
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 = 'occ'
run = 0
out = []
for s in x['samples']:
if s:
state = 'occ'
run = 0
else:
run += 1
if state == 'occ' and run * x['period_ms'] >= x['pickup_ms']:
state = 'clr'
out.append(state)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('sampled regression 6', {'period_ms': 250, 'pickup_ms': 500, 'samples': [False, False, False, True, False, False, None]}, ['occ', 'clr', 'clr', 'occ', 'occ', 'clr', 'occ']), ('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('boundary: pick-up exactly at the delay', {'period_ms': 250, 'pickup_ms': 500, 'samples': [False, False, False]}, ['occ', 'clr', 'clr']), ('boundary: bobbing shunt while occupied', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('control 1', {'period_ms': 100, 'pickup_ms': 1000, 'samples': [False, False, False, None, False, False, True, False, True, False, None, None]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('control 4', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, False, False, True, True, False, False, True, False, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('control 7', {'period_ms': 100, 'pickup_ms': 500, 'samples': [False, False, True, False, None, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ'])], [('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('sampled regression 16', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [None, False, False, None, None, True, True, False, None, None, True, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 10', {'period_ms': 100, 'pickup_ms': 500, 'samples': [None, False, None, False, False, True, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('boundary: never clears', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False]}, ['occ', 'occ', 'occ']), ('control 12', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, True, False, False, None, None, False, True, True]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 15', {'period_ms': 250, 'pickup_ms': 750, 'samples': [False, False, True, True, None, True, None, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 18', {'period_ms': 250, 'pickup_ms': 500, 'samples': [True, None, False, False, None, False, False, False, False, False, False, False, None, False]}, ['occ', 'occ', 'occ', 'clr', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ', 'occ'])], [('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('sampled regression 33', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False, None, False, False, None, False, None, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 18', {'period_ms': 250, 'pickup_ms': 500, 'samples': [True, None, False, False, None, False, False, False, False, False, False, False, None, False]}, ['occ', 'occ', 'occ', 'clr', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ', 'occ']), ('boundary: never clears', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False]}, ['occ', 'occ', 'occ']), ('boundary: train arrives on a clear section', {'period_ms': 100, 'pickup_ms': 100, 'samples': [False, True, False]}, ['clr', 'occ', 'clr']), ('control 23', {'period_ms': 100, 'pickup_ms': 1000, 'samples': [False, False, None, None, False, True, False, True, False, False, None]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 26', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, None, False, False, True, None, None, False, False, True, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('control 29', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, True, False, False, False, True, True, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'])], [('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('sampled regression 54', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, None, False, None, False, False, None, False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 32', {'period_ms': 100, 'pickup_ms': 300, 'samples': [None, False, False, None, False, True, False, True, True, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('boundary: pick-up exactly at the delay', {'period_ms': 250, 'pickup_ms': 500, 'samples': [False, False, False]}, ['occ', 'clr', 'clr']), ('boundary: bobbing shunt while occupied', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('control 34', {'period_ms': 250, 'pickup_ms': 300, 'samples': [True, False, False, False, False, False, False, True]}, ['occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ']), ('control 37', {'period_ms': 250, 'pickup_ms': 300, 'samples': [False, True, False, False, False, False, False, False, False, False, True, False, False]}, ['occ', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ', 'occ', 'clr']), ('control 40', {'period_ms': 100, 'pickup_ms': 1000, 'samples': [False, False, None, False, False, False, False, True, None, False, False, None, True]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'])], [('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('sampled regression 62', {'period_ms': 250, 'pickup_ms': 750, 'samples': [False, True, None, False, False, False, False, False, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr']), ('sampled regression 45', {'period_ms': 250, 'pickup_ms': 500, 'samples': [True, False, False, False, True, False, None, False, False, None, True, False]}, ['occ', 'occ', 'clr', 'clr', 'occ', 'occ', 'occ', 'occ', 'clr', 'occ', 'occ', 'occ']), ('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('boundary: never clears', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False]}, ['occ', 'occ', 'occ']), ('control 48', {'period_ms': 250, 'pickup_ms': 750, 'samples': [False, False, True, True]}, ['occ', 'occ', 'occ', 'occ']), ('control 51', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, None, True, False, False, False, True, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 54', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, None, False, None, False, False, None, False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'])]]
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: receiver failure mid pick-up | ['occ', 'occ', 'clr', 'clr', 'clr', 'clr'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | Failed |
| sampled regression 6 | ['occ', 'clr', 'clr', 'occ', 'occ', 'clr', 'clr'] | ['occ', 'clr', 'clr', 'occ', 'occ', 'clr', 'occ'] | Failed |
| regression: receiver failure on a clear section | ['occ', 'clr', 'clr', 'clr'] | ['occ', 'clr', 'occ', 'occ'] | Failed |
| boundary: pick-up exactly at the delay | ['occ', 'clr', 'clr'] | ['occ', 'clr', 'clr'] | Passed |
| boundary: bobbing shunt while occupied | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | Passed |
| control 1 | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | Passed |
| control 4 | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | Passed |
| control 7 | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | Passed |
SHA-256 / a57a1ecf6773b4288477583d430f5d2c45f78c4c67d5aa6f1e315e58ba5c3010
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
state = 'occ'
run = 0
out = []
for s in x['samples']:
if s is not None and s:
state = 'occ'
run = 0
else:
run += 1
if state == 'occ' and run * x['period_ms'] >= x['pickup_ms']:
state = 'clr'
out.append(state)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('sampled regression 6', {'period_ms': 250, 'pickup_ms': 500, 'samples': [False, False, False, True, False, False, None]}, ['occ', 'clr', 'clr', 'occ', 'occ', 'clr', 'occ']), ('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('boundary: pick-up exactly at the delay', {'period_ms': 250, 'pickup_ms': 500, 'samples': [False, False, False]}, ['occ', 'clr', 'clr']), ('boundary: bobbing shunt while occupied', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('control 1', {'period_ms': 100, 'pickup_ms': 1000, 'samples': [False, False, False, None, False, False, True, False, True, False, None, None]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('control 4', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, False, False, True, True, False, False, True, False, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('control 7', {'period_ms': 100, 'pickup_ms': 500, 'samples': [False, False, True, False, None, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ'])], [('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('sampled regression 16', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [None, False, False, None, None, True, True, False, None, None, True, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 10', {'period_ms': 100, 'pickup_ms': 500, 'samples': [None, False, None, False, False, True, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('boundary: never clears', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False]}, ['occ', 'occ', 'occ']), ('control 12', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, True, False, False, None, None, False, True, True]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 15', {'period_ms': 250, 'pickup_ms': 750, 'samples': [False, False, True, True, None, True, None, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 18', {'period_ms': 250, 'pickup_ms': 500, 'samples': [True, None, False, False, None, False, False, False, False, False, False, False, None, False]}, ['occ', 'occ', 'occ', 'clr', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ', 'occ'])], [('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('sampled regression 33', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False, None, False, False, None, False, None, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 18', {'period_ms': 250, 'pickup_ms': 500, 'samples': [True, None, False, False, None, False, False, False, False, False, False, False, None, False]}, ['occ', 'occ', 'occ', 'clr', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ', 'occ']), ('boundary: never clears', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False]}, ['occ', 'occ', 'occ']), ('boundary: train arrives on a clear section', {'period_ms': 100, 'pickup_ms': 100, 'samples': [False, True, False]}, ['clr', 'occ', 'clr']), ('control 23', {'period_ms': 100, 'pickup_ms': 1000, 'samples': [False, False, None, None, False, True, False, True, False, False, None]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 26', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, None, False, False, True, None, None, False, False, True, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('control 29', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, True, False, False, False, True, True, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'])], [('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('sampled regression 54', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, None, False, None, False, False, None, False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 32', {'period_ms': 100, 'pickup_ms': 300, 'samples': [None, False, False, None, False, True, False, True, True, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('boundary: pick-up exactly at the delay', {'period_ms': 250, 'pickup_ms': 500, 'samples': [False, False, False]}, ['occ', 'clr', 'clr']), ('boundary: bobbing shunt while occupied', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('control 34', {'period_ms': 250, 'pickup_ms': 300, 'samples': [True, False, False, False, False, False, False, True]}, ['occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ']), ('control 37', {'period_ms': 250, 'pickup_ms': 300, 'samples': [False, True, False, False, False, False, False, False, False, False, True, False, False]}, ['occ', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ', 'occ', 'clr']), ('control 40', {'period_ms': 100, 'pickup_ms': 1000, 'samples': [False, False, None, False, False, False, False, True, None, False, False, None, True]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'])], [('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('sampled regression 62', {'period_ms': 250, 'pickup_ms': 750, 'samples': [False, True, None, False, False, False, False, False, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr']), ('sampled regression 45', {'period_ms': 250, 'pickup_ms': 500, 'samples': [True, False, False, False, True, False, None, False, False, None, True, False]}, ['occ', 'occ', 'clr', 'clr', 'occ', 'occ', 'occ', 'occ', 'clr', 'occ', 'occ', 'occ']), ('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('boundary: never clears', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False]}, ['occ', 'occ', 'occ']), ('control 48', {'period_ms': 250, 'pickup_ms': 750, 'samples': [False, False, True, True]}, ['occ', 'occ', 'occ', 'occ']), ('control 51', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, None, True, False, False, False, True, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 54', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, None, False, None, False, False, None, False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'])]]
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: receiver failure mid pick-up | ['occ', 'occ', 'clr', 'clr', 'clr', 'clr'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | Failed |
| sampled regression 6 | ['occ', 'clr', 'clr', 'occ', 'occ', 'clr', 'clr'] | ['occ', 'clr', 'clr', 'occ', 'occ', 'clr', 'occ'] | Failed |
| regression: receiver failure on a clear section | ['occ', 'clr', 'clr', 'clr'] | ['occ', 'clr', 'occ', 'occ'] | Failed |
| boundary: pick-up exactly at the delay | ['occ', 'clr', 'clr'] | ['occ', 'clr', 'clr'] | Passed |
| boundary: bobbing shunt while occupied | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | Passed |
| control 1 | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | Passed |
| control 4 | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | Passed |
| control 7 | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | Passed |
SHA-256 / dc062fcf143a9ea6db951c147d4a0441bc56c01ec42283725042c07c1dfbb23e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
state = 'occ'
run = 0
out = []
for s in x['samples']:
if s is None or s:
state = 'occ'
run = 0
else:
run += 1
if state == 'occ' and run * x['period_ms'] >= x['pickup_ms']:
state = 'clr'
out.append(state)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('sampled regression 6', {'period_ms': 250, 'pickup_ms': 500, 'samples': [False, False, False, True, False, False, None]}, ['occ', 'clr', 'clr', 'occ', 'occ', 'clr', 'occ']), ('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('boundary: pick-up exactly at the delay', {'period_ms': 250, 'pickup_ms': 500, 'samples': [False, False, False]}, ['occ', 'clr', 'clr']), ('boundary: bobbing shunt while occupied', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('control 1', {'period_ms': 100, 'pickup_ms': 1000, 'samples': [False, False, False, None, False, False, True, False, True, False, None, None]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('control 4', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, False, False, True, True, False, False, True, False, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('control 7', {'period_ms': 100, 'pickup_ms': 500, 'samples': [False, False, True, False, None, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ'])], [('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('sampled regression 16', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [None, False, False, None, None, True, True, False, None, None, True, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 10', {'period_ms': 100, 'pickup_ms': 500, 'samples': [None, False, None, False, False, True, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('boundary: never clears', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False]}, ['occ', 'occ', 'occ']), ('control 12', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, True, False, False, None, None, False, True, True]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 15', {'period_ms': 250, 'pickup_ms': 750, 'samples': [False, False, True, True, None, True, None, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 18', {'period_ms': 250, 'pickup_ms': 500, 'samples': [True, None, False, False, None, False, False, False, False, False, False, False, None, False]}, ['occ', 'occ', 'occ', 'clr', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ', 'occ'])], [('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('sampled regression 33', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False, None, False, False, None, False, None, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 18', {'period_ms': 250, 'pickup_ms': 500, 'samples': [True, None, False, False, None, False, False, False, False, False, False, False, None, False]}, ['occ', 'occ', 'occ', 'clr', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ', 'occ']), ('boundary: never clears', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False]}, ['occ', 'occ', 'occ']), ('boundary: train arrives on a clear section', {'period_ms': 100, 'pickup_ms': 100, 'samples': [False, True, False]}, ['clr', 'occ', 'clr']), ('control 23', {'period_ms': 100, 'pickup_ms': 1000, 'samples': [False, False, None, None, False, True, False, True, False, False, None]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 26', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, None, False, False, True, None, None, False, False, True, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('control 29', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, True, False, False, False, True, True, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'])], [('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('sampled regression 54', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, None, False, None, False, False, None, False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 32', {'period_ms': 100, 'pickup_ms': 300, 'samples': [None, False, False, None, False, True, False, True, True, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('boundary: pick-up exactly at the delay', {'period_ms': 250, 'pickup_ms': 500, 'samples': [False, False, False]}, ['occ', 'clr', 'clr']), ('boundary: bobbing shunt while occupied', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('control 34', {'period_ms': 250, 'pickup_ms': 300, 'samples': [True, False, False, False, False, False, False, True]}, ['occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ']), ('control 37', {'period_ms': 250, 'pickup_ms': 300, 'samples': [False, True, False, False, False, False, False, False, False, False, True, False, False]}, ['occ', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr', 'occ', 'occ', 'clr']), ('control 40', {'period_ms': 100, 'pickup_ms': 1000, 'samples': [False, False, None, False, False, False, False, True, None, False, False, None, True]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'])], [('regression: receiver failure mid pick-up', {'period_ms': 100, 'pickup_ms': 300, 'samples': [False, False, None, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr']), ('sampled regression 62', {'period_ms': 250, 'pickup_ms': 750, 'samples': [False, True, None, False, False, False, False, False, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'clr', 'clr', 'clr', 'clr', 'clr', 'clr']), ('sampled regression 45', {'period_ms': 250, 'pickup_ms': 500, 'samples': [True, False, False, False, True, False, None, False, False, None, True, False]}, ['occ', 'occ', 'clr', 'clr', 'occ', 'occ', 'occ', 'occ', 'clr', 'occ', 'occ', 'occ']), ('regression: receiver failure on a clear section', {'period_ms': 100, 'pickup_ms': 200, 'samples': [False, False, None, False]}, ['occ', 'clr', 'occ', 'occ']), ('boundary: never clears', {'period_ms': 250, 'pickup_ms': 1000, 'samples': [False, False, False]}, ['occ', 'occ', 'occ']), ('control 48', {'period_ms': 250, 'pickup_ms': 750, 'samples': [False, False, True, True]}, ['occ', 'occ', 'occ', 'occ']), ('control 51', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, None, True, False, False, False, True, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ']), ('sampled regression 54', {'period_ms': 100, 'pickup_ms': 750, 'samples': [False, False, None, False, None, False, False, None, False, False, True, False, False, False]}, ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'])]]
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: receiver failure mid pick-up | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | Passed |
| sampled regression 6 | ['occ', 'clr', 'clr', 'occ', 'occ', 'clr', 'occ'] | ['occ', 'clr', 'clr', 'occ', 'occ', 'clr', 'occ'] | Passed |
| regression: receiver failure on a clear section | ['occ', 'clr', 'occ', 'occ'] | ['occ', 'clr', 'occ', 'occ'] | Passed |
| boundary: pick-up exactly at the delay | ['occ', 'clr', 'clr'] | ['occ', 'clr', 'clr'] | Passed |
| boundary: bobbing shunt while occupied | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'clr'] | Passed |
| control 1 | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | Passed |
| control 4 | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | Passed |
| control 7 | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | ['occ', 'occ', 'occ', 'occ', 'occ', 'occ'] | Passed |
SHA-256 / 74486c0cb7729c8319d6a74367704d9472517cac3ac7970ea1a12dcbff592557
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.777747+00:00.
Case digest / 0c88f2e12cfa4d4f120de9110f9cace6cfbe090089f1896a8ad2b2d6cc2f58c6