{"abstract":"A second train entering an occupied block raises no alarm.","category":"Railway interlocking logic","checks":8,"contract":"A block section between two boxes is normal, line_clear or train_on_line. An offer is accepted (line_clear) only from normal with the clearing point clear, otherwise alarm refused. A departure without line clear raises unauthorised-departure; any departure puts the train on line. arrive_complete returns train_on_line to normal; arrive_no_tail raises tail-missing and keeps the block occupied. cancel only withdraws line_clear. cp_blocked/cp_clear set the clearing point.","evaluation_group":"w2-railway_interlocking_logic-absolute-block","failed_approach":"Alarming only when a train is already on line misses a departure with no offer at all.","family":"w2-railway_interlocking_logic-absolute-block-departure-authority","id":"FA-67046","implementations":{"attempt":{"sha256":"4a675d4e1f5074ce63e7e33513c28e8ab5443c96696c631b9f0465878959dd3c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    state = 'normal'\n    cp = True\n    alarms = []\n    for ev in x['events']:\n        if ev == 'cp_blocked':\n            cp = False\n        elif ev == 'cp_clear':\n            cp = True\n        elif ev == 'offer':\n            if state == 'normal' and cp:\n                state = 'line_clear'\n            else:\n                alarms.append('refused')\n        elif ev == 'depart':\n            if state == 'train_on_line':\n                alarms.append('unauthorised-departure')\n            state = 'train_on_line'\n        elif ev == 'arrive_complete':\n            if state == 'train_on_line':\n                state = 'normal'\n        elif ev == 'arrive_no_tail':\n            alarms.append('tail-missing')\n        elif ev == 'cancel':\n            if state == 'line_clear':\n                state = 'normal'\n    return {'state': state, 'alarms': alarms}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 5', {'events': ['arrive_complete', 'cp_clear', 'offer', 'arrive_no_tail', 'cancel', 'depart', 'depart', 'arrive_complete', 'offer', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'unauthorised-departure', 'unauthorised-departure']}), ('sampled regression 1', {'events': ['cp_blocked', 'depart', 'arrive_no_tail', 'cp_clear', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('control 4', {'events': ['cancel', 'arrive_no_tail', 'offer', 'offer', 'depart', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'tail-missing']}), ('control 7', {'events': ['offer', 'arrive_no_tail', 'arrive_complete', 'cp_clear', 'cp_clear', 'arrive_no_tail']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'tail-missing']}), ('control 10', {'events': ['arrive_complete', 'cp_blocked', 'offer', 'arrive_complete', 'depart']}, {'state': 'train_on_line', 'alarms': ['refused', 'unauthorised-departure']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 29', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'arrive_complete', 'arrive_no_tail', 'cp_clear']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']}), ('control 10', {'events': ['arrive_complete', 'cp_blocked', 'offer', 'arrive_complete', 'depart']}, {'state': 'train_on_line', 'alarms': ['refused', 'unauthorised-departure']}), ('boundary: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 12', {'events': ['depart', 'cp_clear', 'arrive_complete', 'depart', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'unauthorised-departure']}), ('control 15', {'events': ['arrive_complete', 'cp_clear', 'cancel']}, {'state': 'normal', 'alarms': []}), ('control 18', {'events': ['cp_clear', 'depart', 'offer', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 57', {'events': ['cp_blocked', 'depart', 'offer', 'cp_blocked', 'depart', 'arrive_no_tail', 'cancel', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']}), ('sampled regression 17', {'events': ['depart', 'arrive_complete', 'offer', 'arrive_complete', 'depart', 'offer', 'offer', 'depart', 'offer', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused', 'refused', 'unauthorised-departure', 'refused', 'tail-missing']}), ('boundary: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 23', {'events': ['depart', 'cp_blocked', 'arrive_no_tail', 'offer', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'refused']}), ('control 26', {'events': ['cp_clear', 'offer', 'cp_clear', 'cp_clear', 'cp_blocked', 'cp_clear', 'cp_blocked', 'depart']}, {'state': 'train_on_line', 'alarms': []}), ('sampled regression 29', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'arrive_complete', 'arrive_no_tail', 'cp_clear']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 78', {'events': ['cp_blocked', 'arrive_no_tail', 'depart', 'cancel', 'arrive_no_tail', 'depart']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'tail-missing', 'unauthorised-departure']}), ('control 23', {'events': ['depart', 'cp_blocked', 'arrive_no_tail', 'offer', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'refused']}), ('boundary: cancel of line clear', {'events': ['offer', 'cancel', 'offer']}, {'state': 'line_clear', 'alarms': []}), ('control 34', {'events': ['cp_blocked', 'arrive_no_tail', 'cancel', 'cp_clear', 'offer', 'arrive_complete', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing']}), ('control 37', {'events': ['offer', 'depart', 'cp_clear', 'cp_clear']}, {'state': 'train_on_line', 'alarms': []}), ('control 40', {'events': ['arrive_complete', 'cp_clear', 'arrive_no_tail']}, {'state': 'normal', 'alarms': ['tail-missing']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 16', {'events': ['arrive_complete', 'cp_blocked', 'depart', 'depart', 'offer', 'cp_clear', 'offer']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'unauthorised-departure', 'refused', 'refused']}), ('sampled regression 30', {'events': ['depart', 'arrive_no_tail', 'depart', 'depart', 'offer', 'depart', 'depart', 'cp_blocked', 'arrive_no_tail', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'unauthorised-departure', 'unauthorised-departure', 'tail-missing', 'tail-missing']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('sampled regression 45', {'events': ['depart', 'depart', 'depart', 'cp_blocked', 'depart', 'offer', 'arrive_complete', 'offer']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'refused']}), ('control 48', {'events': ['cp_clear', 'cp_blocked', 'arrive_no_tail', 'depart', 'offer', 'offer', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'refused', 'refused', 'tail-missing', 'refused']}), ('control 51', {'events': ['cp_clear', 'cp_blocked', 'offer']}, {'state': 'normal', 'alarms': ['refused']})]]\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":"4af5728e8b7a385641b5cba1424fd22dacb0ca9e5790fb30d3c5ce8f63692278","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    state = 'normal'\n    cp = True\n    alarms = []\n    for ev in x['events']:\n        if ev == 'cp_blocked':\n            cp = False\n        elif ev == 'cp_clear':\n            cp = True\n        elif ev == 'offer':\n            if state == 'normal' and cp:\n                state = 'line_clear'\n            else:\n                alarms.append('refused')\n        elif ev == 'depart':\n            if state == 'normal':\n                alarms.append('unauthorised-departure')\n            state = 'train_on_line'\n        elif ev == 'arrive_complete':\n            if state == 'train_on_line':\n                state = 'normal'\n        elif ev == 'arrive_no_tail':\n            alarms.append('tail-missing')\n        elif ev == 'cancel':\n            if state == 'line_clear':\n                state = 'normal'\n    return {'state': state, 'alarms': alarms}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 5', {'events': ['arrive_complete', 'cp_clear', 'offer', 'arrive_no_tail', 'cancel', 'depart', 'depart', 'arrive_complete', 'offer', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'unauthorised-departure', 'unauthorised-departure']}), ('sampled regression 1', {'events': ['cp_blocked', 'depart', 'arrive_no_tail', 'cp_clear', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('control 4', {'events': ['cancel', 'arrive_no_tail', 'offer', 'offer', 'depart', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'tail-missing']}), ('control 7', {'events': ['offer', 'arrive_no_tail', 'arrive_complete', 'cp_clear', 'cp_clear', 'arrive_no_tail']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'tail-missing']}), ('control 10', {'events': ['arrive_complete', 'cp_blocked', 'offer', 'arrive_complete', 'depart']}, {'state': 'train_on_line', 'alarms': ['refused', 'unauthorised-departure']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 29', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'arrive_complete', 'arrive_no_tail', 'cp_clear']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']}), ('control 10', {'events': ['arrive_complete', 'cp_blocked', 'offer', 'arrive_complete', 'depart']}, {'state': 'train_on_line', 'alarms': ['refused', 'unauthorised-departure']}), ('boundary: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 12', {'events': ['depart', 'cp_clear', 'arrive_complete', 'depart', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'unauthorised-departure']}), ('control 15', {'events': ['arrive_complete', 'cp_clear', 'cancel']}, {'state': 'normal', 'alarms': []}), ('control 18', {'events': ['cp_clear', 'depart', 'offer', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 57', {'events': ['cp_blocked', 'depart', 'offer', 'cp_blocked', 'depart', 'arrive_no_tail', 'cancel', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']}), ('sampled regression 17', {'events': ['depart', 'arrive_complete', 'offer', 'arrive_complete', 'depart', 'offer', 'offer', 'depart', 'offer', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused', 'refused', 'unauthorised-departure', 'refused', 'tail-missing']}), ('boundary: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 23', {'events': ['depart', 'cp_blocked', 'arrive_no_tail', 'offer', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'refused']}), ('control 26', {'events': ['cp_clear', 'offer', 'cp_clear', 'cp_clear', 'cp_blocked', 'cp_clear', 'cp_blocked', 'depart']}, {'state': 'train_on_line', 'alarms': []}), ('sampled regression 29', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'arrive_complete', 'arrive_no_tail', 'cp_clear']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 78', {'events': ['cp_blocked', 'arrive_no_tail', 'depart', 'cancel', 'arrive_no_tail', 'depart']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'tail-missing', 'unauthorised-departure']}), ('control 23', {'events': ['depart', 'cp_blocked', 'arrive_no_tail', 'offer', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'refused']}), ('boundary: cancel of line clear', {'events': ['offer', 'cancel', 'offer']}, {'state': 'line_clear', 'alarms': []}), ('control 34', {'events': ['cp_blocked', 'arrive_no_tail', 'cancel', 'cp_clear', 'offer', 'arrive_complete', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing']}), ('control 37', {'events': ['offer', 'depart', 'cp_clear', 'cp_clear']}, {'state': 'train_on_line', 'alarms': []}), ('control 40', {'events': ['arrive_complete', 'cp_clear', 'arrive_no_tail']}, {'state': 'normal', 'alarms': ['tail-missing']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 16', {'events': ['arrive_complete', 'cp_blocked', 'depart', 'depart', 'offer', 'cp_clear', 'offer']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'unauthorised-departure', 'refused', 'refused']}), ('sampled regression 30', {'events': ['depart', 'arrive_no_tail', 'depart', 'depart', 'offer', 'depart', 'depart', 'cp_blocked', 'arrive_no_tail', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'unauthorised-departure', 'unauthorised-departure', 'tail-missing', 'tail-missing']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('sampled regression 45', {'events': ['depart', 'depart', 'depart', 'cp_blocked', 'depart', 'offer', 'arrive_complete', 'offer']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'refused']}), ('control 48', {'events': ['cp_clear', 'cp_blocked', 'arrive_no_tail', 'depart', 'offer', 'offer', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'refused', 'refused', 'tail-missing', 'refused']}), ('control 51', {'events': ['cp_clear', 'cp_blocked', 'offer']}, {'state': 'normal', 'alarms': ['refused']})]]\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":"1b0d9e16406f2828549f90713eadb112e650e90816e2e9408f1cb1002408aea2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    state = 'normal'\n    cp = True\n    alarms = []\n    for ev in x['events']:\n        if ev == 'cp_blocked':\n            cp = False\n        elif ev == 'cp_clear':\n            cp = True\n        elif ev == 'offer':\n            if state == 'normal' and cp:\n                state = 'line_clear'\n            else:\n                alarms.append('refused')\n        elif ev == 'depart':\n            if state != 'line_clear':\n                alarms.append('unauthorised-departure')\n            state = 'train_on_line'\n        elif ev == 'arrive_complete':\n            if state == 'train_on_line':\n                state = 'normal'\n        elif ev == 'arrive_no_tail':\n            alarms.append('tail-missing')\n        elif ev == 'cancel':\n            if state == 'line_clear':\n                state = 'normal'\n    return {'state': state, 'alarms': alarms}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 5', {'events': ['arrive_complete', 'cp_clear', 'offer', 'arrive_no_tail', 'cancel', 'depart', 'depart', 'arrive_complete', 'offer', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'unauthorised-departure', 'unauthorised-departure']}), ('sampled regression 1', {'events': ['cp_blocked', 'depart', 'arrive_no_tail', 'cp_clear', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('control 4', {'events': ['cancel', 'arrive_no_tail', 'offer', 'offer', 'depart', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused', 'tail-missing']}), ('control 7', {'events': ['offer', 'arrive_no_tail', 'arrive_complete', 'cp_clear', 'cp_clear', 'arrive_no_tail']}, {'state': 'line_clear', 'alarms': ['tail-missing', 'tail-missing']}), ('control 10', {'events': ['arrive_complete', 'cp_blocked', 'offer', 'arrive_complete', 'depart']}, {'state': 'train_on_line', 'alarms': ['refused', 'unauthorised-departure']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 29', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'arrive_complete', 'arrive_no_tail', 'cp_clear']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']}), ('control 10', {'events': ['arrive_complete', 'cp_blocked', 'offer', 'arrive_complete', 'depart']}, {'state': 'train_on_line', 'alarms': ['refused', 'unauthorised-departure']}), ('boundary: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 12', {'events': ['depart', 'cp_clear', 'arrive_complete', 'depart', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'unauthorised-departure']}), ('control 15', {'events': ['arrive_complete', 'cp_clear', 'cancel']}, {'state': 'normal', 'alarms': []}), ('control 18', {'events': ['cp_clear', 'depart', 'offer', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 57', {'events': ['cp_blocked', 'depart', 'offer', 'cp_blocked', 'depart', 'arrive_no_tail', 'cancel', 'cp_blocked']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']}), ('sampled regression 17', {'events': ['depart', 'arrive_complete', 'offer', 'arrive_complete', 'depart', 'offer', 'offer', 'depart', 'offer', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'refused', 'refused', 'unauthorised-departure', 'refused', 'tail-missing']}), ('boundary: train arrives without tail lamp', {'events': ['offer', 'depart', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'refused']}), ('control 23', {'events': ['depart', 'cp_blocked', 'arrive_no_tail', 'offer', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'refused']}), ('control 26', {'events': ['cp_clear', 'offer', 'cp_clear', 'cp_clear', 'cp_blocked', 'cp_clear', 'cp_blocked', 'depart']}, {'state': 'train_on_line', 'alarms': []}), ('sampled regression 29', {'events': ['arrive_complete', 'depart', 'offer', 'depart', 'arrive_complete', 'arrive_no_tail', 'cp_clear']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'refused', 'unauthorised-departure', 'tail-missing']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 78', {'events': ['cp_blocked', 'arrive_no_tail', 'depart', 'cancel', 'arrive_no_tail', 'depart']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'tail-missing', 'unauthorised-departure']}), ('control 23', {'events': ['depart', 'cp_blocked', 'arrive_no_tail', 'offer', 'cp_clear']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'refused']}), ('boundary: cancel of line clear', {'events': ['offer', 'cancel', 'offer']}, {'state': 'line_clear', 'alarms': []}), ('control 34', {'events': ['cp_blocked', 'arrive_no_tail', 'cancel', 'cp_clear', 'offer', 'arrive_complete', 'cp_blocked']}, {'state': 'line_clear', 'alarms': ['tail-missing']}), ('control 37', {'events': ['offer', 'depart', 'cp_clear', 'cp_clear']}, {'state': 'train_on_line', 'alarms': []}), ('control 40', {'events': ['arrive_complete', 'cp_clear', 'arrive_no_tail']}, {'state': 'normal', 'alarms': ['tail-missing']})], [('regression: second train into occupied block', {'events': ['offer', 'depart', 'depart']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure']}), ('boundary: departure without offer', {'events': ['depart', 'arrive_complete']}, {'state': 'normal', 'alarms': ['unauthorised-departure']}), ('sampled regression 16', {'events': ['arrive_complete', 'cp_blocked', 'depart', 'depart', 'offer', 'cp_clear', 'offer']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'unauthorised-departure', 'refused', 'refused']}), ('sampled regression 30', {'events': ['depart', 'arrive_no_tail', 'depart', 'depart', 'offer', 'depart', 'depart', 'cp_blocked', 'arrive_no_tail', 'arrive_no_tail']}, {'state': 'train_on_line', 'alarms': ['unauthorised-departure', 'tail-missing', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'unauthorised-departure', 'unauthorised-departure', 'tail-missing', 'tail-missing']}), ('boundary: offer with clearing point fouled', {'events': ['cp_blocked', 'offer', 'cp_clear', 'offer']}, {'state': 'line_clear', 'alarms': ['refused']}), ('sampled regression 45', {'events': ['depart', 'depart', 'depart', 'cp_blocked', 'depart', 'offer', 'arrive_complete', 'offer']}, {'state': 'normal', 'alarms': ['unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'unauthorised-departure', 'refused', 'refused']}), ('control 48', {'events': ['cp_clear', 'cp_blocked', 'arrive_no_tail', 'depart', 'offer', 'offer', 'arrive_no_tail', 'offer']}, {'state': 'train_on_line', 'alarms': ['tail-missing', 'unauthorised-departure', 'refused', 'refused', 'tail-missing', 'refused']}), ('control 51', {'events': ['cp_clear', 'cp_blocked', 'offer']}, {'state': 'normal', 'alarms': ['refused']})]]\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-absolute-block-departure-authority","generated_at":"2026-09-29T14:47:49.272898+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":"Alarm on any departure that was not preceded by line clear.","root_cause":"Only a departure from the normal state is treated as unauthorised.","sha256":"a20761a1967a5e8aa0575a03a4a386a24b622d3a0fa9b06add1522ec0ccb347e","title":"Absolute block bell-code working: departure authority · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.853,"exit_code":1,"observations":[{"actual":{"alarms":["unauthorised-departure"],"state":"train_on_line"},"check":"regression: second train into occupied block","expected":{"alarms":["unauthorised-departure"],"state":"train_on_line"},"passed":true},{"actual":{"alarms":[],"state":"normal"},"check":"boundary: departure without offer","expected":{"alarms":["unauthorised-departure"],"state":"normal"},"passed":false},{"actual":{"alarms":["tail-missing","unauthorised-departure"],"state":"line_clear"},"check":"sampled regression 5","expected":{"alarms":["tail-missing","unauthorised-departure","unauthorised-departure"],"state":"line_clear"},"passed":false},{"actual":{"alarms":["tail-missing","unauthorised-departure"],"state":"train_on_line"},"check":"sampled regression 1","expected":{"alarms":["unauthorised-departure","tail-missing","unauthorised-departure"],"state":"train_on_line"},"passed":false},{"actual":{"alarms":["refused"],"state":"line_clear"},"check":"boundary: offer with clearing point fouled","expected":{"alarms":["refused"],"state":"line_clear"},"passed":true},{"actual":{"alarms":["tail-missing","refused","tail-missing"],"state":"train_on_line"},"check":"control 4","expected":{"alarms":["tail-missing","refused","tail-missing"],"state":"train_on_line"},"passed":true},{"actual":{"alarms":["tail-missing","tail-missing"],"state":"line_clear"},"check":"control 7","expected":{"alarms":["tail-missing","tail-missing"],"state":"line_clear"},"passed":true},{"actual":{"alarms":["refused"],"state":"train_on_line"},"check":"control 10","expected":{"alarms":["refused","unauthorised-departure"],"state":"train_on_line"},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: second train into occupied block\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\"]}, \"passed\": true}, {\"check\": \"boundary: departure without offer\", \"actual\": {\"state\": \"normal\", \"alarms\": []}, \"expected\": {\"state\": \"normal\", \"alarms\": [\"unauthorised-departure\"]}, \"passed\": false}, {\"check\": \"sampled regression 5\", \"actual\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"unauthorised-departure\"]}, \"expected\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"unauthorised-departure\", \"unauthorised-departure\"]}, \"passed\": false}, {\"check\": \"sampled regression 1\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"tail-missing\", \"unauthorised-departure\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\", \"tail-missing\", \"unauthorised-departure\"]}, \"passed\": false}, {\"check\": \"boundary: offer with clearing point fouled\", \"actual\": {\"state\": \"line_clear\", \"alarms\": [\"refused\"]}, \"expected\": {\"state\": \"line_clear\", \"alarms\": [\"refused\"]}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"tail-missing\", \"refused\", \"tail-missing\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"tail-missing\", \"refused\", \"tail-missing\"]}, \"passed\": true}, {\"check\": \"control 7\", \"actual\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"tail-missing\"]}, \"expected\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"tail-missing\"]}, \"passed\": true}, {\"check\": \"control 10\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"refused\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"refused\", \"unauthorised-departure\"]}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.693,"exit_code":1,"observations":[{"actual":{"alarms":[],"state":"train_on_line"},"check":"regression: second train into occupied block","expected":{"alarms":["unauthorised-departure"],"state":"train_on_line"},"passed":false},{"actual":{"alarms":["unauthorised-departure"],"state":"normal"},"check":"boundary: departure without offer","expected":{"alarms":["unauthorised-departure"],"state":"normal"},"passed":true},{"actual":{"alarms":["tail-missing","unauthorised-departure"],"state":"line_clear"},"check":"sampled regression 5","expected":{"alarms":["tail-missing","unauthorised-departure","unauthorised-departure"],"state":"line_clear"},"passed":false},{"actual":{"alarms":["unauthorised-departure","tail-missing"],"state":"train_on_line"},"check":"sampled regression 1","expected":{"alarms":["unauthorised-departure","tail-missing","unauthorised-departure"],"state":"train_on_line"},"passed":false},{"actual":{"alarms":["refused"],"state":"line_clear"},"check":"boundary: offer with clearing point fouled","expected":{"alarms":["refused"],"state":"line_clear"},"passed":true},{"actual":{"alarms":["tail-missing","refused","tail-missing"],"state":"train_on_line"},"check":"control 4","expected":{"alarms":["tail-missing","refused","tail-missing"],"state":"train_on_line"},"passed":true},{"actual":{"alarms":["tail-missing","tail-missing"],"state":"line_clear"},"check":"control 7","expected":{"alarms":["tail-missing","tail-missing"],"state":"line_clear"},"passed":true},{"actual":{"alarms":["refused","unauthorised-departure"],"state":"train_on_line"},"check":"control 10","expected":{"alarms":["refused","unauthorised-departure"],"state":"train_on_line"},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: second train into occupied block\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": []}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\"]}, \"passed\": false}, {\"check\": \"boundary: departure without offer\", \"actual\": {\"state\": \"normal\", \"alarms\": [\"unauthorised-departure\"]}, \"expected\": {\"state\": \"normal\", \"alarms\": [\"unauthorised-departure\"]}, \"passed\": true}, {\"check\": \"sampled regression 5\", \"actual\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"unauthorised-departure\"]}, \"expected\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"unauthorised-departure\", \"unauthorised-departure\"]}, \"passed\": false}, {\"check\": \"sampled regression 1\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\", \"tail-missing\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\", \"tail-missing\", \"unauthorised-departure\"]}, \"passed\": false}, {\"check\": \"boundary: offer with clearing point fouled\", \"actual\": {\"state\": \"line_clear\", \"alarms\": [\"refused\"]}, \"expected\": {\"state\": \"line_clear\", \"alarms\": [\"refused\"]}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"tail-missing\", \"refused\", \"tail-missing\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"tail-missing\", \"refused\", \"tail-missing\"]}, \"passed\": true}, {\"check\": \"control 7\", \"actual\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"tail-missing\"]}, \"expected\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"tail-missing\"]}, \"passed\": true}, {\"check\": \"control 10\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"refused\", \"unauthorised-departure\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"refused\", \"unauthorised-departure\"]}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.104,"exit_code":0,"observations":[{"actual":{"alarms":["unauthorised-departure"],"state":"train_on_line"},"check":"regression: second train into occupied block","expected":{"alarms":["unauthorised-departure"],"state":"train_on_line"},"passed":true},{"actual":{"alarms":["unauthorised-departure"],"state":"normal"},"check":"boundary: departure without offer","expected":{"alarms":["unauthorised-departure"],"state":"normal"},"passed":true},{"actual":{"alarms":["tail-missing","unauthorised-departure","unauthorised-departure"],"state":"line_clear"},"check":"sampled regression 5","expected":{"alarms":["tail-missing","unauthorised-departure","unauthorised-departure"],"state":"line_clear"},"passed":true},{"actual":{"alarms":["unauthorised-departure","tail-missing","unauthorised-departure"],"state":"train_on_line"},"check":"sampled regression 1","expected":{"alarms":["unauthorised-departure","tail-missing","unauthorised-departure"],"state":"train_on_line"},"passed":true},{"actual":{"alarms":["refused"],"state":"line_clear"},"check":"boundary: offer with clearing point fouled","expected":{"alarms":["refused"],"state":"line_clear"},"passed":true},{"actual":{"alarms":["tail-missing","refused","tail-missing"],"state":"train_on_line"},"check":"control 4","expected":{"alarms":["tail-missing","refused","tail-missing"],"state":"train_on_line"},"passed":true},{"actual":{"alarms":["tail-missing","tail-missing"],"state":"line_clear"},"check":"control 7","expected":{"alarms":["tail-missing","tail-missing"],"state":"line_clear"},"passed":true},{"actual":{"alarms":["refused","unauthorised-departure"],"state":"train_on_line"},"check":"control 10","expected":{"alarms":["refused","unauthorised-departure"],"state":"train_on_line"},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: second train into occupied block\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\"]}, \"passed\": true}, {\"check\": \"boundary: departure without offer\", \"actual\": {\"state\": \"normal\", \"alarms\": [\"unauthorised-departure\"]}, \"expected\": {\"state\": \"normal\", \"alarms\": [\"unauthorised-departure\"]}, \"passed\": true}, {\"check\": \"sampled regression 5\", \"actual\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"unauthorised-departure\", \"unauthorised-departure\"]}, \"expected\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"unauthorised-departure\", \"unauthorised-departure\"]}, \"passed\": true}, {\"check\": \"sampled regression 1\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\", \"tail-missing\", \"unauthorised-departure\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"unauthorised-departure\", \"tail-missing\", \"unauthorised-departure\"]}, \"passed\": true}, {\"check\": \"boundary: offer with clearing point fouled\", \"actual\": {\"state\": \"line_clear\", \"alarms\": [\"refused\"]}, \"expected\": {\"state\": \"line_clear\", \"alarms\": [\"refused\"]}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"tail-missing\", \"refused\", \"tail-missing\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"tail-missing\", \"refused\", \"tail-missing\"]}, \"passed\": true}, {\"check\": \"control 7\", \"actual\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"tail-missing\"]}, \"expected\": {\"state\": \"line_clear\", \"alarms\": [\"tail-missing\", \"tail-missing\"]}, \"passed\": true}, {\"check\": \"control 10\", \"actual\": {\"state\": \"train_on_line\", \"alarms\": [\"refused\", \"unauthorised-departure\"]}, \"expected\": {\"state\": \"train_on_line\", \"alarms\": [\"refused\", \"unauthorised-departure\"]}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}