FA-67151 / Railway interlocking logic / Open access
Signal lamp proving and aspect degradation: auxiliary filament fallback · case 01
A signal degrades although its auxiliary filament is working.
ROOT CAUSE
Only the main filament counts as lit.
VERIFIED REPAIR
Treat a lamp as lit when either filament works.
Unsuccessful approach: Refusing the auxiliary filament on the red lamp turns a working red into a dark signal.
Case contract
Aspects need lamps: G needs G; YY needs Y1 and Y2; Y needs Y1; R needs R. A lamp is lit if its main or auxiliary filament works. If the requested aspect cannot be lit, show the next more restrictive aspect that can (G, YY, Y, R); if even R cannot be lit the signal is DARK. alarm is raised if the signal is DARK or any lamp used by the shown aspect runs on its auxiliary filament. degraded means shown != requested.
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):
lamps = x['lamps']
need = {'G': ['G'], 'YY': ['Y1', 'Y2'], 'Y': ['Y1'], 'R': ['R']}
order = ['G', 'YY', 'Y', 'R']
def lit(l):
return lamps[l]['main']
shown = 'DARK'
for asp in order[order.index(x['requested']):]:
if all(lit(l) for l in need[asp]):
shown = asp
break
alarm = shown == 'DARK' or any(not lamps[l]['main'] for l in need[shown])
return {'shown': shown, 'alarm': alarm, 'degraded': shown != x['requested']}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: green on auxiliary filament', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'G', 'alarm': True, 'degraded': False}), ('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 2', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 34', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('boundary: green lamp dead', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'YY', 'alarm': False, 'degraded': True}), ('control 1', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 4', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 7', {'requested': 'R', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': False})], [('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 30', {'requested': 'YY', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('boundary: green lamp dead', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'YY', 'alarm': False, 'degraded': True}), ('boundary: lower yellow dead under double yellow', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': True}), ('boundary: upper yellow dead under double yellow', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': True}), ('control 12', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': False, 'aux': True}}}, {'shown': 'YY', 'alarm': False, 'degraded': False}), ('sampled regression 15', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 18', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'Y', 'alarm': True, 'degraded': False})], [('regression: second yellow on auxiliary', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 62', {'requested': 'Y', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': False}}}, {'shown': 'R', 'alarm': True, 'degraded': True}), ('sampled regression 69', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('boundary: upper yellow dead under double yellow', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': True}), ('control 23', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': False}), ('control 26', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': False}), ('control 29', {'requested': 'R', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': False})], [('regression: green on auxiliary filament', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'G', 'alarm': True, 'degraded': False}), ('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('regression: second yellow on auxiliary', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 62', {'requested': 'Y', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': False}}}, {'shown': 'R', 'alarm': True, 'degraded': True}), ('boundary: unused lamp on auxiliary', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': False}), ('sampled regression 34', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('control 37', {'requested': 'R', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': False}), ('control 40', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'YY', 'alarm': False, 'degraded': False})], [('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 25', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 53', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('boundary: all yellows dead', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': False, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': True}), ('regression: green on auxiliary filament', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'G', 'alarm': True, 'degraded': False}), ('control 45', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': False}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 48', {'requested': 'G', 'lamps': {'R': {'main': False, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 51', {'requested': 'YY', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': False, 'degraded': 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: green on auxiliary filament | {'alarm': False, 'degraded': True, 'shown': 'YY'} | {'alarm': True, 'degraded': False, 'shown': 'G'} | Failed |
| regression: red on auxiliary filament | {'alarm': True, 'degraded': True, 'shown': 'DARK'} | {'alarm': True, 'degraded': False, 'shown': 'R'} | Failed |
| sampled regression 2 | {'alarm': False, 'degraded': True, 'shown': 'R'} | {'alarm': True, 'degraded': False, 'shown': 'YY'} | Failed |
| sampled regression 34 | {'alarm': True, 'degraded': True, 'shown': 'DARK'} | {'alarm': True, 'degraded': False, 'shown': 'R'} | Failed |
| boundary: green lamp dead | {'alarm': False, 'degraded': True, 'shown': 'YY'} | {'alarm': False, 'degraded': True, 'shown': 'YY'} | Passed |
| control 1 | {'alarm': False, 'degraded': False, 'shown': 'G'} | {'alarm': False, 'degraded': False, 'shown': 'G'} | Passed |
| control 4 | {'alarm': False, 'degraded': False, 'shown': 'G'} | {'alarm': False, 'degraded': False, 'shown': 'G'} | Passed |
| control 7 | {'alarm': False, 'degraded': False, 'shown': 'R'} | {'alarm': False, 'degraded': False, 'shown': 'R'} | Passed |
SHA-256 / 738561751ea70e7ccb38e088fceefea4f3aad381f6a066ed80c1f27db6dcdc95
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
lamps = x['lamps']
need = {'G': ['G'], 'YY': ['Y1', 'Y2'], 'Y': ['Y1'], 'R': ['R']}
order = ['G', 'YY', 'Y', 'R']
def lit(l):
return lamps[l]['main'] or (lamps[l]['aux'] and l != 'R')
shown = 'DARK'
for asp in order[order.index(x['requested']):]:
if all(lit(l) for l in need[asp]):
shown = asp
break
alarm = shown == 'DARK' or any(not lamps[l]['main'] for l in need[shown])
return {'shown': shown, 'alarm': alarm, 'degraded': shown != x['requested']}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: green on auxiliary filament', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'G', 'alarm': True, 'degraded': False}), ('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 2', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 34', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('boundary: green lamp dead', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'YY', 'alarm': False, 'degraded': True}), ('control 1', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 4', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 7', {'requested': 'R', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': False})], [('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 30', {'requested': 'YY', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('boundary: green lamp dead', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'YY', 'alarm': False, 'degraded': True}), ('boundary: lower yellow dead under double yellow', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': True}), ('boundary: upper yellow dead under double yellow', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': True}), ('control 12', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': False, 'aux': True}}}, {'shown': 'YY', 'alarm': False, 'degraded': False}), ('sampled regression 15', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 18', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'Y', 'alarm': True, 'degraded': False})], [('regression: second yellow on auxiliary', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 62', {'requested': 'Y', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': False}}}, {'shown': 'R', 'alarm': True, 'degraded': True}), ('sampled regression 69', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('boundary: upper yellow dead under double yellow', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': True}), ('control 23', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': False}), ('control 26', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': False}), ('control 29', {'requested': 'R', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': False})], [('regression: green on auxiliary filament', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'G', 'alarm': True, 'degraded': False}), ('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('regression: second yellow on auxiliary', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 62', {'requested': 'Y', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': False}}}, {'shown': 'R', 'alarm': True, 'degraded': True}), ('boundary: unused lamp on auxiliary', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': False}), ('sampled regression 34', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('control 37', {'requested': 'R', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': False}), ('control 40', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'YY', 'alarm': False, 'degraded': False})], [('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 25', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 53', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('boundary: all yellows dead', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': False, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': True}), ('regression: green on auxiliary filament', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'G', 'alarm': True, 'degraded': False}), ('control 45', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': False}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 48', {'requested': 'G', 'lamps': {'R': {'main': False, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 51', {'requested': 'YY', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': False, 'degraded': 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: green on auxiliary filament | {'alarm': True, 'degraded': False, 'shown': 'G'} | {'alarm': True, 'degraded': False, 'shown': 'G'} | Passed |
| regression: red on auxiliary filament | {'alarm': True, 'degraded': True, 'shown': 'DARK'} | {'alarm': True, 'degraded': False, 'shown': 'R'} | Failed |
| sampled regression 2 | {'alarm': True, 'degraded': False, 'shown': 'YY'} | {'alarm': True, 'degraded': False, 'shown': 'YY'} | Passed |
| sampled regression 34 | {'alarm': True, 'degraded': True, 'shown': 'DARK'} | {'alarm': True, 'degraded': False, 'shown': 'R'} | Failed |
| boundary: green lamp dead | {'alarm': False, 'degraded': True, 'shown': 'YY'} | {'alarm': False, 'degraded': True, 'shown': 'YY'} | Passed |
| control 1 | {'alarm': False, 'degraded': False, 'shown': 'G'} | {'alarm': False, 'degraded': False, 'shown': 'G'} | Passed |
| control 4 | {'alarm': False, 'degraded': False, 'shown': 'G'} | {'alarm': False, 'degraded': False, 'shown': 'G'} | Passed |
| control 7 | {'alarm': False, 'degraded': False, 'shown': 'R'} | {'alarm': False, 'degraded': False, 'shown': 'R'} | Passed |
SHA-256 / 8a24941e0b8779ab090e3b88ea31937c724b84758b9179d079fb9c68bbbef673
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
lamps = x['lamps']
need = {'G': ['G'], 'YY': ['Y1', 'Y2'], 'Y': ['Y1'], 'R': ['R']}
order = ['G', 'YY', 'Y', 'R']
def lit(l):
return lamps[l]['main'] or lamps[l]['aux']
shown = 'DARK'
for asp in order[order.index(x['requested']):]:
if all(lit(l) for l in need[asp]):
shown = asp
break
alarm = shown == 'DARK' or any(not lamps[l]['main'] for l in need[shown])
return {'shown': shown, 'alarm': alarm, 'degraded': shown != x['requested']}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: green on auxiliary filament', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'G', 'alarm': True, 'degraded': False}), ('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 2', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 34', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('boundary: green lamp dead', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'YY', 'alarm': False, 'degraded': True}), ('control 1', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 4', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 7', {'requested': 'R', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': False})], [('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 30', {'requested': 'YY', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('boundary: green lamp dead', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'YY', 'alarm': False, 'degraded': True}), ('boundary: lower yellow dead under double yellow', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': True}), ('boundary: upper yellow dead under double yellow', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': True}), ('control 12', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': False, 'aux': True}}}, {'shown': 'YY', 'alarm': False, 'degraded': False}), ('sampled regression 15', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 18', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'Y', 'alarm': True, 'degraded': False})], [('regression: second yellow on auxiliary', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 62', {'requested': 'Y', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': False}}}, {'shown': 'R', 'alarm': True, 'degraded': True}), ('sampled regression 69', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('boundary: upper yellow dead under double yellow', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': True}), ('control 23', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': False}), ('control 26', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': False}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': False}), ('control 29', {'requested': 'R', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': False})], [('regression: green on auxiliary filament', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'G', 'alarm': True, 'degraded': False}), ('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('regression: second yellow on auxiliary', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 62', {'requested': 'Y', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': False}}}, {'shown': 'R', 'alarm': True, 'degraded': True}), ('boundary: unused lamp on auxiliary', {'requested': 'Y', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'Y', 'alarm': False, 'degraded': False}), ('sampled regression 34', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('control 37', {'requested': 'R', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': False}), ('control 40', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'YY', 'alarm': False, 'degraded': False})], [('regression: red on auxiliary filament', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('sampled regression 25', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': True, 'degraded': False}), ('sampled regression 53', {'requested': 'R', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': False}}}, {'shown': 'R', 'alarm': True, 'degraded': False}), ('boundary: all yellows dead', {'requested': 'YY', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': False, 'aux': False}, 'Y2': {'main': False, 'aux': False}, 'G': {'main': True, 'aux': True}}}, {'shown': 'R', 'alarm': False, 'degraded': True}), ('regression: green on auxiliary filament', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': False, 'aux': True}}}, {'shown': 'G', 'alarm': True, 'degraded': False}), ('control 45', {'requested': 'G', 'lamps': {'R': {'main': True, 'aux': True}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': True, 'aux': False}, 'G': {'main': True, 'aux': False}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 48', {'requested': 'G', 'lamps': {'R': {'main': False, 'aux': False}, 'Y1': {'main': True, 'aux': True}, 'Y2': {'main': False, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'G', 'alarm': False, 'degraded': False}), ('control 51', {'requested': 'YY', 'lamps': {'R': {'main': False, 'aux': True}, 'Y1': {'main': True, 'aux': False}, 'Y2': {'main': True, 'aux': True}, 'G': {'main': True, 'aux': True}}}, {'shown': 'YY', 'alarm': False, 'degraded': 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: green on auxiliary filament | {'alarm': True, 'degraded': False, 'shown': 'G'} | {'alarm': True, 'degraded': False, 'shown': 'G'} | Passed |
| regression: red on auxiliary filament | {'alarm': True, 'degraded': False, 'shown': 'R'} | {'alarm': True, 'degraded': False, 'shown': 'R'} | Passed |
| sampled regression 2 | {'alarm': True, 'degraded': False, 'shown': 'YY'} | {'alarm': True, 'degraded': False, 'shown': 'YY'} | Passed |
| sampled regression 34 | {'alarm': True, 'degraded': False, 'shown': 'R'} | {'alarm': True, 'degraded': False, 'shown': 'R'} | Passed |
| boundary: green lamp dead | {'alarm': False, 'degraded': True, 'shown': 'YY'} | {'alarm': False, 'degraded': True, 'shown': 'YY'} | Passed |
| control 1 | {'alarm': False, 'degraded': False, 'shown': 'G'} | {'alarm': False, 'degraded': False, 'shown': 'G'} | Passed |
| control 4 | {'alarm': False, 'degraded': False, 'shown': 'G'} | {'alarm': False, 'degraded': False, 'shown': 'G'} | Passed |
| control 7 | {'alarm': False, 'degraded': False, 'shown': 'R'} | {'alarm': False, 'degraded': False, 'shown': 'R'} | Passed |
SHA-256 / a07be18898f3d767389f4ad5b8e54b91ec82d7c49584202c7e4e3f619b0b3bc9
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:50.083760+00:00.
Case digest / 84170ae59cb06478f9821d61eff5c05f245ed3b69df587b40d0eb50c4f89c22a