FAILURE MAP
← Case archive

FA-54391 / Accessibility interaction semantics / Open access

Explicit native disabled state is lost outside fieldsets · case 01

Explicit native disabled state is lost outside fieldsets.

Verified by executionVariant 1 · 11 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The query native decision in the disabled inheritance adapter violates its declared contract.

VERIFIED REPAIR

Apply the exact contract at the query native decision: native = bool(index[query][2])

Unsuccessful approach: The local repair substitutes native = bool(index[query][2]) and index[query][4] 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 = False
    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 fixtureActualExpectedOutcome
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[False, False, False][True, False, True]Failed
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 11NoneNonePassed

SHA-256 / f583622a2898d20093cb149b7695a24f2c723ec0942b3e152c71773f15c107be

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]) and index[query][4]
    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 fixtureActualExpectedOutcome
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[False, False, False][True, False, True]Failed
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 11NoneNonePassed

SHA-256 / 853c97534db97a2ad342b31749bcbde80fdcfe191dc72961db19ed31b22e0d7d

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 fixtureActualExpectedOutcome
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 11NoneNonePassed

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:47.899052+00:00.

Case digest / 34b7c865885379fda682210dc8d397db7211b7d271a98d8e05d79ca5899fbece