{"abstract":"The ETA forgets the distance run beyond the car position before reversing.","category":"Elevator dispatch scheduling","checks":8,"contract":"A moving car at floor with direction and car stops estimates its arrival at a hall call (target, call direction). Work in the car direction (mirror floors for down). If the target is strictly ahead and the call is in the car direction, the car goes straight there, stopping at stops strictly between. Otherwise it runs to the farthest of its stops ahead and the target, reverses and returns to the target, stopping at every stop ahead plus stops strictly between target and floor behind. A stop at the target floor is not extra. ETA = floors travelled * per_floor_s + stops * stop_s.","contract_signature":"x","evaluation_group":"w2-elevator_dispatch_scheduling-hall-call-eta","failed_approach":"Using the straight distance ignores the reversal completely.","family":"w2-elevator_dispatch_scheduling-hall-call-eta-reversal-path-length","id":"FA-67551","implementations":{"attempt":{"sha256":"0621f924711cd4e53acb331b37bd93de1077f2c015edf4c1ad07be0a91acb1a2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    sg = 1 if x['dir'] == 'up' else -1\n    f = x['floor'] * sg\n    t = x['target'] * sg\n    stops = [s * sg for s in x['stops'] if s * sg != t]\n    same = x['call_dir'] == x['dir']\n    if t > f and same:\n        path = t - f\n        n = len([s for s in stops if f < s < t])\n    else:\n        ahead = [s for s in stops if s > f]\n        far = max(ahead + [t, f])\n        path = abs(t - f)\n        n = len(ahead) + len([s for s in stops if t < s < f])\n    return path * x['per_floor_s'] + n * x['stop_s']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: call behind a down car', {'floor': 10, 'dir': 'down', 'target': 12, 'call_dir': 'up', 'stops': [6], 'per_floor_s': 2, 'stop_s': 10}, 30), ('regression: stops behind served on return', {'floor': 6, 'dir': 'up', 'target': 1, 'call_dir': 'up', 'stops': [9, 3], 'per_floor_s': 2, 'stop_s': 10}, 42), ('regression: call ahead but opposite direction', {'floor': 2, 'dir': 'up', 'target': 8, 'call_dir': 'down', 'stops': [5, 11], 'per_floor_s': 2, 'stop_s': 10}, 44), ('boundary: down car mirrored', {'floor': 10, 'dir': 'down', 'target': 4, 'call_dir': 'down', 'stops': [7], 'per_floor_s': 2, 'stop_s': 10}, 22), ('regression: call at the current floor', {'floor': 5, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [9], 'per_floor_s': 2, 'stop_s': 10}, 26), ('sampled regression 1', {'floor': 6, 'dir': 'down', 'target': 12, 'call_dir': 'down', 'stops': [3, 4], 'per_floor_s': 2, 'stop_s': 12}, 48), ('control 4', {'floor': 1, 'dir': 'down', 'target': 14, 'call_dir': 'down', 'stops': [3, 10, 5], 'per_floor_s': 2, 'stop_s': 12}, 62), ('control 7', {'floor': 7, 'dir': 'up', 'target': 11, 'call_dir': 'up', 'stops': [1, 13, 9, 2], 'per_floor_s': 3, 'stop_s': 12}, 24)], [('regression: call ahead but opposite direction', {'floor': 2, 'dir': 'up', 'target': 8, 'call_dir': 'down', 'stops': [5, 11], 'per_floor_s': 2, 'stop_s': 10}, 44), ('sampled regression 13', {'floor': 2, 'dir': 'up', 'target': 2, 'call_dir': 'down', 'stops': [4], 'per_floor_s': 3, 'stop_s': 12}, 24), ('sampled regression 3', {'floor': 13, 'dir': 'up', 'target': 9, 'call_dir': 'up', 'stops': [2, 15, 4, 6], 'per_floor_s': 3, 'stop_s': 8}, 32), ('regression: call at the current floor', {'floor': 5, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [9], 'per_floor_s': 2, 'stop_s': 10}, 26), ('regression: stops behind served on return', {'floor': 6, 'dir': 'up', 'target': 1, 'call_dir': 'up', 'stops': [9, 3], 'per_floor_s': 2, 'stop_s': 10}, 42), ('control 12', {'floor': 12, 'dir': 'down', 'target': 11, 'call_dir': 'down', 'stops': [4, 8, 7, 15], 'per_floor_s': 3, 'stop_s': 10}, 3), ('control 15', {'floor': 15, 'dir': 'up', 'target': 11, 'call_dir': 'down', 'stops': [3], 'per_floor_s': 3, 'stop_s': 12}, 12), ('control 18', {'floor': 1, 'dir': 'down', 'target': 4, 'call_dir': 'down', 'stops': [8, 2, 11, 1], 'per_floor_s': 2, 'stop_s': 10}, 16)], [('regression: call at the current floor', {'floor': 5, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [9], 'per_floor_s': 2, 'stop_s': 10}, 26), ('sampled regression 40', {'floor': 10, 'dir': 'down', 'target': 11, 'call_dir': 'down', 'stops': [4, 10, 12, 5], 'per_floor_s': 3, 'stop_s': 10}, 59), ('sampled regression 33', {'floor': 5, 'dir': 'up', 'target': 0, 'call_dir': 'down', 'stops': [6, 0, 15], 'per_floor_s': 3, 'stop_s': 10}, 95), ('regression: stops behind served on return', {'floor': 6, 'dir': 'up', 'target': 1, 'call_dir': 'up', 'stops': [9, 3], 'per_floor_s': 2, 'stop_s': 10}, 42), ('boundary: stop at the target floor', {'floor': 2, 'dir': 'up', 'target': 8, 'call_dir': 'up', 'stops': [8, 5], 'per_floor_s': 2, 'stop_s': 10}, 22), ('control 23', {'floor': 4, 'dir': 'up', 'target': 13, 'call_dir': 'up', 'stops': [], 'per_floor_s': 2, 'stop_s': 12}, 18), ('sampled regression 26', {'floor': 14, 'dir': 'up', 'target': 15, 'call_dir': 'down', 'stops': [1, 14], 'per_floor_s': 2, 'stop_s': 8}, 2), ('control 29', {'floor': 8, 'dir': 'down', 'target': 6, 'call_dir': 'down', 'stops': [14, 15, 3], 'per_floor_s': 3, 'stop_s': 10}, 6)], [('regression: stops behind served on return', {'floor': 6, 'dir': 'up', 'target': 1, 'call_dir': 'up', 'stops': [9, 3], 'per_floor_s': 2, 'stop_s': 10}, 42), ('sampled regression 53', {'floor': 0, 'dir': 'up', 'target': 5, 'call_dir': 'down', 'stops': [], 'per_floor_s': 2, 'stop_s': 12}, 10), ('sampled regression 61', {'floor': 11, 'dir': 'down', 'target': 14, 'call_dir': 'down', 'stops': [9, 11, 6, 8], 'per_floor_s': 2, 'stop_s': 8}, 50), ('boundary: stops beyond the target', {'floor': 2, 'dir': 'up', 'target': 6, 'call_dir': 'up', 'stops': [4, 10], 'per_floor_s': 2, 'stop_s': 10}, 18), ('boundary: down car mirrored', {'floor': 10, 'dir': 'down', 'target': 4, 'call_dir': 'down', 'stops': [7], 'per_floor_s': 2, 'stop_s': 10}, 22), ('control 34', {'floor': 7, 'dir': 'down', 'target': 7, 'call_dir': 'up', 'stops': [10, 7], 'per_floor_s': 2, 'stop_s': 8}, 0), ('control 37', {'floor': 14, 'dir': 'up', 'target': 11, 'call_dir': 'up', 'stops': [7, 4, 13, 1], 'per_floor_s': 2, 'stop_s': 10}, 16), ('sampled regression 40', {'floor': 10, 'dir': 'down', 'target': 11, 'call_dir': 'down', 'stops': [4, 10, 12, 5], 'per_floor_s': 3, 'stop_s': 10}, 59)], [('regression: call behind a down car', {'floor': 10, 'dir': 'down', 'target': 12, 'call_dir': 'up', 'stops': [6], 'per_floor_s': 2, 'stop_s': 10}, 30), ('sampled regression 71', {'floor': 13, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [6, 14, 15, 11], 'per_floor_s': 3, 'stop_s': 10}, 76), ('sampled regression 77', {'floor': 12, 'dir': 'down', 'target': 8, 'call_dir': 'up', 'stops': [14, 10, 3], 'per_floor_s': 3, 'stop_s': 12}, 66), ('regression: call ahead but opposite direction', {'floor': 2, 'dir': 'up', 'target': 8, 'call_dir': 'down', 'stops': [5, 11], 'per_floor_s': 2, 'stop_s': 10}, 44), ('regression: call at the current floor', {'floor': 5, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [9], 'per_floor_s': 2, 'stop_s': 10}, 26), ('control 45', {'floor': 2, 'dir': 'down', 'target': 0, 'call_dir': 'down', 'stops': [3, 12, 7, 11], 'per_floor_s': 2, 'stop_s': 8}, 4), ('sampled regression 48', {'floor': 8, 'dir': 'down', 'target': 2, 'call_dir': 'up', 'stops': [8, 7, 4, 6], 'per_floor_s': 3, 'stop_s': 8}, 42), ('control 51', {'floor': 11, 'dir': 'up', 'target': 4, 'call_dir': 'down', 'stops': [], 'per_floor_s': 3, 'stop_s': 12}, 21)]]\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":"ac65a55cb638984016bae4723e9376933108c745ecd01bbfd0d9d70b4c5babd5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    sg = 1 if x['dir'] == 'up' else -1\n    f = x['floor'] * sg\n    t = x['target'] * sg\n    stops = [s * sg for s in x['stops'] if s * sg != t]\n    same = x['call_dir'] == x['dir']\n    if t > f and same:\n        path = t - f\n        n = len([s for s in stops if f < s < t])\n    else:\n        ahead = [s for s in stops if s > f]\n        far = max(ahead + [t, f])\n        path = (far - f) + abs(f - t)\n        n = len(ahead) + len([s for s in stops if t < s < f])\n    return path * x['per_floor_s'] + n * x['stop_s']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: call behind a down car', {'floor': 10, 'dir': 'down', 'target': 12, 'call_dir': 'up', 'stops': [6], 'per_floor_s': 2, 'stop_s': 10}, 30), ('regression: stops behind served on return', {'floor': 6, 'dir': 'up', 'target': 1, 'call_dir': 'up', 'stops': [9, 3], 'per_floor_s': 2, 'stop_s': 10}, 42), ('regression: call ahead but opposite direction', {'floor': 2, 'dir': 'up', 'target': 8, 'call_dir': 'down', 'stops': [5, 11], 'per_floor_s': 2, 'stop_s': 10}, 44), ('boundary: down car mirrored', {'floor': 10, 'dir': 'down', 'target': 4, 'call_dir': 'down', 'stops': [7], 'per_floor_s': 2, 'stop_s': 10}, 22), ('regression: call at the current floor', {'floor': 5, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [9], 'per_floor_s': 2, 'stop_s': 10}, 26), ('sampled regression 1', {'floor': 6, 'dir': 'down', 'target': 12, 'call_dir': 'down', 'stops': [3, 4], 'per_floor_s': 2, 'stop_s': 12}, 48), ('control 4', {'floor': 1, 'dir': 'down', 'target': 14, 'call_dir': 'down', 'stops': [3, 10, 5], 'per_floor_s': 2, 'stop_s': 12}, 62), ('control 7', {'floor': 7, 'dir': 'up', 'target': 11, 'call_dir': 'up', 'stops': [1, 13, 9, 2], 'per_floor_s': 3, 'stop_s': 12}, 24)], [('regression: call ahead but opposite direction', {'floor': 2, 'dir': 'up', 'target': 8, 'call_dir': 'down', 'stops': [5, 11], 'per_floor_s': 2, 'stop_s': 10}, 44), ('sampled regression 13', {'floor': 2, 'dir': 'up', 'target': 2, 'call_dir': 'down', 'stops': [4], 'per_floor_s': 3, 'stop_s': 12}, 24), ('sampled regression 3', {'floor': 13, 'dir': 'up', 'target': 9, 'call_dir': 'up', 'stops': [2, 15, 4, 6], 'per_floor_s': 3, 'stop_s': 8}, 32), ('regression: call at the current floor', {'floor': 5, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [9], 'per_floor_s': 2, 'stop_s': 10}, 26), ('regression: stops behind served on return', {'floor': 6, 'dir': 'up', 'target': 1, 'call_dir': 'up', 'stops': [9, 3], 'per_floor_s': 2, 'stop_s': 10}, 42), ('control 12', {'floor': 12, 'dir': 'down', 'target': 11, 'call_dir': 'down', 'stops': [4, 8, 7, 15], 'per_floor_s': 3, 'stop_s': 10}, 3), ('control 15', {'floor': 15, 'dir': 'up', 'target': 11, 'call_dir': 'down', 'stops': [3], 'per_floor_s': 3, 'stop_s': 12}, 12), ('control 18', {'floor': 1, 'dir': 'down', 'target': 4, 'call_dir': 'down', 'stops': [8, 2, 11, 1], 'per_floor_s': 2, 'stop_s': 10}, 16)], [('regression: call at the current floor', {'floor': 5, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [9], 'per_floor_s': 2, 'stop_s': 10}, 26), ('sampled regression 40', {'floor': 10, 'dir': 'down', 'target': 11, 'call_dir': 'down', 'stops': [4, 10, 12, 5], 'per_floor_s': 3, 'stop_s': 10}, 59), ('sampled regression 33', {'floor': 5, 'dir': 'up', 'target': 0, 'call_dir': 'down', 'stops': [6, 0, 15], 'per_floor_s': 3, 'stop_s': 10}, 95), ('regression: stops behind served on return', {'floor': 6, 'dir': 'up', 'target': 1, 'call_dir': 'up', 'stops': [9, 3], 'per_floor_s': 2, 'stop_s': 10}, 42), ('boundary: stop at the target floor', {'floor': 2, 'dir': 'up', 'target': 8, 'call_dir': 'up', 'stops': [8, 5], 'per_floor_s': 2, 'stop_s': 10}, 22), ('control 23', {'floor': 4, 'dir': 'up', 'target': 13, 'call_dir': 'up', 'stops': [], 'per_floor_s': 2, 'stop_s': 12}, 18), ('sampled regression 26', {'floor': 14, 'dir': 'up', 'target': 15, 'call_dir': 'down', 'stops': [1, 14], 'per_floor_s': 2, 'stop_s': 8}, 2), ('control 29', {'floor': 8, 'dir': 'down', 'target': 6, 'call_dir': 'down', 'stops': [14, 15, 3], 'per_floor_s': 3, 'stop_s': 10}, 6)], [('regression: stops behind served on return', {'floor': 6, 'dir': 'up', 'target': 1, 'call_dir': 'up', 'stops': [9, 3], 'per_floor_s': 2, 'stop_s': 10}, 42), ('sampled regression 53', {'floor': 0, 'dir': 'up', 'target': 5, 'call_dir': 'down', 'stops': [], 'per_floor_s': 2, 'stop_s': 12}, 10), ('sampled regression 61', {'floor': 11, 'dir': 'down', 'target': 14, 'call_dir': 'down', 'stops': [9, 11, 6, 8], 'per_floor_s': 2, 'stop_s': 8}, 50), ('boundary: stops beyond the target', {'floor': 2, 'dir': 'up', 'target': 6, 'call_dir': 'up', 'stops': [4, 10], 'per_floor_s': 2, 'stop_s': 10}, 18), ('boundary: down car mirrored', {'floor': 10, 'dir': 'down', 'target': 4, 'call_dir': 'down', 'stops': [7], 'per_floor_s': 2, 'stop_s': 10}, 22), ('control 34', {'floor': 7, 'dir': 'down', 'target': 7, 'call_dir': 'up', 'stops': [10, 7], 'per_floor_s': 2, 'stop_s': 8}, 0), ('control 37', {'floor': 14, 'dir': 'up', 'target': 11, 'call_dir': 'up', 'stops': [7, 4, 13, 1], 'per_floor_s': 2, 'stop_s': 10}, 16), ('sampled regression 40', {'floor': 10, 'dir': 'down', 'target': 11, 'call_dir': 'down', 'stops': [4, 10, 12, 5], 'per_floor_s': 3, 'stop_s': 10}, 59)], [('regression: call behind a down car', {'floor': 10, 'dir': 'down', 'target': 12, 'call_dir': 'up', 'stops': [6], 'per_floor_s': 2, 'stop_s': 10}, 30), ('sampled regression 71', {'floor': 13, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [6, 14, 15, 11], 'per_floor_s': 3, 'stop_s': 10}, 76), ('sampled regression 77', {'floor': 12, 'dir': 'down', 'target': 8, 'call_dir': 'up', 'stops': [14, 10, 3], 'per_floor_s': 3, 'stop_s': 12}, 66), ('regression: call ahead but opposite direction', {'floor': 2, 'dir': 'up', 'target': 8, 'call_dir': 'down', 'stops': [5, 11], 'per_floor_s': 2, 'stop_s': 10}, 44), ('regression: call at the current floor', {'floor': 5, 'dir': 'up', 'target': 5, 'call_dir': 'up', 'stops': [9], 'per_floor_s': 2, 'stop_s': 10}, 26), ('control 45', {'floor': 2, 'dir': 'down', 'target': 0, 'call_dir': 'down', 'stops': [3, 12, 7, 11], 'per_floor_s': 2, 'stop_s': 8}, 4), ('sampled regression 48', {'floor': 8, 'dir': 'down', 'target': 2, 'call_dir': 'up', 'stops': [8, 7, 4, 6], 'per_floor_s': 3, 'stop_s': 8}, 42), ('control 51', {'floor': 11, 'dir': 'up', 'target': 4, 'call_dir': 'down', 'stops': [], 'per_floor_s': 3, 'stop_s': 12}, 21)]]\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 lift-control contract for a bounded teaching model; it makes no claim of conformance to any lift code or vendor dispatcher 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-elevator_dispatch_scheduling-hall-call-eta-reversal-path-length","generated_at":"2026-09-29T14:47:53.957520+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Lift group controllers make these decisions many times per minute; a wrong answer strands passengers, wastes trips or overrides a safety rule.","root_cause":"The return leg is measured from the current floor instead of from the reversal floor.","sha256":"b32342e365f22c362cce8873f43c142baca851b40ce91cd63c8f3eb872f1951b","title":"Hall call ETA with intermediate stops: reversal path length · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":42.348,"exit_code":1,"observations":[{"actual":14,"check":"regression: call behind a down car","expected":30,"passed":false},{"actual":30,"check":"regression: stops behind served on return","expected":42,"passed":false},{"actual":32,"check":"regression: call ahead but opposite direction","expected":44,"passed":false},{"actual":22,"check":"boundary: down car mirrored","expected":22,"passed":true},{"actual":10,"check":"regression: call at the current floor","expected":26,"passed":false},{"actual":36,"check":"sampled regression 1","expected":48,"passed":false},{"actual":62,"check":"control 4","expected":62,"passed":true},{"actual":24,"check":"control 7","expected":24,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: call behind a down car\", \"actual\": 14, \"expected\": 30, \"passed\": false}, {\"check\": \"regression: stops behind served on return\", \"actual\": 30, \"expected\": 42, \"passed\": false}, {\"check\": \"regression: call ahead but opposite direction\", \"actual\": 32, \"expected\": 44, \"passed\": false}, {\"check\": \"boundary: down car mirrored\", \"actual\": 22, \"expected\": 22, \"passed\": true}, {\"check\": \"regression: call at the current floor\", \"actual\": 10, \"expected\": 26, \"passed\": false}, {\"check\": \"sampled regression 1\", \"actual\": 36, \"expected\": 48, \"passed\": false}, {\"check\": \"control 4\", \"actual\": 62, \"expected\": 62, \"passed\": true}, {\"check\": \"control 7\", \"actual\": 24, \"expected\": 24, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.804,"exit_code":1,"observations":[{"actual":22,"check":"regression: call behind a down car","expected":30,"passed":false},{"actual":36,"check":"regression: stops behind served on return","expected":42,"passed":false},{"actual":50,"check":"regression: call ahead but opposite direction","expected":44,"passed":false},{"actual":22,"check":"boundary: down car mirrored","expected":22,"passed":true},{"actual":18,"check":"regression: call at the current floor","expected":26,"passed":false},{"actual":42,"check":"sampled regression 1","expected":48,"passed":false},{"actual":62,"check":"control 4","expected":62,"passed":true},{"actual":24,"check":"control 7","expected":24,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: call behind a down car\", \"actual\": 22, \"expected\": 30, \"passed\": false}, {\"check\": \"regression: stops behind served on return\", \"actual\": 36, \"expected\": 42, \"passed\": false}, {\"check\": \"regression: call ahead but opposite direction\", \"actual\": 50, \"expected\": 44, \"passed\": false}, {\"check\": \"boundary: down car mirrored\", \"actual\": 22, \"expected\": 22, \"passed\": true}, {\"check\": \"regression: call at the current floor\", \"actual\": 18, \"expected\": 26, \"passed\": false}, {\"check\": \"sampled regression 1\", \"actual\": 42, \"expected\": 48, \"passed\": false}, {\"check\": \"control 4\", \"actual\": 62, \"expected\": 62, \"passed\": true}, {\"check\": \"control 7\", \"actual\": 24, \"expected\": 24, \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}