FA-67826 / Elevator dispatch scheduling / Open access
Encoder position and door zone detection: magnet correction · case 01
Passing a door-zone magnet throws the position far off.
ROOT CAUSE
The magnet position is added instead of assigned.
VERIFIED REPAIR
Reset the position to the magnet floor in micrometres.
Unsuccessful approach: Assigning millimetres to a micrometre register puts the car near the pit.
Case contract
Car position is tracked in micrometres: start_mm*1000, pulses add count*um_per_pulse, a door-zone magnet at floor k resets the position to floor_mm[k]*1000. After every event the position in mm is floor(um/1000); the car is at the nearest floor (ties to the lower index) if within zone_mm inclusive, otherwise None (between floors).
Why this case matters
Lift group controllers make these decisions many times per minute; a wrong answer strands passengers, wastes trips or overrides a safety rule.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
table = x['floor_mm']
pos = x['start_mm'] * 1000
out = []
for kind, v in x['events']:
if kind == 'pulses':
pos += v * x['um_per_pulse']
else:
pos += table[v] * 1000
mm = pos // 1000
best = min(range(len(table)), key=lambda k: (abs(table[k] - mm), k))
out.append(best if abs(table[best] - mm) <= x['zone_mm'] else None)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 5', {'floor_mm': [0, 4200, 7700, 10700, 14200, 18400, 21400], 'start_mm': 0, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['pulses', 1000], ['magnet', 3], ['pulses', 4200], ['pulses', 1000], ['pulses', 2999], ['magnet', 2], ['pulses', 100]]}, [None, 3, None, None, None, 2, None]), ('sampled regression 1', {'floor_mm': [0, 4200, 8400, 11400, 14900], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 5000], ['magnet', 4], ['pulses', 2999], ['pulses', 4200], ['pulses', 2999], ['magnet', 4]]}, [3, None, 4, None, None, None, 4]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('control 4', {'floor_mm': [0, 3000, 6500, 10000, 13500, 16500, 20000], 'start_mm': 2990, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 1000], ['pulses', 100]]}, [None, None]), ('sampled regression 7', {'floor_mm': [0, 3500, 7700, 10700, 14200, 17200, 21400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 1000], ['pulses', 100], ['magnet', 2], ['pulses', 3000]]}, [0, None, None, None, 2, 3]), ('sampled regression 10', {'floor_mm': [0, 3000, 6000, 9500, 13700], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['magnet', 2], ['pulses', 4200], ['pulses', 3500], ['pulses', 100], ['pulses', 5000], ['pulses', 3000], ['pulses', 4200]]}, [2, None, 4, None, None, None, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 14', {'floor_mm': [0, 3000, 6500, 9500, 12500, 16000, 19500, 23700], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 2999], ['magnet', 1], ['pulses', 3000]]}, [1, 1, None]), ('sampled regression 8', {'floor_mm': [0, 4200, 8400, 12600, 16100, 19600, 23800], 'start_mm': 20, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 2], ['pulses', 3500], ['magnet', 5], ['magnet', 0], ['pulses', 3500]]}, [2, None, 5, 0, None]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('sampled regression 12', {'floor_mm': [0, 3000, 6000, 10200, 13200, 17400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 3499], ['pulses', 1000], ['pulses', 3500], ['pulses', 100], ['magnet', 2], ['pulses', 3500]]}, [0, None, None, None, None, 2, None]), ('control 15', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 3499]]}, [1, None]), ('control 18', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 3499], ['pulses', 3000], ['pulses', 3000]]}, [None, None, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 31', {'floor_mm': [0, 4200, 8400, 11400, 14400, 17900, 22100, 26300], 'start_mm': 2990, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3499], ['magnet', 1], ['magnet', 2], ['magnet', 1], ['pulses', 3000], ['pulses', 4200]]}, [None, 1, 2, 1, None, 3]), ('sampled regression 14', {'floor_mm': [0, 3000, 6500, 9500, 12500, 16000, 19500, 23700], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 2999], ['magnet', 1], ['pulses', 3000]]}, [1, 1, None]), ('boundary: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('boundary: fractional millimetre below a floor', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 1]]}, [1]), ('control 23', {'floor_mm': [0, 4200, 7700, 11200, 15400, 18400, 22600, 25600, 28600], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3500], ['pulses', 3000]]}, [None, None]), ('control 26', {'floor_mm': [0, 4200, 7200, 11400, 14900, 17900, 21400, 25600], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['pulses', 4200], ['pulses', 4200], ['pulses', 3500], ['pulses', 2999], ['pulses', 3499], ['pulses', 2999], ['pulses', 4200]]}, [1, None, None, 4, None, 6, None]), ('sampled regression 29', {'floor_mm': [0, 4200, 8400, 12600, 16100, 20300, 23800, 27300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 2999], ['pulses', 3499], ['pulses', 5000], ['magnet', 1], ['pulses', 100]]}, [3, None, None, None, 1, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 40', {'floor_mm': [0, 4200, 7700, 11900, 15400, 19600, 22600, 26800, 29800], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 0], ['magnet', 8], ['pulses', 5000], ['pulses', 3000], ['pulses', 5000], ['magnet', 4]]}, [None, 0, 8, None, None, None, 4]), ('sampled regression 29', {'floor_mm': [0, 4200, 8400, 12600, 16100, 20300, 23800, 27300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 2999], ['pulses', 3499], ['pulses', 5000], ['magnet', 1], ['pulses', 100]]}, [3, None, None, None, 1, None]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('sampled regression 34', {'floor_mm': [0, 4200, 7700, 10700, 14200, 17700, 20700, 23700], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 5], ['pulses', 5000]]}, [5, 6]), ('sampled regression 37', {'floor_mm': [0, 4200, 7200, 10700, 14200, 17700, 20700], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 1000], ['pulses', 100], ['magnet', 2]]}, [None, None, None, 2]), ('control 43', {'floor_mm': [0, 3500, 7000, 11200, 14200], 'start_mm': 0, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 1], ['pulses', 2999]]}, [1, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 50', {'floor_mm': [0, 3000, 7200, 11400, 14900, 18400, 22600], 'start_mm': 20, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 100], ['pulses', 100], ['magnet', 3], ['pulses', 3499], ['pulses', 1000]]}, [None, None, 3, 4, None]), ('sampled regression 36', {'floor_mm': [0, 3500, 7000, 10500, 14700, 18200], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 4], ['magnet', 3], ['pulses', 2999], ['magnet', 2], ['pulses', 3499], ['pulses', 5000]]}, [4, 3, None, 2, None, None]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('sampled regression 45', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19800, 22800, 26300], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 3], ['pulses', 3500], ['pulses', 3500]]}, [3, None, 4]), ('sampled regression 48', {'floor_mm': [0, 3000, 6000, 9000, 13200, 16200, 20400, 23400, 26400], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 1000], ['magnet', 2]]}, [0, None, 2]), ('sampled regression 51', {'floor_mm': [0, 4200, 7200, 10700, 14900, 19100], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 100]]}, [0, None, None])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: magnet correction | [1, 2, None] | [1, 1, 2] | Failed |
| sampled regression 5 | [None, None, None, None, None, None, None] | [None, 3, None, None, None, 2, None] | Failed |
| sampled regression 1 | [3, None, None, None, None, None, None] | [3, None, 4, None, None, None, 4] | Failed |
| boundary: encoder slip accumulates | [1, 2] | [1, 2] | Passed |
| boundary: zone edge | [1, 1] | [1, 1] | Passed |
| control 4 | [None, None] | [None, None] | Passed |
| sampled regression 7 | [None, None, None, None, None, None] | [0, None, None, None, 2, 3] | Failed |
| sampled regression 10 | [None, None, None, None, None, None, None] | [2, None, 4, None, None, None, None] | Failed |
SHA-256 / 9b63dc553e6feef84cd218a27347f8435dd106e1ca873232202a312c6e98ad5e
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
table = x['floor_mm']
pos = x['start_mm'] * 1000
out = []
for kind, v in x['events']:
if kind == 'pulses':
pos += v * x['um_per_pulse']
else:
pos = table[v]
mm = pos // 1000
best = min(range(len(table)), key=lambda k: (abs(table[k] - mm), k))
out.append(best if abs(table[best] - mm) <= x['zone_mm'] else None)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 5', {'floor_mm': [0, 4200, 7700, 10700, 14200, 18400, 21400], 'start_mm': 0, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['pulses', 1000], ['magnet', 3], ['pulses', 4200], ['pulses', 1000], ['pulses', 2999], ['magnet', 2], ['pulses', 100]]}, [None, 3, None, None, None, 2, None]), ('sampled regression 1', {'floor_mm': [0, 4200, 8400, 11400, 14900], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 5000], ['magnet', 4], ['pulses', 2999], ['pulses', 4200], ['pulses', 2999], ['magnet', 4]]}, [3, None, 4, None, None, None, 4]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('control 4', {'floor_mm': [0, 3000, 6500, 10000, 13500, 16500, 20000], 'start_mm': 2990, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 1000], ['pulses', 100]]}, [None, None]), ('sampled regression 7', {'floor_mm': [0, 3500, 7700, 10700, 14200, 17200, 21400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 1000], ['pulses', 100], ['magnet', 2], ['pulses', 3000]]}, [0, None, None, None, 2, 3]), ('sampled regression 10', {'floor_mm': [0, 3000, 6000, 9500, 13700], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['magnet', 2], ['pulses', 4200], ['pulses', 3500], ['pulses', 100], ['pulses', 5000], ['pulses', 3000], ['pulses', 4200]]}, [2, None, 4, None, None, None, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 14', {'floor_mm': [0, 3000, 6500, 9500, 12500, 16000, 19500, 23700], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 2999], ['magnet', 1], ['pulses', 3000]]}, [1, 1, None]), ('sampled regression 8', {'floor_mm': [0, 4200, 8400, 12600, 16100, 19600, 23800], 'start_mm': 20, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 2], ['pulses', 3500], ['magnet', 5], ['magnet', 0], ['pulses', 3500]]}, [2, None, 5, 0, None]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('sampled regression 12', {'floor_mm': [0, 3000, 6000, 10200, 13200, 17400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 3499], ['pulses', 1000], ['pulses', 3500], ['pulses', 100], ['magnet', 2], ['pulses', 3500]]}, [0, None, None, None, None, 2, None]), ('control 15', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 3499]]}, [1, None]), ('control 18', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 3499], ['pulses', 3000], ['pulses', 3000]]}, [None, None, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 31', {'floor_mm': [0, 4200, 8400, 11400, 14400, 17900, 22100, 26300], 'start_mm': 2990, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3499], ['magnet', 1], ['magnet', 2], ['magnet', 1], ['pulses', 3000], ['pulses', 4200]]}, [None, 1, 2, 1, None, 3]), ('sampled regression 14', {'floor_mm': [0, 3000, 6500, 9500, 12500, 16000, 19500, 23700], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 2999], ['magnet', 1], ['pulses', 3000]]}, [1, 1, None]), ('boundary: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('boundary: fractional millimetre below a floor', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 1]]}, [1]), ('control 23', {'floor_mm': [0, 4200, 7700, 11200, 15400, 18400, 22600, 25600, 28600], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3500], ['pulses', 3000]]}, [None, None]), ('control 26', {'floor_mm': [0, 4200, 7200, 11400, 14900, 17900, 21400, 25600], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['pulses', 4200], ['pulses', 4200], ['pulses', 3500], ['pulses', 2999], ['pulses', 3499], ['pulses', 2999], ['pulses', 4200]]}, [1, None, None, 4, None, 6, None]), ('sampled regression 29', {'floor_mm': [0, 4200, 8400, 12600, 16100, 20300, 23800, 27300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 2999], ['pulses', 3499], ['pulses', 5000], ['magnet', 1], ['pulses', 100]]}, [3, None, None, None, 1, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 40', {'floor_mm': [0, 4200, 7700, 11900, 15400, 19600, 22600, 26800, 29800], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 0], ['magnet', 8], ['pulses', 5000], ['pulses', 3000], ['pulses', 5000], ['magnet', 4]]}, [None, 0, 8, None, None, None, 4]), ('sampled regression 29', {'floor_mm': [0, 4200, 8400, 12600, 16100, 20300, 23800, 27300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 2999], ['pulses', 3499], ['pulses', 5000], ['magnet', 1], ['pulses', 100]]}, [3, None, None, None, 1, None]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('sampled regression 34', {'floor_mm': [0, 4200, 7700, 10700, 14200, 17700, 20700, 23700], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 5], ['pulses', 5000]]}, [5, 6]), ('sampled regression 37', {'floor_mm': [0, 4200, 7200, 10700, 14200, 17700, 20700], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 1000], ['pulses', 100], ['magnet', 2]]}, [None, None, None, 2]), ('control 43', {'floor_mm': [0, 3500, 7000, 11200, 14200], 'start_mm': 0, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 1], ['pulses', 2999]]}, [1, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 50', {'floor_mm': [0, 3000, 7200, 11400, 14900, 18400, 22600], 'start_mm': 20, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 100], ['pulses', 100], ['magnet', 3], ['pulses', 3499], ['pulses', 1000]]}, [None, None, 3, 4, None]), ('sampled regression 36', {'floor_mm': [0, 3500, 7000, 10500, 14700, 18200], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 4], ['magnet', 3], ['pulses', 2999], ['magnet', 2], ['pulses', 3499], ['pulses', 5000]]}, [4, 3, None, 2, None, None]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('sampled regression 45', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19800, 22800, 26300], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 3], ['pulses', 3500], ['pulses', 3500]]}, [3, None, 4]), ('sampled regression 48', {'floor_mm': [0, 3000, 6000, 9000, 13200, 16200, 20400, 23400, 26400], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 1000], ['magnet', 2]]}, [0, None, 2]), ('sampled regression 51', {'floor_mm': [0, 4200, 7200, 10700, 14900, 19100], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 100]]}, [0, None, None])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: magnet correction | [1, 0, 1] | [1, 1, 2] | Failed |
| sampled regression 5 | [None, 0, None, None, None, 0, None] | [None, 3, None, None, None, 2, None] | Failed |
| sampled regression 1 | [0, None, 0, None, None, None, 0] | [3, None, 4, None, None, None, 4] | Failed |
| boundary: encoder slip accumulates | [1, 2] | [1, 2] | Passed |
| boundary: zone edge | [1, 1] | [1, 1] | Passed |
| control 4 | [None, None] | [None, None] | Passed |
| sampled regression 7 | [0, None, None, None, 0, None] | [0, None, None, None, 2, 3] | Failed |
| sampled regression 10 | [0, None, None, None, None, None, None] | [2, None, 4, None, None, None, None] | Failed |
SHA-256 / 3a380b1bf0aeda29451177555467204b2b34c71bdd44a8d1f2f9bebe69b1b0ca
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
table = x['floor_mm']
pos = x['start_mm'] * 1000
out = []
for kind, v in x['events']:
if kind == 'pulses':
pos += v * x['um_per_pulse']
else:
pos = table[v] * 1000
mm = pos // 1000
best = min(range(len(table)), key=lambda k: (abs(table[k] - mm), k))
out.append(best if abs(table[best] - mm) <= x['zone_mm'] else None)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 5', {'floor_mm': [0, 4200, 7700, 10700, 14200, 18400, 21400], 'start_mm': 0, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['pulses', 1000], ['magnet', 3], ['pulses', 4200], ['pulses', 1000], ['pulses', 2999], ['magnet', 2], ['pulses', 100]]}, [None, 3, None, None, None, 2, None]), ('sampled regression 1', {'floor_mm': [0, 4200, 8400, 11400, 14900], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 5000], ['magnet', 4], ['pulses', 2999], ['pulses', 4200], ['pulses', 2999], ['magnet', 4]]}, [3, None, 4, None, None, None, 4]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('control 4', {'floor_mm': [0, 3000, 6500, 10000, 13500, 16500, 20000], 'start_mm': 2990, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 1000], ['pulses', 100]]}, [None, None]), ('sampled regression 7', {'floor_mm': [0, 3500, 7700, 10700, 14200, 17200, 21400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 1000], ['pulses', 100], ['magnet', 2], ['pulses', 3000]]}, [0, None, None, None, 2, 3]), ('sampled regression 10', {'floor_mm': [0, 3000, 6000, 9500, 13700], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['magnet', 2], ['pulses', 4200], ['pulses', 3500], ['pulses', 100], ['pulses', 5000], ['pulses', 3000], ['pulses', 4200]]}, [2, None, 4, None, None, None, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 14', {'floor_mm': [0, 3000, 6500, 9500, 12500, 16000, 19500, 23700], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 2999], ['magnet', 1], ['pulses', 3000]]}, [1, 1, None]), ('sampled regression 8', {'floor_mm': [0, 4200, 8400, 12600, 16100, 19600, 23800], 'start_mm': 20, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 2], ['pulses', 3500], ['magnet', 5], ['magnet', 0], ['pulses', 3500]]}, [2, None, 5, 0, None]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('sampled regression 12', {'floor_mm': [0, 3000, 6000, 10200, 13200, 17400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 3499], ['pulses', 1000], ['pulses', 3500], ['pulses', 100], ['magnet', 2], ['pulses', 3500]]}, [0, None, None, None, None, 2, None]), ('control 15', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 3499]]}, [1, None]), ('control 18', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 3499], ['pulses', 3000], ['pulses', 3000]]}, [None, None, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 31', {'floor_mm': [0, 4200, 8400, 11400, 14400, 17900, 22100, 26300], 'start_mm': 2990, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3499], ['magnet', 1], ['magnet', 2], ['magnet', 1], ['pulses', 3000], ['pulses', 4200]]}, [None, 1, 2, 1, None, 3]), ('sampled regression 14', {'floor_mm': [0, 3000, 6500, 9500, 12500, 16000, 19500, 23700], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 2999], ['magnet', 1], ['pulses', 3000]]}, [1, 1, None]), ('boundary: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('boundary: fractional millimetre below a floor', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 1]]}, [1]), ('control 23', {'floor_mm': [0, 4200, 7700, 11200, 15400, 18400, 22600, 25600, 28600], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3500], ['pulses', 3000]]}, [None, None]), ('control 26', {'floor_mm': [0, 4200, 7200, 11400, 14900, 17900, 21400, 25600], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['pulses', 4200], ['pulses', 4200], ['pulses', 3500], ['pulses', 2999], ['pulses', 3499], ['pulses', 2999], ['pulses', 4200]]}, [1, None, None, 4, None, 6, None]), ('sampled regression 29', {'floor_mm': [0, 4200, 8400, 12600, 16100, 20300, 23800, 27300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 2999], ['pulses', 3499], ['pulses', 5000], ['magnet', 1], ['pulses', 100]]}, [3, None, None, None, 1, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 40', {'floor_mm': [0, 4200, 7700, 11900, 15400, 19600, 22600, 26800, 29800], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 0], ['magnet', 8], ['pulses', 5000], ['pulses', 3000], ['pulses', 5000], ['magnet', 4]]}, [None, 0, 8, None, None, None, 4]), ('sampled regression 29', {'floor_mm': [0, 4200, 8400, 12600, 16100, 20300, 23800, 27300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 2999], ['pulses', 3499], ['pulses', 5000], ['magnet', 1], ['pulses', 100]]}, [3, None, None, None, 1, None]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('sampled regression 34', {'floor_mm': [0, 4200, 7700, 10700, 14200, 17700, 20700, 23700], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 5], ['pulses', 5000]]}, [5, 6]), ('sampled regression 37', {'floor_mm': [0, 4200, 7200, 10700, 14200, 17700, 20700], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 1000], ['pulses', 100], ['magnet', 2]]}, [None, None, None, 2]), ('control 43', {'floor_mm': [0, 3500, 7000, 11200, 14200], 'start_mm': 0, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 1], ['pulses', 2999]]}, [1, None])], [('regression: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('sampled regression 50', {'floor_mm': [0, 3000, 7200, 11400, 14900, 18400, 22600], 'start_mm': 20, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 100], ['pulses', 100], ['magnet', 3], ['pulses', 3499], ['pulses', 1000]]}, [None, None, 3, 4, None]), ('sampled regression 36', {'floor_mm': [0, 3500, 7000, 10500, 14700, 18200], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 4], ['magnet', 3], ['pulses', 2999], ['magnet', 2], ['pulses', 3499], ['pulses', 5000]]}, [4, 3, None, 2, None, None]), ('boundary: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('sampled regression 45', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19800, 22800, 26300], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 3], ['pulses', 3500], ['pulses', 3500]]}, [3, None, 4]), ('sampled regression 48', {'floor_mm': [0, 3000, 6000, 9000, 13200, 16200, 20400, 23400, 26400], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 1000], ['magnet', 2]]}, [0, None, 2]), ('sampled regression 51', {'floor_mm': [0, 4200, 7200, 10700, 14900, 19100], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 100]]}, [0, None, None])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: magnet correction | [1, 1, 2] | [1, 1, 2] | Passed |
| sampled regression 5 | [None, 3, None, None, None, 2, None] | [None, 3, None, None, None, 2, None] | Passed |
| sampled regression 1 | [3, None, 4, None, None, None, 4] | [3, None, 4, None, None, None, 4] | Passed |
| boundary: encoder slip accumulates | [1, 2] | [1, 2] | Passed |
| boundary: zone edge | [1, 1] | [1, 1] | Passed |
| control 4 | [None, None] | [None, None] | Passed |
| sampled regression 7 | [0, None, None, None, 2, 3] | [0, None, None, None, 2, 3] | Passed |
| sampled regression 10 | [2, None, 4, None, None, None, None] | [2, None, 4, None, None, None, None] | Passed |
SHA-256 / 00af91d5eeb3d540da2397ff29becbff991b1a135414dea3bbc3d88bc4a9d5e2
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:47:56.499373+00:00.
Case digest / 081075f16ef0091c474ea50d356e7b80ead1aa39aa5d747c65c5844c2992d712