{"abstract":"The overlap is released while the train stands in it.","category":"Railway interlocking logic","checks":8,"contract":"The overlap beyond a signal is locked. The release timer starts at the first berth occupation; the overlap is released when an event time reaches start + timer_s while the train has not overrun into the overlap. A berth clear before release cancels the timer (a later occupation restarts it); after release it has no effect. Entering the overlap before release marks an overrun and blocks release. query appends locked or released.","evaluation_group":"w2-railway_interlocking_logic-overlap-timed-release","failed_approach":"Only counting overruns when no timer is running misses the train that stopped briefly and rolled on.","family":"w2-railway_interlocking_logic-overlap-timed-release-overrun-blocking","id":"FA-67036","implementations":{"attempt":{"sha256":"9aa08e1aa07c9338eae7585c1f8c38709398fcbfdce1741c00a107473199d714","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    T = x['timer_s']\n    start = None\n    overran = False\n    released = False\n    out = []\n    for t, ev in x['events']:\n        if start is not None and not released and not overran and t - start >= T:\n            released = True\n        if ev == 'berth_occ':\n            if start is None:\n                start = t\n        elif ev == 'berth_clr':\n            if not released:\n                start = None\n        elif ev == 'overlap_occ':\n            if start is None:\n                overran = True\n        elif ev == 'query':\n            out.append('released' if released else 'locked')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 6', {'timer_s': 120, 'events': [[90, 'query'], [95, 'berth_clr'], [100, 'overlap_occ'], [130, 'berth_occ'], [130, 'overlap_occ'], [220, 'query'], [280, 'berth_clr'], [285, 'query'], [345, 'berth_clr'], [405, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 11', {'timer_s': 120, 'events': [[5, 'berth_occ'], [65, 'overlap_occ'], [125, 'query'], [185, 'query']]}, ['locked', 'locked']), ('boundary: expiry exactly on time', {'timer_s': 60, 'events': [[10, 'berth_occ'], [70, 'query']]}, ['released']), ('boundary: track circuit bob restarts nothing', {'timer_s': 60, 'events': [[0, 'berth_occ'], [40, 'berth_occ'], [60, 'query']]}, ['released']), ('sampled regression 1', {'timer_s': 45, 'events': [[5, 'overlap_occ'], [35, 'query'], [65, 'berth_clr'], [125, 'query'], [170, 'query'], [170, 'berth_clr'], [230, 'berth_occ'], [350, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('control 4', {'timer_s': 90, 'events': [[60, 'berth_clr'], [150, 'berth_occ'], [155, 'berth_occ'], [155, 'query']]}, ['locked']), ('control 7', {'timer_s': 45, 'events': [[5, 'query'], [65, 'overlap_occ'], [110, 'overlap_occ'], [170, 'query']]}, ['locked', 'locked'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 20', {'timer_s': 90, 'events': [[5, 'overlap_occ'], [95, 'overlap_occ'], [100, 'overlap_occ'], [160, 'query'], [220, 'berth_occ'], [340, 'query']]}, ['locked', 'locked']), ('sampled regression 42', {'timer_s': 120, 'events': [[90, 'berth_occ'], [180, 'overlap_occ'], [240, 'berth_clr'], [330, 'query'], [390, 'query']]}, ['locked', 'locked']), ('boundary: train stops at time zero', {'timer_s': 60, 'events': [[0, 'berth_occ'], [30, 'berth_occ'], [60, 'query']]}, ['released']), ('boundary: train leaves before expiry', {'timer_s': 60, 'events': [[0, 'berth_occ'], [30, 'berth_clr'], [90, 'query']]}, ['locked']), ('control 12', {'timer_s': 120, 'events': [[60, 'berth_occ'], [65, 'query'], [70, 'query'], [70, 'query'], [75, 'berth_occ'], [80, 'berth_occ'], [125, 'berth_clr'], [125, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('control 15', {'timer_s': 120, 'events': [[60, 'berth_clr'], [105, 'berth_clr'], [110, 'berth_clr'], [115, 'berth_clr'], [175, 'query'], [175, 'berth_clr'], [235, 'query'], [265, 'overlap_occ'], [270, 'berth_clr'], [390, 'query']]}, ['locked', 'locked', 'locked']), ('control 18', {'timer_s': 90, 'events': [[0, 'query'], [0, 'query'], [30, 'berth_occ'], [120, 'overlap_occ'], [210, 'berth_clr'], [215, 'query'], [245, 'berth_occ'], [365, 'query']]}, ['locked', 'locked', 'released', 'released'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 37', {'timer_s': 120, 'events': [[30, 'query'], [60, 'overlap_occ'], [120, 'berth_occ'], [180, 'overlap_occ'], [185, 'overlap_occ'], [185, 'overlap_occ'], [245, 'query'], [275, 'query'], [280, 'overlap_occ'], [280, 'berth_occ'], [280, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 77', {'timer_s': 120, 'events': [[60, 'query'], [120, 'berth_occ'], [165, 'overlap_occ'], [170, 'query'], [175, 'berth_occ'], [205, 'query'], [205, 'berth_occ'], [250, 'query'], [250, 'query']]}, ['locked', 'locked', 'locked', 'locked', 'locked']), ('boundary: berth clears after release', {'timer_s': 60, 'events': [[0, 'berth_occ'], [60, 'query'], [65, 'berth_clr'], [70, 'query']]}, ['released', 'released']), ('boundary: ninety second timer at one minute', {'timer_s': 90, 'events': [[0, 'berth_occ'], [60, 'query'], [89, 'query'], [90, 'query']]}, ['locked', 'locked', 'released']), ('control 23', {'timer_s': 45, 'events': [[0, 'query'], [5, 'berth_occ'], [95, 'berth_occ'], [185, 'berth_occ'], [245, 'query']]}, ['locked', 'released']), ('control 26', {'timer_s': 60, 'events': [[30, 'query'], [60, 'query'], [150, 'overlap_occ'], [150, 'query']]}, ['locked', 'locked', 'locked']), ('sampled regression 29', {'timer_s': 90, 'events': [[90, 'overlap_occ'], [95, 'query'], [95, 'berth_occ'], [185, 'query'], [230, 'query'], [260, 'query'], [350, 'berth_occ'], [410, 'query']]}, ['locked', 'locked', 'locked', 'locked', 'locked'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 47', {'timer_s': 45, 'events': [[45, 'berth_occ'], [45, 'overlap_occ'], [50, 'query'], [95, 'query'], [95, 'query']]}, ['locked', 'locked', 'locked']), ('sampled regression 36', {'timer_s': 120, 'events': [[60, 'berth_clr'], [65, 'berth_occ'], [125, 'berth_occ'], [130, 'berth_occ'], [160, 'berth_occ'], [165, 'overlap_occ'], [210, 'overlap_occ'], [270, 'berth_occ'], [315, 'berth_occ'], [320, 'overlap_occ'], [320, 'query']]}, ['locked']), ('boundary: ninety second timer at one minute', {'timer_s': 90, 'events': [[0, 'berth_occ'], [60, 'query'], [89, 'query'], [90, 'query']]}, ['locked', 'locked', 'released']), ('boundary: expiry after a minute boundary', {'timer_s': 120, 'events': [[30, 'berth_occ'], [140, 'query'], [150, 'query']]}, ['locked', 'released']), ('control 34', {'timer_s': 60, 'events': [[5, 'query'], [35, 'query'], [80, 'berth_occ'], [170, 'berth_occ'], [260, 'berth_occ'], [320, 'berth_occ'], [350, 'overlap_occ'], [395, 'overlap_occ'], [440, 'query'], [500, 'query'], [560, 'query']]}, ['locked', 'locked', 'released', 'released', 'released']), ('sampled regression 37', {'timer_s': 120, 'events': [[30, 'query'], [60, 'overlap_occ'], [120, 'berth_occ'], [180, 'overlap_occ'], [185, 'overlap_occ'], [185, 'overlap_occ'], [245, 'query'], [275, 'query'], [280, 'overlap_occ'], [280, 'berth_occ'], [280, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 40', {'timer_s': 90, 'events': [[60, 'overlap_occ'], [90, 'query'], [135, 'berth_occ'], [195, 'overlap_occ'], [225, 'berth_occ'], [230, 'berth_clr'], [230, 'query']]}, ['locked', 'locked'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 73', {'timer_s': 60, 'events': [[5, 'overlap_occ'], [50, 'berth_occ'], [140, 'berth_clr'], [200, 'berth_occ'], [260, 'query'], [290, 'overlap_occ'], [290, 'overlap_occ'], [290, 'query']]}, ['locked', 'locked']), ('sampled regression 51', {'timer_s': 90, 'events': [[90, 'berth_occ'], [150, 'berth_clr'], [195, 'query'], [255, 'berth_occ'], [315, 'query'], [320, 'query'], [320, 'overlap_occ'], [440, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('boundary: expiry exactly on time', {'timer_s': 60, 'events': [[10, 'berth_occ'], [70, 'query']]}, ['released']), ('boundary: track circuit bob restarts nothing', {'timer_s': 60, 'events': [[0, 'berth_occ'], [40, 'berth_occ'], [60, 'query']]}, ['released']), ('sampled regression 45', {'timer_s': 60, 'events': [[60, 'query'], [120, 'query'], [150, 'overlap_occ'], [155, 'berth_occ'], [245, 'overlap_occ'], [290, 'berth_occ'], [380, 'berth_clr'], [470, 'overlap_occ'], [470, 'query'], [475, 'berth_occ'], [595, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 48', {'timer_s': 45, 'events': [[60, 'overlap_occ'], [150, 'berth_occ'], [180, 'overlap_occ'], [180, 'berth_occ'], [270, 'berth_clr'], [275, 'berth_clr'], [275, 'overlap_occ'], [275, 'query']]}, ['locked']), ('control 54', {'timer_s': 60, 'events': [[5, 'berth_occ'], [95, 'overlap_occ'], [140, 'query'], [145, 'query'], [205, 'query'], [205, 'overlap_occ'], [265, 'query']]}, ['released', 'released', 'released', 'released'])]]\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":"7e32205460846fbaefa93054bf446f38dac0fc4c34187d23e7bd7cb167d6ed50","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    T = x['timer_s']\n    start = None\n    overran = False\n    released = False\n    out = []\n    for t, ev in x['events']:\n        if start is not None and not released and not overran and t - start >= T:\n            released = True\n        if ev == 'berth_occ':\n            if start is None:\n                start = t\n        elif ev == 'berth_clr':\n            if not released:\n                start = None\n        elif ev == 'overlap_occ':\n            pass\n        elif ev == 'query':\n            out.append('released' if released else 'locked')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 6', {'timer_s': 120, 'events': [[90, 'query'], [95, 'berth_clr'], [100, 'overlap_occ'], [130, 'berth_occ'], [130, 'overlap_occ'], [220, 'query'], [280, 'berth_clr'], [285, 'query'], [345, 'berth_clr'], [405, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 11', {'timer_s': 120, 'events': [[5, 'berth_occ'], [65, 'overlap_occ'], [125, 'query'], [185, 'query']]}, ['locked', 'locked']), ('boundary: expiry exactly on time', {'timer_s': 60, 'events': [[10, 'berth_occ'], [70, 'query']]}, ['released']), ('boundary: track circuit bob restarts nothing', {'timer_s': 60, 'events': [[0, 'berth_occ'], [40, 'berth_occ'], [60, 'query']]}, ['released']), ('sampled regression 1', {'timer_s': 45, 'events': [[5, 'overlap_occ'], [35, 'query'], [65, 'berth_clr'], [125, 'query'], [170, 'query'], [170, 'berth_clr'], [230, 'berth_occ'], [350, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('control 4', {'timer_s': 90, 'events': [[60, 'berth_clr'], [150, 'berth_occ'], [155, 'berth_occ'], [155, 'query']]}, ['locked']), ('control 7', {'timer_s': 45, 'events': [[5, 'query'], [65, 'overlap_occ'], [110, 'overlap_occ'], [170, 'query']]}, ['locked', 'locked'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 20', {'timer_s': 90, 'events': [[5, 'overlap_occ'], [95, 'overlap_occ'], [100, 'overlap_occ'], [160, 'query'], [220, 'berth_occ'], [340, 'query']]}, ['locked', 'locked']), ('sampled regression 42', {'timer_s': 120, 'events': [[90, 'berth_occ'], [180, 'overlap_occ'], [240, 'berth_clr'], [330, 'query'], [390, 'query']]}, ['locked', 'locked']), ('boundary: train stops at time zero', {'timer_s': 60, 'events': [[0, 'berth_occ'], [30, 'berth_occ'], [60, 'query']]}, ['released']), ('boundary: train leaves before expiry', {'timer_s': 60, 'events': [[0, 'berth_occ'], [30, 'berth_clr'], [90, 'query']]}, ['locked']), ('control 12', {'timer_s': 120, 'events': [[60, 'berth_occ'], [65, 'query'], [70, 'query'], [70, 'query'], [75, 'berth_occ'], [80, 'berth_occ'], [125, 'berth_clr'], [125, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('control 15', {'timer_s': 120, 'events': [[60, 'berth_clr'], [105, 'berth_clr'], [110, 'berth_clr'], [115, 'berth_clr'], [175, 'query'], [175, 'berth_clr'], [235, 'query'], [265, 'overlap_occ'], [270, 'berth_clr'], [390, 'query']]}, ['locked', 'locked', 'locked']), ('control 18', {'timer_s': 90, 'events': [[0, 'query'], [0, 'query'], [30, 'berth_occ'], [120, 'overlap_occ'], [210, 'berth_clr'], [215, 'query'], [245, 'berth_occ'], [365, 'query']]}, ['locked', 'locked', 'released', 'released'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 37', {'timer_s': 120, 'events': [[30, 'query'], [60, 'overlap_occ'], [120, 'berth_occ'], [180, 'overlap_occ'], [185, 'overlap_occ'], [185, 'overlap_occ'], [245, 'query'], [275, 'query'], [280, 'overlap_occ'], [280, 'berth_occ'], [280, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 77', {'timer_s': 120, 'events': [[60, 'query'], [120, 'berth_occ'], [165, 'overlap_occ'], [170, 'query'], [175, 'berth_occ'], [205, 'query'], [205, 'berth_occ'], [250, 'query'], [250, 'query']]}, ['locked', 'locked', 'locked', 'locked', 'locked']), ('boundary: berth clears after release', {'timer_s': 60, 'events': [[0, 'berth_occ'], [60, 'query'], [65, 'berth_clr'], [70, 'query']]}, ['released', 'released']), ('boundary: ninety second timer at one minute', {'timer_s': 90, 'events': [[0, 'berth_occ'], [60, 'query'], [89, 'query'], [90, 'query']]}, ['locked', 'locked', 'released']), ('control 23', {'timer_s': 45, 'events': [[0, 'query'], [5, 'berth_occ'], [95, 'berth_occ'], [185, 'berth_occ'], [245, 'query']]}, ['locked', 'released']), ('control 26', {'timer_s': 60, 'events': [[30, 'query'], [60, 'query'], [150, 'overlap_occ'], [150, 'query']]}, ['locked', 'locked', 'locked']), ('sampled regression 29', {'timer_s': 90, 'events': [[90, 'overlap_occ'], [95, 'query'], [95, 'berth_occ'], [185, 'query'], [230, 'query'], [260, 'query'], [350, 'berth_occ'], [410, 'query']]}, ['locked', 'locked', 'locked', 'locked', 'locked'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 47', {'timer_s': 45, 'events': [[45, 'berth_occ'], [45, 'overlap_occ'], [50, 'query'], [95, 'query'], [95, 'query']]}, ['locked', 'locked', 'locked']), ('sampled regression 36', {'timer_s': 120, 'events': [[60, 'berth_clr'], [65, 'berth_occ'], [125, 'berth_occ'], [130, 'berth_occ'], [160, 'berth_occ'], [165, 'overlap_occ'], [210, 'overlap_occ'], [270, 'berth_occ'], [315, 'berth_occ'], [320, 'overlap_occ'], [320, 'query']]}, ['locked']), ('boundary: ninety second timer at one minute', {'timer_s': 90, 'events': [[0, 'berth_occ'], [60, 'query'], [89, 'query'], [90, 'query']]}, ['locked', 'locked', 'released']), ('boundary: expiry after a minute boundary', {'timer_s': 120, 'events': [[30, 'berth_occ'], [140, 'query'], [150, 'query']]}, ['locked', 'released']), ('control 34', {'timer_s': 60, 'events': [[5, 'query'], [35, 'query'], [80, 'berth_occ'], [170, 'berth_occ'], [260, 'berth_occ'], [320, 'berth_occ'], [350, 'overlap_occ'], [395, 'overlap_occ'], [440, 'query'], [500, 'query'], [560, 'query']]}, ['locked', 'locked', 'released', 'released', 'released']), ('sampled regression 37', {'timer_s': 120, 'events': [[30, 'query'], [60, 'overlap_occ'], [120, 'berth_occ'], [180, 'overlap_occ'], [185, 'overlap_occ'], [185, 'overlap_occ'], [245, 'query'], [275, 'query'], [280, 'overlap_occ'], [280, 'berth_occ'], [280, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 40', {'timer_s': 90, 'events': [[60, 'overlap_occ'], [90, 'query'], [135, 'berth_occ'], [195, 'overlap_occ'], [225, 'berth_occ'], [230, 'berth_clr'], [230, 'query']]}, ['locked', 'locked'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 73', {'timer_s': 60, 'events': [[5, 'overlap_occ'], [50, 'berth_occ'], [140, 'berth_clr'], [200, 'berth_occ'], [260, 'query'], [290, 'overlap_occ'], [290, 'overlap_occ'], [290, 'query']]}, ['locked', 'locked']), ('sampled regression 51', {'timer_s': 90, 'events': [[90, 'berth_occ'], [150, 'berth_clr'], [195, 'query'], [255, 'berth_occ'], [315, 'query'], [320, 'query'], [320, 'overlap_occ'], [440, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('boundary: expiry exactly on time', {'timer_s': 60, 'events': [[10, 'berth_occ'], [70, 'query']]}, ['released']), ('boundary: track circuit bob restarts nothing', {'timer_s': 60, 'events': [[0, 'berth_occ'], [40, 'berth_occ'], [60, 'query']]}, ['released']), ('sampled regression 45', {'timer_s': 60, 'events': [[60, 'query'], [120, 'query'], [150, 'overlap_occ'], [155, 'berth_occ'], [245, 'overlap_occ'], [290, 'berth_occ'], [380, 'berth_clr'], [470, 'overlap_occ'], [470, 'query'], [475, 'berth_occ'], [595, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 48', {'timer_s': 45, 'events': [[60, 'overlap_occ'], [150, 'berth_occ'], [180, 'overlap_occ'], [180, 'berth_occ'], [270, 'berth_clr'], [275, 'berth_clr'], [275, 'overlap_occ'], [275, 'query']]}, ['locked']), ('control 54', {'timer_s': 60, 'events': [[5, 'berth_occ'], [95, 'overlap_occ'], [140, 'query'], [145, 'query'], [205, 'query'], [205, 'overlap_occ'], [265, 'query']]}, ['released', 'released', 'released', 'released'])]]\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":"f2acd74f78254c3400ce9ca3f5a1da9460b630c69e0f901e9b06da50e26e57b7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    T = x['timer_s']\n    start = None\n    overran = False\n    released = False\n    out = []\n    for t, ev in x['events']:\n        if start is not None and not released and not overran and t - start >= T:\n            released = True\n        if ev == 'berth_occ':\n            if start is None:\n                start = t\n        elif ev == 'berth_clr':\n            if not released:\n                start = None\n        elif ev == 'overlap_occ':\n            if not released:\n                overran = True\n        elif ev == 'query':\n            out.append('released' if released else 'locked')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 6', {'timer_s': 120, 'events': [[90, 'query'], [95, 'berth_clr'], [100, 'overlap_occ'], [130, 'berth_occ'], [130, 'overlap_occ'], [220, 'query'], [280, 'berth_clr'], [285, 'query'], [345, 'berth_clr'], [405, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 11', {'timer_s': 120, 'events': [[5, 'berth_occ'], [65, 'overlap_occ'], [125, 'query'], [185, 'query']]}, ['locked', 'locked']), ('boundary: expiry exactly on time', {'timer_s': 60, 'events': [[10, 'berth_occ'], [70, 'query']]}, ['released']), ('boundary: track circuit bob restarts nothing', {'timer_s': 60, 'events': [[0, 'berth_occ'], [40, 'berth_occ'], [60, 'query']]}, ['released']), ('sampled regression 1', {'timer_s': 45, 'events': [[5, 'overlap_occ'], [35, 'query'], [65, 'berth_clr'], [125, 'query'], [170, 'query'], [170, 'berth_clr'], [230, 'berth_occ'], [350, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('control 4', {'timer_s': 90, 'events': [[60, 'berth_clr'], [150, 'berth_occ'], [155, 'berth_occ'], [155, 'query']]}, ['locked']), ('control 7', {'timer_s': 45, 'events': [[5, 'query'], [65, 'overlap_occ'], [110, 'overlap_occ'], [170, 'query']]}, ['locked', 'locked'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 20', {'timer_s': 90, 'events': [[5, 'overlap_occ'], [95, 'overlap_occ'], [100, 'overlap_occ'], [160, 'query'], [220, 'berth_occ'], [340, 'query']]}, ['locked', 'locked']), ('sampled regression 42', {'timer_s': 120, 'events': [[90, 'berth_occ'], [180, 'overlap_occ'], [240, 'berth_clr'], [330, 'query'], [390, 'query']]}, ['locked', 'locked']), ('boundary: train stops at time zero', {'timer_s': 60, 'events': [[0, 'berth_occ'], [30, 'berth_occ'], [60, 'query']]}, ['released']), ('boundary: train leaves before expiry', {'timer_s': 60, 'events': [[0, 'berth_occ'], [30, 'berth_clr'], [90, 'query']]}, ['locked']), ('control 12', {'timer_s': 120, 'events': [[60, 'berth_occ'], [65, 'query'], [70, 'query'], [70, 'query'], [75, 'berth_occ'], [80, 'berth_occ'], [125, 'berth_clr'], [125, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('control 15', {'timer_s': 120, 'events': [[60, 'berth_clr'], [105, 'berth_clr'], [110, 'berth_clr'], [115, 'berth_clr'], [175, 'query'], [175, 'berth_clr'], [235, 'query'], [265, 'overlap_occ'], [270, 'berth_clr'], [390, 'query']]}, ['locked', 'locked', 'locked']), ('control 18', {'timer_s': 90, 'events': [[0, 'query'], [0, 'query'], [30, 'berth_occ'], [120, 'overlap_occ'], [210, 'berth_clr'], [215, 'query'], [245, 'berth_occ'], [365, 'query']]}, ['locked', 'locked', 'released', 'released'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 37', {'timer_s': 120, 'events': [[30, 'query'], [60, 'overlap_occ'], [120, 'berth_occ'], [180, 'overlap_occ'], [185, 'overlap_occ'], [185, 'overlap_occ'], [245, 'query'], [275, 'query'], [280, 'overlap_occ'], [280, 'berth_occ'], [280, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 77', {'timer_s': 120, 'events': [[60, 'query'], [120, 'berth_occ'], [165, 'overlap_occ'], [170, 'query'], [175, 'berth_occ'], [205, 'query'], [205, 'berth_occ'], [250, 'query'], [250, 'query']]}, ['locked', 'locked', 'locked', 'locked', 'locked']), ('boundary: berth clears after release', {'timer_s': 60, 'events': [[0, 'berth_occ'], [60, 'query'], [65, 'berth_clr'], [70, 'query']]}, ['released', 'released']), ('boundary: ninety second timer at one minute', {'timer_s': 90, 'events': [[0, 'berth_occ'], [60, 'query'], [89, 'query'], [90, 'query']]}, ['locked', 'locked', 'released']), ('control 23', {'timer_s': 45, 'events': [[0, 'query'], [5, 'berth_occ'], [95, 'berth_occ'], [185, 'berth_occ'], [245, 'query']]}, ['locked', 'released']), ('control 26', {'timer_s': 60, 'events': [[30, 'query'], [60, 'query'], [150, 'overlap_occ'], [150, 'query']]}, ['locked', 'locked', 'locked']), ('sampled regression 29', {'timer_s': 90, 'events': [[90, 'overlap_occ'], [95, 'query'], [95, 'berth_occ'], [185, 'query'], [230, 'query'], [260, 'query'], [350, 'berth_occ'], [410, 'query']]}, ['locked', 'locked', 'locked', 'locked', 'locked'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 47', {'timer_s': 45, 'events': [[45, 'berth_occ'], [45, 'overlap_occ'], [50, 'query'], [95, 'query'], [95, 'query']]}, ['locked', 'locked', 'locked']), ('sampled regression 36', {'timer_s': 120, 'events': [[60, 'berth_clr'], [65, 'berth_occ'], [125, 'berth_occ'], [130, 'berth_occ'], [160, 'berth_occ'], [165, 'overlap_occ'], [210, 'overlap_occ'], [270, 'berth_occ'], [315, 'berth_occ'], [320, 'overlap_occ'], [320, 'query']]}, ['locked']), ('boundary: ninety second timer at one minute', {'timer_s': 90, 'events': [[0, 'berth_occ'], [60, 'query'], [89, 'query'], [90, 'query']]}, ['locked', 'locked', 'released']), ('boundary: expiry after a minute boundary', {'timer_s': 120, 'events': [[30, 'berth_occ'], [140, 'query'], [150, 'query']]}, ['locked', 'released']), ('control 34', {'timer_s': 60, 'events': [[5, 'query'], [35, 'query'], [80, 'berth_occ'], [170, 'berth_occ'], [260, 'berth_occ'], [320, 'berth_occ'], [350, 'overlap_occ'], [395, 'overlap_occ'], [440, 'query'], [500, 'query'], [560, 'query']]}, ['locked', 'locked', 'released', 'released', 'released']), ('sampled regression 37', {'timer_s': 120, 'events': [[30, 'query'], [60, 'overlap_occ'], [120, 'berth_occ'], [180, 'overlap_occ'], [185, 'overlap_occ'], [185, 'overlap_occ'], [245, 'query'], [275, 'query'], [280, 'overlap_occ'], [280, 'berth_occ'], [280, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 40', {'timer_s': 90, 'events': [[60, 'overlap_occ'], [90, 'query'], [135, 'berth_occ'], [195, 'overlap_occ'], [225, 'berth_occ'], [230, 'berth_clr'], [230, 'query']]}, ['locked', 'locked'])], [('regression: overrun into the overlap', {'timer_s': 60, 'events': [[0, 'berth_occ'], [20, 'overlap_occ'], [120, 'query']]}, ['locked']), ('sampled regression 73', {'timer_s': 60, 'events': [[5, 'overlap_occ'], [50, 'berth_occ'], [140, 'berth_clr'], [200, 'berth_occ'], [260, 'query'], [290, 'overlap_occ'], [290, 'overlap_occ'], [290, 'query']]}, ['locked', 'locked']), ('sampled regression 51', {'timer_s': 90, 'events': [[90, 'berth_occ'], [150, 'berth_clr'], [195, 'query'], [255, 'berth_occ'], [315, 'query'], [320, 'query'], [320, 'overlap_occ'], [440, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('boundary: expiry exactly on time', {'timer_s': 60, 'events': [[10, 'berth_occ'], [70, 'query']]}, ['released']), ('boundary: track circuit bob restarts nothing', {'timer_s': 60, 'events': [[0, 'berth_occ'], [40, 'berth_occ'], [60, 'query']]}, ['released']), ('sampled regression 45', {'timer_s': 60, 'events': [[60, 'query'], [120, 'query'], [150, 'overlap_occ'], [155, 'berth_occ'], [245, 'overlap_occ'], [290, 'berth_occ'], [380, 'berth_clr'], [470, 'overlap_occ'], [470, 'query'], [475, 'berth_occ'], [595, 'query']]}, ['locked', 'locked', 'locked', 'locked']), ('sampled regression 48', {'timer_s': 45, 'events': [[60, 'overlap_occ'], [150, 'berth_occ'], [180, 'overlap_occ'], [180, 'berth_occ'], [270, 'berth_clr'], [275, 'berth_clr'], [275, 'overlap_occ'], [275, 'query']]}, ['locked']), ('control 54', {'timer_s': 60, 'events': [[5, 'berth_occ'], [95, 'overlap_occ'], [140, 'query'], [145, 'query'], [205, 'query'], [205, 'overlap_occ'], [265, 'query']]}, ['released', 'released', 'released', 'released'])]]\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-overlap-timed-release-overrun-blocking","generated_at":"2026-09-29T14:47:49.188674+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":"Mark an overrun whenever the overlap is entered before release.","root_cause":"Entry into the overlap is ignored.","sha256":"bb0f6aceea20ce2508928bcee3efdd83dec47f7b472c27f3c6f77946b301e06b","title":"Overlap timed release: overrun blocking · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.68,"exit_code":1,"observations":[{"actual":["released"],"check":"regression: overrun into the overlap","expected":["locked"],"passed":false},{"actual":["locked","locked","locked","locked"],"check":"sampled regression 6","expected":["locked","locked","locked","locked"],"passed":true},{"actual":["released","released"],"check":"sampled regression 11","expected":["locked","locked"],"passed":false},{"actual":["released"],"check":"boundary: expiry exactly on time","expected":["released"],"passed":true},{"actual":["released"],"check":"boundary: track circuit bob restarts nothing","expected":["released"],"passed":true},{"actual":["locked","locked","locked","locked"],"check":"sampled regression 1","expected":["locked","locked","locked","locked"],"passed":true},{"actual":["locked"],"check":"control 4","expected":["locked"],"passed":true},{"actual":["locked","locked"],"check":"control 7","expected":["locked","locked"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: overrun into the overlap\", \"actual\": [\"released\"], \"expected\": [\"locked\"], \"passed\": false}, {\"check\": \"sampled regression 6\", \"actual\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"expected\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"passed\": true}, {\"check\": \"sampled regression 11\", \"actual\": [\"released\", \"released\"], \"expected\": [\"locked\", \"locked\"], \"passed\": false}, {\"check\": \"boundary: expiry exactly on time\", \"actual\": [\"released\"], \"expected\": [\"released\"], \"passed\": true}, {\"check\": \"boundary: track circuit bob restarts nothing\", \"actual\": [\"released\"], \"expected\": [\"released\"], \"passed\": true}, {\"check\": \"sampled regression 1\", \"actual\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"expected\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [\"locked\"], \"expected\": [\"locked\"], \"passed\": true}, {\"check\": \"control 7\", \"actual\": [\"locked\", \"locked\"], \"expected\": [\"locked\", \"locked\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.487,"exit_code":1,"observations":[{"actual":["released"],"check":"regression: overrun into the overlap","expected":["locked"],"passed":false},{"actual":["locked","locked","released","released"],"check":"sampled regression 6","expected":["locked","locked","locked","locked"],"passed":false},{"actual":["released","released"],"check":"sampled regression 11","expected":["locked","locked"],"passed":false},{"actual":["released"],"check":"boundary: expiry exactly on time","expected":["released"],"passed":true},{"actual":["released"],"check":"boundary: track circuit bob restarts nothing","expected":["released"],"passed":true},{"actual":["locked","locked","locked","released"],"check":"sampled regression 1","expected":["locked","locked","locked","locked"],"passed":false},{"actual":["locked"],"check":"control 4","expected":["locked"],"passed":true},{"actual":["locked","locked"],"check":"control 7","expected":["locked","locked"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: overrun into the overlap\", \"actual\": [\"released\"], \"expected\": [\"locked\"], \"passed\": false}, {\"check\": \"sampled regression 6\", \"actual\": [\"locked\", \"locked\", \"released\", \"released\"], \"expected\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"passed\": false}, {\"check\": \"sampled regression 11\", \"actual\": [\"released\", \"released\"], \"expected\": [\"locked\", \"locked\"], \"passed\": false}, {\"check\": \"boundary: expiry exactly on time\", \"actual\": [\"released\"], \"expected\": [\"released\"], \"passed\": true}, {\"check\": \"boundary: track circuit bob restarts nothing\", \"actual\": [\"released\"], \"expected\": [\"released\"], \"passed\": true}, {\"check\": \"sampled regression 1\", \"actual\": [\"locked\", \"locked\", \"locked\", \"released\"], \"expected\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"passed\": false}, {\"check\": \"control 4\", \"actual\": [\"locked\"], \"expected\": [\"locked\"], \"passed\": true}, {\"check\": \"control 7\", \"actual\": [\"locked\", \"locked\"], \"expected\": [\"locked\", \"locked\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.961,"exit_code":0,"observations":[{"actual":["locked"],"check":"regression: overrun into the overlap","expected":["locked"],"passed":true},{"actual":["locked","locked","locked","locked"],"check":"sampled regression 6","expected":["locked","locked","locked","locked"],"passed":true},{"actual":["locked","locked"],"check":"sampled regression 11","expected":["locked","locked"],"passed":true},{"actual":["released"],"check":"boundary: expiry exactly on time","expected":["released"],"passed":true},{"actual":["released"],"check":"boundary: track circuit bob restarts nothing","expected":["released"],"passed":true},{"actual":["locked","locked","locked","locked"],"check":"sampled regression 1","expected":["locked","locked","locked","locked"],"passed":true},{"actual":["locked"],"check":"control 4","expected":["locked"],"passed":true},{"actual":["locked","locked"],"check":"control 7","expected":["locked","locked"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: overrun into the overlap\", \"actual\": [\"locked\"], \"expected\": [\"locked\"], \"passed\": true}, {\"check\": \"sampled regression 6\", \"actual\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"expected\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"passed\": true}, {\"check\": \"sampled regression 11\", \"actual\": [\"locked\", \"locked\"], \"expected\": [\"locked\", \"locked\"], \"passed\": true}, {\"check\": \"boundary: expiry exactly on time\", \"actual\": [\"released\"], \"expected\": [\"released\"], \"passed\": true}, {\"check\": \"boundary: track circuit bob restarts nothing\", \"actual\": [\"released\"], \"expected\": [\"released\"], \"passed\": true}, {\"check\": \"sampled regression 1\", \"actual\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"expected\": [\"locked\", \"locked\", \"locked\", \"locked\"], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [\"locked\"], \"expected\": [\"locked\"], \"passed\": true}, {\"check\": \"control 7\", \"actual\": [\"locked\", \"locked\"], \"expected\": [\"locked\", \"locked\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}