{"abstract":"The announcement trace violates the stated context-lease contract.","category":"Assistive announcements","checks":7,"contract":"Announcement context leases map source to [epoch,text]. Register increments the source epoch and clears its text; publish requires a live source and matching epoch. Queue snapshots text plus source epoch. Drain speaks only still-live matching leases. Remove revokes source. Rename transfers a source lease and invalidates queued old-source messages. Report spoken and queue depth.","evaluation_group":"s3-announcement-context-lease","failed_approach":"The attempted repair substitutes epochs[e[1]]=epochs.get(e[1],0)+2 and still violates a regression oracle.","family":"s3-assistive-announcements-context-lease-epoch","id":"FA-20541","implementations":{"attempt":{"sha256":"99a19ac31b53a4dba220d5199a1bc38d0833a566cbfbdcc7a6db909d6cfef25c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    leases={}; epochs={}; queue=[]; spoken=[]\n    for e in events:\n        if e[0]=='register':\n            epochs[e[1]]=epochs.get(e[1],0)+2\n            leases[e[1]]=[epochs[e[1]],'']\n        elif e[0]=='publish':\n            if e[1] not in leases: continue\n            if e[2]!=leases[e[1]][0]: continue\n            leases[e[1]][1]=e[3]\n        elif e[0]=='queue' and e[1] in leases:\n            queue.append([e[1],leases[e[1]][0],leases[e[1]][1]])\n        elif e[0]=='remove': leases.pop(e[1],None)\n        elif e[0]=='rename' and e[1] in leases:\n            leases[e[2]]=leases.pop(e[1])\n        elif e[0]=='drain':\n            for source,epoch,text in queue:\n                if source not in leases: continue\n                if leases[source][0]!=epoch: continue\n                if text: spoken.append(text)\n            queue.clear()\n    return [spoken,len(queue),sorted((k,v) for k,v in leases.items())]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['register','a'],['publish','a',1,'old'*N],['queue','a'],['publish','a',1,'new'],['drain'],['drain']]\", \"[['register','a'],['publish','a',1,'old'],['queue','a'],['register','a'],['publish','a',1,'stale'*N],['queue','a'],['drain']]\", \"[['register','a'],['register','b'],['publish','b',1,'keep'*N],['remove','a'],['queue','b'],['drain']]\", \"[['register','a'],['publish','a',1,'hello'*N],['queue','a'],['rename','a','b'],['queue','b'],['drain']]\", \"[['register','a'],['queue','a'],['drain'],['publish','a',1,'  x  '*N],['queue','a'],['drain']]\", \"[['publish','missing',1,'x'*N],['remove','missing'],['drain']]\", \"[['register','a'],['publish','a',1,'x'*N],['queue','a'],['remove','a'],['drain']]\"]\nexpected = {1: [[['old'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keep'], 0, [('b', [1, 'keep'])]], [['hello'], 0, [('b', [1, 'hello'])]], [['  x  '], 0, [('a', [1, '  x  '])]], [[], 0, []], [[], 0, []]], 2: [[['oldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeep'], 0, [('b', [1, 'keepkeep'])]], [['hellohello'], 0, [('b', [1, 'hellohello'])]], [['  x    x  '], 0, [('a', [1, '  x    x  '])]], [[], 0, []], [[], 0, []]], 3: [[['oldoldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeepkeep'], 0, [('b', [1, 'keepkeepkeep'])]], [['hellohellohello'], 0, [('b', [1, 'hellohellohello'])]], [['  x    x    x  '], 0, [('a', [1, '  x    x    x  '])]], [[], 0, []], [[], 0, []]], 4: [[['oldoldoldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeepkeepkeep'], 0, [('b', [1, 'keepkeepkeepkeep'])]], [['hellohellohellohello'], 0, [('b', [1, 'hellohellohellohello'])]], [['  x    x    x    x  '], 0, [('a', [1, '  x    x    x    x  '])]], [[], 0, []], [[], 0, []]], 5: [[['oldoldoldoldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeepkeepkeepkeep'], 0, [('b', [1, 'keepkeepkeepkeepkeep'])]], [['hellohellohellohellohello'], 0, [('b', [1, 'hellohellohellohellohello'])]], [['  x    x    x    x    x  '], 0, [('a', [1, '  x    x    x    x    x  '])]], [[], 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":"e6fbf40ef2f19492bcd727ee9bd9f8657f13841009b64802a6ba39085ee32810","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    leases={}; epochs={}; queue=[]; spoken=[]\n    for e in events:\n        if e[0]=='register':\n            epochs[e[1]]=1\n            leases[e[1]]=[epochs[e[1]],'']\n        elif e[0]=='publish':\n            if e[1] not in leases: continue\n            if e[2]!=leases[e[1]][0]: continue\n            leases[e[1]][1]=e[3]\n        elif e[0]=='queue' and e[1] in leases:\n            queue.append([e[1],leases[e[1]][0],leases[e[1]][1]])\n        elif e[0]=='remove': leases.pop(e[1],None)\n        elif e[0]=='rename' and e[1] in leases:\n            leases[e[2]]=leases.pop(e[1])\n        elif e[0]=='drain':\n            for source,epoch,text in queue:\n                if source not in leases: continue\n                if leases[source][0]!=epoch: continue\n                if text: spoken.append(text)\n            queue.clear()\n    return [spoken,len(queue),sorted((k,v) for k,v in leases.items())]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['register','a'],['publish','a',1,'old'*N],['queue','a'],['publish','a',1,'new'],['drain'],['drain']]\", \"[['register','a'],['publish','a',1,'old'],['queue','a'],['register','a'],['publish','a',1,'stale'*N],['queue','a'],['drain']]\", \"[['register','a'],['register','b'],['publish','b',1,'keep'*N],['remove','a'],['queue','b'],['drain']]\", \"[['register','a'],['publish','a',1,'hello'*N],['queue','a'],['rename','a','b'],['queue','b'],['drain']]\", \"[['register','a'],['queue','a'],['drain'],['publish','a',1,'  x  '*N],['queue','a'],['drain']]\", \"[['publish','missing',1,'x'*N],['remove','missing'],['drain']]\", \"[['register','a'],['publish','a',1,'x'*N],['queue','a'],['remove','a'],['drain']]\"]\nexpected = {1: [[['old'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keep'], 0, [('b', [1, 'keep'])]], [['hello'], 0, [('b', [1, 'hello'])]], [['  x  '], 0, [('a', [1, '  x  '])]], [[], 0, []], [[], 0, []]], 2: [[['oldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeep'], 0, [('b', [1, 'keepkeep'])]], [['hellohello'], 0, [('b', [1, 'hellohello'])]], [['  x    x  '], 0, [('a', [1, '  x    x  '])]], [[], 0, []], [[], 0, []]], 3: [[['oldoldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeepkeep'], 0, [('b', [1, 'keepkeepkeep'])]], [['hellohellohello'], 0, [('b', [1, 'hellohellohello'])]], [['  x    x    x  '], 0, [('a', [1, '  x    x    x  '])]], [[], 0, []], [[], 0, []]], 4: [[['oldoldoldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeepkeepkeep'], 0, [('b', [1, 'keepkeepkeepkeep'])]], [['hellohellohellohello'], 0, [('b', [1, 'hellohellohellohello'])]], [['  x    x    x    x  '], 0, [('a', [1, '  x    x    x    x  '])]], [[], 0, []], [[], 0, []]], 5: [[['oldoldoldoldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeepkeepkeepkeep'], 0, [('b', [1, 'keepkeepkeepkeepkeep'])]], [['hellohellohellohellohello'], 0, [('b', [1, 'hellohellohellohellohello'])]], [['  x    x    x    x    x  '], 0, [('a', [1, '  x    x    x    x    x  '])]], [[], 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":"f1ab57995f15cbc8b447b4338b46bdd28756bfd55cb0d36cd48aca7b65a69243","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    leases={}; epochs={}; queue=[]; spoken=[]\n    for e in events:\n        if e[0]=='register':\n            epochs[e[1]]=epochs.get(e[1],0)+1\n            leases[e[1]]=[epochs[e[1]],'']\n        elif e[0]=='publish':\n            if e[1] not in leases: continue\n            if e[2]!=leases[e[1]][0]: continue\n            leases[e[1]][1]=e[3]\n        elif e[0]=='queue' and e[1] in leases:\n            queue.append([e[1],leases[e[1]][0],leases[e[1]][1]])\n        elif e[0]=='remove': leases.pop(e[1],None)\n        elif e[0]=='rename' and e[1] in leases:\n            leases[e[2]]=leases.pop(e[1])\n        elif e[0]=='drain':\n            for source,epoch,text in queue:\n                if source not in leases: continue\n                if leases[source][0]!=epoch: continue\n                if text: spoken.append(text)\n            queue.clear()\n    return [spoken,len(queue),sorted((k,v) for k,v in leases.items())]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['register','a'],['publish','a',1,'old'*N],['queue','a'],['publish','a',1,'new'],['drain'],['drain']]\", \"[['register','a'],['publish','a',1,'old'],['queue','a'],['register','a'],['publish','a',1,'stale'*N],['queue','a'],['drain']]\", \"[['register','a'],['register','b'],['publish','b',1,'keep'*N],['remove','a'],['queue','b'],['drain']]\", \"[['register','a'],['publish','a',1,'hello'*N],['queue','a'],['rename','a','b'],['queue','b'],['drain']]\", \"[['register','a'],['queue','a'],['drain'],['publish','a',1,'  x  '*N],['queue','a'],['drain']]\", \"[['publish','missing',1,'x'*N],['remove','missing'],['drain']]\", \"[['register','a'],['publish','a',1,'x'*N],['queue','a'],['remove','a'],['drain']]\"]\nexpected = {1: [[['old'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keep'], 0, [('b', [1, 'keep'])]], [['hello'], 0, [('b', [1, 'hello'])]], [['  x  '], 0, [('a', [1, '  x  '])]], [[], 0, []], [[], 0, []]], 2: [[['oldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeep'], 0, [('b', [1, 'keepkeep'])]], [['hellohello'], 0, [('b', [1, 'hellohello'])]], [['  x    x  '], 0, [('a', [1, '  x    x  '])]], [[], 0, []], [[], 0, []]], 3: [[['oldoldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeepkeep'], 0, [('b', [1, 'keepkeepkeep'])]], [['hellohellohello'], 0, [('b', [1, 'hellohellohello'])]], [['  x    x    x  '], 0, [('a', [1, '  x    x    x  '])]], [[], 0, []], [[], 0, []]], 4: [[['oldoldoldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeepkeepkeep'], 0, [('b', [1, 'keepkeepkeepkeep'])]], [['hellohellohellohello'], 0, [('b', [1, 'hellohellohellohello'])]], [['  x    x    x    x  '], 0, [('a', [1, '  x    x    x    x  '])]], [[], 0, []], [[], 0, []]], 5: [[['oldoldoldoldold'], 0, [('a', [1, 'new'])]], [[], 0, [('a', [2, ''])]], [['keepkeepkeepkeepkeep'], 0, [('b', [1, 'keepkeepkeepkeepkeep'])]], [['hellohellohellohellohello'], 0, [('b', [1, 'hellohellohellohellohello'])]], [['  x    x    x    x    x  '], 0, [('a', [1, '  x    x    x    x    x  '])]], [[], 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-context-lease-epoch","generated_at":"2026-09-29T14:40:19.919076+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: epochs[e[1]]=epochs.get(e[1],0)+1","root_cause":"Fault site: epochs[e[1]]=epochs.get(e[1],0)+1 is implemented as epochs[e[1]]=1","sha256":"047235c0c4ed421cffd9927e53007d4a67e2a0fa6e97ea2f2ce8fbaa9564b668","title":"Source re-registration reuses a stale lease · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.283,"exit_code":1,"observations":[{"actual":[[],0,[["a",[2,""]]]],"check":"trace-1","expected":[["old"],0,[["a",[1,"new"]]]],"passed":false},{"actual":[[],0,[["a",[4,""]]]],"check":"trace-2","expected":[[],0,[["a",[2,""]]]],"passed":false},{"actual":[[],0,[["b",[2,""]]]],"check":"trace-3","expected":[["keep"],0,[["b",[1,"keep"]]]],"passed":false},{"actual":[[],0,[["b",[2,""]]]],"check":"trace-4","expected":[["hello"],0,[["b",[1,"hello"]]]],"passed":false},{"actual":[[],0,[["a",[2,""]]]],"check":"trace-5","expected":[["  x  "],0,[["a",[1,"  x  "]]]],"passed":false},{"actual":[[],0,[]],"check":"trace-6","expected":[[],0,[]],"passed":true},{"actual":[[],0,[]],"check":"trace-7","expected":[[],0,[]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[], 0, [[\"a\", [2, \"\"]]]], \"expected\": [[\"old\"], 0, [[\"a\", [1, \"new\"]]]], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[], 0, [[\"a\", [4, \"\"]]]], \"expected\": [[], 0, [[\"a\", [2, \"\"]]]], \"passed\": false}, {\"check\": \"trace-3\", \"actual\": [[], 0, [[\"b\", [2, \"\"]]]], \"expected\": [[\"keep\"], 0, [[\"b\", [1, \"keep\"]]]], \"passed\": false}, {\"check\": \"trace-4\", \"actual\": [[], 0, [[\"b\", [2, \"\"]]]], \"expected\": [[\"hello\"], 0, [[\"b\", [1, \"hello\"]]]], \"passed\": false}, {\"check\": \"trace-5\", \"actual\": [[], 0, [[\"a\", [2, \"\"]]]], \"expected\": [[\"  x  \"], 0, [[\"a\", [1, \"  x  \"]]]], \"passed\": false}, {\"check\": \"trace-6\", \"actual\": [[], 0, []], \"expected\": [[], 0, []], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 0, []], \"expected\": [[], 0, []], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.127,"exit_code":1,"observations":[{"actual":[["old"],0,[["a",[1,"new"]]]],"check":"trace-1","expected":[["old"],0,[["a",[1,"new"]]]],"passed":true},{"actual":[["old","stale"],0,[["a",[1,"stale"]]]],"check":"trace-2","expected":[[],0,[["a",[2,""]]]],"passed":false},{"actual":[["keep"],0,[["b",[1,"keep"]]]],"check":"trace-3","expected":[["keep"],0,[["b",[1,"keep"]]]],"passed":true},{"actual":[["hello"],0,[["b",[1,"hello"]]]],"check":"trace-4","expected":[["hello"],0,[["b",[1,"hello"]]]],"passed":true},{"actual":[["  x  "],0,[["a",[1,"  x  "]]]],"check":"trace-5","expected":[["  x  "],0,[["a",[1,"  x  "]]]],"passed":true},{"actual":[[],0,[]],"check":"trace-6","expected":[[],0,[]],"passed":true},{"actual":[[],0,[]],"check":"trace-7","expected":[[],0,[]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"old\"], 0, [[\"a\", [1, \"new\"]]]], \"expected\": [[\"old\"], 0, [[\"a\", [1, \"new\"]]]], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"old\", \"stale\"], 0, [[\"a\", [1, \"stale\"]]]], \"expected\": [[], 0, [[\"a\", [2, \"\"]]]], \"passed\": false}, {\"check\": \"trace-3\", \"actual\": [[\"keep\"], 0, [[\"b\", [1, \"keep\"]]]], \"expected\": [[\"keep\"], 0, [[\"b\", [1, \"keep\"]]]], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"hello\"], 0, [[\"b\", [1, \"hello\"]]]], \"expected\": [[\"hello\"], 0, [[\"b\", [1, \"hello\"]]]], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"  x  \"], 0, [[\"a\", [1, \"  x  \"]]]], \"expected\": [[\"  x  \"], 0, [[\"a\", [1, \"  x  \"]]]], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], 0, []], \"expected\": [[], 0, []], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 0, []], \"expected\": [[], 0, []], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.945,"exit_code":0,"observations":[{"actual":[["old"],0,[["a",[1,"new"]]]],"check":"trace-1","expected":[["old"],0,[["a",[1,"new"]]]],"passed":true},{"actual":[[],0,[["a",[2,""]]]],"check":"trace-2","expected":[[],0,[["a",[2,""]]]],"passed":true},{"actual":[["keep"],0,[["b",[1,"keep"]]]],"check":"trace-3","expected":[["keep"],0,[["b",[1,"keep"]]]],"passed":true},{"actual":[["hello"],0,[["b",[1,"hello"]]]],"check":"trace-4","expected":[["hello"],0,[["b",[1,"hello"]]]],"passed":true},{"actual":[["  x  "],0,[["a",[1,"  x  "]]]],"check":"trace-5","expected":[["  x  "],0,[["a",[1,"  x  "]]]],"passed":true},{"actual":[[],0,[]],"check":"trace-6","expected":[[],0,[]],"passed":true},{"actual":[[],0,[]],"check":"trace-7","expected":[[],0,[]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"old\"], 0, [[\"a\", [1, \"new\"]]]], \"expected\": [[\"old\"], 0, [[\"a\", [1, \"new\"]]]], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[], 0, [[\"a\", [2, \"\"]]]], \"expected\": [[], 0, [[\"a\", [2, \"\"]]]], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"keep\"], 0, [[\"b\", [1, \"keep\"]]]], \"expected\": [[\"keep\"], 0, [[\"b\", [1, \"keep\"]]]], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"hello\"], 0, [[\"b\", [1, \"hello\"]]]], \"expected\": [[\"hello\"], 0, [[\"b\", [1, \"hello\"]]]], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"  x  \"], 0, [[\"a\", [1, \"  x  \"]]]], \"expected\": [[\"  x  \"], 0, [[\"a\", [1, \"  x  \"]]]], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], 0, []], \"expected\": [[], 0, []], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 0, []], \"expected\": [[], 0, []], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}