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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| decorative inert | None | None | Passed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| decorative inert | None | None | Passed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| decorative inert | None | None | Passed |
| 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