{"abstract":"The announcement trace violates the stated coalescing-window contract.","category":"Assistive announcements","checks":8,"contract":"Per-source announcements coalesce during an explicit tick window. First update opens [deadline=now+window,text,count]. Further updates replace text, increment count, and never slide deadline. Tick monotonically advances now and emits due sources by deadline then source insertion order as [source,text,count]. Force emits one source immediately. Cancel removes one source. Changing window affects future openings only. Return spoken, pending and now.","evaluation_group":"s3-announcement-coalescing-window","failed_approach":"The attempted repair substitutes if e[0]=='window': window=3 and still violates a regression oracle.","family":"s3-assistive-announcements-coalescing-window-window-min","id":"FA-20791","implementations":{"attempt":{"sha256":"2da663488c97721a0f7ba4d423504378b5647ebef10760923ab924e2180f704e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    window=3; now=0; pending={}; spoken=[]\n    for e in events:\n        if e[0]=='window': window=3\n        elif e[0]=='update':\n            if e[1] in pending:\n                pending[e[1]][1]=e[2]\n                pending[e[1]][2]+=1\n            else: pending[e[1]]=[now+window,e[2],1]\n        elif e[0]=='cancel': pending.pop(e[1],None)\n        elif e[0]=='force' and e[1] in pending:\n            row=pending.pop(e[1]); spoken.append([e[1],row[1],row[2]])\n        elif e[0]=='tick':\n            now=max(now,e[1])\n            ready=sorted([k for k,v in pending.items() if v[0]<=now],key=lambda k:pending[k][0])\n            for k in ready:\n                row=pending.pop(k)\n                spoken.append([k,row[1],row[2]])\n    return [spoken,[[k]+v for k,v in pending.items()],now]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['window',N],['update','z','first'],['update','z','last'*N],['tick',N]]\", \"[['tick',N+3],['window',2],['update','a','x'*N]]\", \"[['tick',N+3],['window',2],['update','a','x'*N],['tick',N+4],['tick',N+5]]\", \"[['window',0],['update','a','x'*N],['tick',0]]\", \"[['update','a','first'*N],['update','b','keep'],['cancel','b']]\", \"[['update','a','x'],['update','a','y'*N],['force','a'],['tick',10]]\", \"[['window',1],['update','z','early'*N],['window',3],['update','a','late'],['tick',N+4],['tick',0]]\", '[]']\nexpected = {1: [[[['z', 'last', 2]], [], 1], [[], [['a', 6, 'x', 1]], 4], [[['a', 'x', 1]], [], 6], [[], [['a', 1, 'x', 1]], 0], [[], [['a', 3, 'first', 1]], 0], [[['a', 'y', 2]], [], 10], [[['z', 'early', 1], ['a', 'late', 1]], [], 5], [[], [], 0]], 2: [[[['z', 'lastlast', 2]], [], 2], [[], [['a', 7, 'xx', 1]], 5], [[['a', 'xx', 1]], [], 7], [[], [['a', 1, 'xx', 1]], 0], [[], [['a', 3, 'firstfirst', 1]], 0], [[['a', 'yy', 2]], [], 10], [[['z', 'earlyearly', 1], ['a', 'late', 1]], [], 6], [[], [], 0]], 3: [[[['z', 'lastlastlast', 2]], [], 3], [[], [['a', 8, 'xxx', 1]], 6], [[['a', 'xxx', 1]], [], 8], [[], [['a', 1, 'xxx', 1]], 0], [[], [['a', 3, 'firstfirstfirst', 1]], 0], [[['a', 'yyy', 2]], [], 10], [[['z', 'earlyearlyearly', 1], ['a', 'late', 1]], [], 7], [[], [], 0]], 4: [[[['z', 'lastlastlastlast', 2]], [], 4], [[], [['a', 9, 'xxxx', 1]], 7], [[['a', 'xxxx', 1]], [], 9], [[], [['a', 1, 'xxxx', 1]], 0], [[], [['a', 3, 'firstfirstfirstfirst', 1]], 0], [[['a', 'yyyy', 2]], [], 10], [[['z', 'earlyearlyearlyearly', 1], ['a', 'late', 1]], [], 8], [[], [], 0]], 5: [[[['z', 'lastlastlastlastlast', 2]], [], 5], [[], [['a', 10, 'xxxxx', 1]], 8], [[['a', 'xxxxx', 1]], [], 10], [[], [['a', 1, 'xxxxx', 1]], 0], [[], [['a', 3, 'firstfirstfirstfirstfirst', 1]], 0], [[['a', 'yyyyy', 2]], [], 10], [[['z', 'earlyearlyearlyearlyearly', 1], ['a', 'late', 1]], [], 9], [[], [], 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":"8575eb402a810637e0fede1a606fe10150d063b69af51c2b82c696d8dd8da52a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    window=3; now=0; pending={}; spoken=[]\n    for e in events:\n        if e[0]=='window': window=e[1]\n        elif e[0]=='update':\n            if e[1] in pending:\n                pending[e[1]][1]=e[2]\n                pending[e[1]][2]+=1\n            else: pending[e[1]]=[now+window,e[2],1]\n        elif e[0]=='cancel': pending.pop(e[1],None)\n        elif e[0]=='force' and e[1] in pending:\n            row=pending.pop(e[1]); spoken.append([e[1],row[1],row[2]])\n        elif e[0]=='tick':\n            now=max(now,e[1])\n            ready=sorted([k for k,v in pending.items() if v[0]<=now],key=lambda k:pending[k][0])\n            for k in ready:\n                row=pending.pop(k)\n                spoken.append([k,row[1],row[2]])\n    return [spoken,[[k]+v for k,v in pending.items()],now]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['window',N],['update','z','first'],['update','z','last'*N],['tick',N]]\", \"[['tick',N+3],['window',2],['update','a','x'*N]]\", \"[['tick',N+3],['window',2],['update','a','x'*N],['tick',N+4],['tick',N+5]]\", \"[['window',0],['update','a','x'*N],['tick',0]]\", \"[['update','a','first'*N],['update','b','keep'],['cancel','b']]\", \"[['update','a','x'],['update','a','y'*N],['force','a'],['tick',10]]\", \"[['window',1],['update','z','early'*N],['window',3],['update','a','late'],['tick',N+4],['tick',0]]\", '[]']\nexpected = {1: [[[['z', 'last', 2]], [], 1], [[], [['a', 6, 'x', 1]], 4], [[['a', 'x', 1]], [], 6], [[], [['a', 1, 'x', 1]], 0], [[], [['a', 3, 'first', 1]], 0], [[['a', 'y', 2]], [], 10], [[['z', 'early', 1], ['a', 'late', 1]], [], 5], [[], [], 0]], 2: [[[['z', 'lastlast', 2]], [], 2], [[], [['a', 7, 'xx', 1]], 5], [[['a', 'xx', 1]], [], 7], [[], [['a', 1, 'xx', 1]], 0], [[], [['a', 3, 'firstfirst', 1]], 0], [[['a', 'yy', 2]], [], 10], [[['z', 'earlyearly', 1], ['a', 'late', 1]], [], 6], [[], [], 0]], 3: [[[['z', 'lastlastlast', 2]], [], 3], [[], [['a', 8, 'xxx', 1]], 6], [[['a', 'xxx', 1]], [], 8], [[], [['a', 1, 'xxx', 1]], 0], [[], [['a', 3, 'firstfirstfirst', 1]], 0], [[['a', 'yyy', 2]], [], 10], [[['z', 'earlyearlyearly', 1], ['a', 'late', 1]], [], 7], [[], [], 0]], 4: [[[['z', 'lastlastlastlast', 2]], [], 4], [[], [['a', 9, 'xxxx', 1]], 7], [[['a', 'xxxx', 1]], [], 9], [[], [['a', 1, 'xxxx', 1]], 0], [[], [['a', 3, 'firstfirstfirstfirst', 1]], 0], [[['a', 'yyyy', 2]], [], 10], [[['z', 'earlyearlyearlyearly', 1], ['a', 'late', 1]], [], 8], [[], [], 0]], 5: [[[['z', 'lastlastlastlastlast', 2]], [], 5], [[], [['a', 10, 'xxxxx', 1]], 8], [[['a', 'xxxxx', 1]], [], 10], [[], [['a', 1, 'xxxxx', 1]], 0], [[], [['a', 3, 'firstfirstfirstfirstfirst', 1]], 0], [[['a', 'yyyyy', 2]], [], 10], [[['z', 'earlyearlyearlyearlyearly', 1], ['a', 'late', 1]], [], 9], [[], [], 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":"23aa7e960877a8056cc277834bf39c2b10a7d46462d8899ba4604a4cc4a22365","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    window=3; now=0; pending={}; spoken=[]\n    for e in events:\n        if e[0]=='window': window=max(1,e[1])\n        elif e[0]=='update':\n            if e[1] in pending:\n                pending[e[1]][1]=e[2]\n                pending[e[1]][2]+=1\n            else: pending[e[1]]=[now+window,e[2],1]\n        elif e[0]=='cancel': pending.pop(e[1],None)\n        elif e[0]=='force' and e[1] in pending:\n            row=pending.pop(e[1]); spoken.append([e[1],row[1],row[2]])\n        elif e[0]=='tick':\n            now=max(now,e[1])\n            ready=sorted([k for k,v in pending.items() if v[0]<=now],key=lambda k:pending[k][0])\n            for k in ready:\n                row=pending.pop(k)\n                spoken.append([k,row[1],row[2]])\n    return [spoken,[[k]+v for k,v in pending.items()],now]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['window',N],['update','z','first'],['update','z','last'*N],['tick',N]]\", \"[['tick',N+3],['window',2],['update','a','x'*N]]\", \"[['tick',N+3],['window',2],['update','a','x'*N],['tick',N+4],['tick',N+5]]\", \"[['window',0],['update','a','x'*N],['tick',0]]\", \"[['update','a','first'*N],['update','b','keep'],['cancel','b']]\", \"[['update','a','x'],['update','a','y'*N],['force','a'],['tick',10]]\", \"[['window',1],['update','z','early'*N],['window',3],['update','a','late'],['tick',N+4],['tick',0]]\", '[]']\nexpected = {1: [[[['z', 'last', 2]], [], 1], [[], [['a', 6, 'x', 1]], 4], [[['a', 'x', 1]], [], 6], [[], [['a', 1, 'x', 1]], 0], [[], [['a', 3, 'first', 1]], 0], [[['a', 'y', 2]], [], 10], [[['z', 'early', 1], ['a', 'late', 1]], [], 5], [[], [], 0]], 2: [[[['z', 'lastlast', 2]], [], 2], [[], [['a', 7, 'xx', 1]], 5], [[['a', 'xx', 1]], [], 7], [[], [['a', 1, 'xx', 1]], 0], [[], [['a', 3, 'firstfirst', 1]], 0], [[['a', 'yy', 2]], [], 10], [[['z', 'earlyearly', 1], ['a', 'late', 1]], [], 6], [[], [], 0]], 3: [[[['z', 'lastlastlast', 2]], [], 3], [[], [['a', 8, 'xxx', 1]], 6], [[['a', 'xxx', 1]], [], 8], [[], [['a', 1, 'xxx', 1]], 0], [[], [['a', 3, 'firstfirstfirst', 1]], 0], [[['a', 'yyy', 2]], [], 10], [[['z', 'earlyearlyearly', 1], ['a', 'late', 1]], [], 7], [[], [], 0]], 4: [[[['z', 'lastlastlastlast', 2]], [], 4], [[], [['a', 9, 'xxxx', 1]], 7], [[['a', 'xxxx', 1]], [], 9], [[], [['a', 1, 'xxxx', 1]], 0], [[], [['a', 3, 'firstfirstfirstfirst', 1]], 0], [[['a', 'yyyy', 2]], [], 10], [[['z', 'earlyearlyearlyearly', 1], ['a', 'late', 1]], [], 8], [[], [], 0]], 5: [[[['z', 'lastlastlastlastlast', 2]], [], 5], [[], [['a', 10, 'xxxxx', 1]], 8], [[['a', 'xxxxx', 1]], [], 10], [[], [['a', 1, 'xxxxx', 1]], 0], [[], [['a', 3, 'firstfirstfirstfirstfirst', 1]], 0], [[['a', 'yyyyy', 2]], [], 10], [[['z', 'earlyearlyearlyearlyearly', 1], ['a', 'late', 1]], [], 9], [[], [], 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-coalescing-window-window-min","generated_at":"2026-09-29T14:40:22.452639+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 e[0]=='window': window=max(1,e[1])","root_cause":"Fault site: if e[0]=='window': window=max(1,e[1]) is implemented as if e[0]=='window': window=e[1]","sha256":"d57b78be4bed81bd67081a60b1fcf4902fd2f3a8c155765419ed41caea2bb9a0","title":"Zero coalescing window allows immediate speech · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.471,"exit_code":1,"observations":[{"actual":[[],[["z",3,"last",2]],1],"check":"trace-1","expected":[[["z","last",2]],[],1],"passed":false},{"actual":[[],[["a",7,"x",1]],4],"check":"trace-2","expected":[[],[["a",6,"x",1]],4],"passed":false},{"actual":[[],[["a",7,"x",1]],6],"check":"trace-3","expected":[[["a","x",1]],[],6],"passed":false},{"actual":[[],[["a",3,"x",1]],0],"check":"trace-4","expected":[[],[["a",1,"x",1]],0],"passed":false},{"actual":[[],[["a",3,"first",1]],0],"check":"trace-5","expected":[[],[["a",3,"first",1]],0],"passed":true},{"actual":[[["a","y",2]],[],10],"check":"trace-6","expected":[[["a","y",2]],[],10],"passed":true},{"actual":[[["z","early",1],["a","late",1]],[],5],"check":"trace-7","expected":[[["z","early",1],["a","late",1]],[],5],"passed":true},{"actual":[[],[],0],"check":"trace-8","expected":[[],[],0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[], [[\"z\", 3, \"last\", 2]], 1], \"expected\": [[[\"z\", \"last\", 2]], [], 1], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[], [[\"a\", 7, \"x\", 1]], 4], \"expected\": [[], [[\"a\", 6, \"x\", 1]], 4], \"passed\": false}, {\"check\": \"trace-3\", \"actual\": [[], [[\"a\", 7, \"x\", 1]], 6], \"expected\": [[[\"a\", \"x\", 1]], [], 6], \"passed\": false}, {\"check\": \"trace-4\", \"actual\": [[], [[\"a\", 3, \"x\", 1]], 0], \"expected\": [[], [[\"a\", 1, \"x\", 1]], 0], \"passed\": false}, {\"check\": \"trace-5\", \"actual\": [[], [[\"a\", 3, \"first\", 1]], 0], \"expected\": [[], [[\"a\", 3, \"first\", 1]], 0], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[[\"a\", \"y\", 2]], [], 10], \"expected\": [[[\"a\", \"y\", 2]], [], 10], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[[\"z\", \"early\", 1], [\"a\", \"late\", 1]], [], 5], \"expected\": [[[\"z\", \"early\", 1], [\"a\", \"late\", 1]], [], 5], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[], [], 0], \"expected\": [[], [], 0], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.069,"exit_code":1,"observations":[{"actual":[[["z","last",2]],[],1],"check":"trace-1","expected":[[["z","last",2]],[],1],"passed":true},{"actual":[[],[["a",6,"x",1]],4],"check":"trace-2","expected":[[],[["a",6,"x",1]],4],"passed":true},{"actual":[[["a","x",1]],[],6],"check":"trace-3","expected":[[["a","x",1]],[],6],"passed":true},{"actual":[[["a","x",1]],[],0],"check":"trace-4","expected":[[],[["a",1,"x",1]],0],"passed":false},{"actual":[[],[["a",3,"first",1]],0],"check":"trace-5","expected":[[],[["a",3,"first",1]],0],"passed":true},{"actual":[[["a","y",2]],[],10],"check":"trace-6","expected":[[["a","y",2]],[],10],"passed":true},{"actual":[[["z","early",1],["a","late",1]],[],5],"check":"trace-7","expected":[[["z","early",1],["a","late",1]],[],5],"passed":true},{"actual":[[],[],0],"check":"trace-8","expected":[[],[],0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[[\"z\", \"last\", 2]], [], 1], \"expected\": [[[\"z\", \"last\", 2]], [], 1], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[], [[\"a\", 6, \"x\", 1]], 4], \"expected\": [[], [[\"a\", 6, \"x\", 1]], 4], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[[\"a\", \"x\", 1]], [], 6], \"expected\": [[[\"a\", \"x\", 1]], [], 6], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[[\"a\", \"x\", 1]], [], 0], \"expected\": [[], [[\"a\", 1, \"x\", 1]], 0], \"passed\": false}, {\"check\": \"trace-5\", \"actual\": [[], [[\"a\", 3, \"first\", 1]], 0], \"expected\": [[], [[\"a\", 3, \"first\", 1]], 0], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[[\"a\", \"y\", 2]], [], 10], \"expected\": [[[\"a\", \"y\", 2]], [], 10], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[[\"z\", \"early\", 1], [\"a\", \"late\", 1]], [], 5], \"expected\": [[[\"z\", \"early\", 1], [\"a\", \"late\", 1]], [], 5], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[], [], 0], \"expected\": [[], [], 0], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.097,"exit_code":0,"observations":[{"actual":[[["z","last",2]],[],1],"check":"trace-1","expected":[[["z","last",2]],[],1],"passed":true},{"actual":[[],[["a",6,"x",1]],4],"check":"trace-2","expected":[[],[["a",6,"x",1]],4],"passed":true},{"actual":[[["a","x",1]],[],6],"check":"trace-3","expected":[[["a","x",1]],[],6],"passed":true},{"actual":[[],[["a",1,"x",1]],0],"check":"trace-4","expected":[[],[["a",1,"x",1]],0],"passed":true},{"actual":[[],[["a",3,"first",1]],0],"check":"trace-5","expected":[[],[["a",3,"first",1]],0],"passed":true},{"actual":[[["a","y",2]],[],10],"check":"trace-6","expected":[[["a","y",2]],[],10],"passed":true},{"actual":[[["z","early",1],["a","late",1]],[],5],"check":"trace-7","expected":[[["z","early",1],["a","late",1]],[],5],"passed":true},{"actual":[[],[],0],"check":"trace-8","expected":[[],[],0],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[[\"z\", \"last\", 2]], [], 1], \"expected\": [[[\"z\", \"last\", 2]], [], 1], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[], [[\"a\", 6, \"x\", 1]], 4], \"expected\": [[], [[\"a\", 6, \"x\", 1]], 4], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[[\"a\", \"x\", 1]], [], 6], \"expected\": [[[\"a\", \"x\", 1]], [], 6], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[], [[\"a\", 1, \"x\", 1]], 0], \"expected\": [[], [[\"a\", 1, \"x\", 1]], 0], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[], [[\"a\", 3, \"first\", 1]], 0], \"expected\": [[], [[\"a\", 3, \"first\", 1]], 0], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[[\"a\", \"y\", 2]], [], 10], \"expected\": [[[\"a\", \"y\", 2]], [], 10], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[[\"z\", \"early\", 1], [\"a\", \"late\", 1]], [], 5], \"expected\": [[[\"z\", \"early\", 1], [\"a\", \"late\", 1]], [], 5], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[], [], 0], \"expected\": [[], [], 0], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}