FAILURE MAP
← Case archive

FA-54416 / Accessibility interaction semantics / Open access

First legend descendants lose their fieldset exemption · case 01

First legend descendants lose their fieldset exemption.

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

ROOT CAUSE

The legend exemption decision in the disabled inheritance adapter violates its declared contract.

VERIFIED REPAIR

Apply the exact contract at the legend exemption decision: row[5] not in chain[:chain.index(ident)]

Unsuccessful approach: The local repair substitutes row[5] != query 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[2] and True: 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[True, False, True][False, False, False]Failed
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 / 6c9b401b8a9afbbf081cf99655a2976e51b8c5aec71df965d980bce0a69e605b

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] and row[5] != query: 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[True, False, True][False, False, False]Failed
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 / c7d23ef64d56d7ce625bc35849b5d2914296e5deb68b558e137a83a3b33fa55d

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

Case digest / 23160cf00cc20842818ac5d6a41e1d3606d1147e064483372dba387fb095762a