FAILURE MAP
← Case archive

FA-53691 / Accessibility interaction semantics / Open access

Machine inferred alternatives are labeled as authored · case 01

Machine inferred alternatives are labeled as authored.

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

ROOT CAUSE

The inference provenance decision in the image alternative adapter violates its declared contract.

VERIFIED REPAIR

Apply the exact contract at the inference provenance decision: 'inferred',status

Unsuccessful approach: The local repair substitutes 'title',status 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 = '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(' '),'alt',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', 'alt', 'ready']['OCR 1', 'inferred', 'ready']Failed
unconsented OCR['', None, 'ready']['', None, 'ready']Passed
loading OCR['', None, 'loading']['', None, 'loading']Passed
broken OCR['', None, 'broken']['', None, 'broken']Passed

SHA-256 / 319abeb167845495efca0851f0fdf85c54611973b83fd166841d46bae7082933

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 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(' '),'title',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', 'title', 'ready']['OCR 1', 'inferred', 'ready']Failed
unconsented OCR['', None, 'ready']['', None, 'ready']Passed
loading OCR['', None, 'loading']['', None, 'loading']Passed
broken OCR['', None, 'broken']['', None, 'broken']Passed

SHA-256 / 9b0188c60e7502e3a72c45231fd59ac6324cad9e04afa604b5da63cb321dce9e

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

Case digest / 58c089149ce3ba1de3c2f7806f6db55595c465123a52049c7be6b88df17c30f3