{"abstract":"The announcement trace violates the stated speech-envelope contract.","category":"Assistive announcements","checks":6,"contract":"Each input row is [text,role,ordinal,total,unit,negated,language,private,label,detail]. Compose a speech envelope: redact private values, prefix label, apply negation, append units, prepend ordinal of known positive total, append role, append nonempty detail once, preserve language fallback en, and omit empty nonprivate values. Return [language,spoken] pairs. This is an explicit product grammar, not natural language localization.","evaluation_group":"s3-announcement-speech-envelope","failed_approach":"The attempted repair substitutes if unit and not private: value+=unit and still violates a regression oracle.","family":"s3-assistive-announcements-speech-envelope-unit","id":"FA-20661","implementations":{"attempt":{"sha256":"dbd31d4033ae460d336877a93cf4eaf73df69d3598e45070c539f54cfdfc77c5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    out=[]\n    for text,role,pos,total,unit,negative,lang,private,label,detail in events:\n        if not text and not private: continue\n        value='hidden' if private else text\n        if label: value=label+': '+value\n        if negative: value='not '+value\n        if unit and not private: value+=unit\n        if total>0: value=str(pos)+' of '+str(total)+': '+value\n        if role: value+=' ('+role+')'\n        if detail and detail!=text and not private: value+='; '+detail\n        language=lang if lang else 'en'\n        out.append([language,value])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['value'*N,'status',2,N+3,'items',True,'fr',False,'Count','detail']]\", \"[['secret'*N,'status',1,3,'kg',False,'en',True,'Weight','private detail']]\", \"[['','',0,0,'',False,'',False,'Label',''],['','',0,0,'',False,'',True,'','']]\", \"[['same'*N,'',0,-1,'',False,'de',False,'','same'*N]]\", \"[['  x  '*N,'',0,0,'',False,'',False,'','']]\", '[]']\nexpected = {1: [[['fr', '2 of 4: not Count: value items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'same']], [['en', '  x  ']], []], 2: [[['fr', '2 of 5: not Count: valuevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesame']], [['en', '  x    x  ']], []], 3: [[['fr', '2 of 6: not Count: valuevaluevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesamesame']], [['en', '  x    x    x  ']], []], 4: [[['fr', '2 of 7: not Count: valuevaluevaluevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesamesamesame']], [['en', '  x    x    x    x  ']], []], 5: [[['fr', '2 of 8: not Count: valuevaluevaluevaluevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesamesamesamesame']], [['en', '  x    x    x    x    x  ']], []]}[N]\nfor i, expression in enumerate(fixtures):\n    check(\"trace-\"+str(i+1), solve(eval(expression)), expected[i])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"322714d0a5943b7c22cc575c91ea2fac3de0e9dff1b81971f1fac4c506ae66d4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    out=[]\n    for text,role,pos,total,unit,negative,lang,private,label,detail in events:\n        if not text and not private: continue\n        value='hidden' if private else text\n        if label: value=label+': '+value\n        if negative: value='not '+value\n        if unit: value+=' '+unit\n        if total>0: value=str(pos)+' of '+str(total)+': '+value\n        if role: value+=' ('+role+')'\n        if detail and detail!=text and not private: value+='; '+detail\n        language=lang if lang else 'en'\n        out.append([language,value])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['value'*N,'status',2,N+3,'items',True,'fr',False,'Count','detail']]\", \"[['secret'*N,'status',1,3,'kg',False,'en',True,'Weight','private detail']]\", \"[['','',0,0,'',False,'',False,'Label',''],['','',0,0,'',False,'',True,'','']]\", \"[['same'*N,'',0,-1,'',False,'de',False,'','same'*N]]\", \"[['  x  '*N,'',0,0,'',False,'',False,'','']]\", '[]']\nexpected = {1: [[['fr', '2 of 4: not Count: value items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'same']], [['en', '  x  ']], []], 2: [[['fr', '2 of 5: not Count: valuevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesame']], [['en', '  x    x  ']], []], 3: [[['fr', '2 of 6: not Count: valuevaluevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesamesame']], [['en', '  x    x    x  ']], []], 4: [[['fr', '2 of 7: not Count: valuevaluevaluevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesamesamesame']], [['en', '  x    x    x    x  ']], []], 5: [[['fr', '2 of 8: not Count: valuevaluevaluevaluevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesamesamesamesame']], [['en', '  x    x    x    x    x  ']], []]}[N]\nfor i, expression in enumerate(fixtures):\n    check(\"trace-\"+str(i+1), solve(eval(expression)), expected[i])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"a5f27ef3b1e258d4ca28c3afe1b0b8229eaa53eb14fe09c3f3b814beb5ef11d2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    out=[]\n    for text,role,pos,total,unit,negative,lang,private,label,detail in events:\n        if not text and not private: continue\n        value='hidden' if private else text\n        if label: value=label+': '+value\n        if negative: value='not '+value\n        if unit and not private: value+=' '+unit\n        if total>0: value=str(pos)+' of '+str(total)+': '+value\n        if role: value+=' ('+role+')'\n        if detail and detail!=text and not private: value+='; '+detail\n        language=lang if lang else 'en'\n        out.append([language,value])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['value'*N,'status',2,N+3,'items',True,'fr',False,'Count','detail']]\", \"[['secret'*N,'status',1,3,'kg',False,'en',True,'Weight','private detail']]\", \"[['','',0,0,'',False,'',False,'Label',''],['','',0,0,'',False,'',True,'','']]\", \"[['same'*N,'',0,-1,'',False,'de',False,'','same'*N]]\", \"[['  x  '*N,'',0,0,'',False,'',False,'','']]\", '[]']\nexpected = {1: [[['fr', '2 of 4: not Count: value items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'same']], [['en', '  x  ']], []], 2: [[['fr', '2 of 5: not Count: valuevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesame']], [['en', '  x    x  ']], []], 3: [[['fr', '2 of 6: not Count: valuevaluevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesamesame']], [['en', '  x    x    x  ']], []], 4: [[['fr', '2 of 7: not Count: valuevaluevaluevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesamesamesame']], [['en', '  x    x    x    x  ']], []], 5: [[['fr', '2 of 8: not Count: valuevaluevaluevaluevalue items (status); detail']], [['en', '1 of 3: Weight: hidden (status)']], [['en', 'hidden']], [['de', 'samesamesamesamesame']], [['en', '  x    x    x    x    x  ']], []]}[N]\nfor i, expression in enumerate(fixtures):\n    check(\"trace-\"+str(i+1), solve(eval(expression)), expected[i])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Stipulated bounded policy, not a browser, speech engine, platform API, or standards conformance claim. 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"s3-assistive-announcements-speech-envelope-unit","generated_at":"2026-09-29T14:40:21.173047+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Deterministic controlled model of assistive announcement delivery.","repair":"Restore the stated transition: if unit and not private: value+=' '+unit","root_cause":"Fault site: if unit and not private: value+=' '+unit is implemented as if unit: value+=' '+unit","sha256":"6aca2c22e03162ebeab6f4d0facd38ed91e04743ae11541d8edf2d4afd22f12a","title":"Private value leaks its unit suffix · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.487,"exit_code":1,"observations":[{"actual":[["fr","2 of 4: not Count: valueitems (status); detail"]],"check":"trace-1","expected":[["fr","2 of 4: not Count: value items (status); detail"]],"passed":false},{"actual":[["en","1 of 3: Weight: hidden (status)"]],"check":"trace-2","expected":[["en","1 of 3: Weight: hidden (status)"]],"passed":true},{"actual":[["en","hidden"]],"check":"trace-3","expected":[["en","hidden"]],"passed":true},{"actual":[["de","same"]],"check":"trace-4","expected":[["de","same"]],"passed":true},{"actual":[["en","  x  "]],"check":"trace-5","expected":[["en","  x  "]],"passed":true},{"actual":[],"check":"trace-6","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"fr\", \"2 of 4: not Count: valueitems (status); detail\"]], \"expected\": [[\"fr\", \"2 of 4: not Count: value items (status); detail\"]], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[\"en\", \"1 of 3: Weight: hidden (status)\"]], \"expected\": [[\"en\", \"1 of 3: Weight: hidden (status)\"]], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"en\", \"hidden\"]], \"expected\": [[\"en\", \"hidden\"]], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"de\", \"same\"]], \"expected\": [[\"de\", \"same\"]], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"en\", \"  x  \"]], \"expected\": [[\"en\", \"  x  \"]], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":45.088,"exit_code":1,"observations":[{"actual":[["fr","2 of 4: not Count: value items (status); detail"]],"check":"trace-1","expected":[["fr","2 of 4: not Count: value items (status); detail"]],"passed":true},{"actual":[["en","1 of 3: Weight: hidden kg (status)"]],"check":"trace-2","expected":[["en","1 of 3: Weight: hidden (status)"]],"passed":false},{"actual":[["en","hidden"]],"check":"trace-3","expected":[["en","hidden"]],"passed":true},{"actual":[["de","same"]],"check":"trace-4","expected":[["de","same"]],"passed":true},{"actual":[["en","  x  "]],"check":"trace-5","expected":[["en","  x  "]],"passed":true},{"actual":[],"check":"trace-6","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"fr\", \"2 of 4: not Count: value items (status); detail\"]], \"expected\": [[\"fr\", \"2 of 4: not Count: value items (status); detail\"]], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"en\", \"1 of 3: Weight: hidden kg (status)\"]], \"expected\": [[\"en\", \"1 of 3: Weight: hidden (status)\"]], \"passed\": false}, {\"check\": \"trace-3\", \"actual\": [[\"en\", \"hidden\"]], \"expected\": [[\"en\", \"hidden\"]], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"de\", \"same\"]], \"expected\": [[\"de\", \"same\"]], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"en\", \"  x  \"]], \"expected\": [[\"en\", \"  x  \"]], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.057,"exit_code":0,"observations":[{"actual":[["fr","2 of 4: not Count: value items (status); detail"]],"check":"trace-1","expected":[["fr","2 of 4: not Count: value items (status); detail"]],"passed":true},{"actual":[["en","1 of 3: Weight: hidden (status)"]],"check":"trace-2","expected":[["en","1 of 3: Weight: hidden (status)"]],"passed":true},{"actual":[["en","hidden"]],"check":"trace-3","expected":[["en","hidden"]],"passed":true},{"actual":[["de","same"]],"check":"trace-4","expected":[["de","same"]],"passed":true},{"actual":[["en","  x  "]],"check":"trace-5","expected":[["en","  x  "]],"passed":true},{"actual":[],"check":"trace-6","expected":[],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"fr\", \"2 of 4: not Count: value items (status); detail\"]], \"expected\": [[\"fr\", \"2 of 4: not Count: value items (status); detail\"]], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"en\", \"1 of 3: Weight: hidden (status)\"]], \"expected\": [[\"en\", \"1 of 3: Weight: hidden (status)\"]], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"en\", \"hidden\"]], \"expected\": [[\"en\", \"hidden\"]], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"de\", \"same\"]], \"expected\": [[\"de\", \"same\"]], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"en\", \"  x  \"]], \"expected\": [[\"en\", \"  x  \"]], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}