{"abstract":"A train approaching a clear platform is refused a main aspect because it has not stood at the signal.","category":"Railway interlocking logic","checks":8,"contract":"Without a route the answer is none. With the section ahead clear the main aspect is given. Into an occupied section a call-on is given only if the train has stood at the signal for at least 120 s and is stationary (0 km/h), the gap to the standing train is at least 20 m and that train is not moving; otherwise none.","evaluation_group":"w2-railway_interlocking_logic-call-on-permissive","failed_approach":"Requiring the standing time for a main aspect still holds a running train at danger.","family":"w2-railway_interlocking_logic-call-on-permissive-main-aspect-precedence","id":"FA-67216","implementations":{"attempt":{"sha256":"8a5affa390e5737b0951baf7ec7ef2c7ea5996dabd0930076ec84b972a1c8bc1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    if not x['route_set']:\n        return 'none'\n    if not x['ahead_occupied'] and x['stand_s'] >= 120:\n        return 'main'\n    if x['stand_s'] < 120 or x['speed_kmh'] > 0:\n        return 'none'\n    if x['gap_m'] < 20:\n        return 'none'\n    if x['platform_train_moving']:\n        return 'none'\n    return 'call-on'\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 24', {'route_set': True, 'ahead_occupied': False, 'stand_s': 30, 'speed_kmh': 3, 'gap_m': 20, 'platform_train_moving': False}, 'main'), ('sampled regression 2', {'route_set': True, 'ahead_occupied': False, 'stand_s': 30, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': True}, 'main'), ('boundary: stood exactly two minutes', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'call-on'), ('boundary: stood one second short', {'route_set': True, 'ahead_occupied': True, 'stand_s': 119, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('control 1', {'route_set': True, 'ahead_occupied': False, 'stand_s': 300, 'speed_kmh': 0, 'gap_m': 60, 'platform_train_moving': False}, 'main'), ('control 4', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 3, 'gap_m': 200, 'platform_train_moving': True}, 'none'), ('control 7', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 3, 'gap_m': 19, 'platform_train_moving': False}, 'none')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 51', {'route_set': True, 'ahead_occupied': False, 'stand_s': 300, 'speed_kmh': 3, 'gap_m': 20, 'platform_train_moving': False}, 'main'), ('sampled regression 50', {'route_set': True, 'ahead_occupied': False, 'stand_s': 119, 'speed_kmh': 10, 'gap_m': 21, 'platform_train_moving': False}, 'main'), ('boundary: creeping at walking pace', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 3, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('boundary: rolling at call-on speed', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 12, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('control 12', {'route_set': True, 'ahead_occupied': True, 'stand_s': 300, 'speed_kmh': 0, 'gap_m': 5, 'platform_train_moving': False}, 'none'), ('control 15', {'route_set': True, 'ahead_occupied': True, 'stand_s': 119, 'speed_kmh': 20, 'gap_m': 19, 'platform_train_moving': True}, 'none'), ('control 18', {'route_set': True, 'ahead_occupied': True, 'stand_s': 0, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': True}, 'none')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 75', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 3, 'gap_m': 200, 'platform_train_moving': True}, 'main'), ('boundary: platform train moving far away', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 200, 'platform_train_moving': True}, 'none'), ('boundary: platform train moving close by', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 30, 'platform_train_moving': True}, 'none'), ('boundary: gap exactly at the minimum', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': False}, 'call-on'), ('control 23', {'route_set': True, 'ahead_occupied': True, 'stand_s': 30, 'speed_kmh': 15, 'gap_m': 200, 'platform_train_moving': False}, 'none'), ('control 26', {'route_set': False, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 19, 'platform_train_moving': False}, 'none'), ('control 29', {'route_set': True, 'ahead_occupied': True, 'stand_s': 30, 'speed_kmh': 20, 'gap_m': 19, 'platform_train_moving': False}, 'none')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 44', {'route_set': True, 'ahead_occupied': False, 'stand_s': 121, 'speed_kmh': 10, 'gap_m': 200, 'platform_train_moving': False}, 'main'), ('sampled regression 36', {'route_set': True, 'ahead_occupied': False, 'stand_s': 119, 'speed_kmh': 20, 'gap_m': 5, 'platform_train_moving': True}, 'main'), ('boundary: gap exactly at the minimum', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': False}, 'call-on'), ('boundary: no route', {'route_set': False, 'ahead_occupied': False, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('control 34', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 20, 'gap_m': 60, 'platform_train_moving': False}, 'none'), ('control 37', {'route_set': True, 'ahead_occupied': True, 'stand_s': 0, 'speed_kmh': 20, 'gap_m': 19, 'platform_train_moving': False}, 'none'), ('control 40', {'route_set': True, 'ahead_occupied': True, 'stand_s': 121, 'speed_kmh': 0, 'gap_m': 200, 'platform_train_moving': False}, 'call-on')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 71', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 3, 'gap_m': 200, 'platform_train_moving': False}, 'main'), ('sampled regression 57', {'route_set': True, 'ahead_occupied': False, 'stand_s': 30, 'speed_kmh': 10, 'gap_m': 21, 'platform_train_moving': False}, 'main'), ('boundary: no route', {'route_set': False, 'ahead_occupied': False, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('boundary: stood exactly two minutes', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'call-on'), ('control 45', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 5, 'platform_train_moving': False}, 'none'), ('control 48', {'route_set': True, 'ahead_occupied': True, 'stand_s': 30, 'speed_kmh': 20, 'gap_m': 200, 'platform_train_moving': False}, 'none'), ('sampled regression 51', {'route_set': True, 'ahead_occupied': False, 'stand_s': 300, 'speed_kmh': 3, 'gap_m': 20, 'platform_train_moving': False}, 'main')]]\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":"8121851613eeae46d988ef0ba6e14c28c5511eb3185b1cb9e0b5dbdfb42b45ad","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    if not x['route_set']:\n        return 'none'\n    if x['stand_s'] < 120 or x['speed_kmh'] > 0:\n        return 'none'\n    if not x['ahead_occupied']:\n        return 'main'\n    if x['gap_m'] < 20:\n        return 'none'\n    if x['platform_train_moving']:\n        return 'none'\n    return 'call-on'\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 24', {'route_set': True, 'ahead_occupied': False, 'stand_s': 30, 'speed_kmh': 3, 'gap_m': 20, 'platform_train_moving': False}, 'main'), ('sampled regression 2', {'route_set': True, 'ahead_occupied': False, 'stand_s': 30, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': True}, 'main'), ('boundary: stood exactly two minutes', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'call-on'), ('boundary: stood one second short', {'route_set': True, 'ahead_occupied': True, 'stand_s': 119, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('control 1', {'route_set': True, 'ahead_occupied': False, 'stand_s': 300, 'speed_kmh': 0, 'gap_m': 60, 'platform_train_moving': False}, 'main'), ('control 4', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 3, 'gap_m': 200, 'platform_train_moving': True}, 'none'), ('control 7', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 3, 'gap_m': 19, 'platform_train_moving': False}, 'none')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 51', {'route_set': True, 'ahead_occupied': False, 'stand_s': 300, 'speed_kmh': 3, 'gap_m': 20, 'platform_train_moving': False}, 'main'), ('sampled regression 50', {'route_set': True, 'ahead_occupied': False, 'stand_s': 119, 'speed_kmh': 10, 'gap_m': 21, 'platform_train_moving': False}, 'main'), ('boundary: creeping at walking pace', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 3, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('boundary: rolling at call-on speed', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 12, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('control 12', {'route_set': True, 'ahead_occupied': True, 'stand_s': 300, 'speed_kmh': 0, 'gap_m': 5, 'platform_train_moving': False}, 'none'), ('control 15', {'route_set': True, 'ahead_occupied': True, 'stand_s': 119, 'speed_kmh': 20, 'gap_m': 19, 'platform_train_moving': True}, 'none'), ('control 18', {'route_set': True, 'ahead_occupied': True, 'stand_s': 0, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': True}, 'none')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 75', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 3, 'gap_m': 200, 'platform_train_moving': True}, 'main'), ('boundary: platform train moving far away', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 200, 'platform_train_moving': True}, 'none'), ('boundary: platform train moving close by', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 30, 'platform_train_moving': True}, 'none'), ('boundary: gap exactly at the minimum', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': False}, 'call-on'), ('control 23', {'route_set': True, 'ahead_occupied': True, 'stand_s': 30, 'speed_kmh': 15, 'gap_m': 200, 'platform_train_moving': False}, 'none'), ('control 26', {'route_set': False, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 19, 'platform_train_moving': False}, 'none'), ('control 29', {'route_set': True, 'ahead_occupied': True, 'stand_s': 30, 'speed_kmh': 20, 'gap_m': 19, 'platform_train_moving': False}, 'none')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 44', {'route_set': True, 'ahead_occupied': False, 'stand_s': 121, 'speed_kmh': 10, 'gap_m': 200, 'platform_train_moving': False}, 'main'), ('sampled regression 36', {'route_set': True, 'ahead_occupied': False, 'stand_s': 119, 'speed_kmh': 20, 'gap_m': 5, 'platform_train_moving': True}, 'main'), ('boundary: gap exactly at the minimum', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': False}, 'call-on'), ('boundary: no route', {'route_set': False, 'ahead_occupied': False, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('control 34', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 20, 'gap_m': 60, 'platform_train_moving': False}, 'none'), ('control 37', {'route_set': True, 'ahead_occupied': True, 'stand_s': 0, 'speed_kmh': 20, 'gap_m': 19, 'platform_train_moving': False}, 'none'), ('control 40', {'route_set': True, 'ahead_occupied': True, 'stand_s': 121, 'speed_kmh': 0, 'gap_m': 200, 'platform_train_moving': False}, 'call-on')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 71', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 3, 'gap_m': 200, 'platform_train_moving': False}, 'main'), ('sampled regression 57', {'route_set': True, 'ahead_occupied': False, 'stand_s': 30, 'speed_kmh': 10, 'gap_m': 21, 'platform_train_moving': False}, 'main'), ('boundary: no route', {'route_set': False, 'ahead_occupied': False, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('boundary: stood exactly two minutes', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'call-on'), ('control 45', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 5, 'platform_train_moving': False}, 'none'), ('control 48', {'route_set': True, 'ahead_occupied': True, 'stand_s': 30, 'speed_kmh': 20, 'gap_m': 200, 'platform_train_moving': False}, 'none'), ('sampled regression 51', {'route_set': True, 'ahead_occupied': False, 'stand_s': 300, 'speed_kmh': 3, 'gap_m': 20, 'platform_train_moving': False}, 'main')]]\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":"59c35bb423f04ecbd38800cf82bbda37394b18bf663c2d2b767b5b8a354b06f2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    if not x['route_set']:\n        return 'none'\n    if not x['ahead_occupied']:\n        return 'main'\n    if x['stand_s'] < 120 or x['speed_kmh'] > 0:\n        return 'none'\n    if x['gap_m'] < 20:\n        return 'none'\n    if x['platform_train_moving']:\n        return 'none'\n    return 'call-on'\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 24', {'route_set': True, 'ahead_occupied': False, 'stand_s': 30, 'speed_kmh': 3, 'gap_m': 20, 'platform_train_moving': False}, 'main'), ('sampled regression 2', {'route_set': True, 'ahead_occupied': False, 'stand_s': 30, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': True}, 'main'), ('boundary: stood exactly two minutes', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'call-on'), ('boundary: stood one second short', {'route_set': True, 'ahead_occupied': True, 'stand_s': 119, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('control 1', {'route_set': True, 'ahead_occupied': False, 'stand_s': 300, 'speed_kmh': 0, 'gap_m': 60, 'platform_train_moving': False}, 'main'), ('control 4', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 3, 'gap_m': 200, 'platform_train_moving': True}, 'none'), ('control 7', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 3, 'gap_m': 19, 'platform_train_moving': False}, 'none')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 51', {'route_set': True, 'ahead_occupied': False, 'stand_s': 300, 'speed_kmh': 3, 'gap_m': 20, 'platform_train_moving': False}, 'main'), ('sampled regression 50', {'route_set': True, 'ahead_occupied': False, 'stand_s': 119, 'speed_kmh': 10, 'gap_m': 21, 'platform_train_moving': False}, 'main'), ('boundary: creeping at walking pace', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 3, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('boundary: rolling at call-on speed', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 12, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('control 12', {'route_set': True, 'ahead_occupied': True, 'stand_s': 300, 'speed_kmh': 0, 'gap_m': 5, 'platform_train_moving': False}, 'none'), ('control 15', {'route_set': True, 'ahead_occupied': True, 'stand_s': 119, 'speed_kmh': 20, 'gap_m': 19, 'platform_train_moving': True}, 'none'), ('control 18', {'route_set': True, 'ahead_occupied': True, 'stand_s': 0, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': True}, 'none')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 75', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 3, 'gap_m': 200, 'platform_train_moving': True}, 'main'), ('boundary: platform train moving far away', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 200, 'platform_train_moving': True}, 'none'), ('boundary: platform train moving close by', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 30, 'platform_train_moving': True}, 'none'), ('boundary: gap exactly at the minimum', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': False}, 'call-on'), ('control 23', {'route_set': True, 'ahead_occupied': True, 'stand_s': 30, 'speed_kmh': 15, 'gap_m': 200, 'platform_train_moving': False}, 'none'), ('control 26', {'route_set': False, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 19, 'platform_train_moving': False}, 'none'), ('control 29', {'route_set': True, 'ahead_occupied': True, 'stand_s': 30, 'speed_kmh': 20, 'gap_m': 19, 'platform_train_moving': False}, 'none')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 44', {'route_set': True, 'ahead_occupied': False, 'stand_s': 121, 'speed_kmh': 10, 'gap_m': 200, 'platform_train_moving': False}, 'main'), ('sampled regression 36', {'route_set': True, 'ahead_occupied': False, 'stand_s': 119, 'speed_kmh': 20, 'gap_m': 5, 'platform_train_moving': True}, 'main'), ('boundary: gap exactly at the minimum', {'route_set': True, 'ahead_occupied': True, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 20, 'platform_train_moving': False}, 'call-on'), ('boundary: no route', {'route_set': False, 'ahead_occupied': False, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('control 34', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 20, 'gap_m': 60, 'platform_train_moving': False}, 'none'), ('control 37', {'route_set': True, 'ahead_occupied': True, 'stand_s': 0, 'speed_kmh': 20, 'gap_m': 19, 'platform_train_moving': False}, 'none'), ('control 40', {'route_set': True, 'ahead_occupied': True, 'stand_s': 121, 'speed_kmh': 0, 'gap_m': 200, 'platform_train_moving': False}, 'call-on')], [('regression: clear platform for a moving train', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 40, 'gap_m': 100, 'platform_train_moving': False}, 'main'), ('sampled regression 71', {'route_set': True, 'ahead_occupied': False, 'stand_s': 0, 'speed_kmh': 3, 'gap_m': 200, 'platform_train_moving': False}, 'main'), ('sampled regression 57', {'route_set': True, 'ahead_occupied': False, 'stand_s': 30, 'speed_kmh': 10, 'gap_m': 21, 'platform_train_moving': False}, 'main'), ('boundary: no route', {'route_set': False, 'ahead_occupied': False, 'stand_s': 200, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'none'), ('boundary: stood exactly two minutes', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 100, 'platform_train_moving': False}, 'call-on'), ('control 45', {'route_set': True, 'ahead_occupied': True, 'stand_s': 120, 'speed_kmh': 0, 'gap_m': 5, 'platform_train_moving': False}, 'none'), ('control 48', {'route_set': True, 'ahead_occupied': True, 'stand_s': 30, 'speed_kmh': 20, 'gap_m': 200, 'platform_train_moving': False}, 'none'), ('sampled regression 51', {'route_set': True, 'ahead_occupied': False, 'stand_s': 300, 'speed_kmh': 3, 'gap_m': 20, 'platform_train_moving': False}, 'main')]]\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-call-on-permissive-main-aspect-precedence","generated_at":"2026-09-29T14:47:50.706889+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":"Offer the main aspect as soon as the section ahead is clear.","root_cause":"The call-on standing checks run before the test for a clear section ahead.","sha256":"026d515cb3da117e7b57b7379cf283f675ebf9bd56b8001545342a9141a80c2f","title":"Call-on permissive move authorisation: main aspect precedence · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.627,"exit_code":1,"observations":[{"actual":"none","check":"regression: clear platform for a moving train","expected":"main","passed":false},{"actual":"none","check":"sampled regression 24","expected":"main","passed":false},{"actual":"none","check":"sampled regression 2","expected":"main","passed":false},{"actual":"call-on","check":"boundary: stood exactly two minutes","expected":"call-on","passed":true},{"actual":"none","check":"boundary: stood one second short","expected":"none","passed":true},{"actual":"main","check":"control 1","expected":"main","passed":true},{"actual":"none","check":"control 4","expected":"none","passed":true},{"actual":"none","check":"control 7","expected":"none","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: clear platform for a moving train\", \"actual\": \"none\", \"expected\": \"main\", \"passed\": false}, {\"check\": \"sampled regression 24\", \"actual\": \"none\", \"expected\": \"main\", \"passed\": false}, {\"check\": \"sampled regression 2\", \"actual\": \"none\", \"expected\": \"main\", \"passed\": false}, {\"check\": \"boundary: stood exactly two minutes\", \"actual\": \"call-on\", \"expected\": \"call-on\", \"passed\": true}, {\"check\": \"boundary: stood one second short\", \"actual\": \"none\", \"expected\": \"none\", \"passed\": true}, {\"check\": \"control 1\", \"actual\": \"main\", \"expected\": \"main\", \"passed\": true}, {\"check\": \"control 4\", \"actual\": \"none\", \"expected\": \"none\", \"passed\": true}, {\"check\": \"control 7\", \"actual\": \"none\", \"expected\": \"none\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.087,"exit_code":1,"observations":[{"actual":"none","check":"regression: clear platform for a moving train","expected":"main","passed":false},{"actual":"none","check":"sampled regression 24","expected":"main","passed":false},{"actual":"none","check":"sampled regression 2","expected":"main","passed":false},{"actual":"call-on","check":"boundary: stood exactly two minutes","expected":"call-on","passed":true},{"actual":"none","check":"boundary: stood one second short","expected":"none","passed":true},{"actual":"main","check":"control 1","expected":"main","passed":true},{"actual":"none","check":"control 4","expected":"none","passed":true},{"actual":"none","check":"control 7","expected":"none","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: clear platform for a moving train\", \"actual\": \"none\", \"expected\": \"main\", \"passed\": false}, {\"check\": \"sampled regression 24\", \"actual\": \"none\", \"expected\": \"main\", \"passed\": false}, {\"check\": \"sampled regression 2\", \"actual\": \"none\", \"expected\": \"main\", \"passed\": false}, {\"check\": \"boundary: stood exactly two minutes\", \"actual\": \"call-on\", \"expected\": \"call-on\", \"passed\": true}, {\"check\": \"boundary: stood one second short\", \"actual\": \"none\", \"expected\": \"none\", \"passed\": true}, {\"check\": \"control 1\", \"actual\": \"main\", \"expected\": \"main\", \"passed\": true}, {\"check\": \"control 4\", \"actual\": \"none\", \"expected\": \"none\", \"passed\": true}, {\"check\": \"control 7\", \"actual\": \"none\", \"expected\": \"none\", \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.344,"exit_code":0,"observations":[{"actual":"main","check":"regression: clear platform for a moving train","expected":"main","passed":true},{"actual":"main","check":"sampled regression 24","expected":"main","passed":true},{"actual":"main","check":"sampled regression 2","expected":"main","passed":true},{"actual":"call-on","check":"boundary: stood exactly two minutes","expected":"call-on","passed":true},{"actual":"none","check":"boundary: stood one second short","expected":"none","passed":true},{"actual":"main","check":"control 1","expected":"main","passed":true},{"actual":"none","check":"control 4","expected":"none","passed":true},{"actual":"none","check":"control 7","expected":"none","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: clear platform for a moving train\", \"actual\": \"main\", \"expected\": \"main\", \"passed\": true}, {\"check\": \"sampled regression 24\", \"actual\": \"main\", \"expected\": \"main\", \"passed\": true}, {\"check\": \"sampled regression 2\", \"actual\": \"main\", \"expected\": \"main\", \"passed\": true}, {\"check\": \"boundary: stood exactly two minutes\", \"actual\": \"call-on\", \"expected\": \"call-on\", \"passed\": true}, {\"check\": \"boundary: stood one second short\", \"actual\": \"none\", \"expected\": \"none\", \"passed\": true}, {\"check\": \"control 1\", \"actual\": \"main\", \"expected\": \"main\", \"passed\": true}, {\"check\": \"control 4\", \"actual\": \"none\", \"expected\": \"none\", \"passed\": true}, {\"check\": \"control 7\", \"actual\": \"none\", \"expected\": \"none\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}