FAILURE MAP
← Case archive

FA-67666 / Elevator dispatch scheduling / Open access

Car relevelling with doors open: open door limit while active · case 01

The car keeps relevelling with doors open after the offset grows large.

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

ROOT CAUSE

The door-open limit is replaced by the fault limit during an active relevel.

VERIFIED REPAIR

Apply the 75 mm open-door limit on every relevelling sample.

Unsuccessful approach: Dropping the limit for active relevels misses growth after the start.

Case contract

While standing at a floor the level offset (mm) is sampled. Beyond +-200 mm the sample is a fault and any relevel stops. Relevelling starts when |offset| > 10 and continues until |offset| <= 3 (hysteresis). A relevel runs with doors open when |offset| <= 75, otherwise the doors close first (close-relevel). Output hold, relevel, close-relevel or fault per sample.

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):
    active = False
    out = []
    for off in x['samples']:
        a = abs(off)
        if a > 200:
            out.append('fault')
            active = False
            continue
        if active:
            if a <= 3:
                active = False
                out.append('hold')
            else:
                out.append('relevel' if a <= 200 else 'close-relevel')
        elif a > 10:
            active = True
            out.append('relevel' if a <= 75 else 'close-relevel')
        else:
            out.append('hold')
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 4', {'samples': [150, 4, 200, 201, 4, -250, 9, 0]}, ['close-relevel', 'relevel', 'close-relevel', 'fault', 'hold', 'fault', 'hold', 'hold']), ('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('boundary: hysteresis band', {'samples': [11, 8, 4, 3]}, ['relevel', 'relevel', 'relevel', 'hold']), ('boundary: fault clears relevelling', {'samples': [20, 250, 5]}, ['relevel', 'fault', 'hold']), ('sampled regression 1', {'samples': [200, 40, 200, 9, 4]}, ['close-relevel', 'relevel', 'close-relevel', 'relevel', 'relevel']), ('sampled regression 7', {'samples': [-250, 201, 4, 2, 4, 11, 76, 75, 10]}, ['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']), ('sampled regression 10', {'samples': [10, 9, -11, 150, 3, 201]}, ['hold', 'hold', 'relevel', 'close-relevel', 'hold', 'fault'])], [('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('sampled regression 15', {'samples': [-3, 2, 75, 201, 75, 200]}, ['hold', 'hold', 'relevel', 'fault', 'relevel', 'close-relevel']), ('sampled regression 7', {'samples': [-250, 201, 4, 2, 4, 11, 76, 75, 10]}, ['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']), ('boundary: fault clears relevelling', {'samples': [20, 250, 5]}, ['relevel', 'fault', 'hold']), ('boundary: exactly at the fault limit', {'samples': [200, 201]}, ['close-relevel', 'fault']), ('control 12', {'samples': [-4, 150, 11]}, ['hold', 'close-relevel', 'relevel']), ('control 18', {'samples': [-76, 10, 10, -250, 201, -4, 40]}, ['close-relevel', 'relevel', 'relevel', 'fault', 'fault', 'hold', 'relevel']), ('control 21', {'samples': [75, 40, 201, 9, 11, 4]}, ['relevel', 'relevel', 'fault', 'hold', 'relevel', 'relevel'])], [('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 27', {'samples': [3, 11, 11, 4, 201, 150, 150, -4, 10]}, ['hold', 'relevel', 'relevel', 'relevel', 'fault', 'close-relevel', 'close-relevel', 'relevel', 'relevel']), ('sampled regression 16', {'samples': [200, 75, -76, 10, 0, 40]}, ['close-relevel', 'relevel', 'close-relevel', 'relevel', 'hold', 'relevel']), ('boundary: negative offsets', {'samples': [-11, -4, -3]}, ['relevel', 'relevel', 'hold']), ('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('sampled regression 23', {'samples': [3, 10, 200, 0, 3, -4, 0, 200, -4, 150]}, ['hold', 'hold', 'close-relevel', 'hold', 'hold', 'hold', 'hold', 'close-relevel', 'relevel', 'close-relevel']), ('control 26', {'samples': [76, 201, 3, 3]}, ['close-relevel', 'fault', 'hold', 'hold']), ('control 29', {'samples': [2, 4, 75, 0, 11, -3, -3, 4]}, ['hold', 'hold', 'relevel', 'hold', 'relevel', 'hold', 'hold', 'hold'])], [('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('sampled regression 42', {'samples': [-3, -76, -76, 11, 2, 150, 75, 76]}, ['hold', 'close-relevel', 'close-relevel', 'relevel', 'hold', 'close-relevel', 'relevel', 'close-relevel']), ('sampled regression 25', {'samples': [200, 150, 2, 11, -250, 75, 0, 11]}, ['close-relevel', 'close-relevel', 'hold', 'relevel', 'fault', 'relevel', 'hold', 'relevel']), ('boundary: hysteresis band', {'samples': [11, 8, 4, 3]}, ['relevel', 'relevel', 'relevel', 'hold']), ('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 34', {'samples': [150, 10, 200]}, ['close-relevel', 'relevel', 'close-relevel']), ('sampled regression 37', {'samples': [-76, 0, 76, 11, -11, 200, 150, 9]}, ['close-relevel', 'hold', 'close-relevel', 'relevel', 'relevel', 'close-relevel', 'close-relevel', 'relevel']), ('sampled regression 40', {'samples': [40, 76, -4]}, ['relevel', 'close-relevel', 'relevel'])], [('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 60', {'samples': [-250, 200, 40, -4, 150, 3, 3, 3]}, ['fault', 'close-relevel', 'relevel', 'relevel', 'close-relevel', 'hold', 'hold', 'hold']), ('sampled regression 36', {'samples': [11, 150, 11, 3]}, ['relevel', 'close-relevel', 'relevel', 'hold']), ('boundary: fault clears relevelling', {'samples': [20, 250, 5]}, ['relevel', 'fault', 'hold']), ('boundary: exactly at the fault limit', {'samples': [200, 201]}, ['close-relevel', 'fault']), ('control 45', {'samples': [150, 75, 4, 75, -11, 75, 40, -4, 3, 9]}, ['close-relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'hold', 'hold']), ('sampled regression 48', {'samples': [150, -76, 10, 4, -250, 40, 10]}, ['close-relevel', 'close-relevel', 'relevel', 'relevel', 'fault', 'relevel', 'relevel']), ('sampled regression 51', {'samples': [200, -4, -4, 76, 75, 76]}, ['close-relevel', 'relevel', 'relevel', 'close-relevel', 'relevel', 'close-relevel'])]]
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: large offset while relevelling['relevel', 'relevel', 'relevel']['relevel', 'close-relevel', 'relevel']Failed
sampled regression 4['close-relevel', 'relevel', 'relevel', 'fault', 'hold', 'fault', 'hold', 'hold']['close-relevel', 'relevel', 'close-relevel', 'fault', 'hold', 'fault', 'hold', 'hold']Failed
regression: open door limit['relevel', 'relevel']['relevel', 'close-relevel']Failed
boundary: hysteresis band['relevel', 'relevel', 'relevel', 'hold']['relevel', 'relevel', 'relevel', 'hold']Passed
boundary: fault clears relevelling['relevel', 'fault', 'hold']['relevel', 'fault', 'hold']Passed
sampled regression 1['close-relevel', 'relevel', 'relevel', 'relevel', 'relevel']['close-relevel', 'relevel', 'close-relevel', 'relevel', 'relevel']Failed
sampled regression 7['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'relevel', 'relevel', 'relevel']['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']Failed
sampled regression 10['hold', 'hold', 'relevel', 'relevel', 'hold', 'fault']['hold', 'hold', 'relevel', 'close-relevel', 'hold', 'fault']Failed

SHA-256 / 1d960ff9efebf4fd9387e83d59d617183ddfdab33dbbc1cb2be1fb97654cbe2d

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    active = False
    out = []
    for off in x['samples']:
        a = abs(off)
        if a > 200:
            out.append('fault')
            active = False
            continue
        if active:
            if a <= 3:
                active = False
                out.append('hold')
            else:
                out.append('relevel')
        elif a > 10:
            active = True
            out.append('relevel' if a <= 75 else 'close-relevel')
        else:
            out.append('hold')
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 4', {'samples': [150, 4, 200, 201, 4, -250, 9, 0]}, ['close-relevel', 'relevel', 'close-relevel', 'fault', 'hold', 'fault', 'hold', 'hold']), ('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('boundary: hysteresis band', {'samples': [11, 8, 4, 3]}, ['relevel', 'relevel', 'relevel', 'hold']), ('boundary: fault clears relevelling', {'samples': [20, 250, 5]}, ['relevel', 'fault', 'hold']), ('sampled regression 1', {'samples': [200, 40, 200, 9, 4]}, ['close-relevel', 'relevel', 'close-relevel', 'relevel', 'relevel']), ('sampled regression 7', {'samples': [-250, 201, 4, 2, 4, 11, 76, 75, 10]}, ['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']), ('sampled regression 10', {'samples': [10, 9, -11, 150, 3, 201]}, ['hold', 'hold', 'relevel', 'close-relevel', 'hold', 'fault'])], [('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('sampled regression 15', {'samples': [-3, 2, 75, 201, 75, 200]}, ['hold', 'hold', 'relevel', 'fault', 'relevel', 'close-relevel']), ('sampled regression 7', {'samples': [-250, 201, 4, 2, 4, 11, 76, 75, 10]}, ['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']), ('boundary: fault clears relevelling', {'samples': [20, 250, 5]}, ['relevel', 'fault', 'hold']), ('boundary: exactly at the fault limit', {'samples': [200, 201]}, ['close-relevel', 'fault']), ('control 12', {'samples': [-4, 150, 11]}, ['hold', 'close-relevel', 'relevel']), ('control 18', {'samples': [-76, 10, 10, -250, 201, -4, 40]}, ['close-relevel', 'relevel', 'relevel', 'fault', 'fault', 'hold', 'relevel']), ('control 21', {'samples': [75, 40, 201, 9, 11, 4]}, ['relevel', 'relevel', 'fault', 'hold', 'relevel', 'relevel'])], [('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 27', {'samples': [3, 11, 11, 4, 201, 150, 150, -4, 10]}, ['hold', 'relevel', 'relevel', 'relevel', 'fault', 'close-relevel', 'close-relevel', 'relevel', 'relevel']), ('sampled regression 16', {'samples': [200, 75, -76, 10, 0, 40]}, ['close-relevel', 'relevel', 'close-relevel', 'relevel', 'hold', 'relevel']), ('boundary: negative offsets', {'samples': [-11, -4, -3]}, ['relevel', 'relevel', 'hold']), ('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('sampled regression 23', {'samples': [3, 10, 200, 0, 3, -4, 0, 200, -4, 150]}, ['hold', 'hold', 'close-relevel', 'hold', 'hold', 'hold', 'hold', 'close-relevel', 'relevel', 'close-relevel']), ('control 26', {'samples': [76, 201, 3, 3]}, ['close-relevel', 'fault', 'hold', 'hold']), ('control 29', {'samples': [2, 4, 75, 0, 11, -3, -3, 4]}, ['hold', 'hold', 'relevel', 'hold', 'relevel', 'hold', 'hold', 'hold'])], [('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('sampled regression 42', {'samples': [-3, -76, -76, 11, 2, 150, 75, 76]}, ['hold', 'close-relevel', 'close-relevel', 'relevel', 'hold', 'close-relevel', 'relevel', 'close-relevel']), ('sampled regression 25', {'samples': [200, 150, 2, 11, -250, 75, 0, 11]}, ['close-relevel', 'close-relevel', 'hold', 'relevel', 'fault', 'relevel', 'hold', 'relevel']), ('boundary: hysteresis band', {'samples': [11, 8, 4, 3]}, ['relevel', 'relevel', 'relevel', 'hold']), ('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 34', {'samples': [150, 10, 200]}, ['close-relevel', 'relevel', 'close-relevel']), ('sampled regression 37', {'samples': [-76, 0, 76, 11, -11, 200, 150, 9]}, ['close-relevel', 'hold', 'close-relevel', 'relevel', 'relevel', 'close-relevel', 'close-relevel', 'relevel']), ('sampled regression 40', {'samples': [40, 76, -4]}, ['relevel', 'close-relevel', 'relevel'])], [('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 60', {'samples': [-250, 200, 40, -4, 150, 3, 3, 3]}, ['fault', 'close-relevel', 'relevel', 'relevel', 'close-relevel', 'hold', 'hold', 'hold']), ('sampled regression 36', {'samples': [11, 150, 11, 3]}, ['relevel', 'close-relevel', 'relevel', 'hold']), ('boundary: fault clears relevelling', {'samples': [20, 250, 5]}, ['relevel', 'fault', 'hold']), ('boundary: exactly at the fault limit', {'samples': [200, 201]}, ['close-relevel', 'fault']), ('control 45', {'samples': [150, 75, 4, 75, -11, 75, 40, -4, 3, 9]}, ['close-relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'hold', 'hold']), ('sampled regression 48', {'samples': [150, -76, 10, 4, -250, 40, 10]}, ['close-relevel', 'close-relevel', 'relevel', 'relevel', 'fault', 'relevel', 'relevel']), ('sampled regression 51', {'samples': [200, -4, -4, 76, 75, 76]}, ['close-relevel', 'relevel', 'relevel', 'close-relevel', 'relevel', 'close-relevel'])]]
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: large offset while relevelling['relevel', 'relevel', 'relevel']['relevel', 'close-relevel', 'relevel']Failed
sampled regression 4['close-relevel', 'relevel', 'relevel', 'fault', 'hold', 'fault', 'hold', 'hold']['close-relevel', 'relevel', 'close-relevel', 'fault', 'hold', 'fault', 'hold', 'hold']Failed
regression: open door limit['relevel', 'relevel']['relevel', 'close-relevel']Failed
boundary: hysteresis band['relevel', 'relevel', 'relevel', 'hold']['relevel', 'relevel', 'relevel', 'hold']Passed
boundary: fault clears relevelling['relevel', 'fault', 'hold']['relevel', 'fault', 'hold']Passed
sampled regression 1['close-relevel', 'relevel', 'relevel', 'relevel', 'relevel']['close-relevel', 'relevel', 'close-relevel', 'relevel', 'relevel']Failed
sampled regression 7['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'relevel', 'relevel', 'relevel']['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']Failed
sampled regression 10['hold', 'hold', 'relevel', 'relevel', 'hold', 'fault']['hold', 'hold', 'relevel', 'close-relevel', 'hold', 'fault']Failed

SHA-256 / 9b1f14b96364b83473bb7ea52c389780b8917ebc8554532f7a6834d5f3d1f9a5

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    active = False
    out = []
    for off in x['samples']:
        a = abs(off)
        if a > 200:
            out.append('fault')
            active = False
            continue
        if active:
            if a <= 3:
                active = False
                out.append('hold')
            else:
                out.append('relevel' if a <= 75 else 'close-relevel')
        elif a > 10:
            active = True
            out.append('relevel' if a <= 75 else 'close-relevel')
        else:
            out.append('hold')
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 4', {'samples': [150, 4, 200, 201, 4, -250, 9, 0]}, ['close-relevel', 'relevel', 'close-relevel', 'fault', 'hold', 'fault', 'hold', 'hold']), ('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('boundary: hysteresis band', {'samples': [11, 8, 4, 3]}, ['relevel', 'relevel', 'relevel', 'hold']), ('boundary: fault clears relevelling', {'samples': [20, 250, 5]}, ['relevel', 'fault', 'hold']), ('sampled regression 1', {'samples': [200, 40, 200, 9, 4]}, ['close-relevel', 'relevel', 'close-relevel', 'relevel', 'relevel']), ('sampled regression 7', {'samples': [-250, 201, 4, 2, 4, 11, 76, 75, 10]}, ['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']), ('sampled regression 10', {'samples': [10, 9, -11, 150, 3, 201]}, ['hold', 'hold', 'relevel', 'close-relevel', 'hold', 'fault'])], [('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('sampled regression 15', {'samples': [-3, 2, 75, 201, 75, 200]}, ['hold', 'hold', 'relevel', 'fault', 'relevel', 'close-relevel']), ('sampled regression 7', {'samples': [-250, 201, 4, 2, 4, 11, 76, 75, 10]}, ['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']), ('boundary: fault clears relevelling', {'samples': [20, 250, 5]}, ['relevel', 'fault', 'hold']), ('boundary: exactly at the fault limit', {'samples': [200, 201]}, ['close-relevel', 'fault']), ('control 12', {'samples': [-4, 150, 11]}, ['hold', 'close-relevel', 'relevel']), ('control 18', {'samples': [-76, 10, 10, -250, 201, -4, 40]}, ['close-relevel', 'relevel', 'relevel', 'fault', 'fault', 'hold', 'relevel']), ('control 21', {'samples': [75, 40, 201, 9, 11, 4]}, ['relevel', 'relevel', 'fault', 'hold', 'relevel', 'relevel'])], [('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 27', {'samples': [3, 11, 11, 4, 201, 150, 150, -4, 10]}, ['hold', 'relevel', 'relevel', 'relevel', 'fault', 'close-relevel', 'close-relevel', 'relevel', 'relevel']), ('sampled regression 16', {'samples': [200, 75, -76, 10, 0, 40]}, ['close-relevel', 'relevel', 'close-relevel', 'relevel', 'hold', 'relevel']), ('boundary: negative offsets', {'samples': [-11, -4, -3]}, ['relevel', 'relevel', 'hold']), ('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('sampled regression 23', {'samples': [3, 10, 200, 0, 3, -4, 0, 200, -4, 150]}, ['hold', 'hold', 'close-relevel', 'hold', 'hold', 'hold', 'hold', 'close-relevel', 'relevel', 'close-relevel']), ('control 26', {'samples': [76, 201, 3, 3]}, ['close-relevel', 'fault', 'hold', 'hold']), ('control 29', {'samples': [2, 4, 75, 0, 11, -3, -3, 4]}, ['hold', 'hold', 'relevel', 'hold', 'relevel', 'hold', 'hold', 'hold'])], [('regression: open door limit', {'samples': [75, 76]}, ['relevel', 'close-relevel']), ('sampled regression 42', {'samples': [-3, -76, -76, 11, 2, 150, 75, 76]}, ['hold', 'close-relevel', 'close-relevel', 'relevel', 'hold', 'close-relevel', 'relevel', 'close-relevel']), ('sampled regression 25', {'samples': [200, 150, 2, 11, -250, 75, 0, 11]}, ['close-relevel', 'close-relevel', 'hold', 'relevel', 'fault', 'relevel', 'hold', 'relevel']), ('boundary: hysteresis band', {'samples': [11, 8, 4, 3]}, ['relevel', 'relevel', 'relevel', 'hold']), ('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 34', {'samples': [150, 10, 200]}, ['close-relevel', 'relevel', 'close-relevel']), ('sampled regression 37', {'samples': [-76, 0, 76, 11, -11, 200, 150, 9]}, ['close-relevel', 'hold', 'close-relevel', 'relevel', 'relevel', 'close-relevel', 'close-relevel', 'relevel']), ('sampled regression 40', {'samples': [40, 76, -4]}, ['relevel', 'close-relevel', 'relevel'])], [('regression: large offset while relevelling', {'samples': [20, 90, 30]}, ['relevel', 'close-relevel', 'relevel']), ('sampled regression 60', {'samples': [-250, 200, 40, -4, 150, 3, 3, 3]}, ['fault', 'close-relevel', 'relevel', 'relevel', 'close-relevel', 'hold', 'hold', 'hold']), ('sampled regression 36', {'samples': [11, 150, 11, 3]}, ['relevel', 'close-relevel', 'relevel', 'hold']), ('boundary: fault clears relevelling', {'samples': [20, 250, 5]}, ['relevel', 'fault', 'hold']), ('boundary: exactly at the fault limit', {'samples': [200, 201]}, ['close-relevel', 'fault']), ('control 45', {'samples': [150, 75, 4, 75, -11, 75, 40, -4, 3, 9]}, ['close-relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'relevel', 'hold', 'hold']), ('sampled regression 48', {'samples': [150, -76, 10, 4, -250, 40, 10]}, ['close-relevel', 'close-relevel', 'relevel', 'relevel', 'fault', 'relevel', 'relevel']), ('sampled regression 51', {'samples': [200, -4, -4, 76, 75, 76]}, ['close-relevel', 'relevel', 'relevel', 'close-relevel', 'relevel', 'close-relevel'])]]
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: large offset while relevelling['relevel', 'close-relevel', 'relevel']['relevel', 'close-relevel', 'relevel']Passed
sampled regression 4['close-relevel', 'relevel', 'close-relevel', 'fault', 'hold', 'fault', 'hold', 'hold']['close-relevel', 'relevel', 'close-relevel', 'fault', 'hold', 'fault', 'hold', 'hold']Passed
regression: open door limit['relevel', 'close-relevel']['relevel', 'close-relevel']Passed
boundary: hysteresis band['relevel', 'relevel', 'relevel', 'hold']['relevel', 'relevel', 'relevel', 'hold']Passed
boundary: fault clears relevelling['relevel', 'fault', 'hold']['relevel', 'fault', 'hold']Passed
sampled regression 1['close-relevel', 'relevel', 'close-relevel', 'relevel', 'relevel']['close-relevel', 'relevel', 'close-relevel', 'relevel', 'relevel']Passed
sampled regression 7['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']['fault', 'fault', 'hold', 'hold', 'hold', 'relevel', 'close-relevel', 'relevel', 'relevel']Passed
sampled regression 10['hold', 'hold', 'relevel', 'close-relevel', 'hold', 'fault']['hold', 'hold', 'relevel', 'close-relevel', 'hold', 'fault']Passed

SHA-256 / ddc308fcd23fbca3cf4e8eb11cd0548c2d8b9a652a5a4e5a97f5c9b455f2288b

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

Case digest / 68c179298e4af5cd6e013f8632ed344ce8ad3c670169e73aee0a3651fb2fe29f