FAILURE MAP
← Case archive

FA-67466 / Elevator dispatch scheduling / Open access

Floor label and index mapping: index range guard · case 01

A negative index returns a label from the top of the building.

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

ROOT CAUSE

Negative indices fall through to Python negative indexing.

THE FAILURE

Negative indices fall through to Python negative indexing.

Unsuccessful approach: Excluding index 0 loses the lowest floor.

Case contract

Physical indices 0..floors-1 are labelled bottom-up: basements Bk..B1, then G, then M if there is a mezzanine, then 1, 2, 3 ... skipping 13 when skip13. label:i returns the label of index i (None outside the range); index:L returns the index of label L (case-insensitive) or None.

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):
    labels = ['B%d' % i for i in range(x['basements'], 0, -1)] + ['G']
    if x['mezz']:
        labels.append('M')
    num = 1
    while len(labels) < x['floors']:
        if x['skip13'] and num == 13:
            num += 1
            continue
        labels.append(str(num))
        num += 1
    out = []
    for q in x['queries']:
        kind, val = q.split(':')
        if kind == 'label':
            i = int(val)
            out.append(labels[i] if i < len(labels) else None)
        else:
            v = val.upper()
            out.append(labels.index(v) if v in labels else None)
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('boundary: two basements', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 8, 'queries': ['label:0', 'label:1', 'index:B1', 'index:B2']}, ['B2', 'B1', 1, 0]), ('sampled regression 5', {'basements': 2, 'mezz': True, 'skip13': True, 'floors': 9, 'queries': ['index:M', 'label:0', 'index:B1', 'index:B1', 'label:-2', 'index:g']}, [3, 'B2', 1, 1, None, 2]), ('boundary: thirteen skipped', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 16, 'queries': ['label:13', 'index:14', 'index:13']}, ['14', 13, None]), ('boundary: thirteen kept', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 16, 'queries': ['label:13', 'index:13']}, ['13', 13]), ('control 1', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 9, 'queries': ['label:2', 'index:B1', 'index:B1', 'label:9', 'index:15', 'label:9']}, ['1', None, None, None, None, None]), ('sampled regression 4', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 15, 'queries': ['index:B1', 'label:-1', 'index:g', 'label:13', 'index:13', 'index:14']}, [None, None, 0, '14', None, 13]), ('sampled regression 7', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 9, 'queries': ['index:G', 'index:B2', 'index:14', 'label:8', 'label:-1', 'label:5']}, [1, None, None, '6', None, '3'])], [('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('sampled regression 28', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 12, 'queries': ['label:1', 'label:13', 'index:m', 'index:b2', 'label:-2', 'label:10']}, ['G', None, 2, None, None, '8']), ('control 15', {'basements': 2, 'mezz': True, 'skip13': True, 'floors': 15, 'queries': ['label:14', 'index:1', 'index:13', 'label:0', 'label:7', 'index:X']}, ['11', 4, None, 'B2', '4', None]), ('boundary: thirteen kept', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 16, 'queries': ['label:13', 'index:13']}, ['13', 13]), ('boundary: ground floor index', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:0', 'index:g', 'index:m']}, ['G', 0, 1]), ('sampled regression 12', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 8, 'queries': ['index:B2', 'index:20', 'index:12', 'index:13', 'index:12', 'label:-1']}, [None, None, None, None, None, None]), ('sampled regression 18', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 18, 'queries': ['index:B1', 'label:-1', 'index:12', 'index:15', 'label:16', 'index:20']}, [0, None, 14, 16, '15', None]), ('control 21', {'basements': 2, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:11', 'index:b2', 'label:0', 'index:B2', 'label:6', 'index:1']}, [None, 0, 'B2', 0, '3', 4])], [('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('boundary: ground floor index', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:0', 'index:g', 'index:m']}, ['G', 0, 1]), ('sampled regression 46', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 10, 'queries': ['label:8', 'index:B1', 'index:14', 'label:-1', 'label:2', 'label:4']}, ['6', 1, None, None, 'G', '2']), ('sampled regression 33', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 12, 'queries': ['label:8', 'index:13', 'label:9', 'label:0', 'label:6', 'label:-1']}, ['6', None, '7', 'B2', '4', None]), ('boundary: twenty-six with skip', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 30, 'queries': ['label:26', 'label:27', 'index:26']}, ['27', '28', 25]), ('control 23', {'basements': 2, 'mezz': True, 'skip13': True, 'floors': 18, 'queries': ['index:B2', 'label:5', 'index:15', 'index:B1', 'index:b2', 'index:g']}, [0, '2', 17, 1, 0, 2]), ('sampled regression 26', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 8, 'queries': ['index:G', 'label:-1', 'label:6', 'label:3', 'index:G', 'label:-1']}, [1, None, '4', '1', 1, None]), ('control 29', {'basements': 1, 'mezz': False, 'skip13': False, 'floors': 14, 'queries': ['label:11', 'label:6', 'label:14', 'label:2', 'index:b2', 'index:M']}, ['10', '5', None, '1', None, None])], [('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('boundary: two basements', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 8, 'queries': ['label:0', 'label:1', 'index:B1', 'index:B2']}, ['B2', 'B1', 1, 0]), ('sampled regression 53', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 6, 'queries': ['label:6', 'index:B2', 'label:7', 'label:-1', 'index:B2', 'label:1']}, [None, None, None, None, None, 'G']), ('sampled regression 66', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 6, 'queries': ['index:15', 'label:3', 'label:6', 'label:0', 'label:-2', 'label:3']}, [None, '1', None, 'B2', None, '1']), ('boundary: index past the top', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 6, 'queries': ['label:6', 'label:5']}, [None, '5']), ('sampled regression 34', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 6, 'queries': ['index:B2', 'index:M', 'label:4', 'index:13', 'label:-2', 'label:5']}, [None, None, '4', None, None, '5']), ('control 37', {'basements': 1, 'mezz': False, 'skip13': True, 'floors': 19, 'queries': ['label:15', 'index:17', 'label:5', 'index:15', 'index:M', 'index:B1']}, ['15', 17, '4', 15, None, 0]), ('control 40', {'basements': 1, 'mezz': True, 'skip13': False, 'floors': 13, 'queries': ['index:B2', 'index:B2', 'index:g', 'index:17', 'index:17', 'label:13']}, [None, None, 1, None, None, None])], [('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('sampled regression 74', {'basements': 1, 'mezz': False, 'skip13': False, 'floors': 6, 'queries': ['index:14', 'index:g', 'index:G', 'index:20', 'index:X', 'label:-1']}, [None, 1, 1, None, None, None]), ('boundary: two basements', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 8, 'queries': ['label:0', 'label:1', 'index:B1', 'index:B2']}, ['B2', 'B1', 1, 0]), ('boundary: thirteen skipped', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 16, 'queries': ['label:13', 'index:14', 'index:13']}, ['14', 13, None]), ('boundary: thirteen kept', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 16, 'queries': ['label:13', 'index:13']}, ['13', 13]), ('control 45', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 6, 'queries': ['index:m', 'index:15', 'label:4', 'index:g', 'index:17', 'label:7']}, [None, None, '4', 0, None, None]), ('sampled regression 48', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 17, 'queries': ['label:8', 'label:5', 'index:m', 'label:13', 'label:-1', 'label:16']}, ['7', '4', 1, '12', None, '16']), ('sampled regression 51', {'basements': 2, 'mezz': False, 'skip13': False, 'floors': 10, 'queries': ['label:6', 'label:-2', 'label:8', 'label:-2', 'label:7', 'index:B1']}, ['4', None, '6', None, '5', 1])]]
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: negative index['7', 'B1'][None, 'B1']Failed
boundary: two basements['B2', 'B1', 1, 0]['B2', 'B1', 1, 0]Passed
sampled regression 5[3, 'B2', 1, 1, '4', 2][3, 'B2', 1, 1, None, 2]Failed
boundary: thirteen skipped['14', 13, None]['14', 13, None]Passed
boundary: thirteen kept['13', 13]['13', 13]Passed
control 1['1', None, None, None, None, None]['1', None, None, None, None, None]Passed
sampled regression 4[None, '15', 0, '14', None, 13][None, None, 0, '14', None, 13]Failed
sampled regression 7[1, None, None, '6', '6', '3'][1, None, None, '6', None, '3']Failed

SHA-256 / 1511e16457d4a66ab013dbc244be7cea173d8c0bbdcbbc1a14ea178812f11046

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    labels = ['B%d' % i for i in range(x['basements'], 0, -1)] + ['G']
    if x['mezz']:
        labels.append('M')
    num = 1
    while len(labels) < x['floors']:
        if x['skip13'] and num == 13:
            num += 1
            continue
        labels.append(str(num))
        num += 1
    out = []
    for q in x['queries']:
        kind, val = q.split(':')
        if kind == 'label':
            i = int(val)
            out.append(labels[i] if 0 < i < len(labels) else None)
        else:
            v = val.upper()
            out.append(labels.index(v) if v in labels else None)
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('boundary: two basements', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 8, 'queries': ['label:0', 'label:1', 'index:B1', 'index:B2']}, ['B2', 'B1', 1, 0]), ('sampled regression 5', {'basements': 2, 'mezz': True, 'skip13': True, 'floors': 9, 'queries': ['index:M', 'label:0', 'index:B1', 'index:B1', 'label:-2', 'index:g']}, [3, 'B2', 1, 1, None, 2]), ('boundary: thirteen skipped', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 16, 'queries': ['label:13', 'index:14', 'index:13']}, ['14', 13, None]), ('boundary: thirteen kept', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 16, 'queries': ['label:13', 'index:13']}, ['13', 13]), ('control 1', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 9, 'queries': ['label:2', 'index:B1', 'index:B1', 'label:9', 'index:15', 'label:9']}, ['1', None, None, None, None, None]), ('sampled regression 4', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 15, 'queries': ['index:B1', 'label:-1', 'index:g', 'label:13', 'index:13', 'index:14']}, [None, None, 0, '14', None, 13]), ('sampled regression 7', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 9, 'queries': ['index:G', 'index:B2', 'index:14', 'label:8', 'label:-1', 'label:5']}, [1, None, None, '6', None, '3'])], [('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('sampled regression 28', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 12, 'queries': ['label:1', 'label:13', 'index:m', 'index:b2', 'label:-2', 'label:10']}, ['G', None, 2, None, None, '8']), ('control 15', {'basements': 2, 'mezz': True, 'skip13': True, 'floors': 15, 'queries': ['label:14', 'index:1', 'index:13', 'label:0', 'label:7', 'index:X']}, ['11', 4, None, 'B2', '4', None]), ('boundary: thirteen kept', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 16, 'queries': ['label:13', 'index:13']}, ['13', 13]), ('boundary: ground floor index', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:0', 'index:g', 'index:m']}, ['G', 0, 1]), ('sampled regression 12', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 8, 'queries': ['index:B2', 'index:20', 'index:12', 'index:13', 'index:12', 'label:-1']}, [None, None, None, None, None, None]), ('sampled regression 18', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 18, 'queries': ['index:B1', 'label:-1', 'index:12', 'index:15', 'label:16', 'index:20']}, [0, None, 14, 16, '15', None]), ('control 21', {'basements': 2, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:11', 'index:b2', 'label:0', 'index:B2', 'label:6', 'index:1']}, [None, 0, 'B2', 0, '3', 4])], [('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('boundary: ground floor index', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:0', 'index:g', 'index:m']}, ['G', 0, 1]), ('sampled regression 46', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 10, 'queries': ['label:8', 'index:B1', 'index:14', 'label:-1', 'label:2', 'label:4']}, ['6', 1, None, None, 'G', '2']), ('sampled regression 33', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 12, 'queries': ['label:8', 'index:13', 'label:9', 'label:0', 'label:6', 'label:-1']}, ['6', None, '7', 'B2', '4', None]), ('boundary: twenty-six with skip', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 30, 'queries': ['label:26', 'label:27', 'index:26']}, ['27', '28', 25]), ('control 23', {'basements': 2, 'mezz': True, 'skip13': True, 'floors': 18, 'queries': ['index:B2', 'label:5', 'index:15', 'index:B1', 'index:b2', 'index:g']}, [0, '2', 17, 1, 0, 2]), ('sampled regression 26', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 8, 'queries': ['index:G', 'label:-1', 'label:6', 'label:3', 'index:G', 'label:-1']}, [1, None, '4', '1', 1, None]), ('control 29', {'basements': 1, 'mezz': False, 'skip13': False, 'floors': 14, 'queries': ['label:11', 'label:6', 'label:14', 'label:2', 'index:b2', 'index:M']}, ['10', '5', None, '1', None, None])], [('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('boundary: two basements', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 8, 'queries': ['label:0', 'label:1', 'index:B1', 'index:B2']}, ['B2', 'B1', 1, 0]), ('sampled regression 53', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 6, 'queries': ['label:6', 'index:B2', 'label:7', 'label:-1', 'index:B2', 'label:1']}, [None, None, None, None, None, 'G']), ('sampled regression 66', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 6, 'queries': ['index:15', 'label:3', 'label:6', 'label:0', 'label:-2', 'label:3']}, [None, '1', None, 'B2', None, '1']), ('boundary: index past the top', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 6, 'queries': ['label:6', 'label:5']}, [None, '5']), ('sampled regression 34', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 6, 'queries': ['index:B2', 'index:M', 'label:4', 'index:13', 'label:-2', 'label:5']}, [None, None, '4', None, None, '5']), ('control 37', {'basements': 1, 'mezz': False, 'skip13': True, 'floors': 19, 'queries': ['label:15', 'index:17', 'label:5', 'index:15', 'index:M', 'index:B1']}, ['15', 17, '4', 15, None, 0]), ('control 40', {'basements': 1, 'mezz': True, 'skip13': False, 'floors': 13, 'queries': ['index:B2', 'index:B2', 'index:g', 'index:17', 'index:17', 'label:13']}, [None, None, 1, None, None, None])], [('regression: negative index', {'basements': 1, 'mezz': True, 'skip13': True, 'floors': 10, 'queries': ['label:-1', 'label:0']}, [None, 'B1']), ('sampled regression 74', {'basements': 1, 'mezz': False, 'skip13': False, 'floors': 6, 'queries': ['index:14', 'index:g', 'index:G', 'index:20', 'index:X', 'label:-1']}, [None, 1, 1, None, None, None]), ('boundary: two basements', {'basements': 2, 'mezz': False, 'skip13': True, 'floors': 8, 'queries': ['label:0', 'label:1', 'index:B1', 'index:B2']}, ['B2', 'B1', 1, 0]), ('boundary: thirteen skipped', {'basements': 0, 'mezz': False, 'skip13': True, 'floors': 16, 'queries': ['label:13', 'index:14', 'index:13']}, ['14', 13, None]), ('boundary: thirteen kept', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 16, 'queries': ['label:13', 'index:13']}, ['13', 13]), ('control 45', {'basements': 0, 'mezz': False, 'skip13': False, 'floors': 6, 'queries': ['index:m', 'index:15', 'label:4', 'index:g', 'index:17', 'label:7']}, [None, None, '4', 0, None, None]), ('sampled regression 48', {'basements': 0, 'mezz': True, 'skip13': True, 'floors': 17, 'queries': ['label:8', 'label:5', 'index:m', 'label:13', 'label:-1', 'label:16']}, ['7', '4', 1, '12', None, '16']), ('sampled regression 51', {'basements': 2, 'mezz': False, 'skip13': False, 'floors': 10, 'queries': ['label:6', 'label:-2', 'label:8', 'label:-2', 'label:7', 'index:B1']}, ['4', None, '6', None, '5', 1])]]
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: negative index[None, None][None, 'B1']Failed
boundary: two basements[None, 'B1', 1, 0]['B2', 'B1', 1, 0]Failed
sampled regression 5[3, None, 1, 1, None, 2][3, 'B2', 1, 1, None, 2]Failed
boundary: thirteen skipped['14', 13, None]['14', 13, None]Passed
boundary: thirteen kept['13', 13]['13', 13]Passed
control 1['1', None, None, None, None, None]['1', None, None, None, None, None]Passed
sampled regression 4[None, None, 0, '14', None, 13][None, None, 0, '14', None, 13]Passed
sampled regression 7[1, None, None, '6', None, '3'][1, None, None, '6', None, '3']Passed

SHA-256 / 9a1acb39b0d381dbdb5015dfc797dfb0452a1d4d227496e0e81a08f84b3d3687

HELD IN THE MEMBER ARCHIVE

The verified repair and its recorded checks are member-only.

This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.

Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.

Member access is invitation-based. Sign in with your invited account to inspect the repair.

Sign in to the archive ↗

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

Case digest / 3bbd2555c11735b16a8c79f3d80a85abbeb7b9708d75efb35e78cfcedd7e3572