FAILURE MAP
← Case archive

FA-67191 / Railway interlocking logic / Open access

Signal replacement and stick control: automatic stick reset · case 01

An automatic signal stays at danger for good after the first train.

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

ROOT CAUSE

Automatic signals keep the stick because their route never re-sets.

THE FAILURE

Automatic signals keep the stick because their route never re-sets.

Unsuccessful approach: Resetting only when a train approaches keeps an automatic signal red with an empty approach.

Case contract

Each step gives [section beyond occupied, route set, approach occupied]. An auto signal behaves as permanently routed. A signal shows danger whenever the section beyond is occupied; a signal that was clear when a train occupies that section latches a stick that keeps it at danger until the route is set afresh (off then on); auto signals drop the stick every step. Otherwise it clears when routed, not stuck, and for approach-released signals only with the approach occupied. Output the state per step.

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):
    mode = x['mode']
    state = 'danger'
    stick = False
    prev_route = False
    out = []
    for occ, route, appr in x['steps']:
        if mode == 'auto':
            route = True
        if (route and not prev_route):
            stick = False
        if occ:
            if state == 'clear':
                stick = True
            state = 'danger'
        elif route and not stick and (mode != 'approach' or appr):
            state = 'clear'
        else:
            state = 'danger'
        prev_route = route
        out.append(state)
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 22', {'mode': 'auto', 'steps': [[True, False, True], [False, False, True], [False, True, False], [False, True, True], [False, False, False], [True, False, True], [False, True, True], [False, False, False], [True, False, False]]}, ['danger', 'clear', 'clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger']), ('sampled regression 11', {'mode': 'auto', 'steps': [[False, True, False], [False, False, True], [False, False, False], [True, False, True], [False, False, False], [False, False, False], [True, False, True], [False, False, True], [False, False, False]]}, ['clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear']), ('boundary: second train behind on the same route', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, True, True]]}, ['clear', 'danger', 'danger']), ('boundary: route re-set after a train', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, False, True], [False, True, True]]}, ['clear', 'danger', 'danger', 'clear']), ('control 1', {'mode': 'auto', 'steps': [[False, True, False], [False, False, True], [False, True, False], [False, False, True], [False, False, False]]}, ['clear', 'clear', 'clear', 'clear', 'clear']), ('control 4', {'mode': 'controlled', 'steps': [[False, False, False], [False, True, True], [True, True, True], [False, True, True], [False, False, False]]}, ['danger', 'clear', 'danger', 'danger', 'danger']), ('control 7', {'mode': 'approach', 'steps': [[False, False, False], [False, False, False], [False, False, True], [False, False, True], [False, True, False], [False, False, True], [False, True, True], [False, True, True], [False, True, True], [True, True, True]]}, ['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear', 'clear', 'clear', 'danger'])], [('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 60', {'mode': 'auto', 'steps': [[False, False, False], [True, True, False], [False, False, False], [False, False, False], [False, False, True]]}, ['clear', 'danger', 'clear', 'clear', 'clear']), ('boundary: approach-released signal with empty approach', {'mode': 'approach', 'steps': [[False, True, False], [False, True, True]]}, ['danger', 'clear']), ('boundary: approach-released signal replaced by train', {'mode': 'approach', 'steps': [[False, True, True], [True, True, True], [False, True, True]]}, ['clear', 'danger', 'danger']), ('boundary: occupied before clearing', {'mode': 'auto', 'steps': [[True, False, False], [True, False, False], [False, False, False]]}, ['danger', 'danger', 'clear']), ('control 12', {'mode': 'controlled', 'steps': [[False, False, True], [False, True, True], [True, False, True], [False, False, False], [False, False, True], [True, True, True], [True, False, False]]}, ['danger', 'clear', 'danger', 'danger', 'danger', 'danger', 'danger']), ('control 15', {'mode': 'approach', 'steps': [[False, True, True], [False, True, False], [False, True, True]]}, ['clear', 'danger', 'clear']), ('control 18', {'mode': 'approach', 'steps': [[False, True, False], [False, False, False], [False, False, False], [True, True, False], [False, True, False], [True, True, True], [False, True, True]]}, ['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear'])], [('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 11', {'mode': 'auto', 'steps': [[False, True, False], [False, False, True], [False, False, False], [True, False, True], [False, False, False], [False, False, False], [True, False, True], [False, False, True], [False, False, False]]}, ['clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear']), ('boundary: occupied before clearing', {'mode': 'auto', 'steps': [[True, False, False], [True, False, False], [False, False, False]]}, ['danger', 'danger', 'clear']), ('boundary: controlled signal with a standing train', {'mode': 'controlled', 'steps': [[True, True, True], [False, True, True]]}, ['danger', 'clear']), ('boundary: second train behind on the same route', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, True, True]]}, ['clear', 'danger', 'danger']), ('control 23', {'mode': 'controlled', 'steps': [[False, True, True], [False, True, False], [False, True, True], [True, True, False], [False, True, False]]}, ['clear', 'clear', 'clear', 'danger', 'danger']), ('control 26', {'mode': 'approach', 'steps': [[False, False, False], [False, True, True], [True, True, False], [True, False, True], [True, True, False], [True, False, True], [False, False, False], [False, True, True], [False, False, True], [False, True, False]]}, ['danger', 'clear', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear', 'danger', 'danger']), ('sampled regression 29', {'mode': 'auto', 'steps': [[True, False, False], [False, False, False], [True, False, False], [False, False, True], [False, False, False], [False, True, True], [False, True, True], [False, False, False], [True, False, True], [False, True, False]]}, ['danger', 'clear', 'danger', 'clear', 'clear', 'clear', 'clear', 'clear', 'danger', 'clear'])], [('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 47', {'mode': 'auto', 'steps': [[True, True, True], [False, False, True], [True, False, False], [False, False, True], [False, False, True], [True, True, False], [False, True, True], [True, True, False], [False, False, False], [False, False, False]]}, ['danger', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'danger', 'clear', 'clear']), ('sampled regression 60', {'mode': 'auto', 'steps': [[False, False, False], [True, True, False], [False, False, False], [False, False, False], [False, False, True]]}, ['clear', 'danger', 'clear', 'clear', 'clear']), ('boundary: controlled signal with a standing train', {'mode': 'controlled', 'steps': [[True, True, True], [False, True, True]]}, ['danger', 'clear']), ('boundary: second train behind on the same route', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, True, True]]}, ['clear', 'danger', 'danger']), ('control 34', {'mode': 'approach', 'steps': [[False, True, True], [False, False, False], [False, True, True], [False, False, False], [True, False, True], [False, False, True], [True, False, False], [True, False, True]]}, ['clear', 'danger', 'clear', 'danger', 'danger', 'danger', 'danger', 'danger']), ('control 37', {'mode': 'approach', 'steps': [[False, False, True], [True, False, False], [False, False, True], [False, False, True], [True, False, True], [False, False, False], [False, False, True], [False, False, True], [False, False, False]]}, ['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'danger']), ('sampled regression 40', {'mode': 'auto', 'steps': [[False, True, True], [True, True, True], [False, True, True], [False, True, False], [True, False, True], [True, False, True], [True, False, True]]}, ['clear', 'danger', 'clear', 'clear', 'danger', 'danger', 'danger'])], [('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 70', {'mode': 'auto', 'steps': [[False, False, True], [True, False, False], [False, False, True], [False, False, True], [True, False, False], [False, False, True], [False, False, False], [False, False, True]]}, ['clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear', 'clear']), ('sampled regression 11', {'mode': 'auto', 'steps': [[False, True, False], [False, False, True], [False, False, False], [True, False, True], [False, False, False], [False, False, False], [True, False, True], [False, False, True], [False, False, False]]}, ['clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear']), ('boundary: route re-set after a train', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, False, True], [False, True, True]]}, ['clear', 'danger', 'danger', 'clear']), ('boundary: approach-released signal with empty approach', {'mode': 'approach', 'steps': [[False, True, False], [False, True, True]]}, ['danger', 'clear']), ('control 45', {'mode': 'approach', 'steps': [[False, False, False], [False, False, False], [False, True, False], [False, True, False], [True, True, False], [False, True, False], [False, True, False], [False, True, True]]}, ['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear']), ('control 48', {'mode': 'approach', 'steps': [[True, True, False], [False, True, True], [False, False, False], [False, False, True], [False, True, True], [True, True, False]]}, ['danger', 'clear', 'danger', 'danger', 'clear', 'danger']), ('control 51', {'mode': 'controlled', 'steps': [[False, False, True], [False, False, False], [False, True, False], [False, True, True], [True, False, True], [False, False, True], [True, True, False]]}, ['danger', 'danger', 'clear', 'clear', 'danger', 'danger', 'danger'])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: automatic signal re-clears['clear', 'danger', 'danger']['clear', 'danger', 'clear']Failed
sampled regression 22['danger', 'clear', 'clear', 'clear', 'clear', 'danger', 'danger', 'danger', 'danger']['danger', 'clear', 'clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger']Failed
sampled regression 11['clear', 'clear', 'clear', 'danger', 'danger', 'danger', 'danger', 'danger', 'danger']['clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear']Failed
boundary: second train behind on the same route['clear', 'danger', 'danger']['clear', 'danger', 'danger']Passed
boundary: route re-set after a train['clear', 'danger', 'danger', 'clear']['clear', 'danger', 'danger', 'clear']Passed
control 1['clear', 'clear', 'clear', 'clear', 'clear']['clear', 'clear', 'clear', 'clear', 'clear']Passed
control 4['danger', 'clear', 'danger', 'danger', 'danger']['danger', 'clear', 'danger', 'danger', 'danger']Passed
control 7['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear', 'clear', 'clear', 'danger']['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear', 'clear', 'clear', 'danger']Passed

SHA-256 / f96a14fab01aa7d5d918ac7fe7e10833dce26813cd1452ac5a7a8ae76ff9db9d

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    mode = x['mode']
    state = 'danger'
    stick = False
    prev_route = False
    out = []
    for occ, route, appr in x['steps']:
        if mode == 'auto':
            route = True
        if (route and not prev_route) or (mode == 'auto' and appr):
            stick = False
        if occ:
            if state == 'clear':
                stick = True
            state = 'danger'
        elif route and not stick and (mode != 'approach' or appr):
            state = 'clear'
        else:
            state = 'danger'
        prev_route = route
        out.append(state)
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 22', {'mode': 'auto', 'steps': [[True, False, True], [False, False, True], [False, True, False], [False, True, True], [False, False, False], [True, False, True], [False, True, True], [False, False, False], [True, False, False]]}, ['danger', 'clear', 'clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger']), ('sampled regression 11', {'mode': 'auto', 'steps': [[False, True, False], [False, False, True], [False, False, False], [True, False, True], [False, False, False], [False, False, False], [True, False, True], [False, False, True], [False, False, False]]}, ['clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear']), ('boundary: second train behind on the same route', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, True, True]]}, ['clear', 'danger', 'danger']), ('boundary: route re-set after a train', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, False, True], [False, True, True]]}, ['clear', 'danger', 'danger', 'clear']), ('control 1', {'mode': 'auto', 'steps': [[False, True, False], [False, False, True], [False, True, False], [False, False, True], [False, False, False]]}, ['clear', 'clear', 'clear', 'clear', 'clear']), ('control 4', {'mode': 'controlled', 'steps': [[False, False, False], [False, True, True], [True, True, True], [False, True, True], [False, False, False]]}, ['danger', 'clear', 'danger', 'danger', 'danger']), ('control 7', {'mode': 'approach', 'steps': [[False, False, False], [False, False, False], [False, False, True], [False, False, True], [False, True, False], [False, False, True], [False, True, True], [False, True, True], [False, True, True], [True, True, True]]}, ['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear', 'clear', 'clear', 'danger'])], [('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 60', {'mode': 'auto', 'steps': [[False, False, False], [True, True, False], [False, False, False], [False, False, False], [False, False, True]]}, ['clear', 'danger', 'clear', 'clear', 'clear']), ('boundary: approach-released signal with empty approach', {'mode': 'approach', 'steps': [[False, True, False], [False, True, True]]}, ['danger', 'clear']), ('boundary: approach-released signal replaced by train', {'mode': 'approach', 'steps': [[False, True, True], [True, True, True], [False, True, True]]}, ['clear', 'danger', 'danger']), ('boundary: occupied before clearing', {'mode': 'auto', 'steps': [[True, False, False], [True, False, False], [False, False, False]]}, ['danger', 'danger', 'clear']), ('control 12', {'mode': 'controlled', 'steps': [[False, False, True], [False, True, True], [True, False, True], [False, False, False], [False, False, True], [True, True, True], [True, False, False]]}, ['danger', 'clear', 'danger', 'danger', 'danger', 'danger', 'danger']), ('control 15', {'mode': 'approach', 'steps': [[False, True, True], [False, True, False], [False, True, True]]}, ['clear', 'danger', 'clear']), ('control 18', {'mode': 'approach', 'steps': [[False, True, False], [False, False, False], [False, False, False], [True, True, False], [False, True, False], [True, True, True], [False, True, True]]}, ['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear'])], [('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 11', {'mode': 'auto', 'steps': [[False, True, False], [False, False, True], [False, False, False], [True, False, True], [False, False, False], [False, False, False], [True, False, True], [False, False, True], [False, False, False]]}, ['clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear']), ('boundary: occupied before clearing', {'mode': 'auto', 'steps': [[True, False, False], [True, False, False], [False, False, False]]}, ['danger', 'danger', 'clear']), ('boundary: controlled signal with a standing train', {'mode': 'controlled', 'steps': [[True, True, True], [False, True, True]]}, ['danger', 'clear']), ('boundary: second train behind on the same route', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, True, True]]}, ['clear', 'danger', 'danger']), ('control 23', {'mode': 'controlled', 'steps': [[False, True, True], [False, True, False], [False, True, True], [True, True, False], [False, True, False]]}, ['clear', 'clear', 'clear', 'danger', 'danger']), ('control 26', {'mode': 'approach', 'steps': [[False, False, False], [False, True, True], [True, True, False], [True, False, True], [True, True, False], [True, False, True], [False, False, False], [False, True, True], [False, False, True], [False, True, False]]}, ['danger', 'clear', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear', 'danger', 'danger']), ('sampled regression 29', {'mode': 'auto', 'steps': [[True, False, False], [False, False, False], [True, False, False], [False, False, True], [False, False, False], [False, True, True], [False, True, True], [False, False, False], [True, False, True], [False, True, False]]}, ['danger', 'clear', 'danger', 'clear', 'clear', 'clear', 'clear', 'clear', 'danger', 'clear'])], [('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 47', {'mode': 'auto', 'steps': [[True, True, True], [False, False, True], [True, False, False], [False, False, True], [False, False, True], [True, True, False], [False, True, True], [True, True, False], [False, False, False], [False, False, False]]}, ['danger', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'danger', 'clear', 'clear']), ('sampled regression 60', {'mode': 'auto', 'steps': [[False, False, False], [True, True, False], [False, False, False], [False, False, False], [False, False, True]]}, ['clear', 'danger', 'clear', 'clear', 'clear']), ('boundary: controlled signal with a standing train', {'mode': 'controlled', 'steps': [[True, True, True], [False, True, True]]}, ['danger', 'clear']), ('boundary: second train behind on the same route', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, True, True]]}, ['clear', 'danger', 'danger']), ('control 34', {'mode': 'approach', 'steps': [[False, True, True], [False, False, False], [False, True, True], [False, False, False], [True, False, True], [False, False, True], [True, False, False], [True, False, True]]}, ['clear', 'danger', 'clear', 'danger', 'danger', 'danger', 'danger', 'danger']), ('control 37', {'mode': 'approach', 'steps': [[False, False, True], [True, False, False], [False, False, True], [False, False, True], [True, False, True], [False, False, False], [False, False, True], [False, False, True], [False, False, False]]}, ['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'danger']), ('sampled regression 40', {'mode': 'auto', 'steps': [[False, True, True], [True, True, True], [False, True, True], [False, True, False], [True, False, True], [True, False, True], [True, False, True]]}, ['clear', 'danger', 'clear', 'clear', 'danger', 'danger', 'danger'])], [('regression: automatic signal re-clears', {'mode': 'auto', 'steps': [[False, False, False], [True, False, True], [False, False, False]]}, ['clear', 'danger', 'clear']), ('sampled regression 70', {'mode': 'auto', 'steps': [[False, False, True], [True, False, False], [False, False, True], [False, False, True], [True, False, False], [False, False, True], [False, False, False], [False, False, True]]}, ['clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear', 'clear']), ('sampled regression 11', {'mode': 'auto', 'steps': [[False, True, False], [False, False, True], [False, False, False], [True, False, True], [False, False, False], [False, False, False], [True, False, True], [False, False, True], [False, False, False]]}, ['clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear']), ('boundary: route re-set after a train', {'mode': 'controlled', 'steps': [[False, True, True], [True, True, True], [False, False, True], [False, True, True]]}, ['clear', 'danger', 'danger', 'clear']), ('boundary: approach-released signal with empty approach', {'mode': 'approach', 'steps': [[False, True, False], [False, True, True]]}, ['danger', 'clear']), ('control 45', {'mode': 'approach', 'steps': [[False, False, False], [False, False, False], [False, True, False], [False, True, False], [True, True, False], [False, True, False], [False, True, False], [False, True, True]]}, ['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear']), ('control 48', {'mode': 'approach', 'steps': [[True, True, False], [False, True, True], [False, False, False], [False, False, True], [False, True, True], [True, True, False]]}, ['danger', 'clear', 'danger', 'danger', 'clear', 'danger']), ('control 51', {'mode': 'controlled', 'steps': [[False, False, True], [False, False, False], [False, True, False], [False, True, True], [True, False, True], [False, False, True], [True, True, False]]}, ['danger', 'danger', 'clear', 'clear', 'danger', 'danger', 'danger'])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: automatic signal re-clears['clear', 'danger', 'danger']['clear', 'danger', 'clear']Failed
sampled regression 22['danger', 'clear', 'clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger']['danger', 'clear', 'clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger']Passed
sampled regression 11['clear', 'clear', 'clear', 'danger', 'danger', 'danger', 'danger', 'clear', 'clear']['clear', 'clear', 'clear', 'danger', 'clear', 'clear', 'danger', 'clear', 'clear']Failed
boundary: second train behind on the same route['clear', 'danger', 'danger']['clear', 'danger', 'danger']Passed
boundary: route re-set after a train['clear', 'danger', 'danger', 'clear']['clear', 'danger', 'danger', 'clear']Passed
control 1['clear', 'clear', 'clear', 'clear', 'clear']['clear', 'clear', 'clear', 'clear', 'clear']Passed
control 4['danger', 'clear', 'danger', 'danger', 'danger']['danger', 'clear', 'danger', 'danger', 'danger']Passed
control 7['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear', 'clear', 'clear', 'danger']['danger', 'danger', 'danger', 'danger', 'danger', 'danger', 'clear', 'clear', 'clear', 'danger']Passed

SHA-256 / a8752d244c321685ae582954701b14771b4d05386dd3cdc57a972c1d95355bb8

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

Case digest / 9c73d3797a1b3301f97317b5436719256651183e3ffc66197fbbaa7fa57da426