FA-32371 / Menu interactions / Open access
Replacing a submenu retains a stale descendant cascade · case 01
Replacing a submenu retains a stale descendant cascade.
ROOT CAUSE
The cascade-ownership model applies `p['chain']+[p['item']]` at its replace operation instead of the stipulated transformation.
VERIFIED REPAIR
Apply `p['chain'][:p['depth']]+[p['item']]` at replace.
Unsuccessful approach: The attempted repair `p['chain'][:p['depth']+1]+[p['item']]` still violates the replace oracle.
Case contract
An opened cascade is an ordered branch; replacing a depth discards deeper descendants.
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 == 'replace':
return p['chain']+[p['item']]
if action == 'close':
return p['chain'][:p['depth']]
if action == 'remove-owner':
return p['chain'][:p['chain'].index(p['owner'])] if p['owner'] in p['chain'] else p['chain']
if action == 'same-owner':
return p['chain'] if p['chain'][p['depth']]==p['item'] else p['chain'][:p['depth']]+[p['item']]
if action == 'parent-token':
return p['tokens'][p['depth']-1]
if action == 'owner-depth':
return p['chain'].index(p['owner']) if p['owner'] in p['chain'] else None
return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('replace contract', solve('replace', {'chain':['r','a','old'],'depth':1,'item':'b'+str(N)}), ['r','b'+str(N)])
check('close contract', solve('close', {'chain':['r','a',str(N)],'depth':2}), ['r','a'])
check('remove-owner contract', solve('remove-owner', {'chain':['r','a','b',str(N)],'owner':'a'}), ['r'])
check('same-owner contract', solve('same-owner', {'chain':['r','a',str(N)],'depth':1,'item':'a'}), ['r','a',str(N)])
check('parent-token contract', solve('parent-token', {'tokens':['root','parent'+str(N),'child'],'depth':2}), 'parent'+str(N))
check('owner-depth contract', solve('owner-depth', {'chain':['r','a'+str(N),'b','c'],'owner':'a'+str(N)}), 1)
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 |
|---|---|---|---|
| replace contract | ['r', 'a', 'old', 'b1'] | ['r', 'b1'] | Failed |
| close contract | ['r', 'a'] | ['r', 'a'] | Passed |
| remove-owner contract | ['r'] | ['r'] | Passed |
| same-owner contract | ['r', 'a', '1'] | ['r', 'a', '1'] | Passed |
| parent-token contract | parent1 | parent1 | Passed |
| owner-depth contract | 1 | 1 | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
SHA-256 / 7d58a172b8324d03518568c3b1c17fc8e6caacc9c176ab72d6d7c67cff3fb7f2
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 == 'replace':
return p['chain'][:p['depth']+1]+[p['item']]
if action == 'close':
return p['chain'][:p['depth']]
if action == 'remove-owner':
return p['chain'][:p['chain'].index(p['owner'])] if p['owner'] in p['chain'] else p['chain']
if action == 'same-owner':
return p['chain'] if p['chain'][p['depth']]==p['item'] else p['chain'][:p['depth']]+[p['item']]
if action == 'parent-token':
return p['tokens'][p['depth']-1]
if action == 'owner-depth':
return p['chain'].index(p['owner']) if p['owner'] in p['chain'] else None
return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('replace contract', solve('replace', {'chain':['r','a','old'],'depth':1,'item':'b'+str(N)}), ['r','b'+str(N)])
check('close contract', solve('close', {'chain':['r','a',str(N)],'depth':2}), ['r','a'])
check('remove-owner contract', solve('remove-owner', {'chain':['r','a','b',str(N)],'owner':'a'}), ['r'])
check('same-owner contract', solve('same-owner', {'chain':['r','a',str(N)],'depth':1,'item':'a'}), ['r','a',str(N)])
check('parent-token contract', solve('parent-token', {'tokens':['root','parent'+str(N),'child'],'depth':2}), 'parent'+str(N))
check('owner-depth contract', solve('owner-depth', {'chain':['r','a'+str(N),'b','c'],'owner':'a'+str(N)}), 1)
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 |
|---|---|---|---|
| replace contract | ['r', 'a', 'b1'] | ['r', 'b1'] | Failed |
| close contract | ['r', 'a'] | ['r', 'a'] | Passed |
| remove-owner contract | ['r'] | ['r'] | Passed |
| same-owner contract | ['r', 'a', '1'] | ['r', 'a', '1'] | Passed |
| parent-token contract | parent1 | parent1 | Passed |
| owner-depth contract | 1 | 1 | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
SHA-256 / 527708653865b953f3b18a2858c2b9c4547e5b9487e4a62b70584ee5fc0dc931
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 == 'replace':
return p['chain'][:p['depth']]+[p['item']]
if action == 'close':
return p['chain'][:p['depth']]
if action == 'remove-owner':
return p['chain'][:p['chain'].index(p['owner'])] if p['owner'] in p['chain'] else p['chain']
if action == 'same-owner':
return p['chain'] if p['chain'][p['depth']]==p['item'] else p['chain'][:p['depth']]+[p['item']]
if action == 'parent-token':
return p['tokens'][p['depth']-1]
if action == 'owner-depth':
return p['chain'].index(p['owner']) if p['owner'] in p['chain'] else None
return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('replace contract', solve('replace', {'chain':['r','a','old'],'depth':1,'item':'b'+str(N)}), ['r','b'+str(N)])
check('close contract', solve('close', {'chain':['r','a',str(N)],'depth':2}), ['r','a'])
check('remove-owner contract', solve('remove-owner', {'chain':['r','a','b',str(N)],'owner':'a'}), ['r'])
check('same-owner contract', solve('same-owner', {'chain':['r','a',str(N)],'depth':1,'item':'a'}), ['r','a',str(N)])
check('parent-token contract', solve('parent-token', {'tokens':['root','parent'+str(N),'child'],'depth':2}), 'parent'+str(N))
check('owner-depth contract', solve('owner-depth', {'chain':['r','a'+str(N),'b','c'],'owner':'a'+str(N)}), 1)
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 |
|---|---|---|---|
| replace contract | ['r', 'b1'] | ['r', 'b1'] | Passed |
| close contract | ['r', 'a'] | ['r', 'a'] | Passed |
| remove-owner contract | ['r'] | ['r'] | Passed |
| same-owner contract | ['r', 'a', '1'] | ['r', 'a', '1'] | Passed |
| parent-token contract | parent1 | parent1 | Passed |
| owner-depth contract | 1 | 1 | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
SHA-256 / 4ec9dcbbc6a11be2ec545b65542eeefb30422f0e74773f5ef99ec12ab55daa1e
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:11.546428+00:00.
Case digest / 008f0033c55621854a9e6499cd563857725de28b478ca3a766b9d8082beb217f