FA-32501 / Menu interactions / Open access
Menu group heading is attached after its commands · case 01
Menu group heading is attached after its commands.
ROOT CAUSE
The section-composition model applies `p['items']+[{'header':p['title']}]` at its header operation instead of the stipulated transformation.
VERIFIED REPAIR
Apply `[{'header':p['title']}]+p['items']` at header.
Unsuccessful approach: The attempted repair `p['items']` still violates the header 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 [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 p['items']+[{'header':p['title']}]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 | ['a', 'b', {'header': 'g1'}] | [{'header': 'g1'}, 'a', 'b'] | Failed |
| 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 contract | 4 | 4 | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
SHA-256 / 21dbb288648dc989bcd88a7ff52f8ad4a468c585d0386b51a544d1c644742267
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['items']]
if action == 'separators':
return sum(([{'separator':True}]+g for g in p[1:]),p[0]) if p else []
if action == 'header':
return 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 | ['a', 'b'] | [{'header': 'g1'}, 'a', 'b'] | Failed |
| 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 contract | 4 | 4 | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
SHA-256 / 0eb76525deb9d9ad3571f1ad3787ef8f67f790e209eee2010c383dba1e65e6e0
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 contract | 4 | 4 | Passed |
| 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.853796+00:00.
Case digest / 3657fa6e224c1bce52d2181114476f202eedd97962af0ccd195970f0dfdc70db