FAILURE MAP
← Case archive

FA-67436 / Elevator dispatch scheduling / Open access

Trip flight time from a trapezoidal profile: profile regime threshold · case 01

Medium trips are timed as if the car reached contract speed.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The regime test uses the distance for a single acceleration phase.

VERIFIED REPAIR

Contract speed is reached only when the distance covers both acceleration and deceleration (v^2/a).

Unsuccessful approach: Doubling the threshold times some full-speed trips with the triangular formula.

Case contract

heights_mm[i] is the rise from floor i to floor i+1. The trip distance is the sum between the two floors (either direction). With speed vmax (mm/s) and acceleration acc (mm/s^2): if distance*acc >= vmax^2 the car reaches vmax and t = d/vmax + vmax/acc, otherwise t = 2*sqrt(d/acc). Return milliseconds rounded up; zero distance is 0.

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
import math
N = 1
observations = []
def solve(x):
    lo, hi = sorted((x['from'], x['to']))
    d = sum(x['heights_mm'][lo:hi])
    if d == 0:
        return 0
    v = x['vmax']
    a = x['acc']
    if 2 * d * a >= v * v:
        t = d / v + v / a
    else:
        t = 2 * math.sqrt(d / a)
    return math.ceil(t * 1000 - 1e-9)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 3', {'heights_mm': [4200, 3000, 4200, 3000, 3000, 5000, 4200, 4200, 4200, 4200, 3000], 'from': 4, 'to': 6, 'vmax': 2500, 'acc': 1000}, 5700), ('boundary: one floor up', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 0, 'to': 1, 'vmax': 2500, 'acc': 1000}, 3465), ('control 1', {'heights_mm': [5000, 4200, 3500, 4200, 4200, 5000, 3000, 3500, 5000, 4200, 3500], 'from': 7, 'to': 0, 'vmax': 1600, 'acc': 1200}, 19521), ('control 4', {'heights_mm': [3500, 3500, 5000, 3500], 'from': 1, 'to': 1, 'vmax': 4000, 'acc': 600}, 0), ('control 7', {'heights_mm': [3500, 3500, 4200, 5000, 3500], 'from': 4, 'to': 1, 'vmax': 2500, 'acc': 1200}, 7164)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 27', {'heights_mm': [4200, 4200, 5000, 3500, 4200, 5000, 4200, 5000, 3000], 'from': 2, 'to': 8, 'vmax': 4000, 'acc': 800}, 11725), ('boundary: long run at contract speed', {'heights_mm': [4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000], 'from': 0, 'to': 9, 'vmax': 2500, 'acc': 1000}, 16900), ('control 12', {'heights_mm': [3000, 5000, 3000, 5000, 4200, 5000, 3000, 4200, 4200, 3500], 'from': 5, 'to': 1, 'vmax': 1000, 'acc': 600}, 18867), ('control 15', {'heights_mm': [3000, 3500, 3000, 3000, 5000, 3000, 3500, 3000, 3000, 3500], 'from': 4, 'to': 7, 'vmax': 1000, 'acc': 600}, 13167), ('control 18', {'heights_mm': [4200, 3000, 3500, 5000, 3500], 'from': 3, 'to': 4, 'vmax': 1000, 'acc': 800}, 6250)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 56', {'heights_mm': [3000, 5000, 5000, 5000, 4200, 4200, 3000, 5000, 4200, 3000], 'from': 7, 'to': 0, 'vmax': 4000, 'acc': 600}, 14017), ('boundary: same floor', {'heights_mm': [3000, 3000, 3000], 'from': 2, 'to': 2, 'vmax': 2500, 'acc': 1000}, 0), ('control 23', {'heights_mm': [5000, 3000, 3000, 4200, 4200, 3500, 3000], 'from': 1, 'to': 0, 'vmax': 1600, 'acc': 1000}, 4725), ('control 26', {'heights_mm': [4200, 5000, 4200, 4200, 3000, 3500, 3500, 3500], 'from': 7, 'to': 0, 'vmax': 4000, 'acc': 1000}, 10900), ('control 29', {'heights_mm': [3000, 3000, 3500, 3500, 3000, 4200, 3500, 3000, 3000, 4200, 3500, 5000], 'from': 0, 'to': 4, 'vmax': 1000, 'acc': 1000}, 14000)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 8', {'heights_mm': [3000, 4200, 3500, 4200, 3000, 3000, 4200], 'from': 0, 'to': 4, 'vmax': 4000, 'acc': 1200}, 7059), ('boundary: fractional milliseconds', {'heights_mm': [3500, 3500, 3500, 3500], 'from': 0, 'to': 3, 'vmax': 1600, 'acc': 600}, 9230), ('control 34', {'heights_mm': [3000, 5000, 3500, 4200, 3500, 3000, 3500], 'from': 3, 'to': 5, 'vmax': 4000, 'acc': 800}, 6205), ('control 37', {'heights_mm': [3000, 3000, 5000, 3000, 5000], 'from': 2, 'to': 4, 'vmax': 1000, 'acc': 1200}, 8834), ('control 40', {'heights_mm': [3000, 3500, 3500, 5000], 'from': 0, 'to': 2, 'vmax': 1600, 'acc': 1000}, 5663)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 32', {'heights_mm': [3500, 4200, 4200, 3500, 5000, 3500, 5000, 3500, 3000, 3000, 3500], 'from': 10, 'to': 2, 'vmax': 4000, 'acc': 1000}, 11675), ('boundary: long run at contract speed', {'heights_mm': [4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000], 'from': 0, 'to': 9, 'vmax': 2500, 'acc': 1000}, 16900), ('control 45', {'heights_mm': [5000, 3500, 3000, 3500, 4200, 3000, 3500, 3500, 3500, 4200], 'from': 3, 'to': 8, 'vmax': 1000, 'acc': 1200}, 18534), ('control 48', {'heights_mm': [5000, 3000, 3500, 3000, 3000, 3500, 3500, 3000, 5000, 3500], 'from': 9, 'to': 8, 'vmax': 4000, 'acc': 1000}, 4473), ('control 51', {'heights_mm': [4200, 4200, 3000, 5000, 5000, 5000, 3500], 'from': 6, 'to': 5, 'vmax': 4000, 'acc': 800}, 5000)]]
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 fixtureActualExpectedOutcome
regression: between the two regimes59255917Failed
boundary: downward trip55805580Passed
sampled regression 3863846378Failed
control 357005700Passed
boundary: one floor up34653465Passed
control 11952119521Passed
control 400Passed
control 771647164Passed

SHA-256 / f831d7adf29508c55ffe2f9f2548b7364281b71ddf60e38293faf57c98d9ffe2

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    lo, hi = sorted((x['from'], x['to']))
    d = sum(x['heights_mm'][lo:hi])
    if d == 0:
        return 0
    v = x['vmax']
    a = x['acc']
    if d * a >= 2 * v * v:
        t = d / v + v / a
    else:
        t = 2 * math.sqrt(d / a)
    return math.ceil(t * 1000 - 1e-9)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 3', {'heights_mm': [4200, 3000, 4200, 3000, 3000, 5000, 4200, 4200, 4200, 4200, 3000], 'from': 4, 'to': 6, 'vmax': 2500, 'acc': 1000}, 5700), ('boundary: one floor up', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 0, 'to': 1, 'vmax': 2500, 'acc': 1000}, 3465), ('control 1', {'heights_mm': [5000, 4200, 3500, 4200, 4200, 5000, 3000, 3500, 5000, 4200, 3500], 'from': 7, 'to': 0, 'vmax': 1600, 'acc': 1200}, 19521), ('control 4', {'heights_mm': [3500, 3500, 5000, 3500], 'from': 1, 'to': 1, 'vmax': 4000, 'acc': 600}, 0), ('control 7', {'heights_mm': [3500, 3500, 4200, 5000, 3500], 'from': 4, 'to': 1, 'vmax': 2500, 'acc': 1200}, 7164)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 27', {'heights_mm': [4200, 4200, 5000, 3500, 4200, 5000, 4200, 5000, 3000], 'from': 2, 'to': 8, 'vmax': 4000, 'acc': 800}, 11725), ('boundary: long run at contract speed', {'heights_mm': [4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000], 'from': 0, 'to': 9, 'vmax': 2500, 'acc': 1000}, 16900), ('control 12', {'heights_mm': [3000, 5000, 3000, 5000, 4200, 5000, 3000, 4200, 4200, 3500], 'from': 5, 'to': 1, 'vmax': 1000, 'acc': 600}, 18867), ('control 15', {'heights_mm': [3000, 3500, 3000, 3000, 5000, 3000, 3500, 3000, 3000, 3500], 'from': 4, 'to': 7, 'vmax': 1000, 'acc': 600}, 13167), ('control 18', {'heights_mm': [4200, 3000, 3500, 5000, 3500], 'from': 3, 'to': 4, 'vmax': 1000, 'acc': 800}, 6250)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 56', {'heights_mm': [3000, 5000, 5000, 5000, 4200, 4200, 3000, 5000, 4200, 3000], 'from': 7, 'to': 0, 'vmax': 4000, 'acc': 600}, 14017), ('boundary: same floor', {'heights_mm': [3000, 3000, 3000], 'from': 2, 'to': 2, 'vmax': 2500, 'acc': 1000}, 0), ('control 23', {'heights_mm': [5000, 3000, 3000, 4200, 4200, 3500, 3000], 'from': 1, 'to': 0, 'vmax': 1600, 'acc': 1000}, 4725), ('control 26', {'heights_mm': [4200, 5000, 4200, 4200, 3000, 3500, 3500, 3500], 'from': 7, 'to': 0, 'vmax': 4000, 'acc': 1000}, 10900), ('control 29', {'heights_mm': [3000, 3000, 3500, 3500, 3000, 4200, 3500, 3000, 3000, 4200, 3500, 5000], 'from': 0, 'to': 4, 'vmax': 1000, 'acc': 1000}, 14000)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 8', {'heights_mm': [3000, 4200, 3500, 4200, 3000, 3000, 4200], 'from': 0, 'to': 4, 'vmax': 4000, 'acc': 1200}, 7059), ('boundary: fractional milliseconds', {'heights_mm': [3500, 3500, 3500, 3500], 'from': 0, 'to': 3, 'vmax': 1600, 'acc': 600}, 9230), ('control 34', {'heights_mm': [3000, 5000, 3500, 4200, 3500, 3000, 3500], 'from': 3, 'to': 5, 'vmax': 4000, 'acc': 800}, 6205), ('control 37', {'heights_mm': [3000, 3000, 5000, 3000, 5000], 'from': 2, 'to': 4, 'vmax': 1000, 'acc': 1200}, 8834), ('control 40', {'heights_mm': [3000, 3500, 3500, 5000], 'from': 0, 'to': 2, 'vmax': 1600, 'acc': 1000}, 5663)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 32', {'heights_mm': [3500, 4200, 4200, 3500, 5000, 3500, 5000, 3500, 3000, 3000, 3500], 'from': 10, 'to': 2, 'vmax': 4000, 'acc': 1000}, 11675), ('boundary: long run at contract speed', {'heights_mm': [4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000], 'from': 0, 'to': 9, 'vmax': 2500, 'acc': 1000}, 16900), ('control 45', {'heights_mm': [5000, 3500, 3000, 3500, 4200, 3000, 3500, 3500, 3500, 4200], 'from': 3, 'to': 8, 'vmax': 1000, 'acc': 1200}, 18534), ('control 48', {'heights_mm': [5000, 3000, 3500, 3000, 3000, 3500, 3500, 3000, 5000, 3500], 'from': 9, 'to': 8, 'vmax': 4000, 'acc': 1000}, 4473), ('control 51', {'heights_mm': [4200, 4200, 3000, 5000, 5000, 5000, 3500], 'from': 6, 'to': 5, 'vmax': 4000, 'acc': 800}, 5000)]]
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 fixtureActualExpectedOutcome
regression: between the two regimes59175917Passed
boundary: downward trip55505580Failed
sampled regression 3863786378Passed
control 356575700Failed
boundary: one floor up34653465Passed
control 11952119521Passed
control 400Passed
control 771647164Passed

SHA-256 / 957a7ed97435345999e057614751cb4ee64d3f43dbb99a420af63d9cfae90c86

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    lo, hi = sorted((x['from'], x['to']))
    d = sum(x['heights_mm'][lo:hi])
    if d == 0:
        return 0
    v = x['vmax']
    a = x['acc']
    if d * a >= v * v:
        t = d / v + v / a
    else:
        t = 2 * math.sqrt(d / a)
    return math.ceil(t * 1000 - 1e-9)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 3', {'heights_mm': [4200, 3000, 4200, 3000, 3000, 5000, 4200, 4200, 4200, 4200, 3000], 'from': 4, 'to': 6, 'vmax': 2500, 'acc': 1000}, 5700), ('boundary: one floor up', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 0, 'to': 1, 'vmax': 2500, 'acc': 1000}, 3465), ('control 1', {'heights_mm': [5000, 4200, 3500, 4200, 4200, 5000, 3000, 3500, 5000, 4200, 3500], 'from': 7, 'to': 0, 'vmax': 1600, 'acc': 1200}, 19521), ('control 4', {'heights_mm': [3500, 3500, 5000, 3500], 'from': 1, 'to': 1, 'vmax': 4000, 'acc': 600}, 0), ('control 7', {'heights_mm': [3500, 3500, 4200, 5000, 3500], 'from': 4, 'to': 1, 'vmax': 2500, 'acc': 1200}, 7164)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 27', {'heights_mm': [4200, 4200, 5000, 3500, 4200, 5000, 4200, 5000, 3000], 'from': 2, 'to': 8, 'vmax': 4000, 'acc': 800}, 11725), ('boundary: long run at contract speed', {'heights_mm': [4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000], 'from': 0, 'to': 9, 'vmax': 2500, 'acc': 1000}, 16900), ('control 12', {'heights_mm': [3000, 5000, 3000, 5000, 4200, 5000, 3000, 4200, 4200, 3500], 'from': 5, 'to': 1, 'vmax': 1000, 'acc': 600}, 18867), ('control 15', {'heights_mm': [3000, 3500, 3000, 3000, 5000, 3000, 3500, 3000, 3000, 3500], 'from': 4, 'to': 7, 'vmax': 1000, 'acc': 600}, 13167), ('control 18', {'heights_mm': [4200, 3000, 3500, 5000, 3500], 'from': 3, 'to': 4, 'vmax': 1000, 'acc': 800}, 6250)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 56', {'heights_mm': [3000, 5000, 5000, 5000, 4200, 4200, 3000, 5000, 4200, 3000], 'from': 7, 'to': 0, 'vmax': 4000, 'acc': 600}, 14017), ('boundary: same floor', {'heights_mm': [3000, 3000, 3000], 'from': 2, 'to': 2, 'vmax': 2500, 'acc': 1000}, 0), ('control 23', {'heights_mm': [5000, 3000, 3000, 4200, 4200, 3500, 3000], 'from': 1, 'to': 0, 'vmax': 1600, 'acc': 1000}, 4725), ('control 26', {'heights_mm': [4200, 5000, 4200, 4200, 3000, 3500, 3500, 3500], 'from': 7, 'to': 0, 'vmax': 4000, 'acc': 1000}, 10900), ('control 29', {'heights_mm': [3000, 3000, 3500, 3500, 3000, 4200, 3500, 3000, 3000, 4200, 3500, 5000], 'from': 0, 'to': 4, 'vmax': 1000, 'acc': 1000}, 14000)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 8', {'heights_mm': [3000, 4200, 3500, 4200, 3000, 3000, 4200], 'from': 0, 'to': 4, 'vmax': 4000, 'acc': 1200}, 7059), ('boundary: fractional milliseconds', {'heights_mm': [3500, 3500, 3500, 3500], 'from': 0, 'to': 3, 'vmax': 1600, 'acc': 600}, 9230), ('control 34', {'heights_mm': [3000, 5000, 3500, 4200, 3500, 3000, 3500], 'from': 3, 'to': 5, 'vmax': 4000, 'acc': 800}, 6205), ('control 37', {'heights_mm': [3000, 3000, 5000, 3000, 5000], 'from': 2, 'to': 4, 'vmax': 1000, 'acc': 1200}, 8834), ('control 40', {'heights_mm': [3000, 3500, 3500, 5000], 'from': 0, 'to': 2, 'vmax': 1600, 'acc': 1000}, 5663)], [('regression: between the two regimes', {'heights_mm': [3500, 3500, 3500, 3500, 3500, 3500], 'from': 0, 'to': 2, 'vmax': 2500, 'acc': 800}, 5917), ('boundary: downward trip', {'heights_mm': [3000, 3500, 4200, 5000], 'from': 3, 'to': 1, 'vmax': 2500, 'acc': 1000}, 5580), ('sampled regression 38', {'heights_mm': [4200, 3500, 4200, 4200, 5000, 3000, 3500, 4200, 3500, 3000, 3500], 'from': 6, 'to': 3, 'vmax': 4000, 'acc': 1200}, 6378), ('control 32', {'heights_mm': [3500, 4200, 4200, 3500, 5000, 3500, 5000, 3500, 3000, 3000, 3500], 'from': 10, 'to': 2, 'vmax': 4000, 'acc': 1000}, 11675), ('boundary: long run at contract speed', {'heights_mm': [4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000], 'from': 0, 'to': 9, 'vmax': 2500, 'acc': 1000}, 16900), ('control 45', {'heights_mm': [5000, 3500, 3000, 3500, 4200, 3000, 3500, 3500, 3500, 4200], 'from': 3, 'to': 8, 'vmax': 1000, 'acc': 1200}, 18534), ('control 48', {'heights_mm': [5000, 3000, 3500, 3000, 3000, 3500, 3500, 3000, 5000, 3500], 'from': 9, 'to': 8, 'vmax': 4000, 'acc': 1000}, 4473), ('control 51', {'heights_mm': [4200, 4200, 3000, 5000, 5000, 5000, 3500], 'from': 6, 'to': 5, 'vmax': 4000, 'acc': 800}, 5000)]]
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 fixtureActualExpectedOutcome
regression: between the two regimes59175917Passed
boundary: downward trip55805580Passed
sampled regression 3863786378Passed
control 357005700Passed
boundary: one floor up34653465Passed
control 11952119521Passed
control 400Passed
control 771647164Passed

SHA-256 / 0009db2462aaee46258913631862453bf96f7418cf139ccd76c5bc3d34453989

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:52.844341+00:00.

Case digest / 03987cd41aa38bf0e8e8312586ca9401f7da94267a5842ec2bfbe0877ebab167