FAILURE MAP
← Case archive

FA-67111 / Railway interlocking logic / Open access

Two-out-of-three occupancy voting: minimum healthy channels · case 01

A single surviving channel is trusted to declare the section clear.

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

ROOT CAUSE

Voting proceeds with only one healthy channel.

VERIFIED REPAIR

Force occupied when fewer than two channels are healthy.

Unsuccessful approach: Forcing occupied with two healthy channels ignores two agreeing clear reports.

Case contract

Three channels report occupancy (True/False) or None when failed. A channel isolated earlier counts as None. With fewer than two healthy channels the vote is occupied. Otherwise the vote is occupied when occupied reports are at least as many as clear ones (ties are occupied). A healthy channel that disagrees with the vote increments its discrepancy count, otherwise (agreeing or None) the count resets; a channel is isolated for good when its count reaches isolate_after. Return all votes and isolated channel indices.

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):
    k = x['isolate_after']
    bad = [0, 0, 0]
    iso = [False, False, False]
    votes = []
    for cyc in x['cycles']:
        vals = [None if iso[i] else cyc[i] for i in range(3)]
        healthy = [v for v in vals if v is not None]
        if len(healthy) < 1:
            vote = True
        else:
            t = sum(1 for v in healthy if v)
            f = len(healthy) - t
            vote = t >= f
        votes.append(vote)
        for i in range(3):
            if vals[i] is not None and vals[i] != vote:
                bad[i] += 1
                if bad[i] >= k:
                    iso[i] = True
            else:
                bad[i] = 0
    return {'votes': votes, 'isolated': [i for i in range(3) if iso[i]]}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('sampled regression 9', {'isolate_after': 3, 'cycles': [[None, False, False], [None, True, False], [False, None, None], [False, False, True], [True, None, False], [True, True, True], [None, False, None], [False, False, False], [True, None, False]]}, {'votes': [False, True, True, False, True, True, True, False, True], 'isolated': []}), ('boundary: persistent dissenter', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, False, False]]}, {'votes': [False, False, False], 'isolated': [0]}), ('boundary: two healthy channels disagree', {'isolate_after': 3, 'cycles': [[True, False, None]]}, {'votes': [True], 'isolated': []}), ('control 1', {'isolate_after': 2, 'cycles': [[False, False, False], [True, None, True], [True, True, True], [None, False, False]]}, {'votes': [False, True, True, False], 'isolated': []}), ('control 4', {'isolate_after': 2, 'cycles': [[False, True, True], [False, False, False], [False, False, False], [True, True, False], [True, True, True], [True, False, True], [False, False, False], [False, False, None], [True, True, True]]}, {'votes': [True, False, False, True, True, True, False, False, True], 'isolated': []}), ('control 7', {'isolate_after': 3, 'cycles': [[False, False, True], [False, False, False], [True, True, True], [False, True, True], [True, True, None], [False, False, False], [True, True, True], [False, False, False]]}, {'votes': [False, False, True, True, True, False, True, False], 'isolated': []})], [('regression: two dissenters in turn', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, True, False], [False, True, False], [False, False, False]]}, {'votes': [False, False, True, True, True], 'isolated': [0, 2]}), ('boundary: persistent dissenter', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, False, False]]}, {'votes': [False, False, False], 'isolated': [0]}), ('control 4', {'isolate_after': 2, 'cycles': [[False, True, True], [False, False, False], [False, False, False], [True, True, False], [True, True, True], [True, False, True], [False, False, False], [False, False, None], [True, True, True]]}, {'votes': [True, False, False, True, True, True, False, False, True], 'isolated': []}), ('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: dissent interrupted by failure', {'isolate_after': 2, 'cycles': [[True, False, False], [None, False, False], [True, False, False]]}, {'votes': [False, False, False], 'isolated': []}), ('control 12', {'isolate_after': 3, 'cycles': [[False, False, False], [False, True, False], [True, False, True], [True, False, True], [False, False, True], [False, False, False], [True, False, True], [True, True, True]]}, {'votes': [False, False, True, True, True, False, True, True], 'isolated': [1]}), ('control 15', {'isolate_after': 3, 'cycles': [[False, False, False], [False, None, False], [True, False, False], [True, None, False]]}, {'votes': [False, False, False, True], 'isolated': []}), ('control 18', {'isolate_after': 2, 'cycles': [[False, False, False], [None, False, True], [False, False, True], [True, False, False], [True, False, True], [False, False, False], [False, True, None], [False, False, False], [False, False, False]]}, {'votes': [False, True, False, False, True, False, True, False, False], 'isolated': []})], [('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: dissent interrupted by failure', {'isolate_after': 2, 'cycles': [[True, False, False], [None, False, False], [True, False, False]]}, {'votes': [False, False, False], 'isolated': []}), ('sampled regression 66', {'isolate_after': 3, 'cycles': [[False, False, False], [False, False, None], [False, None, None], [True, False, None], [None, False, False], [False, False, False], [False, True, False], [False, False, True], [True, True, False]]}, {'votes': [False, False, True, True, False, False, False, False, True], 'isolated': []}), ('control 13', {'isolate_after': 3, 'cycles': [[False, False, False], [True, None, True], [True, True, True], [False, None, False], [False, False, True]]}, {'votes': [False, True, True, False, False], 'isolated': []}), ('regression: two dissenters in turn', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, True, False], [False, True, False], [False, False, False]]}, {'votes': [False, False, True, True, True], 'isolated': [0, 2]}), ('control 23', {'isolate_after': 2, 'cycles': [[True, False, True], [None, False, False], [False, False, False], [False, False, False], [False, False, None], [False, False, False], [True, None, True]]}, {'votes': [True, False, False, False, False, False, True], 'isolated': []}), ('control 26', {'isolate_after': 2, 'cycles': [[True, True, True], [False, False, False], [False, False, True], [False, False, None]]}, {'votes': [True, False, False, False], 'isolated': []}), ('control 29', {'isolate_after': 2, 'cycles': [[False, False, True], [False, False, False], [False, False, True], [False, True, False], [False, True, True]]}, {'votes': [False, False, False, False, True], 'isolated': []})], [('regression: two dissenters in turn', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, True, False], [False, True, False], [False, False, False]]}, {'votes': [False, False, True, True, True], 'isolated': [0, 2]}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('sampled regression 40', {'isolate_after': 2, 'cycles': [[True, None, True], [False, False, None], [False, True, False], [False, True, False], [True, True, True], [True, None, False], [None, False, False], [True, True, True]]}, {'votes': [True, False, False, False, True, True, True, True], 'isolated': [1, 2]}), ('control 21', {'isolate_after': 3, 'cycles': [[True, True, True], [False, True, False], [True, True, True], [True, True, False], [None, False, False], [False, False, False], [False, False, False]]}, {'votes': [True, False, True, True, False, False, False], 'isolated': []}), ('boundary: isolated channel keeps reporting', {'isolate_after': 1, 'cycles': [[True, False, False], [True, True, False]]}, {'votes': [False, True], 'isolated': [0, 2]}), ('control 34', {'isolate_after': 2, 'cycles': [[True, True, False], [False, True, False], [True, True, True], [True, True, True], [True, False, True], [False, False, False], [True, False, True]]}, {'votes': [True, False, True, True, True, False, True], 'isolated': []}), ('control 37', {'isolate_after': 3, 'cycles': [[True, True, True], [False, False, False], [False, False, False], [False, True, False], [True, False, False], [False, False, False]]}, {'votes': [True, False, False, False, False, False], 'isolated': []}), ('control 43', {'isolate_after': 3, 'cycles': [[True, False, True], [True, None, False], [False, True, False], [False, False, False], [True, False, False]]}, {'votes': [True, True, False, False, False], 'isolated': []})], [('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: persistent dissenter', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, False, False]]}, {'votes': [False, False, False], 'isolated': [0]}), ('sampled regression 19', {'isolate_after': 2, 'cycles': [[True, True, True], [True, False, None], [True, False, True], [None, False, False], [True, True, None], [True, False, False], [False, False, True], [True, True, True]]}, {'votes': [True, True, True, True, True, True, True, True], 'isolated': [1]}), ('control 32', {'isolate_after': 3, 'cycles': [[False, True, True], [False, False, False], [False, False, None], [True, True, None], [False, False, False], [True, True, False], [True, None, True]]}, {'votes': [True, False, False, True, False, True, True], 'isolated': []}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('control 45', {'isolate_after': 2, 'cycles': [[True, True, True], [False, False, False], [False, False, False], [False, True, False], [None, True, False], [None, True, False], [True, False, False]]}, {'votes': [True, False, False, False, True, True, True], 'isolated': [2]}), ('control 48', {'isolate_after': 2, 'cycles': [[False, False, False], [False, False, False], [False, True, True], [True, True, None], [False, True, False], [True, True, True], [False, False, False], [False, False, False], [False, True, False]]}, {'votes': [False, False, True, True, False, True, False, False, False], 'isolated': []}), ('control 51', {'isolate_after': 3, 'cycles': [[False, False, False], [True, False, False], [True, True, True], [True, True, True], [True, True, True], [True, True, True], [True, False, True], [True, False, False], [True, True, True]]}, {'votes': [False, False, True, True, True, True, True, False, True], 'isolated': []})]]
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: single healthy channel says clear{'isolated': [], 'votes': [False]}{'isolated': [], 'votes': [True]}Failed
boundary: two healthy channels agree clear{'isolated': [], 'votes': [False]}{'isolated': [], 'votes': [False]}Passed
sampled regression 9{'isolated': [], 'votes': [False, True, False, False, True, True, False, False, True]}{'isolated': [], 'votes': [False, True, True, False, True, True, True, False, True]}Failed
boundary: persistent dissenter{'isolated': [0], 'votes': [False, False, False]}{'isolated': [0], 'votes': [False, False, False]}Passed
boundary: two healthy channels disagree{'isolated': [], 'votes': [True]}{'isolated': [], 'votes': [True]}Passed
control 1{'isolated': [], 'votes': [False, True, True, False]}{'isolated': [], 'votes': [False, True, True, False]}Passed
control 4{'isolated': [], 'votes': [True, False, False, True, True, True, False, False, True]}{'isolated': [], 'votes': [True, False, False, True, True, True, False, False, True]}Passed
control 7{'isolated': [], 'votes': [False, False, True, True, True, False, True, False]}{'isolated': [], 'votes': [False, False, True, True, True, False, True, False]}Passed

SHA-256 / a6a14be2f5031d678fef18227407f0315cb30e6092d00eaf6cf78e73e127d687

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    k = x['isolate_after']
    bad = [0, 0, 0]
    iso = [False, False, False]
    votes = []
    for cyc in x['cycles']:
        vals = [None if iso[i] else cyc[i] for i in range(3)]
        healthy = [v for v in vals if v is not None]
        if len(healthy) <= 2:
            vote = True
        else:
            t = sum(1 for v in healthy if v)
            f = len(healthy) - t
            vote = t >= f
        votes.append(vote)
        for i in range(3):
            if vals[i] is not None and vals[i] != vote:
                bad[i] += 1
                if bad[i] >= k:
                    iso[i] = True
            else:
                bad[i] = 0
    return {'votes': votes, 'isolated': [i for i in range(3) if iso[i]]}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('sampled regression 9', {'isolate_after': 3, 'cycles': [[None, False, False], [None, True, False], [False, None, None], [False, False, True], [True, None, False], [True, True, True], [None, False, None], [False, False, False], [True, None, False]]}, {'votes': [False, True, True, False, True, True, True, False, True], 'isolated': []}), ('boundary: persistent dissenter', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, False, False]]}, {'votes': [False, False, False], 'isolated': [0]}), ('boundary: two healthy channels disagree', {'isolate_after': 3, 'cycles': [[True, False, None]]}, {'votes': [True], 'isolated': []}), ('control 1', {'isolate_after': 2, 'cycles': [[False, False, False], [True, None, True], [True, True, True], [None, False, False]]}, {'votes': [False, True, True, False], 'isolated': []}), ('control 4', {'isolate_after': 2, 'cycles': [[False, True, True], [False, False, False], [False, False, False], [True, True, False], [True, True, True], [True, False, True], [False, False, False], [False, False, None], [True, True, True]]}, {'votes': [True, False, False, True, True, True, False, False, True], 'isolated': []}), ('control 7', {'isolate_after': 3, 'cycles': [[False, False, True], [False, False, False], [True, True, True], [False, True, True], [True, True, None], [False, False, False], [True, True, True], [False, False, False]]}, {'votes': [False, False, True, True, True, False, True, False], 'isolated': []})], [('regression: two dissenters in turn', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, True, False], [False, True, False], [False, False, False]]}, {'votes': [False, False, True, True, True], 'isolated': [0, 2]}), ('boundary: persistent dissenter', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, False, False]]}, {'votes': [False, False, False], 'isolated': [0]}), ('control 4', {'isolate_after': 2, 'cycles': [[False, True, True], [False, False, False], [False, False, False], [True, True, False], [True, True, True], [True, False, True], [False, False, False], [False, False, None], [True, True, True]]}, {'votes': [True, False, False, True, True, True, False, False, True], 'isolated': []}), ('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: dissent interrupted by failure', {'isolate_after': 2, 'cycles': [[True, False, False], [None, False, False], [True, False, False]]}, {'votes': [False, False, False], 'isolated': []}), ('control 12', {'isolate_after': 3, 'cycles': [[False, False, False], [False, True, False], [True, False, True], [True, False, True], [False, False, True], [False, False, False], [True, False, True], [True, True, True]]}, {'votes': [False, False, True, True, True, False, True, True], 'isolated': [1]}), ('control 15', {'isolate_after': 3, 'cycles': [[False, False, False], [False, None, False], [True, False, False], [True, None, False]]}, {'votes': [False, False, False, True], 'isolated': []}), ('control 18', {'isolate_after': 2, 'cycles': [[False, False, False], [None, False, True], [False, False, True], [True, False, False], [True, False, True], [False, False, False], [False, True, None], [False, False, False], [False, False, False]]}, {'votes': [False, True, False, False, True, False, True, False, False], 'isolated': []})], [('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: dissent interrupted by failure', {'isolate_after': 2, 'cycles': [[True, False, False], [None, False, False], [True, False, False]]}, {'votes': [False, False, False], 'isolated': []}), ('sampled regression 66', {'isolate_after': 3, 'cycles': [[False, False, False], [False, False, None], [False, None, None], [True, False, None], [None, False, False], [False, False, False], [False, True, False], [False, False, True], [True, True, False]]}, {'votes': [False, False, True, True, False, False, False, False, True], 'isolated': []}), ('control 13', {'isolate_after': 3, 'cycles': [[False, False, False], [True, None, True], [True, True, True], [False, None, False], [False, False, True]]}, {'votes': [False, True, True, False, False], 'isolated': []}), ('regression: two dissenters in turn', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, True, False], [False, True, False], [False, False, False]]}, {'votes': [False, False, True, True, True], 'isolated': [0, 2]}), ('control 23', {'isolate_after': 2, 'cycles': [[True, False, True], [None, False, False], [False, False, False], [False, False, False], [False, False, None], [False, False, False], [True, None, True]]}, {'votes': [True, False, False, False, False, False, True], 'isolated': []}), ('control 26', {'isolate_after': 2, 'cycles': [[True, True, True], [False, False, False], [False, False, True], [False, False, None]]}, {'votes': [True, False, False, False], 'isolated': []}), ('control 29', {'isolate_after': 2, 'cycles': [[False, False, True], [False, False, False], [False, False, True], [False, True, False], [False, True, True]]}, {'votes': [False, False, False, False, True], 'isolated': []})], [('regression: two dissenters in turn', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, True, False], [False, True, False], [False, False, False]]}, {'votes': [False, False, True, True, True], 'isolated': [0, 2]}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('sampled regression 40', {'isolate_after': 2, 'cycles': [[True, None, True], [False, False, None], [False, True, False], [False, True, False], [True, True, True], [True, None, False], [None, False, False], [True, True, True]]}, {'votes': [True, False, False, False, True, True, True, True], 'isolated': [1, 2]}), ('control 21', {'isolate_after': 3, 'cycles': [[True, True, True], [False, True, False], [True, True, True], [True, True, False], [None, False, False], [False, False, False], [False, False, False]]}, {'votes': [True, False, True, True, False, False, False], 'isolated': []}), ('boundary: isolated channel keeps reporting', {'isolate_after': 1, 'cycles': [[True, False, False], [True, True, False]]}, {'votes': [False, True], 'isolated': [0, 2]}), ('control 34', {'isolate_after': 2, 'cycles': [[True, True, False], [False, True, False], [True, True, True], [True, True, True], [True, False, True], [False, False, False], [True, False, True]]}, {'votes': [True, False, True, True, True, False, True], 'isolated': []}), ('control 37', {'isolate_after': 3, 'cycles': [[True, True, True], [False, False, False], [False, False, False], [False, True, False], [True, False, False], [False, False, False]]}, {'votes': [True, False, False, False, False, False], 'isolated': []}), ('control 43', {'isolate_after': 3, 'cycles': [[True, False, True], [True, None, False], [False, True, False], [False, False, False], [True, False, False]]}, {'votes': [True, True, False, False, False], 'isolated': []})], [('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: persistent dissenter', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, False, False]]}, {'votes': [False, False, False], 'isolated': [0]}), ('sampled regression 19', {'isolate_after': 2, 'cycles': [[True, True, True], [True, False, None], [True, False, True], [None, False, False], [True, True, None], [True, False, False], [False, False, True], [True, True, True]]}, {'votes': [True, True, True, True, True, True, True, True], 'isolated': [1]}), ('control 32', {'isolate_after': 3, 'cycles': [[False, True, True], [False, False, False], [False, False, None], [True, True, None], [False, False, False], [True, True, False], [True, None, True]]}, {'votes': [True, False, False, True, False, True, True], 'isolated': []}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('control 45', {'isolate_after': 2, 'cycles': [[True, True, True], [False, False, False], [False, False, False], [False, True, False], [None, True, False], [None, True, False], [True, False, False]]}, {'votes': [True, False, False, False, True, True, True], 'isolated': [2]}), ('control 48', {'isolate_after': 2, 'cycles': [[False, False, False], [False, False, False], [False, True, True], [True, True, None], [False, True, False], [True, True, True], [False, False, False], [False, False, False], [False, True, False]]}, {'votes': [False, False, True, True, False, True, False, False, False], 'isolated': []}), ('control 51', {'isolate_after': 3, 'cycles': [[False, False, False], [True, False, False], [True, True, True], [True, True, True], [True, True, True], [True, True, True], [True, False, True], [True, False, False], [True, True, True]]}, {'votes': [False, False, True, True, True, True, True, False, True], 'isolated': []})]]
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: single healthy channel says clear{'isolated': [], 'votes': [True]}{'isolated': [], 'votes': [True]}Passed
boundary: two healthy channels agree clear{'isolated': [], 'votes': [True]}{'isolated': [], 'votes': [False]}Failed
sampled regression 9{'isolated': [], 'votes': [True, True, True, False, True, True, True, False, True]}{'isolated': [], 'votes': [False, True, True, False, True, True, True, False, True]}Failed
boundary: persistent dissenter{'isolated': [0], 'votes': [False, False, True]}{'isolated': [0], 'votes': [False, False, False]}Failed
boundary: two healthy channels disagree{'isolated': [], 'votes': [True]}{'isolated': [], 'votes': [True]}Passed
control 1{'isolated': [], 'votes': [False, True, True, True]}{'isolated': [], 'votes': [False, True, True, False]}Failed
control 4{'isolated': [], 'votes': [True, False, False, True, True, True, False, True, True]}{'isolated': [], 'votes': [True, False, False, True, True, True, False, False, True]}Failed
control 7{'isolated': [], 'votes': [False, False, True, True, True, False, True, False]}{'isolated': [], 'votes': [False, False, True, True, True, False, True, False]}Passed

SHA-256 / 251b1f22642d9f30550050980f43573a472873cb644c1f09d1c386e9696ce78a

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    k = x['isolate_after']
    bad = [0, 0, 0]
    iso = [False, False, False]
    votes = []
    for cyc in x['cycles']:
        vals = [None if iso[i] else cyc[i] for i in range(3)]
        healthy = [v for v in vals if v is not None]
        if len(healthy) < 2:
            vote = True
        else:
            t = sum(1 for v in healthy if v)
            f = len(healthy) - t
            vote = t >= f
        votes.append(vote)
        for i in range(3):
            if vals[i] is not None and vals[i] != vote:
                bad[i] += 1
                if bad[i] >= k:
                    iso[i] = True
            else:
                bad[i] = 0
    return {'votes': votes, 'isolated': [i for i in range(3) if iso[i]]}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('sampled regression 9', {'isolate_after': 3, 'cycles': [[None, False, False], [None, True, False], [False, None, None], [False, False, True], [True, None, False], [True, True, True], [None, False, None], [False, False, False], [True, None, False]]}, {'votes': [False, True, True, False, True, True, True, False, True], 'isolated': []}), ('boundary: persistent dissenter', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, False, False]]}, {'votes': [False, False, False], 'isolated': [0]}), ('boundary: two healthy channels disagree', {'isolate_after': 3, 'cycles': [[True, False, None]]}, {'votes': [True], 'isolated': []}), ('control 1', {'isolate_after': 2, 'cycles': [[False, False, False], [True, None, True], [True, True, True], [None, False, False]]}, {'votes': [False, True, True, False], 'isolated': []}), ('control 4', {'isolate_after': 2, 'cycles': [[False, True, True], [False, False, False], [False, False, False], [True, True, False], [True, True, True], [True, False, True], [False, False, False], [False, False, None], [True, True, True]]}, {'votes': [True, False, False, True, True, True, False, False, True], 'isolated': []}), ('control 7', {'isolate_after': 3, 'cycles': [[False, False, True], [False, False, False], [True, True, True], [False, True, True], [True, True, None], [False, False, False], [True, True, True], [False, False, False]]}, {'votes': [False, False, True, True, True, False, True, False], 'isolated': []})], [('regression: two dissenters in turn', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, True, False], [False, True, False], [False, False, False]]}, {'votes': [False, False, True, True, True], 'isolated': [0, 2]}), ('boundary: persistent dissenter', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, False, False]]}, {'votes': [False, False, False], 'isolated': [0]}), ('control 4', {'isolate_after': 2, 'cycles': [[False, True, True], [False, False, False], [False, False, False], [True, True, False], [True, True, True], [True, False, True], [False, False, False], [False, False, None], [True, True, True]]}, {'votes': [True, False, False, True, True, True, False, False, True], 'isolated': []}), ('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: dissent interrupted by failure', {'isolate_after': 2, 'cycles': [[True, False, False], [None, False, False], [True, False, False]]}, {'votes': [False, False, False], 'isolated': []}), ('control 12', {'isolate_after': 3, 'cycles': [[False, False, False], [False, True, False], [True, False, True], [True, False, True], [False, False, True], [False, False, False], [True, False, True], [True, True, True]]}, {'votes': [False, False, True, True, True, False, True, True], 'isolated': [1]}), ('control 15', {'isolate_after': 3, 'cycles': [[False, False, False], [False, None, False], [True, False, False], [True, None, False]]}, {'votes': [False, False, False, True], 'isolated': []}), ('control 18', {'isolate_after': 2, 'cycles': [[False, False, False], [None, False, True], [False, False, True], [True, False, False], [True, False, True], [False, False, False], [False, True, None], [False, False, False], [False, False, False]]}, {'votes': [False, True, False, False, True, False, True, False, False], 'isolated': []})], [('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: dissent interrupted by failure', {'isolate_after': 2, 'cycles': [[True, False, False], [None, False, False], [True, False, False]]}, {'votes': [False, False, False], 'isolated': []}), ('sampled regression 66', {'isolate_after': 3, 'cycles': [[False, False, False], [False, False, None], [False, None, None], [True, False, None], [None, False, False], [False, False, False], [False, True, False], [False, False, True], [True, True, False]]}, {'votes': [False, False, True, True, False, False, False, False, True], 'isolated': []}), ('control 13', {'isolate_after': 3, 'cycles': [[False, False, False], [True, None, True], [True, True, True], [False, None, False], [False, False, True]]}, {'votes': [False, True, True, False, False], 'isolated': []}), ('regression: two dissenters in turn', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, True, False], [False, True, False], [False, False, False]]}, {'votes': [False, False, True, True, True], 'isolated': [0, 2]}), ('control 23', {'isolate_after': 2, 'cycles': [[True, False, True], [None, False, False], [False, False, False], [False, False, False], [False, False, None], [False, False, False], [True, None, True]]}, {'votes': [True, False, False, False, False, False, True], 'isolated': []}), ('control 26', {'isolate_after': 2, 'cycles': [[True, True, True], [False, False, False], [False, False, True], [False, False, None]]}, {'votes': [True, False, False, False], 'isolated': []}), ('control 29', {'isolate_after': 2, 'cycles': [[False, False, True], [False, False, False], [False, False, True], [False, True, False], [False, True, True]]}, {'votes': [False, False, False, False, True], 'isolated': []})], [('regression: two dissenters in turn', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, True, False], [False, True, False], [False, False, False]]}, {'votes': [False, False, True, True, True], 'isolated': [0, 2]}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('sampled regression 40', {'isolate_after': 2, 'cycles': [[True, None, True], [False, False, None], [False, True, False], [False, True, False], [True, True, True], [True, None, False], [None, False, False], [True, True, True]]}, {'votes': [True, False, False, False, True, True, True, True], 'isolated': [1, 2]}), ('control 21', {'isolate_after': 3, 'cycles': [[True, True, True], [False, True, False], [True, True, True], [True, True, False], [None, False, False], [False, False, False], [False, False, False]]}, {'votes': [True, False, True, True, False, False, False], 'isolated': []}), ('boundary: isolated channel keeps reporting', {'isolate_after': 1, 'cycles': [[True, False, False], [True, True, False]]}, {'votes': [False, True], 'isolated': [0, 2]}), ('control 34', {'isolate_after': 2, 'cycles': [[True, True, False], [False, True, False], [True, True, True], [True, True, True], [True, False, True], [False, False, False], [True, False, True]]}, {'votes': [True, False, True, True, True, False, True], 'isolated': []}), ('control 37', {'isolate_after': 3, 'cycles': [[True, True, True], [False, False, False], [False, False, False], [False, True, False], [True, False, False], [False, False, False]]}, {'votes': [True, False, False, False, False, False], 'isolated': []}), ('control 43', {'isolate_after': 3, 'cycles': [[True, False, True], [True, None, False], [False, True, False], [False, False, False], [True, False, False]]}, {'votes': [True, True, False, False, False], 'isolated': []})], [('regression: single healthy channel says clear', {'isolate_after': 3, 'cycles': [[False, None, None]]}, {'votes': [True], 'isolated': []}), ('boundary: persistent dissenter', {'isolate_after': 2, 'cycles': [[True, False, False], [True, False, False], [False, False, False]]}, {'votes': [False, False, False], 'isolated': [0]}), ('sampled regression 19', {'isolate_after': 2, 'cycles': [[True, True, True], [True, False, None], [True, False, True], [None, False, False], [True, True, None], [True, False, False], [False, False, True], [True, True, True]]}, {'votes': [True, True, True, True, True, True, True, True], 'isolated': [1]}), ('control 32', {'isolate_after': 3, 'cycles': [[False, True, True], [False, False, False], [False, False, None], [True, True, None], [False, False, False], [True, True, False], [True, None, True]]}, {'votes': [True, False, False, True, False, True, True], 'isolated': []}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('control 45', {'isolate_after': 2, 'cycles': [[True, True, True], [False, False, False], [False, False, False], [False, True, False], [None, True, False], [None, True, False], [True, False, False]]}, {'votes': [True, False, False, False, True, True, True], 'isolated': [2]}), ('control 48', {'isolate_after': 2, 'cycles': [[False, False, False], [False, False, False], [False, True, True], [True, True, None], [False, True, False], [True, True, True], [False, False, False], [False, False, False], [False, True, False]]}, {'votes': [False, False, True, True, False, True, False, False, False], 'isolated': []}), ('control 51', {'isolate_after': 3, 'cycles': [[False, False, False], [True, False, False], [True, True, True], [True, True, True], [True, True, True], [True, True, True], [True, False, True], [True, False, False], [True, True, True]]}, {'votes': [False, False, True, True, True, True, True, False, True], 'isolated': []})]]
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: single healthy channel says clear{'isolated': [], 'votes': [True]}{'isolated': [], 'votes': [True]}Passed
boundary: two healthy channels agree clear{'isolated': [], 'votes': [False]}{'isolated': [], 'votes': [False]}Passed
sampled regression 9{'isolated': [], 'votes': [False, True, True, False, True, True, True, False, True]}{'isolated': [], 'votes': [False, True, True, False, True, True, True, False, True]}Passed
boundary: persistent dissenter{'isolated': [0], 'votes': [False, False, False]}{'isolated': [0], 'votes': [False, False, False]}Passed
boundary: two healthy channels disagree{'isolated': [], 'votes': [True]}{'isolated': [], 'votes': [True]}Passed
control 1{'isolated': [], 'votes': [False, True, True, False]}{'isolated': [], 'votes': [False, True, True, False]}Passed
control 4{'isolated': [], 'votes': [True, False, False, True, True, True, False, False, True]}{'isolated': [], 'votes': [True, False, False, True, True, True, False, False, True]}Passed
control 7{'isolated': [], 'votes': [False, False, True, True, True, False, True, False]}{'isolated': [], 'votes': [False, False, True, True, True, False, True, False]}Passed

SHA-256 / 6d26f9b8043ac2e5ac0b2d3300cb52305fc88aa44b031b8b029c0e041b39c5a1

Verification & scope

Stipulated toy interlocking contract for a bounded teaching model; it makes no claim of conformance to any railway signalling standard and omits real safety cases. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:47:49.897808+00:00.

Case digest / 7192974aebed8b8db971413f3db8a5b5a1ef2d313e290746a1349afc4bd2bc7b