{"abstract":"The announcement trace violates the stated sentence-packing contract.","category":"Assistive announcements","checks":7,"contract":"Input operations configure character budget then append indivisible phrases [text,language]. Flush packs consecutive same-language phrases with one space while within budget. A phrase longer than budget is emitted alone intact. Language change always starts a new packet. Empty phrases are ignored. Break inserts hard boundary. Cancel removes queued phrases of one language. Returned packets are [language,text], queued phrase count and budget; flush consumes pending phrases.","evaluation_group":"s3-announcement-sentence-packing","failed_approach":"The attempted repair substitutes current[1]+='  '+row[1] and still violates a regression oracle.","family":"s3-assistive-announcements-sentence-packing-separator","id":"FA-21476","implementations":{"attempt":{"sha256":"3c26b5b7fcdced2d8900a40836fc10e4a7c426140e4a3285b11c030adc7d1a7b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    budget=10; q=[]; out=[]\n    for e in events:\n        if e[0]=='budget': budget=max(1,e[1])\n        elif e[0]=='phrase':\n            if e[1]: q.append([e[2],e[1]])\n        elif e[0]=='break': q.append(None)\n        elif e[0]=='cancel': q=[x for x in q if x is None or x[0]!=e[1]]\n        elif e[0]=='flush':\n            current=None\n            for row in q:\n                if row is None:\n                    if current is not None: out.append(current); current=None\n                    continue\n                if current is not None and current[0]==row[0] and len(current[1])+1+len(row[1])<=budget:\n                    current[1]+='  '+row[1]\n                else:\n                    if current is not None: out.append(current)\n                    current=list(row)\n            if current is not None: out.append(current)\n            q.clear()\n    return [out,len(q),budget]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['budget',2*N+1],['phrase','a'*N,'en'],['phrase','b'*N,'en'],['phrase','c','en'],['flush']]\", \"[['budget',2*N],['phrase','a'*N,'en'],['phrase','b'*N,'en'],['flush']]\", \"[['budget',100],['phrase','hello'*N,'en-US'],['phrase','hi','en-GB'],['break'],['phrase','x','en-GB'],['flush']]\", \"[['phrase','a','en'],['break'],['phrase','b','en'],['phrase','non','fr'],['cancel','fr'],['flush']]\", \"[['budget',1],['phrase','oversize'*N,'en'],['flush']]\", \"[['budget',0],['phrase','','en'],['phrase','  ','en'],['flush']]\", \"[['flush'],['break'],['flush']]\"]\nexpected = {1: [[[['en', 'a b'], ['en', 'c']], 0, 3], [[['en', 'a'], ['en', 'b']], 0, 2], [[['en-US', 'hello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 2: [[[['en', 'aa bb'], ['en', 'c']], 0, 5], [[['en', 'aa'], ['en', 'bb']], 0, 4], [[['en-US', 'hellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 3: [[[['en', 'aaa bbb'], ['en', 'c']], 0, 7], [[['en', 'aaa'], ['en', 'bbb']], 0, 6], [[['en-US', 'hellohellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 4: [[[['en', 'aaaa bbbb'], ['en', 'c']], 0, 9], [[['en', 'aaaa'], ['en', 'bbbb']], 0, 8], [[['en-US', 'hellohellohellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversizeoversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 5: [[[['en', 'aaaaa bbbbb'], ['en', 'c']], 0, 11], [[['en', 'aaaaa'], ['en', 'bbbbb']], 0, 10], [[['en-US', 'hellohellohellohellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversizeoversizeoversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]]}[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":"f33ff18731c3d001f1c992617dbfdcec9b1965461e21580ba7ba01974bc74239","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    budget=10; q=[]; out=[]\n    for e in events:\n        if e[0]=='budget': budget=max(1,e[1])\n        elif e[0]=='phrase':\n            if e[1]: q.append([e[2],e[1]])\n        elif e[0]=='break': q.append(None)\n        elif e[0]=='cancel': q=[x for x in q if x is None or x[0]!=e[1]]\n        elif e[0]=='flush':\n            current=None\n            for row in q:\n                if row is None:\n                    if current is not None: out.append(current); current=None\n                    continue\n                if current is not None and current[0]==row[0] and len(current[1])+1+len(row[1])<=budget:\n                    current[1]+=row[1]\n                else:\n                    if current is not None: out.append(current)\n                    current=list(row)\n            if current is not None: out.append(current)\n            q.clear()\n    return [out,len(q),budget]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['budget',2*N+1],['phrase','a'*N,'en'],['phrase','b'*N,'en'],['phrase','c','en'],['flush']]\", \"[['budget',2*N],['phrase','a'*N,'en'],['phrase','b'*N,'en'],['flush']]\", \"[['budget',100],['phrase','hello'*N,'en-US'],['phrase','hi','en-GB'],['break'],['phrase','x','en-GB'],['flush']]\", \"[['phrase','a','en'],['break'],['phrase','b','en'],['phrase','non','fr'],['cancel','fr'],['flush']]\", \"[['budget',1],['phrase','oversize'*N,'en'],['flush']]\", \"[['budget',0],['phrase','','en'],['phrase','  ','en'],['flush']]\", \"[['flush'],['break'],['flush']]\"]\nexpected = {1: [[[['en', 'a b'], ['en', 'c']], 0, 3], [[['en', 'a'], ['en', 'b']], 0, 2], [[['en-US', 'hello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 2: [[[['en', 'aa bb'], ['en', 'c']], 0, 5], [[['en', 'aa'], ['en', 'bb']], 0, 4], [[['en-US', 'hellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 3: [[[['en', 'aaa bbb'], ['en', 'c']], 0, 7], [[['en', 'aaa'], ['en', 'bbb']], 0, 6], [[['en-US', 'hellohellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 4: [[[['en', 'aaaa bbbb'], ['en', 'c']], 0, 9], [[['en', 'aaaa'], ['en', 'bbbb']], 0, 8], [[['en-US', 'hellohellohellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversizeoversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 5: [[[['en', 'aaaaa bbbbb'], ['en', 'c']], 0, 11], [[['en', 'aaaaa'], ['en', 'bbbbb']], 0, 10], [[['en-US', 'hellohellohellohellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversizeoversizeoversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]]}[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":"da1ca7355cf76ead042847dbf73dcd40fe8d18850f7faa4140491419650630dc","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    budget=10; q=[]; out=[]\n    for e in events:\n        if e[0]=='budget': budget=max(1,e[1])\n        elif e[0]=='phrase':\n            if e[1]: q.append([e[2],e[1]])\n        elif e[0]=='break': q.append(None)\n        elif e[0]=='cancel': q=[x for x in q if x is None or x[0]!=e[1]]\n        elif e[0]=='flush':\n            current=None\n            for row in q:\n                if row is None:\n                    if current is not None: out.append(current); current=None\n                    continue\n                if current is not None and current[0]==row[0] and len(current[1])+1+len(row[1])<=budget:\n                    current[1]+=' '+row[1]\n                else:\n                    if current is not None: out.append(current)\n                    current=list(row)\n            if current is not None: out.append(current)\n            q.clear()\n    return [out,len(q),budget]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['budget',2*N+1],['phrase','a'*N,'en'],['phrase','b'*N,'en'],['phrase','c','en'],['flush']]\", \"[['budget',2*N],['phrase','a'*N,'en'],['phrase','b'*N,'en'],['flush']]\", \"[['budget',100],['phrase','hello'*N,'en-US'],['phrase','hi','en-GB'],['break'],['phrase','x','en-GB'],['flush']]\", \"[['phrase','a','en'],['break'],['phrase','b','en'],['phrase','non','fr'],['cancel','fr'],['flush']]\", \"[['budget',1],['phrase','oversize'*N,'en'],['flush']]\", \"[['budget',0],['phrase','','en'],['phrase','  ','en'],['flush']]\", \"[['flush'],['break'],['flush']]\"]\nexpected = {1: [[[['en', 'a b'], ['en', 'c']], 0, 3], [[['en', 'a'], ['en', 'b']], 0, 2], [[['en-US', 'hello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 2: [[[['en', 'aa bb'], ['en', 'c']], 0, 5], [[['en', 'aa'], ['en', 'bb']], 0, 4], [[['en-US', 'hellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 3: [[[['en', 'aaa bbb'], ['en', 'c']], 0, 7], [[['en', 'aaa'], ['en', 'bbb']], 0, 6], [[['en-US', 'hellohellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 4: [[[['en', 'aaaa bbbb'], ['en', 'c']], 0, 9], [[['en', 'aaaa'], ['en', 'bbbb']], 0, 8], [[['en-US', 'hellohellohellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversizeoversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]], 5: [[[['en', 'aaaaa bbbbb'], ['en', 'c']], 0, 11], [[['en', 'aaaaa'], ['en', 'bbbbb']], 0, 10], [[['en-US', 'hellohellohellohellohello'], ['en-GB', 'hi'], ['en-GB', 'x']], 0, 100], [[['en', 'a'], ['en', 'b']], 0, 10], [[['en', 'oversizeoversizeoversizeoversizeoversize']], 0, 1], [[['en', '  ']], 0, 1], [[], 0, 10]]}[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-sentence-packing-separator","generated_at":"2026-09-29T14:40:29.172668+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: current[1]+=' '+row[1]","root_cause":"Fault site: current[1]+=' '+row[1] is implemented as current[1]+=row[1]","sha256":"5e3a85db4bac3d1eb0c32f9a93c30eb3050edc445fdee6a631acb03eb6fb1433","title":"Packet text glues adjacent phrases together · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":45.351,"exit_code":1,"observations":[{"actual":[[["en","a  b"],["en","c"]],0,3],"check":"trace-1","expected":[[["en","a b"],["en","c"]],0,3],"passed":false},{"actual":[[["en","a"],["en","b"]],0,2],"check":"trace-2","expected":[[["en","a"],["en","b"]],0,2],"passed":true},{"actual":[[["en-US","hello"],["en-GB","hi"],["en-GB","x"]],0,100],"check":"trace-3","expected":[[["en-US","hello"],["en-GB","hi"],["en-GB","x"]],0,100],"passed":true},{"actual":[[["en","a"],["en","b"]],0,10],"check":"trace-4","expected":[[["en","a"],["en","b"]],0,10],"passed":true},{"actual":[[["en","oversize"]],0,1],"check":"trace-5","expected":[[["en","oversize"]],0,1],"passed":true},{"actual":[[["en","  "]],0,1],"check":"trace-6","expected":[[["en","  "]],0,1],"passed":true},{"actual":[[],0,10],"check":"trace-7","expected":[[],0,10],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[[\"en\", \"a  b\"], [\"en\", \"c\"]], 0, 3], \"expected\": [[[\"en\", \"a b\"], [\"en\", \"c\"]], 0, 3], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 2], \"expected\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 2], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[[\"en-US\", \"hello\"], [\"en-GB\", \"hi\"], [\"en-GB\", \"x\"]], 0, 100], \"expected\": [[[\"en-US\", \"hello\"], [\"en-GB\", \"hi\"], [\"en-GB\", \"x\"]], 0, 100], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 10], \"expected\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 10], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[[\"en\", \"oversize\"]], 0, 1], \"expected\": [[[\"en\", \"oversize\"]], 0, 1], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[[\"en\", \"  \"]], 0, 1], \"expected\": [[[\"en\", \"  \"]], 0, 1], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 0, 10], \"expected\": [[], 0, 10], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.353,"exit_code":1,"observations":[{"actual":[[["en","ab"],["en","c"]],0,3],"check":"trace-1","expected":[[["en","a b"],["en","c"]],0,3],"passed":false},{"actual":[[["en","a"],["en","b"]],0,2],"check":"trace-2","expected":[[["en","a"],["en","b"]],0,2],"passed":true},{"actual":[[["en-US","hello"],["en-GB","hi"],["en-GB","x"]],0,100],"check":"trace-3","expected":[[["en-US","hello"],["en-GB","hi"],["en-GB","x"]],0,100],"passed":true},{"actual":[[["en","a"],["en","b"]],0,10],"check":"trace-4","expected":[[["en","a"],["en","b"]],0,10],"passed":true},{"actual":[[["en","oversize"]],0,1],"check":"trace-5","expected":[[["en","oversize"]],0,1],"passed":true},{"actual":[[["en","  "]],0,1],"check":"trace-6","expected":[[["en","  "]],0,1],"passed":true},{"actual":[[],0,10],"check":"trace-7","expected":[[],0,10],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[[\"en\", \"ab\"], [\"en\", \"c\"]], 0, 3], \"expected\": [[[\"en\", \"a b\"], [\"en\", \"c\"]], 0, 3], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 2], \"expected\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 2], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[[\"en-US\", \"hello\"], [\"en-GB\", \"hi\"], [\"en-GB\", \"x\"]], 0, 100], \"expected\": [[[\"en-US\", \"hello\"], [\"en-GB\", \"hi\"], [\"en-GB\", \"x\"]], 0, 100], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 10], \"expected\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 10], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[[\"en\", \"oversize\"]], 0, 1], \"expected\": [[[\"en\", \"oversize\"]], 0, 1], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[[\"en\", \"  \"]], 0, 1], \"expected\": [[[\"en\", \"  \"]], 0, 1], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 0, 10], \"expected\": [[], 0, 10], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.921,"exit_code":0,"observations":[{"actual":[[["en","a b"],["en","c"]],0,3],"check":"trace-1","expected":[[["en","a b"],["en","c"]],0,3],"passed":true},{"actual":[[["en","a"],["en","b"]],0,2],"check":"trace-2","expected":[[["en","a"],["en","b"]],0,2],"passed":true},{"actual":[[["en-US","hello"],["en-GB","hi"],["en-GB","x"]],0,100],"check":"trace-3","expected":[[["en-US","hello"],["en-GB","hi"],["en-GB","x"]],0,100],"passed":true},{"actual":[[["en","a"],["en","b"]],0,10],"check":"trace-4","expected":[[["en","a"],["en","b"]],0,10],"passed":true},{"actual":[[["en","oversize"]],0,1],"check":"trace-5","expected":[[["en","oversize"]],0,1],"passed":true},{"actual":[[["en","  "]],0,1],"check":"trace-6","expected":[[["en","  "]],0,1],"passed":true},{"actual":[[],0,10],"check":"trace-7","expected":[[],0,10],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[[\"en\", \"a b\"], [\"en\", \"c\"]], 0, 3], \"expected\": [[[\"en\", \"a b\"], [\"en\", \"c\"]], 0, 3], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 2], \"expected\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 2], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[[\"en-US\", \"hello\"], [\"en-GB\", \"hi\"], [\"en-GB\", \"x\"]], 0, 100], \"expected\": [[[\"en-US\", \"hello\"], [\"en-GB\", \"hi\"], [\"en-GB\", \"x\"]], 0, 100], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 10], \"expected\": [[[\"en\", \"a\"], [\"en\", \"b\"]], 0, 10], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[[\"en\", \"oversize\"]], 0, 1], \"expected\": [[[\"en\", \"oversize\"]], 0, 1], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[[\"en\", \"  \"]], 0, 1], \"expected\": [[[\"en\", \"  \"]], 0, 1], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 0, 10], \"expected\": [[], 0, 10], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}