FAILURE MAP
← Case archive

FA-7841 / Keyboard accessibility / Open access

Sequential keyboard focus: Programmatic-only targets join sequential navigation · case 01

Programmatic-only targets join sequential navigation.

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

ROOT CAUSE

The negative operation uses `True` where the contract requires `item['tab'] >= 0`.

VERIFIED REPAIR

Implement the negative operation as `item['tab'] >= 0`.

Unsuccessful approach: Requiring positive tabindex excludes ordinary zero tabindex controls.

Case contract

Visit visible enabled nonnegative tabindex controls; positive tabindex precedes zero; ties retain document order and navigation wraps.

Why this case matters

A deterministic model of sequential keyboard focus; this isolates one interface invariant without requiring a browser.

1 / The failure

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

N = 1
observations = []
def solve(items, current, direction):
    eligible = [i for i, item in enumerate(items) if item['visible'] and not item['disabled'] and True]
    eligible.sort(key=lambda i: (items[i]['tab'] == 0, items[i]['tab'] if items[i]['tab'] > 0 else 0, i))
    if not eligible: return None
    if current not in eligible: return eligible[0] if direction > 0 else eligible[-1]
    return eligible[(eligible.index(current) + direction) % len(eligible)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('hidden', solve([dict(visible=False, disabled=False, tab=0),dict(visible=True,disabled=False,tab=0)], None, 1), 1)
check('disabled', solve([dict(visible=True,disabled=True,tab=0),dict(visible=True,disabled=False,tab=0)], None, 1), 1)
check('negative', solve([dict(visible=True,disabled=False,tab=-1),dict(visible=True,disabled=False,tab=0)], None, 1), 1)
check('priority', solve([dict(visible=True,disabled=False,tab=0),dict(visible=True,disabled=False,tab=2)], None, 1), 1)
check('reverse', solve([dict(visible=True,disabled=False,tab=0)]*3, 1, -1), 0)
check('forward', solve([dict(visible=True,disabled=False,tab=0)]*3, 1, 1), 2)
check('empty', solve([], None, 1), None)
check('parameterized focus sequence', solve([dict(visible=True, disabled=False, tab=0)]*(N+2), N, 1), N+1)
for repetition in range(N):
    check('repeat empty', solve([], None, 1), None)
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
hidden11Passed
disabled11Passed
negative01Failed
priority11Passed
reverse00Passed
forward22Passed
emptyNoneNonePassed
parameterized focus sequence22Passed
repeat emptyNoneNonePassed

SHA-256 / 7130c93809bff4a707b884466b983be6e5d8f36310f88262be93090614486464

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(items, current, direction):
    eligible = [i for i, item in enumerate(items) if item['visible'] and not item['disabled'] and item['tab'] > 0]
    eligible.sort(key=lambda i: (items[i]['tab'] == 0, items[i]['tab'] if items[i]['tab'] > 0 else 0, i))
    if not eligible: return None
    if current not in eligible: return eligible[0] if direction > 0 else eligible[-1]
    return eligible[(eligible.index(current) + direction) % len(eligible)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('hidden', solve([dict(visible=False, disabled=False, tab=0),dict(visible=True,disabled=False,tab=0)], None, 1), 1)
check('disabled', solve([dict(visible=True,disabled=True,tab=0),dict(visible=True,disabled=False,tab=0)], None, 1), 1)
check('negative', solve([dict(visible=True,disabled=False,tab=-1),dict(visible=True,disabled=False,tab=0)], None, 1), 1)
check('priority', solve([dict(visible=True,disabled=False,tab=0),dict(visible=True,disabled=False,tab=2)], None, 1), 1)
check('reverse', solve([dict(visible=True,disabled=False,tab=0)]*3, 1, -1), 0)
check('forward', solve([dict(visible=True,disabled=False,tab=0)]*3, 1, 1), 2)
check('empty', solve([], None, 1), None)
check('parameterized focus sequence', solve([dict(visible=True, disabled=False, tab=0)]*(N+2), N, 1), N+1)
for repetition in range(N):
    check('repeat empty', solve([], None, 1), None)
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
hiddenNone1Failed
disabledNone1Failed
negativeNone1Failed
priority11Passed
reverseNone0Failed
forwardNone2Failed
emptyNoneNonePassed
parameterized focus sequenceNone2Failed
repeat emptyNoneNonePassed

SHA-256 / e371431de6ad2cd7f8d612e2db4a53085f30bafaf854c76822fb9de79f0eae99

3 / The verified repair

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

N = 1
observations = []
def solve(items, current, direction):
    eligible = [i for i, item in enumerate(items) if item['visible'] and not item['disabled'] and item['tab'] >= 0]
    eligible.sort(key=lambda i: (items[i]['tab'] == 0, items[i]['tab'] if items[i]['tab'] > 0 else 0, i))
    if not eligible: return None
    if current not in eligible: return eligible[0] if direction > 0 else eligible[-1]
    return eligible[(eligible.index(current) + direction) % len(eligible)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('hidden', solve([dict(visible=False, disabled=False, tab=0),dict(visible=True,disabled=False,tab=0)], None, 1), 1)
check('disabled', solve([dict(visible=True,disabled=True,tab=0),dict(visible=True,disabled=False,tab=0)], None, 1), 1)
check('negative', solve([dict(visible=True,disabled=False,tab=-1),dict(visible=True,disabled=False,tab=0)], None, 1), 1)
check('priority', solve([dict(visible=True,disabled=False,tab=0),dict(visible=True,disabled=False,tab=2)], None, 1), 1)
check('reverse', solve([dict(visible=True,disabled=False,tab=0)]*3, 1, -1), 0)
check('forward', solve([dict(visible=True,disabled=False,tab=0)]*3, 1, 1), 2)
check('empty', solve([], None, 1), None)
check('parameterized focus sequence', solve([dict(visible=True, disabled=False, tab=0)]*(N+2), N, 1), N+1)
for repetition in range(N):
    check('repeat empty', solve([], None, 1), None)
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
hidden11Passed
disabled11Passed
negative11Passed
priority11Passed
reverse00Passed
forward22Passed
emptyNoneNonePassed
parameterized focus sequence22Passed
repeat emptyNoneNonePassed

SHA-256 / b57c62a1fcaf2d8083d523782e366fd00a799e24974a856b307d0486e8c13a14

Verification & scope

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

Case digest / 6852dbd8206bcd40651d44eb2ba992a7b9cf4737483b7604a8e22d271f5e0c80