FA-53571 / Accessibility interaction semantics / Open access
Stale create replaces a newer semantic proxy · case 01
Stale create replaces a newer semantic proxy.
ROOT CAUSE
The stale create decision in the proxy lifetime adapter violates its declared contract.
VERIFIED REPAIR
Apply the exact contract at the stale create decision: generation > old[0]
Unsuccessful approach: The local repair substitutes generation >= old[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' 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', 1, True, 'stale', 0]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 2, True, 'y', 0], ['a', 2, True, 'y', 0]] | Failed |
| 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 / d4095e38e004e0554135eb6edbe0b675725ea9e071b42c52c617e83a3b8d2dd2
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[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, 'y', 0]] | [['a', 1, True, 'x', 0], ['a', 1, True, 'x', 1], ['a', 1, True, 'x', 1]] | Failed |
| 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 / 9625731ed222ec6462a85b2628e0324918e2c1318d077b0b2533f4e61833af65
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.192068+00:00.
Case digest / 85e34fcda43d3807495527d236f00ea8df7a5943693f3d8e7a2098167fe2e404