FAILURE MAP
← Case archive

FA-53831 / Accessibility interaction semantics / Open access

Empty alternative erases an embedded object position · case 01

Empty alternative erases an embedded object position.

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

ROOT CAUSE

The empty object alt decision in the embedded text objects adapter violates its declared contract.

VERIFIED REPAIR

Apply the exact contract at the empty object alt decision: value if alt_mode and value else '\ufffc'

Unsuccessful approach: The local repair substitutes value if alt_mode else '' but still mishandles the regression fixtures.

Case contract

Input [tokens,alt_mode] where tokens are [kind,text,exposed], kinds text, object, break, decoration. Ignore unexposed or decoration tokens. Text is copied exactly; break becomes LF; object becomes U+FFFC unless alt_mode, when nonempty alternative text is used and empty alternative falls back to U+FFFC. Return [flattened,objects] with objects [token_index,start,end,alternative]. All offsets are codepoints in output; ordinary text does not add object mappings. Adjacent objects remain separate; zero-length text has no effect.

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):
    tokens,alt_mode = data
    text = ''
    objects = []
    for index,(kind,value,exposed) in enumerate(tokens):
        if not exposed or kind == 'decoration': continue
        start = len(text)
        if kind == 'text': text += value
        elif kind == 'break': text += '\n'
        elif kind == 'object':
            text += value if alt_mode else '\ufffc'
            objects.append([index,start,len(text),value])
    return [text,objects]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('contract fixture 1', solve([[['text','A'*N,True],['object','Cat',True],['text','Z',True]],False],), ['A'*N+'Z',[[1,N,N+1,'Cat']]])
check('contract fixture 2', solve([[['text','A'*N,True],['object','Cat',True],['object','',True]],True],), ['A'*N+'Cat',[[1,N,N+3,'Cat'],[2,N+3,N+4,'']]])
check('contract fixture 3', solve([[['decoration','*',True],['object','Hidden',False],['text','X',True]],False],), ['X',[]])
check('contract fixture 4', solve([[['text','A',True],['break','ignored',True],['text','B',True]],False],), ['A\nB',[]])
check('contract fixture 5', solve([[['object','A',True],['object','B',True]],False],), ['',[[0,0,1,'A'],[1,1,2,'B']]])
check('contract fixture 6', solve([[['text','',True]],True],), ['',[]])
check('contract fixture 7', solve([[['text',' A ',True]],False],), [' A ',[]])
check('contract fixture 8', solve([[],False],), ['',[]])
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['AZ', [[1, 1, 2, 'Cat']]]['AZ', [[1, 1, 2, 'Cat']]]Passed
contract fixture 2['ACat', [[1, 1, 4, 'Cat'], [2, 4, 4, '']]]['ACat', [[1, 1, 4, 'Cat'], [2, 4, 5, '']]]Failed
contract fixture 3['X', []]['X', []]Passed
contract fixture 4['A\nB', []]['A\nB', []]Passed
contract fixture 5['', [[0, 0, 1, 'A'], [1, 1, 2, 'B']]]['', [[0, 0, 1, 'A'], [1, 1, 2, 'B']]]Passed
contract fixture 6['', []]['', []]Passed
contract fixture 7[' A ', []][' A ', []]Passed
contract fixture 8['', []]['', []]Passed

SHA-256 / 2aef6651e97b8b3f34279d5153c96f9205e33e33f780f7ae351f542aa2a37842

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(data):
    tokens,alt_mode = data
    text = ''
    objects = []
    for index,(kind,value,exposed) in enumerate(tokens):
        if not exposed or kind == 'decoration': continue
        start = len(text)
        if kind == 'text': text += value
        elif kind == 'break': text += '\n'
        elif kind == 'object':
            text += value if alt_mode else ''
            objects.append([index,start,len(text),value])
    return [text,objects]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('contract fixture 1', solve([[['text','A'*N,True],['object','Cat',True],['text','Z',True]],False],), ['A'*N+'Z',[[1,N,N+1,'Cat']]])
check('contract fixture 2', solve([[['text','A'*N,True],['object','Cat',True],['object','',True]],True],), ['A'*N+'Cat',[[1,N,N+3,'Cat'],[2,N+3,N+4,'']]])
check('contract fixture 3', solve([[['decoration','*',True],['object','Hidden',False],['text','X',True]],False],), ['X',[]])
check('contract fixture 4', solve([[['text','A',True],['break','ignored',True],['text','B',True]],False],), ['A\nB',[]])
check('contract fixture 5', solve([[['object','A',True],['object','B',True]],False],), ['',[[0,0,1,'A'],[1,1,2,'B']]])
check('contract fixture 6', solve([[['text','',True]],True],), ['',[]])
check('contract fixture 7', solve([[['text',' A ',True]],False],), [' A ',[]])
check('contract fixture 8', solve([[],False],), ['',[]])
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['AZ', [[1, 1, 1, 'Cat']]]['AZ', [[1, 1, 2, 'Cat']]]Failed
contract fixture 2['ACat', [[1, 1, 4, 'Cat'], [2, 4, 4, '']]]['ACat', [[1, 1, 4, 'Cat'], [2, 4, 5, '']]]Failed
contract fixture 3['X', []]['X', []]Passed
contract fixture 4['A\nB', []]['A\nB', []]Passed
contract fixture 5['', [[0, 0, 0, 'A'], [1, 0, 0, 'B']]]['', [[0, 0, 1, 'A'], [1, 1, 2, 'B']]]Failed
contract fixture 6['', []]['', []]Passed
contract fixture 7[' A ', []][' A ', []]Passed
contract fixture 8['', []]['', []]Passed

SHA-256 / 5d5503d372dc0d5988d0e381a3310b25fda02bd21cc671dd01abc6a409582607

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(data):
    tokens,alt_mode = data
    text = ''
    objects = []
    for index,(kind,value,exposed) in enumerate(tokens):
        if not exposed or kind == 'decoration': continue
        start = len(text)
        if kind == 'text': text += value
        elif kind == 'break': text += '\n'
        elif kind == 'object':
            text += value if alt_mode and value else '\ufffc'
            objects.append([index,start,len(text),value])
    return [text,objects]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('contract fixture 1', solve([[['text','A'*N,True],['object','Cat',True],['text','Z',True]],False],), ['A'*N+'Z',[[1,N,N+1,'Cat']]])
check('contract fixture 2', solve([[['text','A'*N,True],['object','Cat',True],['object','',True]],True],), ['A'*N+'Cat',[[1,N,N+3,'Cat'],[2,N+3,N+4,'']]])
check('contract fixture 3', solve([[['decoration','*',True],['object','Hidden',False],['text','X',True]],False],), ['X',[]])
check('contract fixture 4', solve([[['text','A',True],['break','ignored',True],['text','B',True]],False],), ['A\nB',[]])
check('contract fixture 5', solve([[['object','A',True],['object','B',True]],False],), ['',[[0,0,1,'A'],[1,1,2,'B']]])
check('contract fixture 6', solve([[['text','',True]],True],), ['',[]])
check('contract fixture 7', solve([[['text',' A ',True]],False],), [' A ',[]])
check('contract fixture 8', solve([[],False],), ['',[]])
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['AZ', [[1, 1, 2, 'Cat']]]['AZ', [[1, 1, 2, 'Cat']]]Passed
contract fixture 2['ACat', [[1, 1, 4, 'Cat'], [2, 4, 5, '']]]['ACat', [[1, 1, 4, 'Cat'], [2, 4, 5, '']]]Passed
contract fixture 3['X', []]['X', []]Passed
contract fixture 4['A\nB', []]['A\nB', []]Passed
contract fixture 5['', [[0, 0, 1, 'A'], [1, 1, 2, 'B']]]['', [[0, 0, 1, 'A'], [1, 1, 2, 'B']]]Passed
contract fixture 6['', []]['', []]Passed
contract fixture 7[' A ', []][' A ', []]Passed
contract fixture 8['', []]['', []]Passed

SHA-256 / 2e972e4ed1fff71f315d4e17658bf5aade7afd94b3d5ef2b942d7a23421b9d6d

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

Case digest / 992a4a20f470ef641866849458fb4b29b18ded5040d044d97553f045cb6c9dfa