FA-33201 / Menu interactions / Open access
Shared submenu provider exposes duplicate Load More actions while a page is pending · case 01
Shared submenu provider exposes duplicate Load More actions while a page is pending.
ROOT CAUSE
The menu-provider-leases model applies `p['next'] is not None` at its load-more operation instead of the stipulated transformation.
VERIFIED REPAIR
Apply `p['next'] is not None and not p['pending_page']` at load-more.
Unsuccessful approach: The attempted repair `bool(p['next']) and not p['pending_page']` still violates the load-more oracle.
Case contract
Providers can be shared by multiple menu surfaces; leases control attachment lifetime and only visible subscribers receive presentation updates.
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 == 'acquire':
return sorted(p['holders'] | {p['id']})
if action == 'release':
return sorted(p['holders']-{p['id']})
if action == 'dispose':
return not p['holders']
if action == 'visible-recipients':
return [x['id'] for x in p if x['visible'] and x['attached']]
if action == 'load-more':
return p['next'] is not None
if action == 'new-load':
return not p['loaded'] and not p['pending']
return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('acquire contract', solve('acquire', {'holders':{'a'},'id':'b'+str(N)}), ['a','b'+str(N)])
check('release contract', solve('release', {'holders':{'a','b'+str(N)},'id':'a'}), ['b'+str(N)])
check('dispose contract', solve('dispose', {'holders':['menu'+str(N)]}), False)
check('visible-recipients contract', solve('visible-recipients', [{'id':N,'visible':False,'attached':True},{'id':N+1,'visible':True,'attached':False}]), [])
check('load-more contract', solve('load-more', {'next':'cursor'+str(N),'pending_page':True}), False)
check('new-load contract', solve('new-load', {'loaded':False,'pending':True,'leases':N}), False)
check('unknown operation', solve('unknown', {}), {'error': 'unsupported menu operation'})
check('empty opaque cursor is valid',solve('load-more',{'next':'','pending_page':False,'generation':N}),True)
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 |
|---|---|---|---|
| acquire contract | ['a', 'b1'] | ['a', 'b1'] | Passed |
| release contract | ['b1'] | ['b1'] | Passed |
| dispose contract | False | False | Passed |
| visible-recipients contract | [] | [] | Passed |
| load-more contract | True | False | Failed |
| new-load contract | False | False | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
| empty opaque cursor is valid | True | True | Passed |
SHA-256 / 34cd46fff9174d69acaf1b3f20c608e974edfc551853b1520969e0be496c3b53
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 == 'acquire':
return sorted(p['holders'] | {p['id']})
if action == 'release':
return sorted(p['holders']-{p['id']})
if action == 'dispose':
return not p['holders']
if action == 'visible-recipients':
return [x['id'] for x in p if x['visible'] and x['attached']]
if action == 'load-more':
return bool(p['next']) and not p['pending_page']
if action == 'new-load':
return not p['loaded'] and not p['pending']
return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('acquire contract', solve('acquire', {'holders':{'a'},'id':'b'+str(N)}), ['a','b'+str(N)])
check('release contract', solve('release', {'holders':{'a','b'+str(N)},'id':'a'}), ['b'+str(N)])
check('dispose contract', solve('dispose', {'holders':['menu'+str(N)]}), False)
check('visible-recipients contract', solve('visible-recipients', [{'id':N,'visible':False,'attached':True},{'id':N+1,'visible':True,'attached':False}]), [])
check('load-more contract', solve('load-more', {'next':'cursor'+str(N),'pending_page':True}), False)
check('new-load contract', solve('new-load', {'loaded':False,'pending':True,'leases':N}), False)
check('unknown operation', solve('unknown', {}), {'error': 'unsupported menu operation'})
check('empty opaque cursor is valid',solve('load-more',{'next':'','pending_page':False,'generation':N}),True)
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 |
|---|---|---|---|
| acquire contract | ['a', 'b1'] | ['a', 'b1'] | Passed |
| release contract | ['b1'] | ['b1'] | Passed |
| dispose contract | False | False | Passed |
| visible-recipients contract | [] | [] | Passed |
| load-more contract | False | False | Passed |
| new-load contract | False | False | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
| empty opaque cursor is valid | False | True | Failed |
SHA-256 / 2008975cb694c87ed58070d5331dc594fdc1ef7a5574b55630afc1be43cd8c53
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 == 'acquire':
return sorted(p['holders'] | {p['id']})
if action == 'release':
return sorted(p['holders']-{p['id']})
if action == 'dispose':
return not p['holders']
if action == 'visible-recipients':
return [x['id'] for x in p if x['visible'] and x['attached']]
if action == 'load-more':
return p['next'] is not None and not p['pending_page']
if action == 'new-load':
return not p['loaded'] and not p['pending']
return {'error': 'unsupported menu operation'}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('acquire contract', solve('acquire', {'holders':{'a'},'id':'b'+str(N)}), ['a','b'+str(N)])
check('release contract', solve('release', {'holders':{'a','b'+str(N)},'id':'a'}), ['b'+str(N)])
check('dispose contract', solve('dispose', {'holders':['menu'+str(N)]}), False)
check('visible-recipients contract', solve('visible-recipients', [{'id':N,'visible':False,'attached':True},{'id':N+1,'visible':True,'attached':False}]), [])
check('load-more contract', solve('load-more', {'next':'cursor'+str(N),'pending_page':True}), False)
check('new-load contract', solve('new-load', {'loaded':False,'pending':True,'leases':N}), False)
check('unknown operation', solve('unknown', {}), {'error': 'unsupported menu operation'})
check('empty opaque cursor is valid',solve('load-more',{'next':'','pending_page':False,'generation':N}),True)
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 |
|---|---|---|---|
| acquire contract | ['a', 'b1'] | ['a', 'b1'] | Passed |
| release contract | ['b1'] | ['b1'] | Passed |
| dispose contract | False | False | Passed |
| visible-recipients contract | [] | [] | Passed |
| load-more contract | False | False | Passed |
| new-load contract | False | False | Passed |
| unknown operation | {'error': 'unsupported menu operation'} | {'error': 'unsupported menu operation'} | Passed |
| empty opaque cursor is valid | True | True | Passed |
SHA-256 / 240bb7f27608ed88d3489ba59a84e602796817ee4fb98c005103f318844a3113
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:19.958841+00:00.
Case digest / 3d50671a61b6d63ce365b77f4effbe44b90e52d2e05c9ac55bf57ab45734c0fa