FAILURE MAP
← Case archive

FA-54666 / Accessibility interaction semantics / Open access

Absent semantic properties are treated as successful nulls · case 01

Absent semantic properties are treated as successful nulls.

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

ROOT CAUSE

The missing property decision in the property query batch adapter violates its declared contract.

VERIFIED REPAIR

Apply the exact contract at the missing property decision: prop not in values

Unsuccessful approach: The local repair substitutes prop not in values and not values but still mishandles the regression fixtures.

Case contract

Input [objects,queries,revision,expected_revision]. objects map IDs to [alive,properties]; queries [id,property]. Allowed props name,value,description,role; a missing property is unsupported while an existing None is successful null. Results retain query order and duplicates, each [status,value]; status stale for every query when revisions differ, gone for missing/defunct object, unsupported for unknown/absent property, ok otherwise. Empty queries produce empty output. Return [revision,results], actual revision always. Values are returned as JSON-compatible content; object aliasing is outside this query-only model.

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):
    objects,queries,revision,expected = data
    results = []
    for ident,prop in queries:
        if expected != revision: results.append(['stale',None]); continue
        record = objects.get(ident)
        if record is None or not record[0]: results.append(['gone',None]); continue
        values = record[1]
        if prop not in {'name','value','description','role'} or False:
            results.append(['unsupported',None]); continue
        results.append(['ok',values.get(prop)])
    return [revision,results]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('contract fixture 1', solve([{'a':[True,{'name':'A'+str(N),'value':None,'description':'','role':'image'}]},[['a','name'],['a','value'],['a','description'],['a','name']],N,N],), [N,[['ok','A'+str(N)],['ok',None],['ok',''],['ok','A'+str(N)]]])
check('contract fixture 2', solve([{'a':[True,{'secret':'s','name':'A'}]},[['a','secret'],['a','role']],N,N],), [N,[['unsupported',None],['unsupported',None]]])
check('contract fixture 3', solve([{'dead':[False,{'name':'secret'}]},[['missing','name'],['dead','name']],N,N],), [N,[['gone',None],['gone',None]]])
check('contract fixture 4', solve([{'a':[True,{'name':'A'}]},[['a','name'],['missing','role']],N,N-1],), [N,[['stale',None],['stale',None]]])
check('contract fixture 5', solve([{'a':[True,{'name':'A'}]},[['a','name']],N,N+1],), [N,[['stale',None]]])
check('contract fixture 6', solve([{},[],N,N],), [N,[]])
check('contract fixture 7', solve([{'z':[True,{'name':'Z'}],'a':[True,{'name':'A'}]},[['z','name'],['a','name']],N,N],), [N,[['ok','Z'],['ok','A']]])
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[1, [['ok', 'A1'], ['ok', None], ['ok', ''], ['ok', 'A1']]][1, [['ok', 'A1'], ['ok', None], ['ok', ''], ['ok', 'A1']]]Passed
contract fixture 2[1, [['unsupported', None], ['ok', None]]][1, [['unsupported', None], ['unsupported', None]]]Failed
contract fixture 3[1, [['gone', None], ['gone', None]]][1, [['gone', None], ['gone', None]]]Passed
contract fixture 4[1, [['stale', None], ['stale', None]]][1, [['stale', None], ['stale', None]]]Passed
contract fixture 5[1, [['stale', None]]][1, [['stale', None]]]Passed
contract fixture 6[1, []][1, []]Passed
contract fixture 7[1, [['ok', 'Z'], ['ok', 'A']]][1, [['ok', 'Z'], ['ok', 'A']]]Passed

SHA-256 / 585ef3a86ed3ac1342d631a1776a1a7a5b810f154338f566624f3fbd1643ac79

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(data):
    objects,queries,revision,expected = data
    results = []
    for ident,prop in queries:
        if expected != revision: results.append(['stale',None]); continue
        record = objects.get(ident)
        if record is None or not record[0]: results.append(['gone',None]); continue
        values = record[1]
        if prop not in {'name','value','description','role'} or prop not in values and not values:
            results.append(['unsupported',None]); continue
        results.append(['ok',values.get(prop)])
    return [revision,results]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('contract fixture 1', solve([{'a':[True,{'name':'A'+str(N),'value':None,'description':'','role':'image'}]},[['a','name'],['a','value'],['a','description'],['a','name']],N,N],), [N,[['ok','A'+str(N)],['ok',None],['ok',''],['ok','A'+str(N)]]])
check('contract fixture 2', solve([{'a':[True,{'secret':'s','name':'A'}]},[['a','secret'],['a','role']],N,N],), [N,[['unsupported',None],['unsupported',None]]])
check('contract fixture 3', solve([{'dead':[False,{'name':'secret'}]},[['missing','name'],['dead','name']],N,N],), [N,[['gone',None],['gone',None]]])
check('contract fixture 4', solve([{'a':[True,{'name':'A'}]},[['a','name'],['missing','role']],N,N-1],), [N,[['stale',None],['stale',None]]])
check('contract fixture 5', solve([{'a':[True,{'name':'A'}]},[['a','name']],N,N+1],), [N,[['stale',None]]])
check('contract fixture 6', solve([{},[],N,N],), [N,[]])
check('contract fixture 7', solve([{'z':[True,{'name':'Z'}],'a':[True,{'name':'A'}]},[['z','name'],['a','name']],N,N],), [N,[['ok','Z'],['ok','A']]])
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[1, [['ok', 'A1'], ['ok', None], ['ok', ''], ['ok', 'A1']]][1, [['ok', 'A1'], ['ok', None], ['ok', ''], ['ok', 'A1']]]Passed
contract fixture 2[1, [['unsupported', None], ['ok', None]]][1, [['unsupported', None], ['unsupported', None]]]Failed
contract fixture 3[1, [['gone', None], ['gone', None]]][1, [['gone', None], ['gone', None]]]Passed
contract fixture 4[1, [['stale', None], ['stale', None]]][1, [['stale', None], ['stale', None]]]Passed
contract fixture 5[1, [['stale', None]]][1, [['stale', None]]]Passed
contract fixture 6[1, []][1, []]Passed
contract fixture 7[1, [['ok', 'Z'], ['ok', 'A']]][1, [['ok', 'Z'], ['ok', 'A']]]Passed

SHA-256 / 110af340afa3416f3ad8c6c25474408c2236b8ef42e719c2a0d3f9781c7f627e

3 / The verified repair

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

N = 1
observations = []
def solve(data):
    objects,queries,revision,expected = data
    results = []
    for ident,prop in queries:
        if expected != revision: results.append(['stale',None]); continue
        record = objects.get(ident)
        if record is None or not record[0]: results.append(['gone',None]); continue
        values = record[1]
        if prop not in {'name','value','description','role'} or prop not in values:
            results.append(['unsupported',None]); continue
        results.append(['ok',values.get(prop)])
    return [revision,results]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('contract fixture 1', solve([{'a':[True,{'name':'A'+str(N),'value':None,'description':'','role':'image'}]},[['a','name'],['a','value'],['a','description'],['a','name']],N,N],), [N,[['ok','A'+str(N)],['ok',None],['ok',''],['ok','A'+str(N)]]])
check('contract fixture 2', solve([{'a':[True,{'secret':'s','name':'A'}]},[['a','secret'],['a','role']],N,N],), [N,[['unsupported',None],['unsupported',None]]])
check('contract fixture 3', solve([{'dead':[False,{'name':'secret'}]},[['missing','name'],['dead','name']],N,N],), [N,[['gone',None],['gone',None]]])
check('contract fixture 4', solve([{'a':[True,{'name':'A'}]},[['a','name'],['missing','role']],N,N-1],), [N,[['stale',None],['stale',None]]])
check('contract fixture 5', solve([{'a':[True,{'name':'A'}]},[['a','name']],N,N+1],), [N,[['stale',None]]])
check('contract fixture 6', solve([{},[],N,N],), [N,[]])
check('contract fixture 7', solve([{'z':[True,{'name':'Z'}],'a':[True,{'name':'A'}]},[['z','name'],['a','name']],N,N],), [N,[['ok','Z'],['ok','A']]])
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[1, [['ok', 'A1'], ['ok', None], ['ok', ''], ['ok', 'A1']]][1, [['ok', 'A1'], ['ok', None], ['ok', ''], ['ok', 'A1']]]Passed
contract fixture 2[1, [['unsupported', None], ['unsupported', None]]][1, [['unsupported', None], ['unsupported', None]]]Passed
contract fixture 3[1, [['gone', None], ['gone', None]]][1, [['gone', None], ['gone', None]]]Passed
contract fixture 4[1, [['stale', None], ['stale', None]]][1, [['stale', None], ['stale', None]]]Passed
contract fixture 5[1, [['stale', None]]][1, [['stale', None]]]Passed
contract fixture 6[1, []][1, []]Passed
contract fixture 7[1, [['ok', 'Z'], ['ok', 'A']]][1, [['ok', 'Z'], ['ok', 'A']]]Passed

SHA-256 / 648cdba9b1de295fe6afb170cb655067067abfa9d9367d15fa7efa9450647d53

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

Case digest / 102021342044c05ee8842c756728b742964fbd98e9970352ce51d1b552162c89