FAILURE MAP
← Case archive

FA-53696 / Accessibility interaction semantics / Open access

Broken loaded images report a successful ready state · case 01

Broken loaded images report a successful ready state.

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

ROOT CAUSE

The broken priority decision in the image alternative adapter violates its declared contract.

VERIFIED REPAIR

Apply the exact contract at the broken priority decision: 'broken' if broken else ('ready' if loaded else 'loading')

Unsuccessful approach: The local repair substitutes 'broken' if broken and not loaded else ('ready' if loaded else 'loading') but still mishandles the regression fixtures.

Case contract

Input [decorative,interactive,alt,title,caption,ocr,ocr_consent,filename,loaded,broken]. None alt means absent; empty alt is intentional. Interactive decorative images retain semantics. Source priority is explicit alt (even empty), nonempty caption, title, consented OCR when loaded and not broken; filename is never spoken. Decorative noninteractive images return None. Return [text,source,status] where status is broken, loading, ready with broken highest priority. Normalization strips only surrounding ASCII spaces; OCR is marked inferred.

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):
    decorative,interactive,alt,title,caption,ocr,consent,filename,loaded,broken = data
    if decorative and not interactive: return None
    status = 'ready' if loaded else ('broken' if broken else 'loading')
    if alt is not None: return [alt.strip(' '),'alt',status]
    if caption: return [caption.strip(' '),'caption',status]
    if title: return [title.strip(' '),'title',status]
    if consent and loaded and not broken and ocr: return [ocr.strip(' '),'inferred',status]
    return ['',None,status]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('decorative inert', solve([True,False,None,'title','caption','ocr',True,'file',True,False],), None)
check('decorative interactive', solve([True,True,' Label '+str(N)+' ','title','caption','ocr',True,'file',True,False],), ['Label '+str(N),'alt','ready'])
check('intentional empty', solve([False,False,'','title','caption','ocr',True,'file',True,False],), ['','alt','ready'])
check('caption precedence', solve([False,False,None,'title',' caption ','ocr',True,'file',True,False],), ['caption','caption','ready'])
check('title only', solve([False,False,None,' title ','','ocr',True,'file',False,False],), ['title','title','loading'])
check('OCR inferred', solve([False,False,None,'','',' OCR '+str(N)+' ',True,'file',True,False],), ['OCR '+str(N),'inferred','ready'])
check('unconsented OCR', solve([False,False,None,'','','ocr',False,'file',True,False],), ['',None,'ready'])
check('loading OCR', solve([False,False,None,'','','ocr',True,'file',False,False],), ['',None,'loading'])
check('broken OCR', solve([False,False,None,'','','ocr',True,'file',True,True],), ['',None,'broken'])
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
decorative inertNoneNonePassed
decorative interactive['Label 1', 'alt', 'ready']['Label 1', 'alt', 'ready']Passed
intentional empty['', 'alt', 'ready']['', 'alt', 'ready']Passed
caption precedence['caption', 'caption', 'ready']['caption', 'caption', 'ready']Passed
title only['title', 'title', 'loading']['title', 'title', 'loading']Passed
OCR inferred['OCR 1', 'inferred', 'ready']['OCR 1', 'inferred', 'ready']Passed
unconsented OCR['', None, 'ready']['', None, 'ready']Passed
loading OCR['', None, 'loading']['', None, 'loading']Passed
broken OCR['', None, 'ready']['', None, 'broken']Failed

SHA-256 / dbac4fa4ca9c42b5d748c58a40c1cef29960d216b24d984ec0e8039587cfb58b

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(data):
    decorative,interactive,alt,title,caption,ocr,consent,filename,loaded,broken = data
    if decorative and not interactive: return None
    status = 'broken' if broken and not loaded else ('ready' if loaded else 'loading')
    if alt is not None: return [alt.strip(' '),'alt',status]
    if caption: return [caption.strip(' '),'caption',status]
    if title: return [title.strip(' '),'title',status]
    if consent and loaded and not broken and ocr: return [ocr.strip(' '),'inferred',status]
    return ['',None,status]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('decorative inert', solve([True,False,None,'title','caption','ocr',True,'file',True,False],), None)
check('decorative interactive', solve([True,True,' Label '+str(N)+' ','title','caption','ocr',True,'file',True,False],), ['Label '+str(N),'alt','ready'])
check('intentional empty', solve([False,False,'','title','caption','ocr',True,'file',True,False],), ['','alt','ready'])
check('caption precedence', solve([False,False,None,'title',' caption ','ocr',True,'file',True,False],), ['caption','caption','ready'])
check('title only', solve([False,False,None,' title ','','ocr',True,'file',False,False],), ['title','title','loading'])
check('OCR inferred', solve([False,False,None,'','',' OCR '+str(N)+' ',True,'file',True,False],), ['OCR '+str(N),'inferred','ready'])
check('unconsented OCR', solve([False,False,None,'','','ocr',False,'file',True,False],), ['',None,'ready'])
check('loading OCR', solve([False,False,None,'','','ocr',True,'file',False,False],), ['',None,'loading'])
check('broken OCR', solve([False,False,None,'','','ocr',True,'file',True,True],), ['',None,'broken'])
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
decorative inertNoneNonePassed
decorative interactive['Label 1', 'alt', 'ready']['Label 1', 'alt', 'ready']Passed
intentional empty['', 'alt', 'ready']['', 'alt', 'ready']Passed
caption precedence['caption', 'caption', 'ready']['caption', 'caption', 'ready']Passed
title only['title', 'title', 'loading']['title', 'title', 'loading']Passed
OCR inferred['OCR 1', 'inferred', 'ready']['OCR 1', 'inferred', 'ready']Passed
unconsented OCR['', None, 'ready']['', None, 'ready']Passed
loading OCR['', None, 'loading']['', None, 'loading']Passed
broken OCR['', None, 'ready']['', None, 'broken']Failed

SHA-256 / 3d593f7560f75a26f4897635ff99c5afade68c59f72e5028d59de54a0da04491

3 / The verified repair

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

N = 1
observations = []
def solve(data):
    decorative,interactive,alt,title,caption,ocr,consent,filename,loaded,broken = data
    if decorative and not interactive: return None
    status = 'broken' if broken else ('ready' if loaded else 'loading')
    if alt is not None: return [alt.strip(' '),'alt',status]
    if caption: return [caption.strip(' '),'caption',status]
    if title: return [title.strip(' '),'title',status]
    if consent and loaded and not broken and ocr: return [ocr.strip(' '),'inferred',status]
    return ['',None,status]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('decorative inert', solve([True,False,None,'title','caption','ocr',True,'file',True,False],), None)
check('decorative interactive', solve([True,True,' Label '+str(N)+' ','title','caption','ocr',True,'file',True,False],), ['Label '+str(N),'alt','ready'])
check('intentional empty', solve([False,False,'','title','caption','ocr',True,'file',True,False],), ['','alt','ready'])
check('caption precedence', solve([False,False,None,'title',' caption ','ocr',True,'file',True,False],), ['caption','caption','ready'])
check('title only', solve([False,False,None,' title ','','ocr',True,'file',False,False],), ['title','title','loading'])
check('OCR inferred', solve([False,False,None,'','',' OCR '+str(N)+' ',True,'file',True,False],), ['OCR '+str(N),'inferred','ready'])
check('unconsented OCR', solve([False,False,None,'','','ocr',False,'file',True,False],), ['',None,'ready'])
check('loading OCR', solve([False,False,None,'','','ocr',True,'file',False,False],), ['',None,'loading'])
check('broken OCR', solve([False,False,None,'','','ocr',True,'file',True,True],), ['',None,'broken'])
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
decorative inertNoneNonePassed
decorative interactive['Label 1', 'alt', 'ready']['Label 1', 'alt', 'ready']Passed
intentional empty['', 'alt', 'ready']['', 'alt', 'ready']Passed
caption precedence['caption', 'caption', 'ready']['caption', 'caption', 'ready']Passed
title only['title', 'title', 'loading']['title', 'title', 'loading']Passed
OCR inferred['OCR 1', 'inferred', 'ready']['OCR 1', 'inferred', 'ready']Passed
unconsented OCR['', None, 'ready']['', None, 'ready']Passed
loading OCR['', None, 'loading']['', None, 'loading']Passed
broken OCR['', None, 'broken']['', None, 'broken']Passed

SHA-256 / 4a3a0b6358cafdc59ac1ed787bc5ac36978c5f0b74fe66a599ef6f48a95f4639

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

Case digest / 2a9fa1e561d973c395ef20b670ae1e88c9e721b3903cbe0687bb8337c2837bba