FAILURE MAP
← Case archive

FA-32491 / Menu interactions / Open access

Empty menu section leaves an orphaned header · case 01

Empty menu section leaves an orphaned header.

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

ROOT CAUSE

The section-composition model applies `p` at its empty-group operation instead of the stipulated transformation.

VERIFIED REPAIR

Apply `[g for g in p if g['items']]` at empty-group.

Unsuccessful approach: The attempted repair `[g for g in p if g['title']]` still violates the empty-group oracle.

Case contract

Menu sections keep headers attached to nonempty groups and separators only between surviving groups; pinned sections retain their declared slots.

Why this case matters

Cascading and context menus require coherent command and session state as content changes.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
import unicodedata
N = 1
observations = []
def solve(action, p):
    if action == 'empty-group':
        return p
    if action == 'separators':
        return sum(([{'separator':True}]+g for g in p[1:]),p[0]) if p else []
    if action == 'header':
        return [{'header':p['title']}]+p['items']
    if action == 'pin-top':
        return [x for x in p if x['pin']=='top']+[x for x in p if x['pin']!='top']
    if action == 'group-key':
        return [(x['provider'],x['group']) for x in p]
    if action == 'count':
        return sum(len(g['items']) for g in p)
    return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('empty-group contract', solve('empty-group', [{'title':'empty','items':[]},{'title':'g','items':[N]}]), [{'title':'g','items':[N]}])
check('separators contract', solve('separators', [[N],[N+1]]), [N,{'separator':True},N+1])
check('header contract', solve('header', {'title':'g'+str(N),'items':['a','b']}), [{'header':'g'+str(N)},'a','b'])
check('pin-top contract', solve('pin-top', [{'id':N,'pin':'none'},{'id':N+1,'pin':'top'}]), [{'id':N+1,'pin':'top'},{'id':N,'pin':'none'}])
check('group-key contract', solve('group-key', [{'provider':'p'+str(N),'group':'tools'}]), [('p'+str(N),'tools')])
check('count contract', solve('count', [{'items':[N,N+1,N+2]},{'items':[N+3]}]), 4)
check('unknown operation', solve('unknown', {}), {'error': 'unsupported menu operation'})
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
empty-group contract[{'items': [], 'title': 'empty'}, {'items': [1], 'title': 'g'}][{'items': [1], 'title': 'g'}]Failed
separators contract[1, {'separator': True}, 2][1, {'separator': True}, 2]Passed
header contract[{'header': 'g1'}, 'a', 'b'][{'header': 'g1'}, 'a', 'b']Passed
pin-top contract[{'id': 2, 'pin': 'top'}, {'id': 1, 'pin': 'none'}][{'id': 2, 'pin': 'top'}, {'id': 1, 'pin': 'none'}]Passed
group-key contract[['p1', 'tools']][['p1', 'tools']]Passed
count contract44Passed
unknown operation{'error': 'unsupported menu operation'}{'error': 'unsupported menu operation'}Passed

SHA-256 / c2eeb1e19a502b51ec1aacd45a328b77520fffec213b0b7f33ce6bac76eb4ed3

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
import unicodedata
N = 1
observations = []
def solve(action, p):
    if action == 'empty-group':
        return [g for g in p if g['title']]
    if action == 'separators':
        return sum(([{'separator':True}]+g for g in p[1:]),p[0]) if p else []
    if action == 'header':
        return [{'header':p['title']}]+p['items']
    if action == 'pin-top':
        return [x for x in p if x['pin']=='top']+[x for x in p if x['pin']!='top']
    if action == 'group-key':
        return [(x['provider'],x['group']) for x in p]
    if action == 'count':
        return sum(len(g['items']) for g in p)
    return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('empty-group contract', solve('empty-group', [{'title':'empty','items':[]},{'title':'g','items':[N]}]), [{'title':'g','items':[N]}])
check('separators contract', solve('separators', [[N],[N+1]]), [N,{'separator':True},N+1])
check('header contract', solve('header', {'title':'g'+str(N),'items':['a','b']}), [{'header':'g'+str(N)},'a','b'])
check('pin-top contract', solve('pin-top', [{'id':N,'pin':'none'},{'id':N+1,'pin':'top'}]), [{'id':N+1,'pin':'top'},{'id':N,'pin':'none'}])
check('group-key contract', solve('group-key', [{'provider':'p'+str(N),'group':'tools'}]), [('p'+str(N),'tools')])
check('count contract', solve('count', [{'items':[N,N+1,N+2]},{'items':[N+3]}]), 4)
check('unknown operation', solve('unknown', {}), {'error': 'unsupported menu operation'})
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
empty-group contract[{'items': [], 'title': 'empty'}, {'items': [1], 'title': 'g'}][{'items': [1], 'title': 'g'}]Failed
separators contract[1, {'separator': True}, 2][1, {'separator': True}, 2]Passed
header contract[{'header': 'g1'}, 'a', 'b'][{'header': 'g1'}, 'a', 'b']Passed
pin-top contract[{'id': 2, 'pin': 'top'}, {'id': 1, 'pin': 'none'}][{'id': 2, 'pin': 'top'}, {'id': 1, 'pin': 'none'}]Passed
group-key contract[['p1', 'tools']][['p1', 'tools']]Passed
count contract44Passed
unknown operation{'error': 'unsupported menu operation'}{'error': 'unsupported menu operation'}Passed

SHA-256 / 072f527df5e7df807adbd4167789e46770d1f6d9454b50a1f2d6159ed9cfbe48

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
import unicodedata
N = 1
observations = []
def solve(action, p):
    if action == 'empty-group':
        return [g for g in p if g['items']]
    if action == 'separators':
        return sum(([{'separator':True}]+g for g in p[1:]),p[0]) if p else []
    if action == 'header':
        return [{'header':p['title']}]+p['items']
    if action == 'pin-top':
        return [x for x in p if x['pin']=='top']+[x for x in p if x['pin']!='top']
    if action == 'group-key':
        return [(x['provider'],x['group']) for x in p]
    if action == 'count':
        return sum(len(g['items']) for g in p)
    return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('empty-group contract', solve('empty-group', [{'title':'empty','items':[]},{'title':'g','items':[N]}]), [{'title':'g','items':[N]}])
check('separators contract', solve('separators', [[N],[N+1]]), [N,{'separator':True},N+1])
check('header contract', solve('header', {'title':'g'+str(N),'items':['a','b']}), [{'header':'g'+str(N)},'a','b'])
check('pin-top contract', solve('pin-top', [{'id':N,'pin':'none'},{'id':N+1,'pin':'top'}]), [{'id':N+1,'pin':'top'},{'id':N,'pin':'none'}])
check('group-key contract', solve('group-key', [{'provider':'p'+str(N),'group':'tools'}]), [('p'+str(N),'tools')])
check('count contract', solve('count', [{'items':[N,N+1,N+2]},{'items':[N+3]}]), 4)
check('unknown operation', solve('unknown', {}), {'error': 'unsupported menu operation'})
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
empty-group contract[{'items': [1], 'title': 'g'}][{'items': [1], 'title': 'g'}]Passed
separators contract[1, {'separator': True}, 2][1, {'separator': True}, 2]Passed
header contract[{'header': 'g1'}, 'a', 'b'][{'header': 'g1'}, 'a', 'b']Passed
pin-top contract[{'id': 2, 'pin': 'top'}, {'id': 1, 'pin': 'none'}][{'id': 2, 'pin': 'top'}, {'id': 1, 'pin': 'none'}]Passed
group-key contract[['p1', 'tools']][['p1', 'tools']]Passed
count contract44Passed
unknown operation{'error': 'unsupported menu operation'}{'error': 'unsupported menu operation'}Passed

SHA-256 / 1d0d465047edbea9ae80a47a7d5ec8c4b662a8dec9b5f893a8b5cf03c5c80fd9

Verification & scope

Offline supplied-valid-payload model; excludes DOM, keyboard, focus, selection, announcements and browser conformance. 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:42:12.808236+00:00.

Case digest / 03969ccd596df969770fe6e0fbec72d8b8444f6c59b20cc58a77d3ddf5422a16