FA-53751 / Accessibility interaction semantics / Open access
Clients lose the confirmation requirement flag · case 01
Clients lose the confirmation requirement flag.
ROOT CAUSE
The confirmation metadata decision in the action descriptors adapter violates its declared contract.
VERIFIED REPAIR
Apply the exact contract at the confirmation metadata decision: [ident,name,kind,confirm]
Unsuccessful approach: The local repair substitutes [ident,name,kind,confirm and kind != 'collapse'] but still mishandles the regression fixtures.
Case contract
Input actions [id,label,enabled,exposed,requires_confirmation,kind,priority], plus permission and locale label overrides. Omit unknown kinds (only invoke, expand, collapse, increment, decrement), disabled or unexposed entries. Destructive confirmation-requiring actions need permission. First eligible occurrence of an ID wins; sort by ascending priority preserving ties. Label is override if key exists (including empty), else authored label, else kind. Return [id,label,kind,requires_confirmation]. This only describes platform actions and never activates them.
Why this case matters
Offline accessibility bridge model with explicit policy; useful for testing semantic API adapters independently of browser implementations.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
actions,permission,overrides = data
seen = set()
rows = []
for ident,label,enabled,exposed,confirm,kind,priority in actions:
if kind not in {'invoke','expand','collapse','increment','decrement'}: continue
if not enabled: continue
if not exposed: continue
if confirm and not permission: continue
if ident in seen: continue
seen.add(ident)
name = overrides[ident] if ident in overrides else (label if label else kind)
rows.append((priority,[ident,name,kind,False]))
return [row for priority,row in sorted(rows,key=lambda item:item[0])]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('ordered descriptor set', solve([[['x','Open',True,True,False,'invoke',N+2],['y','',True,True,False,'expand',N],['z','Close',True,True,True,'collapse',N+1]],True,{'x':'Localized'+str(N)}],), [['y','expand','expand',False],['z','Close','collapse',True],['x','Localized'+str(N),'invoke',False]])
check('disabled entry does not reserve ID', solve([[['x','Bad',False,True,False,'invoke',0],['x','Good',True,True,False,'invoke',1]],False,{}],), [['x','Good','invoke',False]])
check('hidden and unknown', solve([[['x','X',True,False,False,'invoke',0],['y','Y',True,True,False,'erase',1]],True,{}],), [])
check('confirmation unavailable', solve([[['x','Delete',True,True,True,'invoke',0]],False,{}],), [])
check('empty override intentional', solve([[['x','Original',True,True,False,'invoke',0]],False,{'x':''}],), [['x','','invoke',False]])
check('dedupe first and stable ties', solve([[['x','First',True,True,False,'invoke',N],['y','Second',True,True,False,'expand',N],['x','Third',True,True,False,'collapse',0]],False,{}],), [['x','First','invoke',False],['y','Second','expand',False]])
check('empty', solve([[],False,{}],), [])
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 |
|---|---|---|---|
| ordered descriptor set | [['y', 'expand', 'expand', False], ['z', 'Close', 'collapse', False], ['x', 'Localized1', 'invoke', False]] | [['y', 'expand', 'expand', False], ['z', 'Close', 'collapse', True], ['x', 'Localized1', 'invoke', False]] | Failed |
| disabled entry does not reserve ID | [['x', 'Good', 'invoke', False]] | [['x', 'Good', 'invoke', False]] | Passed |
| hidden and unknown | [] | [] | Passed |
| confirmation unavailable | [] | [] | Passed |
| empty override intentional | [['x', '', 'invoke', False]] | [['x', '', 'invoke', False]] | Passed |
| dedupe first and stable ties | [['x', 'First', 'invoke', False], ['y', 'Second', 'expand', False]] | [['x', 'First', 'invoke', False], ['y', 'Second', 'expand', False]] | Passed |
| empty | [] | [] | Passed |
SHA-256 / c004c7eccefb14e96a9b2d26cee630cdaa6ceba55cb569ff4f02861fccd92ec0
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
actions,permission,overrides = data
seen = set()
rows = []
for ident,label,enabled,exposed,confirm,kind,priority in actions:
if kind not in {'invoke','expand','collapse','increment','decrement'}: continue
if not enabled: continue
if not exposed: continue
if confirm and not permission: continue
if ident in seen: continue
seen.add(ident)
name = overrides[ident] if ident in overrides else (label if label else kind)
rows.append((priority,[ident,name,kind,confirm and kind != 'collapse']))
return [row for priority,row in sorted(rows,key=lambda item:item[0])]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('ordered descriptor set', solve([[['x','Open',True,True,False,'invoke',N+2],['y','',True,True,False,'expand',N],['z','Close',True,True,True,'collapse',N+1]],True,{'x':'Localized'+str(N)}],), [['y','expand','expand',False],['z','Close','collapse',True],['x','Localized'+str(N),'invoke',False]])
check('disabled entry does not reserve ID', solve([[['x','Bad',False,True,False,'invoke',0],['x','Good',True,True,False,'invoke',1]],False,{}],), [['x','Good','invoke',False]])
check('hidden and unknown', solve([[['x','X',True,False,False,'invoke',0],['y','Y',True,True,False,'erase',1]],True,{}],), [])
check('confirmation unavailable', solve([[['x','Delete',True,True,True,'invoke',0]],False,{}],), [])
check('empty override intentional', solve([[['x','Original',True,True,False,'invoke',0]],False,{'x':''}],), [['x','','invoke',False]])
check('dedupe first and stable ties', solve([[['x','First',True,True,False,'invoke',N],['y','Second',True,True,False,'expand',N],['x','Third',True,True,False,'collapse',0]],False,{}],), [['x','First','invoke',False],['y','Second','expand',False]])
check('empty', solve([[],False,{}],), [])
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 |
|---|---|---|---|
| ordered descriptor set | [['y', 'expand', 'expand', False], ['z', 'Close', 'collapse', False], ['x', 'Localized1', 'invoke', False]] | [['y', 'expand', 'expand', False], ['z', 'Close', 'collapse', True], ['x', 'Localized1', 'invoke', False]] | Failed |
| disabled entry does not reserve ID | [['x', 'Good', 'invoke', False]] | [['x', 'Good', 'invoke', False]] | Passed |
| hidden and unknown | [] | [] | Passed |
| confirmation unavailable | [] | [] | Passed |
| empty override intentional | [['x', '', 'invoke', False]] | [['x', '', 'invoke', False]] | Passed |
| dedupe first and stable ties | [['x', 'First', 'invoke', False], ['y', 'Second', 'expand', False]] | [['x', 'First', 'invoke', False], ['y', 'Second', 'expand', False]] | Passed |
| empty | [] | [] | Passed |
SHA-256 / 2316ff30e31a9ba1808c473071ead086f1ad51ff40fb6130a666e9cab2a1efd7
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
actions,permission,overrides = data
seen = set()
rows = []
for ident,label,enabled,exposed,confirm,kind,priority in actions:
if kind not in {'invoke','expand','collapse','increment','decrement'}: continue
if not enabled: continue
if not exposed: continue
if confirm and not permission: continue
if ident in seen: continue
seen.add(ident)
name = overrides[ident] if ident in overrides else (label if label else kind)
rows.append((priority,[ident,name,kind,confirm]))
return [row for priority,row in sorted(rows,key=lambda item:item[0])]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('ordered descriptor set', solve([[['x','Open',True,True,False,'invoke',N+2],['y','',True,True,False,'expand',N],['z','Close',True,True,True,'collapse',N+1]],True,{'x':'Localized'+str(N)}],), [['y','expand','expand',False],['z','Close','collapse',True],['x','Localized'+str(N),'invoke',False]])
check('disabled entry does not reserve ID', solve([[['x','Bad',False,True,False,'invoke',0],['x','Good',True,True,False,'invoke',1]],False,{}],), [['x','Good','invoke',False]])
check('hidden and unknown', solve([[['x','X',True,False,False,'invoke',0],['y','Y',True,True,False,'erase',1]],True,{}],), [])
check('confirmation unavailable', solve([[['x','Delete',True,True,True,'invoke',0]],False,{}],), [])
check('empty override intentional', solve([[['x','Original',True,True,False,'invoke',0]],False,{'x':''}],), [['x','','invoke',False]])
check('dedupe first and stable ties', solve([[['x','First',True,True,False,'invoke',N],['y','Second',True,True,False,'expand',N],['x','Third',True,True,False,'collapse',0]],False,{}],), [['x','First','invoke',False],['y','Second','expand',False]])
check('empty', solve([[],False,{}],), [])
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 |
|---|---|---|---|
| ordered descriptor set | [['y', 'expand', 'expand', False], ['z', 'Close', 'collapse', True], ['x', 'Localized1', 'invoke', False]] | [['y', 'expand', 'expand', False], ['z', 'Close', 'collapse', True], ['x', 'Localized1', 'invoke', False]] | Passed |
| disabled entry does not reserve ID | [['x', 'Good', 'invoke', False]] | [['x', 'Good', 'invoke', False]] | Passed |
| hidden and unknown | [] | [] | Passed |
| confirmation unavailable | [] | [] | Passed |
| empty override intentional | [['x', '', 'invoke', False]] | [['x', '', 'invoke', False]] | Passed |
| dedupe first and stable ties | [['x', 'First', 'invoke', False], ['y', 'Second', 'expand', False]] | [['x', 'First', 'invoke', False], ['y', 'Second', 'expand', False]] | Passed |
| empty | [] | [] | Passed |
SHA-256 / 1b66e4e52237053feddeb5ca1f8a1d08cee4c1a84c98f140cc67b2ff2c073047
Verification & scope
Stipulated finite adapter contract, not a claim of platform accessibility or ARIA 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:45:41.926072+00:00.
Case digest / ee1592a19c0c5af51d0a2dfd0f39968ad68fad275c53b34bd5673d9c2eb2eea5