FA-53601 / Accessibility interaction semantics / Open access
Retired accessibility proxies accept new pins · case 01
Retired accessibility proxies accept new pins.
ROOT CAUSE
The dead pin decision in the proxy lifetime adapter violates its declared contract.
VERIFIED REPAIR
Apply the exact contract at the dead pin decision: kind == 'pin' and old[1]
Unsuccessful approach: The local repair substitutes kind == 'pin' and old[3] == 0 but still mishandles the regression fixtures.
Case contract
Bounded accessibility proxy registry: input operations [kind,id,generation,value]. create installs a nonnegative generation only if newer than existing generation; retired generations remain recorded. destroy only applies to matching generation. get returns value only for matching generation live proxy. set changes matching live proxy and never creates objects. pin/unpin maintain nonnegative reference count; destroying a pinned proxy immediately makes reads unavailable but keeps tombstone until unpinned. Each operation returns a snapshot [id,generation,live,value,pins] for its ID, or None when absent; dead value is always None. Unknown operations do nothing.
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):
state = {}
result = []
for kind,ident,generation,value in data:
old = state.get(ident)
if kind == 'create' and generation >= 0 and (old is None or generation > old[0]):
state[ident] = [generation,True,value,0]
elif old is not None and generation == old[0]:
if kind == 'destroy': old[1],old[2] = False,None
elif kind == 'set' and old[1]: old[2] = value
elif kind == 'pin': old[3] += 1
elif kind == 'unpin': old[3] = max(0,old[3]-1)
row = state.get(ident)
result.append((ident,list(row)) if row is not None else None)
return [([entry[0]]+entry[1]) if entry is not None else None for entry in result]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('newer proxy preserves stale isolation', solve([['create','a',N,'x'],['create','a',N+1,'y'],['set','a',N,'stale'],['destroy','a',N,None]],), [['a',N,True,'x',0],['a',N+1,True,'y',0],['a',N+1,True,'y',0],['a',N+1,True,'y',0]])
check('equal generation no reset', solve([['create','a',N,'x'],['pin','a',N,None],['create','a',N,'y']],), [['a',N,True,'x',0],['a',N,True,'x',1],['a',N,True,'x',1]])
check('stale create and pinned generation', solve([['create','a',N,'x'],['pin','a',N,None],['create','a',N+1,'y'],['create','a',N,'stale']],), [['a',N,True,'x',0],['a',N,True,'x',1],['a',N+1,True,'y',0],['a',N+1,True,'y',0]])
check('retired proxy cannot revive', solve([['create','a',N,'x'],['destroy','a',N,None],['set','a',N,'z'],['pin','a',N,None]],), [['a',N,True,'x',0],['a',N,False,None,0],['a',N,False,None,0],['a',N,False,None,0]])
check('pinned destroy immediate', solve([['create','a',N,'x'],['pin','a',N,None],['destroy','a',N,None],['unpin','a',N,None]],), [['a',N,True,'x',0],['a',N,True,'x',1],['a',N,False,None,1],['a',N,False,None,0]])
check('unpin lower bound', solve([['create','a',0,'x'],['unpin','a',0,None],['set','a',0,'y']],), [['a',0,True,'x',0],['a',0,True,'x',0],['a',0,True,'y',0]])
check('unknown and negative', solve([['set','missing',0,'x'],['create','bad',-1,'x'],['get','missing',0,None]],), [None,None,None])
check('separate proxy IDs', solve([['create','a',N,'x'],['create','b',N,'y']],), [['a',N,True,'x',0],['b',N,True,'y',0]])
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 |
|---|---|---|---|
| newer proxy preserves stale isolation | [['a', 1, True, 'x', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | [['a', 1, True, 'x', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | Passed |
| equal generation no reset | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, True, 'x', 1]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, True, 'x', 1]] | Passed |
| stale create and pinned generation | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | Passed |
| retired proxy cannot revive | [['a', 1, True, 'x', 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0], ['a', 1, False, None, 1]] | [['a', 1, True, 'x', 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0]] | Failed |
| pinned destroy immediate | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, False, None, 1], ['a', 1, False, None, 0]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, False, None, 1], ['a', 1, False, None, 0]] | Passed |
| unpin lower bound | [['a', 0, True, 'x', 0], ['a', 0, True, 'x', 0], ['a', 0, True, 'y', 0]] | [['a', 0, True, 'x', 0], ['a', 0, True, 'x', 0], ['a', 0, True, 'y', 0]] | Passed |
| unknown and negative | [None, None, None] | [None, None, None] | Passed |
| separate proxy IDs | [['a', 1, True, 'x', 0], ['b', 1, True, 'y', 0]] | [['a', 1, True, 'x', 0], ['b', 1, True, 'y', 0]] | Passed |
SHA-256 / 683c48b7917a55cbca67e903deb643f22ade4c9fd18d7053512526cdc37bf4ce
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
state = {}
result = []
for kind,ident,generation,value in data:
old = state.get(ident)
if kind == 'create' and generation >= 0 and (old is None or generation > old[0]):
state[ident] = [generation,True,value,0]
elif old is not None and generation == old[0]:
if kind == 'destroy': old[1],old[2] = False,None
elif kind == 'set' and old[1]: old[2] = value
elif kind == 'pin' and old[3] == 0: old[3] += 1
elif kind == 'unpin': old[3] = max(0,old[3]-1)
row = state.get(ident)
result.append((ident,list(row)) if row is not None else None)
return [([entry[0]]+entry[1]) if entry is not None else None for entry in result]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('newer proxy preserves stale isolation', solve([['create','a',N,'x'],['create','a',N+1,'y'],['set','a',N,'stale'],['destroy','a',N,None]],), [['a',N,True,'x',0],['a',N+1,True,'y',0],['a',N+1,True,'y',0],['a',N+1,True,'y',0]])
check('equal generation no reset', solve([['create','a',N,'x'],['pin','a',N,None],['create','a',N,'y']],), [['a',N,True,'x',0],['a',N,True,'x',1],['a',N,True,'x',1]])
check('stale create and pinned generation', solve([['create','a',N,'x'],['pin','a',N,None],['create','a',N+1,'y'],['create','a',N,'stale']],), [['a',N,True,'x',0],['a',N,True,'x',1],['a',N+1,True,'y',0],['a',N+1,True,'y',0]])
check('retired proxy cannot revive', solve([['create','a',N,'x'],['destroy','a',N,None],['set','a',N,'z'],['pin','a',N,None]],), [['a',N,True,'x',0],['a',N,False,None,0],['a',N,False,None,0],['a',N,False,None,0]])
check('pinned destroy immediate', solve([['create','a',N,'x'],['pin','a',N,None],['destroy','a',N,None],['unpin','a',N,None]],), [['a',N,True,'x',0],['a',N,True,'x',1],['a',N,False,None,1],['a',N,False,None,0]])
check('unpin lower bound', solve([['create','a',0,'x'],['unpin','a',0,None],['set','a',0,'y']],), [['a',0,True,'x',0],['a',0,True,'x',0],['a',0,True,'y',0]])
check('unknown and negative', solve([['set','missing',0,'x'],['create','bad',-1,'x'],['get','missing',0,None]],), [None,None,None])
check('separate proxy IDs', solve([['create','a',N,'x'],['create','b',N,'y']],), [['a',N,True,'x',0],['b',N,True,'y',0]])
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 |
|---|---|---|---|
| newer proxy preserves stale isolation | [['a', 1, True, 'x', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | [['a', 1, True, 'x', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | Passed |
| equal generation no reset | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, True, 'x', 1]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, True, 'x', 1]] | Passed |
| stale create and pinned generation | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | Passed |
| retired proxy cannot revive | [['a', 1, True, 'x', 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0], ['a', 1, False, None, 1]] | [['a', 1, True, 'x', 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0]] | Failed |
| pinned destroy immediate | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, False, None, 1], ['a', 1, False, None, 0]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, False, None, 1], ['a', 1, False, None, 0]] | Passed |
| unpin lower bound | [['a', 0, True, 'x', 0], ['a', 0, True, 'x', 0], ['a', 0, True, 'y', 0]] | [['a', 0, True, 'x', 0], ['a', 0, True, 'x', 0], ['a', 0, True, 'y', 0]] | Passed |
| unknown and negative | [None, None, None] | [None, None, None] | Passed |
| separate proxy IDs | [['a', 1, True, 'x', 0], ['b', 1, True, 'y', 0]] | [['a', 1, True, 'x', 0], ['b', 1, True, 'y', 0]] | Passed |
SHA-256 / 4f252c7cf5613d4dd0e0b2ad4772a39c75073134c016ebb917eb85900d814f8e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
state = {}
result = []
for kind,ident,generation,value in data:
old = state.get(ident)
if kind == 'create' and generation >= 0 and (old is None or generation > old[0]):
state[ident] = [generation,True,value,0]
elif old is not None and generation == old[0]:
if kind == 'destroy': old[1],old[2] = False,None
elif kind == 'set' and old[1]: old[2] = value
elif kind == 'pin' and old[1]: old[3] += 1
elif kind == 'unpin': old[3] = max(0,old[3]-1)
row = state.get(ident)
result.append((ident,list(row)) if row is not None else None)
return [([entry[0]]+entry[1]) if entry is not None else None for entry in result]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('newer proxy preserves stale isolation', solve([['create','a',N,'x'],['create','a',N+1,'y'],['set','a',N,'stale'],['destroy','a',N,None]],), [['a',N,True,'x',0],['a',N+1,True,'y',0],['a',N+1,True,'y',0],['a',N+1,True,'y',0]])
check('equal generation no reset', solve([['create','a',N,'x'],['pin','a',N,None],['create','a',N,'y']],), [['a',N,True,'x',0],['a',N,True,'x',1],['a',N,True,'x',1]])
check('stale create and pinned generation', solve([['create','a',N,'x'],['pin','a',N,None],['create','a',N+1,'y'],['create','a',N,'stale']],), [['a',N,True,'x',0],['a',N,True,'x',1],['a',N+1,True,'y',0],['a',N+1,True,'y',0]])
check('retired proxy cannot revive', solve([['create','a',N,'x'],['destroy','a',N,None],['set','a',N,'z'],['pin','a',N,None]],), [['a',N,True,'x',0],['a',N,False,None,0],['a',N,False,None,0],['a',N,False,None,0]])
check('pinned destroy immediate', solve([['create','a',N,'x'],['pin','a',N,None],['destroy','a',N,None],['unpin','a',N,None]],), [['a',N,True,'x',0],['a',N,True,'x',1],['a',N,False,None,1],['a',N,False,None,0]])
check('unpin lower bound', solve([['create','a',0,'x'],['unpin','a',0,None],['set','a',0,'y']],), [['a',0,True,'x',0],['a',0,True,'x',0],['a',0,True,'y',0]])
check('unknown and negative', solve([['set','missing',0,'x'],['create','bad',-1,'x'],['get','missing',0,None]],), [None,None,None])
check('separate proxy IDs', solve([['create','a',N,'x'],['create','b',N,'y']],), [['a',N,True,'x',0],['b',N,True,'y',0]])
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 |
|---|---|---|---|
| newer proxy preserves stale isolation | [['a', 1, True, 'x', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | [['a', 1, True, 'x', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | Passed |
| equal generation no reset | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, True, 'x', 1]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, True, 'x', 1]] | Passed |
| stale create and pinned generation | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | Passed |
| retired proxy cannot revive | [['a', 1, True, 'x', 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0]] | [['a', 1, True, 'x', 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0], ['a', 1, False, None, 0]] | Passed |
| pinned destroy immediate | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, False, None, 1], ['a', 1, False, None, 0]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, False, None, 1], ['a', 1, False, None, 0]] | Passed |
| unpin lower bound | [['a', 0, True, 'x', 0], ['a', 0, True, 'x', 0], ['a', 0, True, 'y', 0]] | [['a', 0, True, 'x', 0], ['a', 0, True, 'x', 0], ['a', 0, True, 'y', 0]] | Passed |
| unknown and negative | [None, None, None] | [None, None, None] | Passed |
| separate proxy IDs | [['a', 1, True, 'x', 0], ['b', 1, True, 'y', 0]] | [['a', 1, True, 'x', 0], ['b', 1, True, 'y', 0]] | Passed |
SHA-256 / 77712f0bf52e23b28bf5b1b7774b7e7456ec7dd8b98bed4cdf22e5e7ee71edcb
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:40.582708+00:00.
Case digest / e7fc8cbd0d7c187a6cbd3078ea9f7c2eb74f26e51291cd0c02701b48f5cc9778