{"abstract":"The announcement trace violates the stated announcement-transaction contract.","category":"Assistive announcements","checks":8,"contract":"Nested announcement transactions stage text. Begin pushes a frame; append outside a frame speaks immediately. Commit merges into parent or speaks outer contents in order; rollback discards only the top frame. Replace edits only last staged item or appends when empty. Clear empties top frame. Flush cannot expose staged text. Report spoken and nested staged frames.","evaluation_group":"s3-announcement-announcement-transaction","failed_approach":"The attempted repair substitutes if frames[-1]: frames[-1].append(e[1]) and still violates a regression oracle.","family":"s3-assistive-announcements-announcement-transaction-replace","id":"FA-20526","implementations":{"attempt":{"sha256":"0a4cdb0bdb2952ab66f85e027376897138f1f5c1bc7a820520479b6bae240f26","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    frames=[]; spoken=[]\n    for e in events:\n        op=e[0]\n        if op=='begin': frames.append([])\n        elif op=='append':\n            if frames: frames[-1].append(e[1])\n            else: spoken.append(e[1])\n        elif op=='commit' and frames:\n            batch=frames.pop()\n            if frames: frames[-1].extend(batch)\n            else: spoken.extend(batch)\n        elif op=='rollback' and frames: frames.pop()\n        elif op=='replace' and frames:\n            if frames[-1]: frames[-1].append(e[1])\n            else: frames[-1].append(e[1])\n        elif op=='clear' and frames: frames[-1].clear()\n        elif op=='flush': pass\n    return [spoken,frames]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['append','outside'*N],['append','second'],['begin'],['append','first'],['append','second'],['replace','fixed'*N],['flush'],['commit']]\", \"[['begin'],['append','outer'*N],['begin'],['append','inner'],['commit'],['commit']]\", \"[['begin'],['append','outer'*N],['begin'],['append','inner'],['rollback'],['commit']]\", \"[['append','spoken'*N],['begin'],['append','hidden'],['clear'],['append','new'],['commit']]\", \"[['begin'],['replace','new'*N],['commit']]\", \"[['begin'],['append','x'*N],['clear']]\", \"[['commit'],['rollback'],['clear'],['flush']]\", \"[['begin'],['append','a'*N],['begin'],['append','b']]\"]\nexpected = {1: [[['outside', 'second', 'first', 'fixed'], []], [['outer', 'inner'], []], [['outer'], []], [['spoken', 'new'], []], [['new'], []], [[], [[]]], [[], []], [[], [['a'], ['b']]]], 2: [[['outsideoutside', 'second', 'first', 'fixedfixed'], []], [['outerouter', 'inner'], []], [['outerouter'], []], [['spokenspoken', 'new'], []], [['newnew'], []], [[], [[]]], [[], []], [[], [['aa'], ['b']]]], 3: [[['outsideoutsideoutside', 'second', 'first', 'fixedfixedfixed'], []], [['outerouterouter', 'inner'], []], [['outerouterouter'], []], [['spokenspokenspoken', 'new'], []], [['newnewnew'], []], [[], [[]]], [[], []], [[], [['aaa'], ['b']]]], 4: [[['outsideoutsideoutsideoutside', 'second', 'first', 'fixedfixedfixedfixed'], []], [['outerouterouterouter', 'inner'], []], [['outerouterouterouter'], []], [['spokenspokenspokenspoken', 'new'], []], [['newnewnewnew'], []], [[], [[]]], [[], []], [[], [['aaaa'], ['b']]]], 5: [[['outsideoutsideoutsideoutsideoutside', 'second', 'first', 'fixedfixedfixedfixedfixed'], []], [['outerouterouterouterouter', 'inner'], []], [['outerouterouterouterouter'], []], [['spokenspokenspokenspokenspoken', 'new'], []], [['newnewnewnewnew'], []], [[], [[]]], [[], []], [[], [['aaaaa'], ['b']]]]}[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":"0cb3e946b6335e5174ef645bcccec8f5d6942ffe8fbb73da0681b80647f8a402","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    frames=[]; spoken=[]\n    for e in events:\n        op=e[0]\n        if op=='begin': frames.append([])\n        elif op=='append':\n            if frames: frames[-1].append(e[1])\n            else: spoken.append(e[1])\n        elif op=='commit' and frames:\n            batch=frames.pop()\n            if frames: frames[-1].extend(batch)\n            else: spoken.extend(batch)\n        elif op=='rollback' and frames: frames.pop()\n        elif op=='replace' and frames:\n            if frames[-1]: frames[-1][0]=e[1]\n            else: frames[-1].append(e[1])\n        elif op=='clear' and frames: frames[-1].clear()\n        elif op=='flush': pass\n    return [spoken,frames]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['append','outside'*N],['append','second'],['begin'],['append','first'],['append','second'],['replace','fixed'*N],['flush'],['commit']]\", \"[['begin'],['append','outer'*N],['begin'],['append','inner'],['commit'],['commit']]\", \"[['begin'],['append','outer'*N],['begin'],['append','inner'],['rollback'],['commit']]\", \"[['append','spoken'*N],['begin'],['append','hidden'],['clear'],['append','new'],['commit']]\", \"[['begin'],['replace','new'*N],['commit']]\", \"[['begin'],['append','x'*N],['clear']]\", \"[['commit'],['rollback'],['clear'],['flush']]\", \"[['begin'],['append','a'*N],['begin'],['append','b']]\"]\nexpected = {1: [[['outside', 'second', 'first', 'fixed'], []], [['outer', 'inner'], []], [['outer'], []], [['spoken', 'new'], []], [['new'], []], [[], [[]]], [[], []], [[], [['a'], ['b']]]], 2: [[['outsideoutside', 'second', 'first', 'fixedfixed'], []], [['outerouter', 'inner'], []], [['outerouter'], []], [['spokenspoken', 'new'], []], [['newnew'], []], [[], [[]]], [[], []], [[], [['aa'], ['b']]]], 3: [[['outsideoutsideoutside', 'second', 'first', 'fixedfixedfixed'], []], [['outerouterouter', 'inner'], []], [['outerouterouter'], []], [['spokenspokenspoken', 'new'], []], [['newnewnew'], []], [[], [[]]], [[], []], [[], [['aaa'], ['b']]]], 4: [[['outsideoutsideoutsideoutside', 'second', 'first', 'fixedfixedfixedfixed'], []], [['outerouterouterouter', 'inner'], []], [['outerouterouterouter'], []], [['spokenspokenspokenspoken', 'new'], []], [['newnewnewnew'], []], [[], [[]]], [[], []], [[], [['aaaa'], ['b']]]], 5: [[['outsideoutsideoutsideoutsideoutside', 'second', 'first', 'fixedfixedfixedfixedfixed'], []], [['outerouterouterouterouter', 'inner'], []], [['outerouterouterouterouter'], []], [['spokenspokenspokenspokenspoken', 'new'], []], [['newnewnewnewnew'], []], [[], [[]]], [[], []], [[], [['aaaaa'], ['b']]]]}[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":"d38baf42f9a61e99864633304e128c1c8fb82295908cdfd1ed2de46bf72bd410","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    frames=[]; spoken=[]\n    for e in events:\n        op=e[0]\n        if op=='begin': frames.append([])\n        elif op=='append':\n            if frames: frames[-1].append(e[1])\n            else: spoken.append(e[1])\n        elif op=='commit' and frames:\n            batch=frames.pop()\n            if frames: frames[-1].extend(batch)\n            else: spoken.extend(batch)\n        elif op=='rollback' and frames: frames.pop()\n        elif op=='replace' and frames:\n            if frames[-1]: frames[-1][-1]=e[1]\n            else: frames[-1].append(e[1])\n        elif op=='clear' and frames: frames[-1].clear()\n        elif op=='flush': pass\n    return [spoken,frames]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['append','outside'*N],['append','second'],['begin'],['append','first'],['append','second'],['replace','fixed'*N],['flush'],['commit']]\", \"[['begin'],['append','outer'*N],['begin'],['append','inner'],['commit'],['commit']]\", \"[['begin'],['append','outer'*N],['begin'],['append','inner'],['rollback'],['commit']]\", \"[['append','spoken'*N],['begin'],['append','hidden'],['clear'],['append','new'],['commit']]\", \"[['begin'],['replace','new'*N],['commit']]\", \"[['begin'],['append','x'*N],['clear']]\", \"[['commit'],['rollback'],['clear'],['flush']]\", \"[['begin'],['append','a'*N],['begin'],['append','b']]\"]\nexpected = {1: [[['outside', 'second', 'first', 'fixed'], []], [['outer', 'inner'], []], [['outer'], []], [['spoken', 'new'], []], [['new'], []], [[], [[]]], [[], []], [[], [['a'], ['b']]]], 2: [[['outsideoutside', 'second', 'first', 'fixedfixed'], []], [['outerouter', 'inner'], []], [['outerouter'], []], [['spokenspoken', 'new'], []], [['newnew'], []], [[], [[]]], [[], []], [[], [['aa'], ['b']]]], 3: [[['outsideoutsideoutside', 'second', 'first', 'fixedfixedfixed'], []], [['outerouterouter', 'inner'], []], [['outerouterouter'], []], [['spokenspokenspoken', 'new'], []], [['newnewnew'], []], [[], [[]]], [[], []], [[], [['aaa'], ['b']]]], 4: [[['outsideoutsideoutsideoutside', 'second', 'first', 'fixedfixedfixedfixed'], []], [['outerouterouterouter', 'inner'], []], [['outerouterouterouter'], []], [['spokenspokenspokenspoken', 'new'], []], [['newnewnewnew'], []], [[], [[]]], [[], []], [[], [['aaaa'], ['b']]]], 5: [[['outsideoutsideoutsideoutsideoutside', 'second', 'first', 'fixedfixedfixedfixedfixed'], []], [['outerouterouterouterouter', 'inner'], []], [['outerouterouterouterouter'], []], [['spokenspokenspokenspokenspoken', 'new'], []], [['newnewnewnewnew'], []], [[], [[]]], [[], []], [[], [['aaaaa'], ['b']]]]}[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-announcement-transaction-replace","generated_at":"2026-09-29T14:40:19.870749+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 frames[-1]: frames[-1][-1]=e[1]","root_cause":"Fault site: if frames[-1]: frames[-1][-1]=e[1] is implemented as if frames[-1]: frames[-1][0]=e[1]","sha256":"f027ec897ffd2e2faaae4230679e7032f45faef064c1084ce004effb368d4087","title":"Staged correction edits the first message in the frame · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.295,"exit_code":1,"observations":[{"actual":[["outside","second","first","second","fixed"],[]],"check":"trace-1","expected":[["outside","second","first","fixed"],[]],"passed":false},{"actual":[["outer","inner"],[]],"check":"trace-2","expected":[["outer","inner"],[]],"passed":true},{"actual":[["outer"],[]],"check":"trace-3","expected":[["outer"],[]],"passed":true},{"actual":[["spoken","new"],[]],"check":"trace-4","expected":[["spoken","new"],[]],"passed":true},{"actual":[["new"],[]],"check":"trace-5","expected":[["new"],[]],"passed":true},{"actual":[[],[[]]],"check":"trace-6","expected":[[],[[]]],"passed":true},{"actual":[[],[]],"check":"trace-7","expected":[[],[]],"passed":true},{"actual":[[],[["a"],["b"]]],"check":"trace-8","expected":[[],[["a"],["b"]]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"outside\", \"second\", \"first\", \"second\", \"fixed\"], []], \"expected\": [[\"outside\", \"second\", \"first\", \"fixed\"], []], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[\"outer\", \"inner\"], []], \"expected\": [[\"outer\", \"inner\"], []], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"outer\"], []], \"expected\": [[\"outer\"], []], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"spoken\", \"new\"], []], \"expected\": [[\"spoken\", \"new\"], []], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"new\"], []], \"expected\": [[\"new\"], []], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], [[]]], \"expected\": [[], [[]]], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], []], \"expected\": [[], []], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[], [[\"a\"], [\"b\"]]], \"expected\": [[], [[\"a\"], [\"b\"]]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.362,"exit_code":1,"observations":[{"actual":[["outside","second","fixed","second"],[]],"check":"trace-1","expected":[["outside","second","first","fixed"],[]],"passed":false},{"actual":[["outer","inner"],[]],"check":"trace-2","expected":[["outer","inner"],[]],"passed":true},{"actual":[["outer"],[]],"check":"trace-3","expected":[["outer"],[]],"passed":true},{"actual":[["spoken","new"],[]],"check":"trace-4","expected":[["spoken","new"],[]],"passed":true},{"actual":[["new"],[]],"check":"trace-5","expected":[["new"],[]],"passed":true},{"actual":[[],[[]]],"check":"trace-6","expected":[[],[[]]],"passed":true},{"actual":[[],[]],"check":"trace-7","expected":[[],[]],"passed":true},{"actual":[[],[["a"],["b"]]],"check":"trace-8","expected":[[],[["a"],["b"]]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"outside\", \"second\", \"fixed\", \"second\"], []], \"expected\": [[\"outside\", \"second\", \"first\", \"fixed\"], []], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[\"outer\", \"inner\"], []], \"expected\": [[\"outer\", \"inner\"], []], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"outer\"], []], \"expected\": [[\"outer\"], []], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"spoken\", \"new\"], []], \"expected\": [[\"spoken\", \"new\"], []], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"new\"], []], \"expected\": [[\"new\"], []], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], [[]]], \"expected\": [[], [[]]], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], []], \"expected\": [[], []], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[], [[\"a\"], [\"b\"]]], \"expected\": [[], [[\"a\"], [\"b\"]]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.013,"exit_code":0,"observations":[{"actual":[["outside","second","first","fixed"],[]],"check":"trace-1","expected":[["outside","second","first","fixed"],[]],"passed":true},{"actual":[["outer","inner"],[]],"check":"trace-2","expected":[["outer","inner"],[]],"passed":true},{"actual":[["outer"],[]],"check":"trace-3","expected":[["outer"],[]],"passed":true},{"actual":[["spoken","new"],[]],"check":"trace-4","expected":[["spoken","new"],[]],"passed":true},{"actual":[["new"],[]],"check":"trace-5","expected":[["new"],[]],"passed":true},{"actual":[[],[[]]],"check":"trace-6","expected":[[],[[]]],"passed":true},{"actual":[[],[]],"check":"trace-7","expected":[[],[]],"passed":true},{"actual":[[],[["a"],["b"]]],"check":"trace-8","expected":[[],[["a"],["b"]]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"outside\", \"second\", \"first\", \"fixed\"], []], \"expected\": [[\"outside\", \"second\", \"first\", \"fixed\"], []], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"outer\", \"inner\"], []], \"expected\": [[\"outer\", \"inner\"], []], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"outer\"], []], \"expected\": [[\"outer\"], []], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"spoken\", \"new\"], []], \"expected\": [[\"spoken\", \"new\"], []], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"new\"], []], \"expected\": [[\"new\"], []], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], [[]]], \"expected\": [[], [[]]], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], []], \"expected\": [[], []], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[], [[\"a\"], [\"b\"]]], \"expected\": [[], [[\"a\"], [\"b\"]]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}