{"abstract":"The announcement trace violates the stated delivery-receipts contract.","category":"Assistive announcements","checks":10,"contract":"A delivery is keyed by (utterance, generation). Submit replaces pending text for that key. A receipt is accepted only for the active generation and exact serial; accepted receipts append spoken text, remove pending, and retire the serial. Disconnect discards pending, increments generation, resets serial. Duplicate receipts do nothing. Report spoken, pending count, generation and next serial.","evaluation_group":"s3-announcement-delivery-receipts","failed_approach":"The attempted repair substitutes serial += 2 and still violates a regression oracle.","family":"s3-assistive-announcements-delivery-receipts-serial","id":"FA-20341","implementations":{"attempt":{"sha256":"6e1c73070d480b23fc33fcae69f39e554bc5f279d918beeecf379a2c79ab9a60","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    pending = {}; retired = set(); spoken = []; generation = 0; serial = 0\n    for e in events:\n        if e[0] == 'submit':\n            serial += 2\n            pending[e[1]] = [generation, serial, e[2]]\n        elif e[0] == 'receipt':\n            ident, epoch, ticket = e[1:]\n            if epoch != generation: continue\n            if ticket in retired: continue\n            if ident not in pending: continue\n            if pending[ident][1] != ticket: continue\n            spoken.append(pending[ident][2])\n            del pending[ident]\n            retired.add(ticket)\n        elif e[0] == 'disconnect':\n            pending.clear()\n            generation += 1\n            serial = 0\n            retired.clear()\n    return [spoken, len(pending), generation, serial]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['submit','a','word'*N],['submit','b','other'],['receipt','a',0,1],['receipt','b',0,1],['receipt','b',0,2]]\", \"[['submit','a','old'],['submit','a','new'*N],['receipt','a',0,1],['receipt','a',0,2]]\", \"[['submit','a','old'],['submit','b','stale'],['disconnect'],['submit','a','new'*N],['receipt','a',0,1],['receipt','a',1,1]]\", \"[['disconnect'],['disconnect'],['submit','a','x'*N],['receipt','a',2,1]]\", \"[['submit','a','hello'*N],['receipt','a',0,1],['receipt','a',0,1]]\", \"[['submit','a','hi'*N],['submit','b','bye'],['receipt','a',0,1],['receipt','b',0,2],['disconnect'],['submit','a','new'],['receipt','a',1,1]]\", \"[['disconnect'],['submit','a','fresh'*N],['receipt','a',0,1]]\", \"[['submit','a','old'],['submit','b','old'],['disconnect']]\", \"[['submit','a','old'],['submit','a','new'*N],['receipt','a',0,1]]\", '[]']\nexpected = {1: [[['word', 'other'], 0, 0, 2], [['new'], 0, 0, 2], [['new'], 0, 1, 1], [['x'], 0, 2, 1], [['hello'], 0, 0, 1], [['hi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 2: [[['wordword', 'other'], 0, 0, 2], [['newnew'], 0, 0, 2], [['newnew'], 0, 1, 1], [['xx'], 0, 2, 1], [['hellohello'], 0, 0, 1], [['hihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 3: [[['wordwordword', 'other'], 0, 0, 2], [['newnewnew'], 0, 0, 2], [['newnewnew'], 0, 1, 1], [['xxx'], 0, 2, 1], [['hellohellohello'], 0, 0, 1], [['hihihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 4: [[['wordwordwordword', 'other'], 0, 0, 2], [['newnewnewnew'], 0, 0, 2], [['newnewnewnew'], 0, 1, 1], [['xxxx'], 0, 2, 1], [['hellohellohellohello'], 0, 0, 1], [['hihihihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 5: [[['wordwordwordwordword', 'other'], 0, 0, 2], [['newnewnewnewnew'], 0, 0, 2], [['newnewnewnewnew'], 0, 1, 1], [['xxxxx'], 0, 2, 1], [['hellohellohellohellohello'], 0, 0, 1], [['hihihihihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]]}[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":"5ff88d3ae09fb30e243aeabfc0bf67ede86428f6f4cea38d35dfd9fc9cf9a824","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    pending = {}; retired = set(); spoken = []; generation = 0; serial = 0\n    for e in events:\n        if e[0] == 'submit':\n            serial = 1\n            pending[e[1]] = [generation, serial, e[2]]\n        elif e[0] == 'receipt':\n            ident, epoch, ticket = e[1:]\n            if epoch != generation: continue\n            if ticket in retired: continue\n            if ident not in pending: continue\n            if pending[ident][1] != ticket: continue\n            spoken.append(pending[ident][2])\n            del pending[ident]\n            retired.add(ticket)\n        elif e[0] == 'disconnect':\n            pending.clear()\n            generation += 1\n            serial = 0\n            retired.clear()\n    return [spoken, len(pending), generation, serial]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['submit','a','word'*N],['submit','b','other'],['receipt','a',0,1],['receipt','b',0,1],['receipt','b',0,2]]\", \"[['submit','a','old'],['submit','a','new'*N],['receipt','a',0,1],['receipt','a',0,2]]\", \"[['submit','a','old'],['submit','b','stale'],['disconnect'],['submit','a','new'*N],['receipt','a',0,1],['receipt','a',1,1]]\", \"[['disconnect'],['disconnect'],['submit','a','x'*N],['receipt','a',2,1]]\", \"[['submit','a','hello'*N],['receipt','a',0,1],['receipt','a',0,1]]\", \"[['submit','a','hi'*N],['submit','b','bye'],['receipt','a',0,1],['receipt','b',0,2],['disconnect'],['submit','a','new'],['receipt','a',1,1]]\", \"[['disconnect'],['submit','a','fresh'*N],['receipt','a',0,1]]\", \"[['submit','a','old'],['submit','b','old'],['disconnect']]\", \"[['submit','a','old'],['submit','a','new'*N],['receipt','a',0,1]]\", '[]']\nexpected = {1: [[['word', 'other'], 0, 0, 2], [['new'], 0, 0, 2], [['new'], 0, 1, 1], [['x'], 0, 2, 1], [['hello'], 0, 0, 1], [['hi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 2: [[['wordword', 'other'], 0, 0, 2], [['newnew'], 0, 0, 2], [['newnew'], 0, 1, 1], [['xx'], 0, 2, 1], [['hellohello'], 0, 0, 1], [['hihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 3: [[['wordwordword', 'other'], 0, 0, 2], [['newnewnew'], 0, 0, 2], [['newnewnew'], 0, 1, 1], [['xxx'], 0, 2, 1], [['hellohellohello'], 0, 0, 1], [['hihihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 4: [[['wordwordwordword', 'other'], 0, 0, 2], [['newnewnewnew'], 0, 0, 2], [['newnewnewnew'], 0, 1, 1], [['xxxx'], 0, 2, 1], [['hellohellohellohello'], 0, 0, 1], [['hihihihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 5: [[['wordwordwordwordword', 'other'], 0, 0, 2], [['newnewnewnewnew'], 0, 0, 2], [['newnewnewnewnew'], 0, 1, 1], [['xxxxx'], 0, 2, 1], [['hellohellohellohellohello'], 0, 0, 1], [['hihihihihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]]}[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":"22dd36c0596f38d0b2a4cbdc0c531fa58c5f44a3a9b9280d55045adee1522a38","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    pending = {}; retired = set(); spoken = []; generation = 0; serial = 0\n    for e in events:\n        if e[0] == 'submit':\n            serial += 1\n            pending[e[1]] = [generation, serial, e[2]]\n        elif e[0] == 'receipt':\n            ident, epoch, ticket = e[1:]\n            if epoch != generation: continue\n            if ticket in retired: continue\n            if ident not in pending: continue\n            if pending[ident][1] != ticket: continue\n            spoken.append(pending[ident][2])\n            del pending[ident]\n            retired.add(ticket)\n        elif e[0] == 'disconnect':\n            pending.clear()\n            generation += 1\n            serial = 0\n            retired.clear()\n    return [spoken, len(pending), generation, serial]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['submit','a','word'*N],['submit','b','other'],['receipt','a',0,1],['receipt','b',0,1],['receipt','b',0,2]]\", \"[['submit','a','old'],['submit','a','new'*N],['receipt','a',0,1],['receipt','a',0,2]]\", \"[['submit','a','old'],['submit','b','stale'],['disconnect'],['submit','a','new'*N],['receipt','a',0,1],['receipt','a',1,1]]\", \"[['disconnect'],['disconnect'],['submit','a','x'*N],['receipt','a',2,1]]\", \"[['submit','a','hello'*N],['receipt','a',0,1],['receipt','a',0,1]]\", \"[['submit','a','hi'*N],['submit','b','bye'],['receipt','a',0,1],['receipt','b',0,2],['disconnect'],['submit','a','new'],['receipt','a',1,1]]\", \"[['disconnect'],['submit','a','fresh'*N],['receipt','a',0,1]]\", \"[['submit','a','old'],['submit','b','old'],['disconnect']]\", \"[['submit','a','old'],['submit','a','new'*N],['receipt','a',0,1]]\", '[]']\nexpected = {1: [[['word', 'other'], 0, 0, 2], [['new'], 0, 0, 2], [['new'], 0, 1, 1], [['x'], 0, 2, 1], [['hello'], 0, 0, 1], [['hi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 2: [[['wordword', 'other'], 0, 0, 2], [['newnew'], 0, 0, 2], [['newnew'], 0, 1, 1], [['xx'], 0, 2, 1], [['hellohello'], 0, 0, 1], [['hihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 3: [[['wordwordword', 'other'], 0, 0, 2], [['newnewnew'], 0, 0, 2], [['newnewnew'], 0, 1, 1], [['xxx'], 0, 2, 1], [['hellohellohello'], 0, 0, 1], [['hihihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 4: [[['wordwordwordword', 'other'], 0, 0, 2], [['newnewnewnew'], 0, 0, 2], [['newnewnewnew'], 0, 1, 1], [['xxxx'], 0, 2, 1], [['hellohellohellohello'], 0, 0, 1], [['hihihihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]], 5: [[['wordwordwordwordword', 'other'], 0, 0, 2], [['newnewnewnewnew'], 0, 0, 2], [['newnewnewnewnew'], 0, 1, 1], [['xxxxx'], 0, 2, 1], [['hellohellohellohellohello'], 0, 0, 1], [['hihihihihi', 'bye', 'new'], 0, 1, 1], [[], 1, 1, 1], [[], 0, 1, 0], [[], 1, 0, 2], [[], 0, 0, 0]]}[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-delivery-receipts-serial","generated_at":"2026-09-29T14:40:18.031761+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: serial += 1","root_cause":"Fault site: serial += 1 is implemented as serial = 1","sha256":"2a4edff1b6425f8c25c2b8f033bebb1fe381ef0de7794651e60af084b4941738","title":"New utterance reuses an outstanding delivery serial · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.315,"exit_code":1,"observations":[{"actual":[[],2,0,4],"check":"trace-1","expected":[["word","other"],0,0,2],"passed":false},{"actual":[[],1,0,4],"check":"trace-2","expected":[["new"],0,0,2],"passed":false},{"actual":[[],1,1,2],"check":"trace-3","expected":[["new"],0,1,1],"passed":false},{"actual":[[],1,2,2],"check":"trace-4","expected":[["x"],0,2,1],"passed":false},{"actual":[[],1,0,2],"check":"trace-5","expected":[["hello"],0,0,1],"passed":false},{"actual":[[],1,1,2],"check":"trace-6","expected":[["hi","bye","new"],0,1,1],"passed":false},{"actual":[[],1,1,2],"check":"trace-7","expected":[[],1,1,1],"passed":false},{"actual":[[],0,1,0],"check":"trace-8","expected":[[],0,1,0],"passed":true},{"actual":[[],1,0,4],"check":"trace-9","expected":[[],1,0,2],"passed":false},{"actual":[[],0,0,0],"check":"trace-10","expected":[[],0,0,0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[], 2, 0, 4], \"expected\": [[\"word\", \"other\"], 0, 0, 2], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[], 1, 0, 4], \"expected\": [[\"new\"], 0, 0, 2], \"passed\": false}, {\"check\": \"trace-3\", \"actual\": [[], 1, 1, 2], \"expected\": [[\"new\"], 0, 1, 1], \"passed\": false}, {\"check\": \"trace-4\", \"actual\": [[], 1, 2, 2], \"expected\": [[\"x\"], 0, 2, 1], \"passed\": false}, {\"check\": \"trace-5\", \"actual\": [[], 1, 0, 2], \"expected\": [[\"hello\"], 0, 0, 1], \"passed\": false}, {\"check\": \"trace-6\", \"actual\": [[], 1, 1, 2], \"expected\": [[\"hi\", \"bye\", \"new\"], 0, 1, 1], \"passed\": false}, {\"check\": \"trace-7\", \"actual\": [[], 1, 1, 2], \"expected\": [[], 1, 1, 1], \"passed\": false}, {\"check\": \"trace-8\", \"actual\": [[], 0, 1, 0], \"expected\": [[], 0, 1, 0], \"passed\": true}, {\"check\": \"trace-9\", \"actual\": [[], 1, 0, 4], \"expected\": [[], 1, 0, 2], \"passed\": false}, {\"check\": \"trace-10\", \"actual\": [[], 0, 0, 0], \"expected\": [[], 0, 0, 0], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.78,"exit_code":1,"observations":[{"actual":[["word"],1,0,1],"check":"trace-1","expected":[["word","other"],0,0,2],"passed":false},{"actual":[["new"],0,0,1],"check":"trace-2","expected":[["new"],0,0,2],"passed":false},{"actual":[["new"],0,1,1],"check":"trace-3","expected":[["new"],0,1,1],"passed":true},{"actual":[["x"],0,2,1],"check":"trace-4","expected":[["x"],0,2,1],"passed":true},{"actual":[["hello"],0,0,1],"check":"trace-5","expected":[["hello"],0,0,1],"passed":true},{"actual":[["hi","new"],0,1,1],"check":"trace-6","expected":[["hi","bye","new"],0,1,1],"passed":false},{"actual":[[],1,1,1],"check":"trace-7","expected":[[],1,1,1],"passed":true},{"actual":[[],0,1,0],"check":"trace-8","expected":[[],0,1,0],"passed":true},{"actual":[["new"],0,0,1],"check":"trace-9","expected":[[],1,0,2],"passed":false},{"actual":[[],0,0,0],"check":"trace-10","expected":[[],0,0,0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"word\"], 1, 0, 1], \"expected\": [[\"word\", \"other\"], 0, 0, 2], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[\"new\"], 0, 0, 1], \"expected\": [[\"new\"], 0, 0, 2], \"passed\": false}, {\"check\": \"trace-3\", \"actual\": [[\"new\"], 0, 1, 1], \"expected\": [[\"new\"], 0, 1, 1], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"x\"], 0, 2, 1], \"expected\": [[\"x\"], 0, 2, 1], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"hello\"], 0, 0, 1], \"expected\": [[\"hello\"], 0, 0, 1], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[\"hi\", \"new\"], 0, 1, 1], \"expected\": [[\"hi\", \"bye\", \"new\"], 0, 1, 1], \"passed\": false}, {\"check\": \"trace-7\", \"actual\": [[], 1, 1, 1], \"expected\": [[], 1, 1, 1], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[], 0, 1, 0], \"expected\": [[], 0, 1, 0], \"passed\": true}, {\"check\": \"trace-9\", \"actual\": [[\"new\"], 0, 0, 1], \"expected\": [[], 1, 0, 2], \"passed\": false}, {\"check\": \"trace-10\", \"actual\": [[], 0, 0, 0], \"expected\": [[], 0, 0, 0], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":46.327,"exit_code":0,"observations":[{"actual":[["word","other"],0,0,2],"check":"trace-1","expected":[["word","other"],0,0,2],"passed":true},{"actual":[["new"],0,0,2],"check":"trace-2","expected":[["new"],0,0,2],"passed":true},{"actual":[["new"],0,1,1],"check":"trace-3","expected":[["new"],0,1,1],"passed":true},{"actual":[["x"],0,2,1],"check":"trace-4","expected":[["x"],0,2,1],"passed":true},{"actual":[["hello"],0,0,1],"check":"trace-5","expected":[["hello"],0,0,1],"passed":true},{"actual":[["hi","bye","new"],0,1,1],"check":"trace-6","expected":[["hi","bye","new"],0,1,1],"passed":true},{"actual":[[],1,1,1],"check":"trace-7","expected":[[],1,1,1],"passed":true},{"actual":[[],0,1,0],"check":"trace-8","expected":[[],0,1,0],"passed":true},{"actual":[[],1,0,2],"check":"trace-9","expected":[[],1,0,2],"passed":true},{"actual":[[],0,0,0],"check":"trace-10","expected":[[],0,0,0],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"word\", \"other\"], 0, 0, 2], \"expected\": [[\"word\", \"other\"], 0, 0, 2], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"new\"], 0, 0, 2], \"expected\": [[\"new\"], 0, 0, 2], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"new\"], 0, 1, 1], \"expected\": [[\"new\"], 0, 1, 1], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"x\"], 0, 2, 1], \"expected\": [[\"x\"], 0, 2, 1], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"hello\"], 0, 0, 1], \"expected\": [[\"hello\"], 0, 0, 1], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[\"hi\", \"bye\", \"new\"], 0, 1, 1], \"expected\": [[\"hi\", \"bye\", \"new\"], 0, 1, 1], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 1, 1, 1], \"expected\": [[], 1, 1, 1], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[], 0, 1, 0], \"expected\": [[], 0, 1, 0], \"passed\": true}, {\"check\": \"trace-9\", \"actual\": [[], 1, 0, 2], \"expected\": [[], 1, 0, 2], \"passed\": true}, {\"check\": \"trace-10\", \"actual\": [[], 0, 0, 0], \"expected\": [[], 0, 0, 0], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}