FA-53491 / Accessibility interaction semantics / Open access
Either reveal or permission independently unmasks a value · case 01
Either reveal or permission independently unmasks a value.
ROOT CAUSE
The redaction gate decision in the protected value adapter violates its declared contract.
VERIFIED REPAIR
Apply the exact contract at the redaction gate decision: not (reveal and permission)
Unsuccessful approach: The local repair substitutes not 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 or 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| redacted multiline | {'editable': True, 'length': 3, 'placeholder': '', 'protected': True, 'text': 'A\nB'} | {'editable': True, 'length': 3, 'placeholder': '', 'protected': True, 'text': '•\n•'} | Failed |
| reveal lacks permission | {'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': 'A'} | {'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'} | Failed |
| permission lacks reveal | {'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': 'A'} | {'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'} | Failed |
| 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 / 472e74323139cc60f0917901c6446beb3107e24ce26a7f406429a56a04e822a4
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:
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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': 'A'} | {'editable': True, 'length': 1, 'placeholder': '', 'protected': True, 'text': '•'} | Failed |
| 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 / ea26b1ede082fd3d6d6e75afae0286f1e5576ca6687bf479874e07a2909f32fa
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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.445834+00:00.
Case digest / fe162dc5618be4b2113fdb1344368826c8ad216c621975f05cfb0fba67927246