FA-54411 / Accessibility interaction semantics / Open access
Enabled fieldsets contribute a native disabled state · case 01
Enabled fieldsets contribute a native disabled state.
ROOT CAUSE
The enabled fieldset decision in the disabled inheritance adapter violates its declared contract.
VERIFIED REPAIR
Apply the exact contract at the enabled fieldset decision: if row[4] and row[2] and
Unsuccessful approach: The local repair substitutes if row[4] and row[2] is not None and but still mishandles the regression fixtures.
Case contract
Input preorder nodes [id,parent,native_disabled,aria_disabled,fieldset,first_legend] and queried ID. Native disabled inherits from disabled fieldsets except descendants of their first_legend; nested disabled fieldsets remain independently effective. aria_disabled is tri-state None/True/False and nearest explicit ancestor value wins, but never cancels native disabled. Return [native_effective,aria_effective,effective] for queried node, or None when missing. An explicit native-disabled node remains disabled even when inside an exempt legend. first_legend ID belongs to fieldset; all parent links exist or None.
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):
nodes,query = data
index = {row[0]:row for row in nodes}
if query not in index: return None
chain = []
current = query
while current is not None:
chain.append(current)
current = index[current][1]
native = bool(index[query][2])
aria = None
for ident in chain:
row = index[ident]
if aria is None and row[3] is not None: aria = row[3]
if row[4] and row[5] not in chain[:chain.index(ident)]: native = True
aria = False if aria is None else aria
return [native,aria,native or aria]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('contract fixture 1', solve([[['f',None,True,None,True,'legend'],['legend','f',False,None,False,None],['x','legend',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 2', solve([[['f',None,True,None,True,'legend'],['x','f',False,None,False,None]],'x'],), [True,False,True])
check('contract fixture 3', solve([[['a',None,False,True,False,None],['b','a',False,False,False,None],['x','b',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 4', solve([[['a',None,False,True,False,None],['x','a',True,False,False,None]],'x'],), [True,False,True])
check('contract fixture 5', solve([[['a',None,False,True,False,None],[str(N),'a',False,None,False,None]],str(N)],), [False,True,True])
check('contract fixture 6', solve([[['f',None,True,None,True,'l'],['l','f',False,None,False,None],['nested','l',True,None,True,None],['x','nested',False,None,False,None]],'x'],), [True,False,True])
check('contract fixture 7', solve([[['parent',None,True,None,False,None],['x','parent',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 8', solve([[['f',None,False,None,True,None],['x','f',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 9', solve([[['a',None,False,True,False,None],['b','a',False,None,False,None],['x','b',False,None,False,None]],'x'],), [False,True,True])
check('contract fixture 10', solve([[['n0',None,False,True,False,None]]+[['n'+str(i),'n'+str(i-1),False,None,False,None] for i in range(1,N+3)],'n'+str(N+2)],), [False,True,True])
check('contract fixture 11', solve([[],'missing'],), None)
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 |
|---|---|---|---|
| contract fixture 1 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 2 | [True, False, True] | [True, False, True] | Passed |
| contract fixture 3 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 4 | [True, False, True] | [True, False, True] | Passed |
| contract fixture 5 | [False, True, True] | [False, True, True] | Passed |
| contract fixture 6 | [True, False, True] | [True, False, True] | Passed |
| contract fixture 7 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 8 | [True, False, True] | [False, False, False] | Failed |
| contract fixture 9 | [False, True, True] | [False, True, True] | Passed |
| contract fixture 10 | [False, True, True] | [False, True, True] | Passed |
| contract fixture 11 | None | None | Passed |
SHA-256 / 9164658e2436032bb0e1311e83ab7c60cedce1e5dcd5ea2cbad5b82a85fd4b1b
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
nodes,query = data
index = {row[0]:row for row in nodes}
if query not in index: return None
chain = []
current = query
while current is not None:
chain.append(current)
current = index[current][1]
native = bool(index[query][2])
aria = None
for ident in chain:
row = index[ident]
if aria is None and row[3] is not None: aria = row[3]
if row[4] and row[2] is not None and row[5] not in chain[:chain.index(ident)]: native = True
aria = False if aria is None else aria
return [native,aria,native or aria]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('contract fixture 1', solve([[['f',None,True,None,True,'legend'],['legend','f',False,None,False,None],['x','legend',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 2', solve([[['f',None,True,None,True,'legend'],['x','f',False,None,False,None]],'x'],), [True,False,True])
check('contract fixture 3', solve([[['a',None,False,True,False,None],['b','a',False,False,False,None],['x','b',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 4', solve([[['a',None,False,True,False,None],['x','a',True,False,False,None]],'x'],), [True,False,True])
check('contract fixture 5', solve([[['a',None,False,True,False,None],[str(N),'a',False,None,False,None]],str(N)],), [False,True,True])
check('contract fixture 6', solve([[['f',None,True,None,True,'l'],['l','f',False,None,False,None],['nested','l',True,None,True,None],['x','nested',False,None,False,None]],'x'],), [True,False,True])
check('contract fixture 7', solve([[['parent',None,True,None,False,None],['x','parent',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 8', solve([[['f',None,False,None,True,None],['x','f',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 9', solve([[['a',None,False,True,False,None],['b','a',False,None,False,None],['x','b',False,None,False,None]],'x'],), [False,True,True])
check('contract fixture 10', solve([[['n0',None,False,True,False,None]]+[['n'+str(i),'n'+str(i-1),False,None,False,None] for i in range(1,N+3)],'n'+str(N+2)],), [False,True,True])
check('contract fixture 11', solve([[],'missing'],), None)
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 |
|---|---|---|---|
| contract fixture 1 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 2 | [True, False, True] | [True, False, True] | Passed |
| contract fixture 3 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 4 | [True, False, True] | [True, False, True] | Passed |
| contract fixture 5 | [False, True, True] | [False, True, True] | Passed |
| contract fixture 6 | [True, False, True] | [True, False, True] | Passed |
| contract fixture 7 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 8 | [True, False, True] | [False, False, False] | Failed |
| contract fixture 9 | [False, True, True] | [False, True, True] | Passed |
| contract fixture 10 | [False, True, True] | [False, True, True] | Passed |
| contract fixture 11 | None | None | Passed |
SHA-256 / 57986e31ca122d62d9d4dba1805cdca0c489599bb356f50464ddae9c5ba6bd5d
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
nodes,query = data
index = {row[0]:row for row in nodes}
if query not in index: return None
chain = []
current = query
while current is not None:
chain.append(current)
current = index[current][1]
native = bool(index[query][2])
aria = None
for ident in chain:
row = index[ident]
if aria is None and row[3] is not None: aria = row[3]
if row[4] and row[2] and row[5] not in chain[:chain.index(ident)]: native = True
aria = False if aria is None else aria
return [native,aria,native or aria]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('contract fixture 1', solve([[['f',None,True,None,True,'legend'],['legend','f',False,None,False,None],['x','legend',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 2', solve([[['f',None,True,None,True,'legend'],['x','f',False,None,False,None]],'x'],), [True,False,True])
check('contract fixture 3', solve([[['a',None,False,True,False,None],['b','a',False,False,False,None],['x','b',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 4', solve([[['a',None,False,True,False,None],['x','a',True,False,False,None]],'x'],), [True,False,True])
check('contract fixture 5', solve([[['a',None,False,True,False,None],[str(N),'a',False,None,False,None]],str(N)],), [False,True,True])
check('contract fixture 6', solve([[['f',None,True,None,True,'l'],['l','f',False,None,False,None],['nested','l',True,None,True,None],['x','nested',False,None,False,None]],'x'],), [True,False,True])
check('contract fixture 7', solve([[['parent',None,True,None,False,None],['x','parent',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 8', solve([[['f',None,False,None,True,None],['x','f',False,None,False,None]],'x'],), [False,False,False])
check('contract fixture 9', solve([[['a',None,False,True,False,None],['b','a',False,None,False,None],['x','b',False,None,False,None]],'x'],), [False,True,True])
check('contract fixture 10', solve([[['n0',None,False,True,False,None]]+[['n'+str(i),'n'+str(i-1),False,None,False,None] for i in range(1,N+3)],'n'+str(N+2)],), [False,True,True])
check('contract fixture 11', solve([[],'missing'],), None)
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 |
|---|---|---|---|
| contract fixture 1 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 2 | [True, False, True] | [True, False, True] | Passed |
| contract fixture 3 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 4 | [True, False, True] | [True, False, True] | Passed |
| contract fixture 5 | [False, True, True] | [False, True, True] | Passed |
| contract fixture 6 | [True, False, True] | [True, False, True] | Passed |
| contract fixture 7 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 8 | [False, False, False] | [False, False, False] | Passed |
| contract fixture 9 | [False, True, True] | [False, True, True] | Passed |
| contract fixture 10 | [False, True, True] | [False, True, True] | Passed |
| contract fixture 11 | None | None | Passed |
SHA-256 / b73fa0cd38727a4c5e877d21c66794bdcb23b585656bd1e594fa44be5743d0ef
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:48.061619+00:00.
Case digest / ed159de2fad887707661690091dc5052e2adf0618a4a13add99bbc3d8ecf390a