FAILURE MAP
← Case archive

FA-53511 / Accessibility interaction semantics / Open access

Read-only values are exposed as editable · case 01

Read-only values are exposed as editable.

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

ROOT CAUSE

The readonly state decision in the protected value adapter violates its declared contract.

VERIFIED REPAIR

Apply the exact contract at the readonly state decision: 'editable':not readonly

Unsuccessful approach: The local repair substitutes 'editable':not readonly or reveal but still mishandles the regression fixtures.

Case contract

Input [raw,protected,reveal,permission,readonly,multiline,max_length,placeholder]. Raw is a string; max_length is None or nonnegative. Normalize CRLF before applying codepoint cap. In single line replace LF with space. Protected text reveals only when reveal and permission; otherwise one bullet per capped codepoint excluding LF, which is retained. Empty values retain empty text and expose placeholder separately. Return {text,placeholder,length,editable,protected}; length is the length after cap, editable is not readonly, protected reports input flag even when revealed.

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):
    raw,protected,reveal,permission,readonly,multiline,cap,placeholder = data
    value = raw.replace('\r\n','\n')
    if not multiline: value = value.replace('\n',' ')
    if cap is not None: value = value[:cap]
    length = len(value)
    if protected and not (reveal and permission):
        value = ''.join('\n' if c == '\n' else '•' for c in value)
    return {'text':value,'placeholder':placeholder if length == 0 else '', 'length':length,'editable':True,'protected':protected}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('redacted multiline', solve(['A'*N+'\r\nB',True,False,True,False,True,None,'hint'],), {'text':'•'*N+'\n•','placeholder':'','length':N+2,'editable':True,'protected':True})
check('reveal lacks permission', solve(['A'*N,True,True,False,False,False,None,'hint'],), {'text':'•'*N,'placeholder':'','length':N,'editable':True,'protected':True})
check('permission lacks reveal', solve(['A'*N,True,False,True,False,False,None,'hint'],), {'text':'•'*N,'placeholder':'','length':N,'editable':True,'protected':True})
check('authorized reveal readonly', solve(['secret',True,True,True,True,False,None,'hint'],), {'text':'secret','placeholder':'','length':6,'editable':False,'protected':True})
check('single line cap', solve(['A\r\nBC',False,False,False,False,False,3,'hint'],), {'text':'A B','placeholder':'','length':3,'editable':True,'protected':False})
check('zero cap placeholder', solve(['secret',True,False,False,False,False,0,'hint'],), {'text':'','placeholder':'hint','length':0,'editable':True,'protected':True})
check('empty value', solve(['',False,False,False,True,False,None,'hint'],), {'text':'','placeholder':'hint','length':0,'editable':False,'protected':False})
check('unicode codepoints', solve(['😀é',True,False,False,False,True,None,''],), {'text':'••','placeholder':'','length':2,'editable':True,'protected':True})
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
redacted multiline{'editable': True, 'length': 3, 'placeholder': '', 'protected': True, 'text': '•\n•'}{'editable': True, 'length': 3, 'placeholder': '', 'protected': True, 'text': '•\n•'}Passed
reveal lacks permission{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}Passed
permission lacks reveal{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}Passed
authorized reveal readonly{'editable': True, 'length': 6, 'placeholder': '', 'protected': True, 'text': 'secret'}{'editable': False, 'length': 6, 'placeholder': '', 'protected': True, 'text': 'secret'}Failed
single line cap{'editable': True, 'length': 3, 'placeholder': '', 'protected': False, 'text': 'A B'}{'editable': True, 'length': 3, 'placeholder': '', 'protected': False, 'text': 'A B'}Passed
zero cap placeholder{'editable': True, 'length': 0, 'placeholder': 'hint', 'protected': True, 'text': ''}{'editable': True, 'length': 0, 'placeholder': 'hint', 'protected': True, 'text': ''}Passed
empty value{'editable': True, 'length': 0, 'placeholder': 'hint', 'protected': False, 'text': ''}{'editable': False, 'length': 0, 'placeholder': 'hint', 'protected': False, 'text': ''}Failed
unicode codepoints{'editable': True, 'length': 2, 'placeholder': '', 'protected': True, 'text': '••'}{'editable': True, 'length': 2, 'placeholder': '', 'protected': True, 'text': '••'}Passed

SHA-256 / bf7ed772f2c03939ec10b05e2f678065c26bb0b569fcc10601c64a65d2113e31

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(data):
    raw,protected,reveal,permission,readonly,multiline,cap,placeholder = data
    value = raw.replace('\r\n','\n')
    if not multiline: value = value.replace('\n',' ')
    if cap is not None: value = value[:cap]
    length = len(value)
    if protected and not (reveal and permission):
        value = ''.join('\n' if c == '\n' else '•' for c in value)
    return {'text':value,'placeholder':placeholder if length == 0 else '', 'length':length,'editable':not readonly or reveal,'protected':protected}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('redacted multiline', solve(['A'*N+'\r\nB',True,False,True,False,True,None,'hint'],), {'text':'•'*N+'\n•','placeholder':'','length':N+2,'editable':True,'protected':True})
check('reveal lacks permission', solve(['A'*N,True,True,False,False,False,None,'hint'],), {'text':'•'*N,'placeholder':'','length':N,'editable':True,'protected':True})
check('permission lacks reveal', solve(['A'*N,True,False,True,False,False,None,'hint'],), {'text':'•'*N,'placeholder':'','length':N,'editable':True,'protected':True})
check('authorized reveal readonly', solve(['secret',True,True,True,True,False,None,'hint'],), {'text':'secret','placeholder':'','length':6,'editable':False,'protected':True})
check('single line cap', solve(['A\r\nBC',False,False,False,False,False,3,'hint'],), {'text':'A B','placeholder':'','length':3,'editable':True,'protected':False})
check('zero cap placeholder', solve(['secret',True,False,False,False,False,0,'hint'],), {'text':'','placeholder':'hint','length':0,'editable':True,'protected':True})
check('empty value', solve(['',False,False,False,True,False,None,'hint'],), {'text':'','placeholder':'hint','length':0,'editable':False,'protected':False})
check('unicode codepoints', solve(['😀é',True,False,False,False,True,None,''],), {'text':'••','placeholder':'','length':2,'editable':True,'protected':True})
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
redacted multiline{'editable': True, 'length': 3, 'placeholder': '', 'protected': True, 'text': '•\n•'}{'editable': True, 'length': 3, 'placeholder': '', 'protected': True, 'text': '•\n•'}Passed
reveal lacks permission{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}Passed
permission lacks reveal{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}Passed
authorized reveal readonly{'editable': True, 'length': 6, 'placeholder': '', 'protected': True, 'text': 'secret'}{'editable': False, 'length': 6, 'placeholder': '', 'protected': True, 'text': 'secret'}Failed
single line cap{'editable': True, 'length': 3, 'placeholder': '', 'protected': False, 'text': 'A B'}{'editable': True, 'length': 3, 'placeholder': '', 'protected': False, 'text': 'A B'}Passed
zero cap placeholder{'editable': True, 'length': 0, 'placeholder': 'hint', 'protected': True, 'text': ''}{'editable': True, 'length': 0, 'placeholder': 'hint', 'protected': True, 'text': ''}Passed
empty value{'editable': False, 'length': 0, 'placeholder': 'hint', 'protected': False, 'text': ''}{'editable': False, 'length': 0, 'placeholder': 'hint', 'protected': False, 'text': ''}Passed
unicode codepoints{'editable': True, 'length': 2, 'placeholder': '', 'protected': True, 'text': '••'}{'editable': True, 'length': 2, 'placeholder': '', 'protected': True, 'text': '••'}Passed

SHA-256 / b3c7d53a70bfcd05857ca59782519b8ebe5ca80d5a1b64f6a34061d4ff2866b7

3 / The verified repair

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

N = 1
observations = []
def solve(data):
    raw,protected,reveal,permission,readonly,multiline,cap,placeholder = data
    value = raw.replace('\r\n','\n')
    if not multiline: value = value.replace('\n',' ')
    if cap is not None: value = value[:cap]
    length = len(value)
    if protected and not (reveal and permission):
        value = ''.join('\n' if c == '\n' else '•' for c in value)
    return {'text':value,'placeholder':placeholder if length == 0 else '', 'length':length,'editable':not readonly,'protected':protected}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('redacted multiline', solve(['A'*N+'\r\nB',True,False,True,False,True,None,'hint'],), {'text':'•'*N+'\n•','placeholder':'','length':N+2,'editable':True,'protected':True})
check('reveal lacks permission', solve(['A'*N,True,True,False,False,False,None,'hint'],), {'text':'•'*N,'placeholder':'','length':N,'editable':True,'protected':True})
check('permission lacks reveal', solve(['A'*N,True,False,True,False,False,None,'hint'],), {'text':'•'*N,'placeholder':'','length':N,'editable':True,'protected':True})
check('authorized reveal readonly', solve(['secret',True,True,True,True,False,None,'hint'],), {'text':'secret','placeholder':'','length':6,'editable':False,'protected':True})
check('single line cap', solve(['A\r\nBC',False,False,False,False,False,3,'hint'],), {'text':'A B','placeholder':'','length':3,'editable':True,'protected':False})
check('zero cap placeholder', solve(['secret',True,False,False,False,False,0,'hint'],), {'text':'','placeholder':'hint','length':0,'editable':True,'protected':True})
check('empty value', solve(['',False,False,False,True,False,None,'hint'],), {'text':'','placeholder':'hint','length':0,'editable':False,'protected':False})
check('unicode codepoints', solve(['😀é',True,False,False,False,True,None,''],), {'text':'••','placeholder':'','length':2,'editable':True,'protected':True})
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
redacted multiline{'editable': True, 'length': 3, 'placeholder': '', 'protected': True, 'text': '•\n•'}{'editable': True, 'length': 3, 'placeholder': '', 'protected': True, 'text': '•\n•'}Passed
reveal lacks permission{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}Passed
permission lacks reveal{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}{'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'}Passed
authorized reveal readonly{'editable': False, 'length': 6, 'placeholder': '', 'protected': True, 'text': 'secret'}{'editable': False, 'length': 6, 'placeholder': '', 'protected': True, 'text': 'secret'}Passed
single line cap{'editable': True, 'length': 3, 'placeholder': '', 'protected': False, 'text': 'A B'}{'editable': True, 'length': 3, 'placeholder': '', 'protected': False, 'text': 'A B'}Passed
zero cap placeholder{'editable': True, 'length': 0, 'placeholder': 'hint', 'protected': True, 'text': ''}{'editable': True, 'length': 0, 'placeholder': 'hint', 'protected': True, 'text': ''}Passed
empty value{'editable': False, 'length': 0, 'placeholder': 'hint', 'protected': False, 'text': ''}{'editable': False, 'length': 0, 'placeholder': 'hint', 'protected': False, 'text': ''}Passed
unicode codepoints{'editable': True, 'length': 2, 'placeholder': '', 'protected': True, 'text': '••'}{'editable': True, 'length': 2, 'placeholder': '', 'protected': True, 'text': '••'}Passed

SHA-256 / f80a6119d0415c2d76ec2ae33a253e3bcf3ebc8d83969b9074e56203f0f8ca45

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

Case digest / 2a75486d3e293900c628f297b7243e50b6ff49bb158dc254553b73791a2105ab