FA-32826 / Menu interactions / Open access
Menu teardown treats timer handle zero as absent · case 01
Menu teardown treats timer handle zero as absent.
ROOT CAUSE
The menu-resource-disposal model applies `sorted(set(x for x in p if x))` at its timer-handles operation instead of the stipulated transformation.
VERIFIED REPAIR
Apply `sorted({x for x in p if x is not None})` at timer-handles.
Unsuccessful approach: The attempted repair `[x for x in p if x is not None]` still violates the timer-handles oracle.
Case contract
Each popup owns subscriptions, timers, content and anchors; teardown releases exactly owned resources and is safe when repeated.
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 == 'listeners':
return [x for x in p['listeners'] if x['session']!=p['session']]
if action == 'timer-handles':
return sorted(set(x for x in p if x))
if action == 'content':
return {'rows':[],'loading':False,'error':None}
if action == 'lease':
return max(0,p['leases']-int(not p['already_closed']))
if action == 'child-order':
return [x['id'] for x in sorted(p,key=lambda x:len(x['menu_path']),reverse=True)]
if action == 'anchor-null':
return None
return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('listeners contract', solve('listeners', {'session':N,'listeners':[{'session':N,'id':'a'},{'session':N+1,'id':'b'}]}), [{'session':N+1,'id':'b'}])
check('timer-handles contract', solve('timer-handles', [0,N,N,None]), [0,N])
check('content contract', solve('content', {'rows':[N],'loading':True}), {'rows':[],'loading':False,'error':None})
check('lease contract', solve('lease', {'leases':N+1,'already_closed':True}), N+1)
check('child-order contract', solve('child-order', [{'id':'child','menu_path':['r','a']},{'id':'root','menu_path':['r']},{'id':N,'menu_path':['r','a','b']}]), [N,'child','root'])
check('anchor-null contract', solve('anchor-null', {'anchor':N,'fallback':'document'}), None)
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 |
|---|---|---|---|
| listeners contract | [{'id': 'b', 'session': 2}] | [{'id': 'b', 'session': 2}] | Passed |
| timer-handles contract | [1] | [0, 1] | Failed |
| content contract | {'error': None, 'loading': False, 'rows': []} | {'error': None, 'loading': False, 'rows': []} | Passed |
| lease contract | 2 | 2 | Passed |
| child-order contract | [1, 'child', 'root'] | [1, 'child', 'root'] | Passed |
| anchor-null contract | None | None | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
SHA-256 / 73069264b6f32070dd6d4429226bd1b7037d2ee43f823c9f74567ee55ac0186a
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 == 'listeners':
return [x for x in p['listeners'] if x['session']!=p['session']]
if action == 'timer-handles':
return [x for x in p if x is not None]
if action == 'content':
return {'rows':[],'loading':False,'error':None}
if action == 'lease':
return max(0,p['leases']-int(not p['already_closed']))
if action == 'child-order':
return [x['id'] for x in sorted(p,key=lambda x:len(x['menu_path']),reverse=True)]
if action == 'anchor-null':
return None
return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('listeners contract', solve('listeners', {'session':N,'listeners':[{'session':N,'id':'a'},{'session':N+1,'id':'b'}]}), [{'session':N+1,'id':'b'}])
check('timer-handles contract', solve('timer-handles', [0,N,N,None]), [0,N])
check('content contract', solve('content', {'rows':[N],'loading':True}), {'rows':[],'loading':False,'error':None})
check('lease contract', solve('lease', {'leases':N+1,'already_closed':True}), N+1)
check('child-order contract', solve('child-order', [{'id':'child','menu_path':['r','a']},{'id':'root','menu_path':['r']},{'id':N,'menu_path':['r','a','b']}]), [N,'child','root'])
check('anchor-null contract', solve('anchor-null', {'anchor':N,'fallback':'document'}), None)
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 |
|---|---|---|---|
| listeners contract | [{'id': 'b', 'session': 2}] | [{'id': 'b', 'session': 2}] | Passed |
| timer-handles contract | [0, 1, 1] | [0, 1] | Failed |
| content contract | {'error': None, 'loading': False, 'rows': []} | {'error': None, 'loading': False, 'rows': []} | Passed |
| lease contract | 2 | 2 | Passed |
| child-order contract | [1, 'child', 'root'] | [1, 'child', 'root'] | Passed |
| anchor-null contract | None | None | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
SHA-256 / efb0635b4460cb217ba8dbf515876cbd51d80f411bb8a9bfe0ec6a04c547fb18
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 == 'listeners':
return [x for x in p['listeners'] if x['session']!=p['session']]
if action == 'timer-handles':
return sorted({x for x in p if x is not None})
if action == 'content':
return {'rows':[],'loading':False,'error':None}
if action == 'lease':
return max(0,p['leases']-int(not p['already_closed']))
if action == 'child-order':
return [x['id'] for x in sorted(p,key=lambda x:len(x['menu_path']),reverse=True)]
if action == 'anchor-null':
return None
return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('listeners contract', solve('listeners', {'session':N,'listeners':[{'session':N,'id':'a'},{'session':N+1,'id':'b'}]}), [{'session':N+1,'id':'b'}])
check('timer-handles contract', solve('timer-handles', [0,N,N,None]), [0,N])
check('content contract', solve('content', {'rows':[N],'loading':True}), {'rows':[],'loading':False,'error':None})
check('lease contract', solve('lease', {'leases':N+1,'already_closed':True}), N+1)
check('child-order contract', solve('child-order', [{'id':'child','menu_path':['r','a']},{'id':'root','menu_path':['r']},{'id':N,'menu_path':['r','a','b']}]), [N,'child','root'])
check('anchor-null contract', solve('anchor-null', {'anchor':N,'fallback':'document'}), None)
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 |
|---|---|---|---|
| listeners contract | [{'id': 'b', 'session': 2}] | [{'id': 'b', 'session': 2}] | Passed |
| timer-handles contract | [0, 1] | [0, 1] | Passed |
| content contract | {'error': None, 'loading': False, 'rows': []} | {'error': None, 'loading': False, 'rows': []} | Passed |
| lease contract | 2 | 2 | Passed |
| child-order contract | [1, 'child', 'root'] | [1, 'child', 'root'] | Passed |
| anchor-null contract | None | None | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
SHA-256 / aefd827335a3b127a95407e01a76d43f12f1125297f197a96991060b47acbe07
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:16.184018+00:00.
Case digest / 78cc6d542b63c10fc7181fa9c63eef91fc8a42f22cc59a583c19db263d840c05