{"abstract":"The signal in rear of a dark signal shows a proceed aspect.","category":"Railway interlocking logic","checks":8,"contract":"Signals 0..n-1 each protect one block; occupied[i] is the block after signal i. Evaluate from the far end: a signal shows R if its block is occupied, else Y if the next signal is R, R if the next signal is DARK, YY if the next is Y, otherwise G. Beyond the last signal the next aspect is G on an open line and R at a buffer stop. A diverging signal is capped at Y. A signal whose red lamp has failed shows DARK instead of R.","evaluation_group":"w2-railway_interlocking_logic-four-aspect-chain","failed_approach":"Holding at R only on open lines still lets a caution approach a dark signal near a buffer stop.","family":"w2-railway_interlocking_logic-four-aspect-chain-dark-signal-treatment","id":"FA-66866","implementations":{"attempt":{"sha256":"aa673f35d15a2931920c3d310dd5f3979272e0b728f69aed270db7bbf6038fbb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    occ = x['occupied']\n    n = len(occ)\n    fail = set(x['lamp_fail'])\n    div = set(x['diverging'])\n    nxt = 'G' if x['open_end'] else 'R'\n    out = [None] * n\n    for i in range(n - 1, -1, -1):\n        if occ[i]:\n            a = 'R'\n        elif nxt in ('R', 'DARK'):\n            a = 'R' if nxt == 'DARK' and x['open_end'] else 'Y'\n        elif nxt == 'Y':\n            a = 'YY'\n        else:\n            a = 'G'\n        if i in div and a in ('YY', 'G'):\n            a = 'Y'\n        if a == 'R' and i in fail:\n            a = 'DARK'\n        out[i] = a\n        nxt = a\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 56', {'occupied': [False, False, False, True, False], 'lamp_fail': [3], 'diverging': [], 'open_end': False}, ['YY', 'Y', 'R', 'DARK', 'Y']), ('sampled regression 63', {'occupied': [False, False, False, False, False, True, False], 'lamp_fail': [5, 6], 'diverging': [], 'open_end': True}, ['G', 'G', 'YY', 'Y', 'R', 'DARK', 'G']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: failed red lamp on a clear signal', {'occupied': [False, False, False], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['G', 'G', 'G']), ('control 1', {'occupied': [False, True, False, False, False, False], 'lamp_fail': [0], 'diverging': [], 'open_end': False}, ['Y', 'R', 'G', 'G', 'YY', 'Y']), ('control 4', {'occupied': [False, True], 'lamp_fail': [], 'diverging': [], 'open_end': False}, ['Y', 'R']), ('control 7', {'occupied': [True, False, False, True], 'lamp_fail': [], 'diverging': [3], 'open_end': True}, ['R', 'YY', 'Y', 'R'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('sampled regression 56', {'occupied': [False, False, False, True, False], 'lamp_fail': [3], 'diverging': [], 'open_end': False}, ['YY', 'Y', 'R', 'DARK', 'Y']), ('boundary: diverging junction behind a double yellow', {'occupied': [False, False, True], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['Y', 'Y', 'R']), ('boundary: diverging junction behind a green', {'occupied': [False, False, False], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['Y', 'G', 'G']), ('control 12', {'occupied': [False, False], 'lamp_fail': [0], 'diverging': [], 'open_end': False}, ['YY', 'Y']), ('control 15', {'occupied': [False, True], 'lamp_fail': [], 'diverging': [], 'open_end': True}, ['Y', 'R']), ('control 18', {'occupied': [False, False], 'lamp_fail': [], 'diverging': [], 'open_end': True}, ['G', 'G'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 76', {'occupied': [False, True, False, True, True], 'lamp_fail': [3, 4], 'diverging': [1], 'open_end': False}, ['Y', 'R', 'R', 'DARK', 'DARK']), ('sampled regression 45', {'occupied': [True, False, False, True], 'lamp_fail': [3], 'diverging': [1], 'open_end': True}, ['R', 'Y', 'R', 'DARK']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: buffer stop at the end', {'occupied': [False, False, False], 'lamp_fail': [], 'diverging': [], 'open_end': False}, ['G', 'YY', 'Y']), ('control 23', {'occupied': [True, False, True], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['R', 'Y', 'R']), ('control 26', {'occupied': [False, False, False, True], 'lamp_fail': [], 'diverging': [3], 'open_end': False}, ['G', 'YY', 'Y', 'R']), ('control 29', {'occupied': [False, True], 'lamp_fail': [], 'diverging': [], 'open_end': False}, ['Y', 'R'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 78', {'occupied': [False, False, False, False, True, False, False], 'lamp_fail': [4, 5], 'diverging': [6], 'open_end': False}, ['G', 'YY', 'Y', 'R', 'DARK', 'YY', 'Y']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: train two blocks ahead', {'occupied': [False, False, True, False], 'lamp_fail': [], 'diverging': [], 'open_end': True}, ['YY', 'Y', 'R', 'G']), ('boundary: dark signal at the buffer end', {'occupied': [False, False], 'lamp_fail': [1], 'diverging': [], 'open_end': False}, ['YY', 'Y']), ('control 34', {'occupied': [False, False, False, False, False, False, False], 'lamp_fail': [], 'diverging': [1], 'open_end': False}, ['YY', 'Y', 'G', 'G', 'G', 'YY', 'Y']), ('control 37', {'occupied': [False, False, False, False], 'lamp_fail': [0], 'diverging': [0, 3], 'open_end': True}, ['Y', 'G', 'YY', 'Y']), ('control 40', {'occupied': [False, False, False, False], 'lamp_fail': [0], 'diverging': [0], 'open_end': True}, ['Y', 'G', 'G', 'G'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 80', {'occupied': [False, False, False, False, False, False, True], 'lamp_fail': [6], 'diverging': [], 'open_end': False}, ['G', 'G', 'G', 'YY', 'Y', 'R', 'DARK']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: failed red lamp on a clear signal', {'occupied': [False, False, False], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['G', 'G', 'G']), ('boundary: diverging junction behind a double yellow', {'occupied': [False, False, True], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['Y', 'Y', 'R']), ('sampled regression 45', {'occupied': [True, False, False, True], 'lamp_fail': [3], 'diverging': [1], 'open_end': True}, ['R', 'Y', 'R', 'DARK']), ('control 48', {'occupied': [False, False, False, False], 'lamp_fail': [1], 'diverging': [2], 'open_end': True}, ['G', 'YY', 'Y', 'G']), ('control 51', {'occupied': [False, False, False, True], 'lamp_fail': [], 'diverging': [0, 2, 3], 'open_end': True}, ['Y', 'YY', 'Y', 'R'])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"32fa7600a402baee8f9393633c8f85c02f08eba7a5eac9e8676dde8421481ebc","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    occ = x['occupied']\n    n = len(occ)\n    fail = set(x['lamp_fail'])\n    div = set(x['diverging'])\n    nxt = 'G' if x['open_end'] else 'R'\n    out = [None] * n\n    for i in range(n - 1, -1, -1):\n        if occ[i]:\n            a = 'R'\n        elif nxt in ('R', 'DARK'):\n            a = 'Y'\n        elif nxt == 'Y':\n            a = 'YY'\n        else:\n            a = 'G'\n        if i in div and a in ('YY', 'G'):\n            a = 'Y'\n        if a == 'R' and i in fail:\n            a = 'DARK'\n        out[i] = a\n        nxt = a\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 56', {'occupied': [False, False, False, True, False], 'lamp_fail': [3], 'diverging': [], 'open_end': False}, ['YY', 'Y', 'R', 'DARK', 'Y']), ('sampled regression 63', {'occupied': [False, False, False, False, False, True, False], 'lamp_fail': [5, 6], 'diverging': [], 'open_end': True}, ['G', 'G', 'YY', 'Y', 'R', 'DARK', 'G']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: failed red lamp on a clear signal', {'occupied': [False, False, False], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['G', 'G', 'G']), ('control 1', {'occupied': [False, True, False, False, False, False], 'lamp_fail': [0], 'diverging': [], 'open_end': False}, ['Y', 'R', 'G', 'G', 'YY', 'Y']), ('control 4', {'occupied': [False, True], 'lamp_fail': [], 'diverging': [], 'open_end': False}, ['Y', 'R']), ('control 7', {'occupied': [True, False, False, True], 'lamp_fail': [], 'diverging': [3], 'open_end': True}, ['R', 'YY', 'Y', 'R'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('sampled regression 56', {'occupied': [False, False, False, True, False], 'lamp_fail': [3], 'diverging': [], 'open_end': False}, ['YY', 'Y', 'R', 'DARK', 'Y']), ('boundary: diverging junction behind a double yellow', {'occupied': [False, False, True], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['Y', 'Y', 'R']), ('boundary: diverging junction behind a green', {'occupied': [False, False, False], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['Y', 'G', 'G']), ('control 12', {'occupied': [False, False], 'lamp_fail': [0], 'diverging': [], 'open_end': False}, ['YY', 'Y']), ('control 15', {'occupied': [False, True], 'lamp_fail': [], 'diverging': [], 'open_end': True}, ['Y', 'R']), ('control 18', {'occupied': [False, False], 'lamp_fail': [], 'diverging': [], 'open_end': True}, ['G', 'G'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 76', {'occupied': [False, True, False, True, True], 'lamp_fail': [3, 4], 'diverging': [1], 'open_end': False}, ['Y', 'R', 'R', 'DARK', 'DARK']), ('sampled regression 45', {'occupied': [True, False, False, True], 'lamp_fail': [3], 'diverging': [1], 'open_end': True}, ['R', 'Y', 'R', 'DARK']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: buffer stop at the end', {'occupied': [False, False, False], 'lamp_fail': [], 'diverging': [], 'open_end': False}, ['G', 'YY', 'Y']), ('control 23', {'occupied': [True, False, True], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['R', 'Y', 'R']), ('control 26', {'occupied': [False, False, False, True], 'lamp_fail': [], 'diverging': [3], 'open_end': False}, ['G', 'YY', 'Y', 'R']), ('control 29', {'occupied': [False, True], 'lamp_fail': [], 'diverging': [], 'open_end': False}, ['Y', 'R'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 78', {'occupied': [False, False, False, False, True, False, False], 'lamp_fail': [4, 5], 'diverging': [6], 'open_end': False}, ['G', 'YY', 'Y', 'R', 'DARK', 'YY', 'Y']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: train two blocks ahead', {'occupied': [False, False, True, False], 'lamp_fail': [], 'diverging': [], 'open_end': True}, ['YY', 'Y', 'R', 'G']), ('boundary: dark signal at the buffer end', {'occupied': [False, False], 'lamp_fail': [1], 'diverging': [], 'open_end': False}, ['YY', 'Y']), ('control 34', {'occupied': [False, False, False, False, False, False, False], 'lamp_fail': [], 'diverging': [1], 'open_end': False}, ['YY', 'Y', 'G', 'G', 'G', 'YY', 'Y']), ('control 37', {'occupied': [False, False, False, False], 'lamp_fail': [0], 'diverging': [0, 3], 'open_end': True}, ['Y', 'G', 'YY', 'Y']), ('control 40', {'occupied': [False, False, False, False], 'lamp_fail': [0], 'diverging': [0], 'open_end': True}, ['Y', 'G', 'G', 'G'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 80', {'occupied': [False, False, False, False, False, False, True], 'lamp_fail': [6], 'diverging': [], 'open_end': False}, ['G', 'G', 'G', 'YY', 'Y', 'R', 'DARK']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: failed red lamp on a clear signal', {'occupied': [False, False, False], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['G', 'G', 'G']), ('boundary: diverging junction behind a double yellow', {'occupied': [False, False, True], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['Y', 'Y', 'R']), ('sampled regression 45', {'occupied': [True, False, False, True], 'lamp_fail': [3], 'diverging': [1], 'open_end': True}, ['R', 'Y', 'R', 'DARK']), ('control 48', {'occupied': [False, False, False, False], 'lamp_fail': [1], 'diverging': [2], 'open_end': True}, ['G', 'YY', 'Y', 'G']), ('control 51', {'occupied': [False, False, False, True], 'lamp_fail': [], 'diverging': [0, 2, 3], 'open_end': True}, ['Y', 'YY', 'Y', 'R'])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"9c9fe436d5f63edcfe21965df96ad104dacbb65451823b5a221d3bfd9e12d6b0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    occ = x['occupied']\n    n = len(occ)\n    fail = set(x['lamp_fail'])\n    div = set(x['diverging'])\n    nxt = 'G' if x['open_end'] else 'R'\n    out = [None] * n\n    for i in range(n - 1, -1, -1):\n        if occ[i]:\n            a = 'R'\n        elif nxt in ('R', 'DARK'):\n            a = 'R' if nxt == 'DARK' else 'Y'\n        elif nxt == 'Y':\n            a = 'YY'\n        else:\n            a = 'G'\n        if i in div and a in ('YY', 'G'):\n            a = 'Y'\n        if a == 'R' and i in fail:\n            a = 'DARK'\n        out[i] = a\n        nxt = a\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 56', {'occupied': [False, False, False, True, False], 'lamp_fail': [3], 'diverging': [], 'open_end': False}, ['YY', 'Y', 'R', 'DARK', 'Y']), ('sampled regression 63', {'occupied': [False, False, False, False, False, True, False], 'lamp_fail': [5, 6], 'diverging': [], 'open_end': True}, ['G', 'G', 'YY', 'Y', 'R', 'DARK', 'G']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: failed red lamp on a clear signal', {'occupied': [False, False, False], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['G', 'G', 'G']), ('control 1', {'occupied': [False, True, False, False, False, False], 'lamp_fail': [0], 'diverging': [], 'open_end': False}, ['Y', 'R', 'G', 'G', 'YY', 'Y']), ('control 4', {'occupied': [False, True], 'lamp_fail': [], 'diverging': [], 'open_end': False}, ['Y', 'R']), ('control 7', {'occupied': [True, False, False, True], 'lamp_fail': [], 'diverging': [3], 'open_end': True}, ['R', 'YY', 'Y', 'R'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('sampled regression 56', {'occupied': [False, False, False, True, False], 'lamp_fail': [3], 'diverging': [], 'open_end': False}, ['YY', 'Y', 'R', 'DARK', 'Y']), ('boundary: diverging junction behind a double yellow', {'occupied': [False, False, True], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['Y', 'Y', 'R']), ('boundary: diverging junction behind a green', {'occupied': [False, False, False], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['Y', 'G', 'G']), ('control 12', {'occupied': [False, False], 'lamp_fail': [0], 'diverging': [], 'open_end': False}, ['YY', 'Y']), ('control 15', {'occupied': [False, True], 'lamp_fail': [], 'diverging': [], 'open_end': True}, ['Y', 'R']), ('control 18', {'occupied': [False, False], 'lamp_fail': [], 'diverging': [], 'open_end': True}, ['G', 'G'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 76', {'occupied': [False, True, False, True, True], 'lamp_fail': [3, 4], 'diverging': [1], 'open_end': False}, ['Y', 'R', 'R', 'DARK', 'DARK']), ('sampled regression 45', {'occupied': [True, False, False, True], 'lamp_fail': [3], 'diverging': [1], 'open_end': True}, ['R', 'Y', 'R', 'DARK']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: buffer stop at the end', {'occupied': [False, False, False], 'lamp_fail': [], 'diverging': [], 'open_end': False}, ['G', 'YY', 'Y']), ('control 23', {'occupied': [True, False, True], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['R', 'Y', 'R']), ('control 26', {'occupied': [False, False, False, True], 'lamp_fail': [], 'diverging': [3], 'open_end': False}, ['G', 'YY', 'Y', 'R']), ('control 29', {'occupied': [False, True], 'lamp_fail': [], 'diverging': [], 'open_end': False}, ['Y', 'R'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 78', {'occupied': [False, False, False, False, True, False, False], 'lamp_fail': [4, 5], 'diverging': [6], 'open_end': False}, ['G', 'YY', 'Y', 'R', 'DARK', 'YY', 'Y']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: train two blocks ahead', {'occupied': [False, False, True, False], 'lamp_fail': [], 'diverging': [], 'open_end': True}, ['YY', 'Y', 'R', 'G']), ('boundary: dark signal at the buffer end', {'occupied': [False, False], 'lamp_fail': [1], 'diverging': [], 'open_end': False}, ['YY', 'Y']), ('control 34', {'occupied': [False, False, False, False, False, False, False], 'lamp_fail': [], 'diverging': [1], 'open_end': False}, ['YY', 'Y', 'G', 'G', 'G', 'YY', 'Y']), ('control 37', {'occupied': [False, False, False, False], 'lamp_fail': [0], 'diverging': [0, 3], 'open_end': True}, ['Y', 'G', 'YY', 'Y']), ('control 40', {'occupied': [False, False, False, False], 'lamp_fail': [0], 'diverging': [0], 'open_end': True}, ['Y', 'G', 'G', 'G'])], [('regression: dark signal ahead', {'occupied': [False, True], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['R', 'DARK']), ('sampled regression 80', {'occupied': [False, False, False, False, False, False, True], 'lamp_fail': [6], 'diverging': [], 'open_end': False}, ['G', 'G', 'G', 'YY', 'Y', 'R', 'DARK']), ('sampled regression 75', {'occupied': [False, False, True, False], 'lamp_fail': [0, 2], 'diverging': [0, 2, 3], 'open_end': False}, ['Y', 'R', 'DARK', 'Y']), ('boundary: failed red lamp on a clear signal', {'occupied': [False, False, False], 'lamp_fail': [1], 'diverging': [], 'open_end': True}, ['G', 'G', 'G']), ('boundary: diverging junction behind a double yellow', {'occupied': [False, False, True], 'lamp_fail': [], 'diverging': [0], 'open_end': True}, ['Y', 'Y', 'R']), ('sampled regression 45', {'occupied': [True, False, False, True], 'lamp_fail': [3], 'diverging': [1], 'open_end': True}, ['R', 'Y', 'R', 'DARK']), ('control 48', {'occupied': [False, False, False, False], 'lamp_fail': [1], 'diverging': [2], 'open_end': True}, ['G', 'YY', 'Y', 'G']), ('control 51', {'occupied': [False, False, False, True], 'lamp_fail': [], 'diverging': [0, 2, 3], 'open_end': True}, ['Y', 'YY', 'Y', 'R'])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-railway_interlocking_logic-four-aspect-chain-dark-signal-treatment","generated_at":"2026-09-29T14:47:47.521118+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Interlocking logic decides whether trains may be given authority; a wrong decision at this point either grants unsafe movements or strands traffic.","repair":"Hold the rear signal at R whenever the next signal is DARK.","root_cause":"A DARK signal ahead is treated like a red one, so the rear signal offers a caution instead of being held at danger.","sha256":"c0d214e2fe0da81c038b0dbc5a99fee8beb7bc4c34fe49ec16359577632c9e9d","title":"Four-aspect signal chain evaluation: dark signal treatment · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.292,"exit_code":1,"observations":[{"actual":["R","DARK"],"check":"regression: dark signal ahead","expected":["R","DARK"],"passed":true},{"actual":["G","YY","Y","DARK","Y"],"check":"sampled regression 56","expected":["YY","Y","R","DARK","Y"],"passed":false},{"actual":["G","G","YY","Y","R","DARK","G"],"check":"sampled regression 63","expected":["G","G","YY","Y","R","DARK","G"],"passed":true},{"actual":["Y","Y","DARK","Y"],"check":"sampled regression 75","expected":["Y","R","DARK","Y"],"passed":false},{"actual":["G","G","G"],"check":"boundary: failed red lamp on a clear signal","expected":["G","G","G"],"passed":true},{"actual":["Y","R","G","G","YY","Y"],"check":"control 1","expected":["Y","R","G","G","YY","Y"],"passed":true},{"actual":["Y","R"],"check":"control 4","expected":["Y","R"],"passed":true},{"actual":["R","YY","Y","R"],"check":"control 7","expected":["R","YY","Y","R"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: dark signal ahead\", \"actual\": [\"R\", \"DARK\"], \"expected\": [\"R\", \"DARK\"], \"passed\": true}, {\"check\": \"sampled regression 56\", \"actual\": [\"G\", \"YY\", \"Y\", \"DARK\", \"Y\"], \"expected\": [\"YY\", \"Y\", \"R\", \"DARK\", \"Y\"], \"passed\": false}, {\"check\": \"sampled regression 63\", \"actual\": [\"G\", \"G\", \"YY\", \"Y\", \"R\", \"DARK\", \"G\"], \"expected\": [\"G\", \"G\", \"YY\", \"Y\", \"R\", \"DARK\", \"G\"], \"passed\": true}, {\"check\": \"sampled regression 75\", \"actual\": [\"Y\", \"Y\", \"DARK\", \"Y\"], \"expected\": [\"Y\", \"R\", \"DARK\", \"Y\"], \"passed\": false}, {\"check\": \"boundary: failed red lamp on a clear signal\", \"actual\": [\"G\", \"G\", \"G\"], \"expected\": [\"G\", \"G\", \"G\"], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [\"Y\", \"R\", \"G\", \"G\", \"YY\", \"Y\"], \"expected\": [\"Y\", \"R\", \"G\", \"G\", \"YY\", \"Y\"], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [\"Y\", \"R\"], \"expected\": [\"Y\", \"R\"], \"passed\": true}, {\"check\": \"control 7\", \"actual\": [\"R\", \"YY\", \"Y\", \"R\"], \"expected\": [\"R\", \"YY\", \"Y\", \"R\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.875,"exit_code":1,"observations":[{"actual":["Y","DARK"],"check":"regression: dark signal ahead","expected":["R","DARK"],"passed":false},{"actual":["G","YY","Y","DARK","Y"],"check":"sampled regression 56","expected":["YY","Y","R","DARK","Y"],"passed":false},{"actual":["G","G","G","YY","Y","DARK","G"],"check":"sampled regression 63","expected":["G","G","YY","Y","R","DARK","G"],"passed":false},{"actual":["Y","Y","DARK","Y"],"check":"sampled regression 75","expected":["Y","R","DARK","Y"],"passed":false},{"actual":["G","G","G"],"check":"boundary: failed red lamp on a clear signal","expected":["G","G","G"],"passed":true},{"actual":["Y","R","G","G","YY","Y"],"check":"control 1","expected":["Y","R","G","G","YY","Y"],"passed":true},{"actual":["Y","R"],"check":"control 4","expected":["Y","R"],"passed":true},{"actual":["R","YY","Y","R"],"check":"control 7","expected":["R","YY","Y","R"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: dark signal ahead\", \"actual\": [\"Y\", \"DARK\"], \"expected\": [\"R\", \"DARK\"], \"passed\": false}, {\"check\": \"sampled regression 56\", \"actual\": [\"G\", \"YY\", \"Y\", \"DARK\", \"Y\"], \"expected\": [\"YY\", \"Y\", \"R\", \"DARK\", \"Y\"], \"passed\": false}, {\"check\": \"sampled regression 63\", \"actual\": [\"G\", \"G\", \"G\", \"YY\", \"Y\", \"DARK\", \"G\"], \"expected\": [\"G\", \"G\", \"YY\", \"Y\", \"R\", \"DARK\", \"G\"], \"passed\": false}, {\"check\": \"sampled regression 75\", \"actual\": [\"Y\", \"Y\", \"DARK\", \"Y\"], \"expected\": [\"Y\", \"R\", \"DARK\", \"Y\"], \"passed\": false}, {\"check\": \"boundary: failed red lamp on a clear signal\", \"actual\": [\"G\", \"G\", \"G\"], \"expected\": [\"G\", \"G\", \"G\"], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [\"Y\", \"R\", \"G\", \"G\", \"YY\", \"Y\"], \"expected\": [\"Y\", \"R\", \"G\", \"G\", \"YY\", \"Y\"], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [\"Y\", \"R\"], \"expected\": [\"Y\", \"R\"], \"passed\": true}, {\"check\": \"control 7\", \"actual\": [\"R\", \"YY\", \"Y\", \"R\"], \"expected\": [\"R\", \"YY\", \"Y\", \"R\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.661,"exit_code":0,"observations":[{"actual":["R","DARK"],"check":"regression: dark signal ahead","expected":["R","DARK"],"passed":true},{"actual":["YY","Y","R","DARK","Y"],"check":"sampled regression 56","expected":["YY","Y","R","DARK","Y"],"passed":true},{"actual":["G","G","YY","Y","R","DARK","G"],"check":"sampled regression 63","expected":["G","G","YY","Y","R","DARK","G"],"passed":true},{"actual":["Y","R","DARK","Y"],"check":"sampled regression 75","expected":["Y","R","DARK","Y"],"passed":true},{"actual":["G","G","G"],"check":"boundary: failed red lamp on a clear signal","expected":["G","G","G"],"passed":true},{"actual":["Y","R","G","G","YY","Y"],"check":"control 1","expected":["Y","R","G","G","YY","Y"],"passed":true},{"actual":["Y","R"],"check":"control 4","expected":["Y","R"],"passed":true},{"actual":["R","YY","Y","R"],"check":"control 7","expected":["R","YY","Y","R"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: dark signal ahead\", \"actual\": [\"R\", \"DARK\"], \"expected\": [\"R\", \"DARK\"], \"passed\": true}, {\"check\": \"sampled regression 56\", \"actual\": [\"YY\", \"Y\", \"R\", \"DARK\", \"Y\"], \"expected\": [\"YY\", \"Y\", \"R\", \"DARK\", \"Y\"], \"passed\": true}, {\"check\": \"sampled regression 63\", \"actual\": [\"G\", \"G\", \"YY\", \"Y\", \"R\", \"DARK\", \"G\"], \"expected\": [\"G\", \"G\", \"YY\", \"Y\", \"R\", \"DARK\", \"G\"], \"passed\": true}, {\"check\": \"sampled regression 75\", \"actual\": [\"Y\", \"R\", \"DARK\", \"Y\"], \"expected\": [\"Y\", \"R\", \"DARK\", \"Y\"], \"passed\": true}, {\"check\": \"boundary: failed red lamp on a clear signal\", \"actual\": [\"G\", \"G\", \"G\"], \"expected\": [\"G\", \"G\", \"G\"], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [\"Y\", \"R\", \"G\", \"G\", \"YY\", \"Y\"], \"expected\": [\"Y\", \"R\", \"G\", \"G\", \"YY\", \"Y\"], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [\"Y\", \"R\"], \"expected\": [\"Y\", \"R\"], \"passed\": true}, {\"check\": \"control 7\", \"actual\": [\"R\", \"YY\", \"Y\", \"R\"], \"expected\": [\"R\", \"YY\", \"Y\", \"R\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}