FAILURE MAP
← Case archive

FA-67126 / Railway interlocking logic / Open access

Two-out-of-three occupancy voting: isolated channel exclusion · case 01

An isolated channel continues to influence the vote.

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

ROOT CAUSE

Isolation is recorded but the raw report is still voted.

VERIFIED REPAIR

Replace isolated channels by None before voting.

Unsuccessful approach: Suppressing only occupied reports from isolated channels lets a stuck-clear channel vote.

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 = list(cyc)
        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: 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]}), ('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]}), ('sampled regression 6', {'isolate_after': 2, 'cycles': [[None, False, True], [False, True, False], [True, False, False], [False, True, False], [False, False, False], [False, False, False], [None, False, True]]}, {'votes': [True, False, True, False, False, False, True], 'isolated': [1]}), ('boundary: two healthy channels disagree', {'isolate_after': 3, 'cycles': [[True, False, None]]}, {'votes': [True], 'isolated': []}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], '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]}), ('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]}), ('sampled regression 56', {'isolate_after': 2, 'cycles': [[False, True, None], [False, True, None], [False, False, False], [True, False, False], [False, False, True]]}, {'votes': [True, True, False, False, True], 'isolated': [0]}), ('boundary: 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 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: 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]}), ('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]}), ('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]}), ('boundary: dissent interrupted by failure', {'isolate_after': 2, 'cycles': [[True, False, False], [None, False, False], [True, False, False]]}, {'votes': [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 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]}), ('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]}), ('sampled regression 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]}), ('boundary: isolated channel keeps reporting', {'isolate_after': 1, 'cycles': [[True, False, False], [True, True, False]]}, {'votes': [False, True], 'isolated': [0, 2]}), ('boundary: two healthy channels disagree', {'isolate_after': 3, 'cycles': [[True, False, None]]}, {'votes': [True], 'isolated': []}), ('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': []}), ('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]})], [('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]}), ('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]}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('boundary: 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 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: two dissenters in turn{'isolated': [0, 1], 'votes': [False, False, False, False, False]}{'isolated': [0, 2], 'votes': [False, False, True, True, True]}Failed
sampled regression 19{'isolated': [1], 'votes': [True, True, True, False, True, False, False, True]}{'isolated': [1], 'votes': [True, True, True, True, True, True, True, True]}Failed
sampled regression 6{'isolated': [1], 'votes': [True, False, False, False, False, False, True]}{'isolated': [1], 'votes': [True, False, True, False, False, False, True]}Failed
boundary: two healthy channels disagree{'isolated': [], 'votes': [True]}{'isolated': [], 'votes': [True]}Passed
boundary: two healthy channels agree clear{'isolated': [], 'votes': [False]}{'isolated': [], 'votes': [False]}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 / 4547c9f7eaea77c6edf8565ca5b3a2a182e8d5b61b9624418e6957a984ec8b3b

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] and cyc[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: 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]}), ('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]}), ('sampled regression 6', {'isolate_after': 2, 'cycles': [[None, False, True], [False, True, False], [True, False, False], [False, True, False], [False, False, False], [False, False, False], [None, False, True]]}, {'votes': [True, False, True, False, False, False, True], 'isolated': [1]}), ('boundary: two healthy channels disagree', {'isolate_after': 3, 'cycles': [[True, False, None]]}, {'votes': [True], 'isolated': []}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], '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]}), ('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]}), ('sampled regression 56', {'isolate_after': 2, 'cycles': [[False, True, None], [False, True, None], [False, False, False], [True, False, False], [False, False, True]]}, {'votes': [True, True, False, False, True], 'isolated': [0]}), ('boundary: 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 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: 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]}), ('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]}), ('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]}), ('boundary: dissent interrupted by failure', {'isolate_after': 2, 'cycles': [[True, False, False], [None, False, False], [True, False, False]]}, {'votes': [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 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]}), ('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]}), ('sampled regression 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]}), ('boundary: isolated channel keeps reporting', {'isolate_after': 1, 'cycles': [[True, False, False], [True, True, False]]}, {'votes': [False, True], 'isolated': [0, 2]}), ('boundary: two healthy channels disagree', {'isolate_after': 3, 'cycles': [[True, False, None]]}, {'votes': [True], 'isolated': []}), ('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': []}), ('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]})], [('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]}), ('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]}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('boundary: 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 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: two dissenters in turn{'isolated': [0, 1], 'votes': [False, False, False, False, False]}{'isolated': [0, 2], 'votes': [False, False, True, True, True]}Failed
sampled regression 19{'isolated': [1], 'votes': [True, True, True, False, True, False, False, True]}{'isolated': [1], 'votes': [True, True, True, True, True, True, True, True]}Failed
sampled regression 6{'isolated': [1], 'votes': [True, False, False, False, False, False, True]}{'isolated': [1], 'votes': [True, False, True, False, False, False, True]}Failed
boundary: two healthy channels disagree{'isolated': [], 'votes': [True]}{'isolated': [], 'votes': [True]}Passed
boundary: two healthy channels agree clear{'isolated': [], 'votes': [False]}{'isolated': [], 'votes': [False]}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 / ee3c6e1e4ff27b28d1a937c7a067041a363a128771e258baa7a3eccccd18df66

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: 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]}), ('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]}), ('sampled regression 6', {'isolate_after': 2, 'cycles': [[None, False, True], [False, True, False], [True, False, False], [False, True, False], [False, False, False], [False, False, False], [None, False, True]]}, {'votes': [True, False, True, False, False, False, True], 'isolated': [1]}), ('boundary: two healthy channels disagree', {'isolate_after': 3, 'cycles': [[True, False, None]]}, {'votes': [True], 'isolated': []}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], '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]}), ('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]}), ('sampled regression 56', {'isolate_after': 2, 'cycles': [[False, True, None], [False, True, None], [False, False, False], [True, False, False], [False, False, True]]}, {'votes': [True, True, False, False, True], 'isolated': [0]}), ('boundary: 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 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: 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]}), ('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]}), ('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]}), ('boundary: dissent interrupted by failure', {'isolate_after': 2, 'cycles': [[True, False, False], [None, False, False], [True, False, False]]}, {'votes': [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 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]}), ('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]}), ('sampled regression 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]}), ('boundary: isolated channel keeps reporting', {'isolate_after': 1, 'cycles': [[True, False, False], [True, True, False]]}, {'votes': [False, True], 'isolated': [0, 2]}), ('boundary: two healthy channels disagree', {'isolate_after': 3, 'cycles': [[True, False, None]]}, {'votes': [True], 'isolated': []}), ('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': []}), ('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]})], [('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]}), ('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]}), ('boundary: two healthy channels agree clear', {'isolate_after': 3, 'cycles': [[False, False, None]]}, {'votes': [False], 'isolated': []}), ('boundary: 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 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: two dissenters in turn{'isolated': [0, 2], 'votes': [False, False, True, True, True]}{'isolated': [0, 2], 'votes': [False, False, True, True, True]}Passed
sampled regression 19{'isolated': [1], 'votes': [True, True, True, True, True, True, True, True]}{'isolated': [1], 'votes': [True, True, True, True, True, True, True, True]}Passed
sampled regression 6{'isolated': [1], 'votes': [True, False, True, False, False, False, True]}{'isolated': [1], 'votes': [True, False, True, False, False, False, True]}Passed
boundary: two healthy channels disagree{'isolated': [], 'votes': [True]}{'isolated': [], 'votes': [True]}Passed
boundary: two healthy channels agree clear{'isolated': [], 'votes': [False]}{'isolated': [], 'votes': [False]}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 / 9fc4dd4c35a5daee0ba9ed412ffb13b0fb5d3d8971d27cfdf284726443ce3237

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

Case digest / 3a91b238a41bfbd59ff7795d6850f45732bad88f5d60f3db2ccbf108c538a4e5