FAILURE MAP
← Case archive

FA-8116 / Menu interactions / Open access

Menu item activation: Submenu activation runs a leaf command and closes its parent · case 01

Submenu activation runs a leaf command and closes its parent.

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

ROOT CAUSE

The submenu operation uses `(False, checked, 'invoke')` where the contract requires `(True, checked, 'focus-child')`.

VERIFIED REPAIR

Implement the submenu operation as `(True, checked, 'focus-child')`.

Unsuccessful approach: Opening without transferring focus leaves keyboard users outside the submenu.

Case contract

Disabled items and nonactivation keys do nothing; click, Enter and Space activate; submenu transfers focus; checks toggle; radios select; leaf commands close.

Why this case matters

A deterministic model of menu item activation; 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(item, opened, checked, event):
    if item['disabled']: return (opened, checked, None)
    if event not in ('click', 'Enter', 'Space'): return (opened, checked, None)
    if item['kind'] == 'submenu': return (False, checked, 'invoke')
    if item['kind'] == 'checkbox': return (opened, not checked, 'change')
    if item['kind'] == 'radio': return (opened, True, 'change')
    return (False, checked, 'invoke')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('disabled', solve(dict(disabled=True,kind='command'), True, False, 'click'), (True, False, None))
check('enter', solve(dict(disabled=False,kind='command'), True, False, 'Enter'), (False, False, 'invoke'))
check('space', solve(dict(disabled=False,kind='command'), True, False, 'Space'), (False, False, 'invoke'))
check('submenu', solve(dict(disabled=False,kind='submenu'), False, False, 'click'), (True, False, 'focus-child'))
check('checkbox off', solve(dict(disabled=False,kind='checkbox'), True, True, 'click'), (True, False, 'change'))
check('radio stays', solve(dict(disabled=False,kind='radio'), True, True, 'click'), (True, True, 'change'))
check('ignore arrow', solve(dict(disabled=False,kind='command'), True, False, 'Left'), (True, False, None))
check('parameterized checked state', solve(dict(disabled=False,kind='checkbox'), True, bool(N%2), 'Space'), (True, not bool(N%2), 'change'))
for repetition in range(N):
    check('repeat ignore arrow', solve(dict(disabled=False,kind='command'), True, False, 'Left'), (True, False, 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
disabled[True, False, None][True, False, None]Passed
enter[False, False, 'invoke'][False, False, 'invoke']Passed
space[False, False, 'invoke'][False, False, 'invoke']Passed
submenu[False, False, 'invoke'][True, False, 'focus-child']Failed
checkbox off[True, False, 'change'][True, False, 'change']Passed
radio stays[True, True, 'change'][True, True, 'change']Passed
ignore arrow[True, False, None][True, False, None]Passed
parameterized checked state[True, False, 'change'][True, False, 'change']Passed
repeat ignore arrow[True, False, None][True, False, None]Passed

SHA-256 / e38610b57d91d74f089d5009d8b44c64eaef5bf2b014ca4c60958baae1d02d05

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(item, opened, checked, event):
    if item['disabled']: return (opened, checked, None)
    if event not in ('click', 'Enter', 'Space'): return (opened, checked, None)
    if item['kind'] == 'submenu': return (True, checked, None)
    if item['kind'] == 'checkbox': return (opened, not checked, 'change')
    if item['kind'] == 'radio': return (opened, True, 'change')
    return (False, checked, 'invoke')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('disabled', solve(dict(disabled=True,kind='command'), True, False, 'click'), (True, False, None))
check('enter', solve(dict(disabled=False,kind='command'), True, False, 'Enter'), (False, False, 'invoke'))
check('space', solve(dict(disabled=False,kind='command'), True, False, 'Space'), (False, False, 'invoke'))
check('submenu', solve(dict(disabled=False,kind='submenu'), False, False, 'click'), (True, False, 'focus-child'))
check('checkbox off', solve(dict(disabled=False,kind='checkbox'), True, True, 'click'), (True, False, 'change'))
check('radio stays', solve(dict(disabled=False,kind='radio'), True, True, 'click'), (True, True, 'change'))
check('ignore arrow', solve(dict(disabled=False,kind='command'), True, False, 'Left'), (True, False, None))
check('parameterized checked state', solve(dict(disabled=False,kind='checkbox'), True, bool(N%2), 'Space'), (True, not bool(N%2), 'change'))
for repetition in range(N):
    check('repeat ignore arrow', solve(dict(disabled=False,kind='command'), True, False, 'Left'), (True, False, 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
disabled[True, False, None][True, False, None]Passed
enter[False, False, 'invoke'][False, False, 'invoke']Passed
space[False, False, 'invoke'][False, False, 'invoke']Passed
submenu[True, False, None][True, False, 'focus-child']Failed
checkbox off[True, False, 'change'][True, False, 'change']Passed
radio stays[True, True, 'change'][True, True, 'change']Passed
ignore arrow[True, False, None][True, False, None]Passed
parameterized checked state[True, False, 'change'][True, False, 'change']Passed
repeat ignore arrow[True, False, None][True, False, None]Passed

SHA-256 / ff8b8459162e6c5541a2a8b6760e0e681d52634c9f9a191505ba5f18e5e8cfbc

3 / The verified repair

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

N = 1
observations = []
def solve(item, opened, checked, event):
    if item['disabled']: return (opened, checked, None)
    if event not in ('click', 'Enter', 'Space'): return (opened, checked, None)
    if item['kind'] == 'submenu': return (True, checked, 'focus-child')
    if item['kind'] == 'checkbox': return (opened, not checked, 'change')
    if item['kind'] == 'radio': return (opened, True, 'change')
    return (False, checked, 'invoke')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('disabled', solve(dict(disabled=True,kind='command'), True, False, 'click'), (True, False, None))
check('enter', solve(dict(disabled=False,kind='command'), True, False, 'Enter'), (False, False, 'invoke'))
check('space', solve(dict(disabled=False,kind='command'), True, False, 'Space'), (False, False, 'invoke'))
check('submenu', solve(dict(disabled=False,kind='submenu'), False, False, 'click'), (True, False, 'focus-child'))
check('checkbox off', solve(dict(disabled=False,kind='checkbox'), True, True, 'click'), (True, False, 'change'))
check('radio stays', solve(dict(disabled=False,kind='radio'), True, True, 'click'), (True, True, 'change'))
check('ignore arrow', solve(dict(disabled=False,kind='command'), True, False, 'Left'), (True, False, None))
check('parameterized checked state', solve(dict(disabled=False,kind='checkbox'), True, bool(N%2), 'Space'), (True, not bool(N%2), 'change'))
for repetition in range(N):
    check('repeat ignore arrow', solve(dict(disabled=False,kind='command'), True, False, 'Left'), (True, False, 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
disabled[True, False, None][True, False, None]Passed
enter[False, False, 'invoke'][False, False, 'invoke']Passed
space[False, False, 'invoke'][False, False, 'invoke']Passed
submenu[True, False, 'focus-child'][True, False, 'focus-child']Passed
checkbox off[True, False, 'change'][True, False, 'change']Passed
radio stays[True, True, 'change'][True, True, 'change']Passed
ignore arrow[True, False, None][True, False, None]Passed
parameterized checked state[True, False, 'change'][True, False, 'change']Passed
repeat ignore arrow[True, False, None][True, False, None]Passed

SHA-256 / 07c93b96f2669cf8ba42e57ef6c586338983f5ed2f64fc3e16d41412264ce883

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

Case digest / 17389049fba6aeb96cdc7f1500d8a37257e74cec69c326cdeb1f71810b03eef8