{"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 leases[e[2]]=leases.pop(e[1]); leases[e[2]][1]=\"\" and still violates a regression oracle.","family":"s3-assistive-announcements-context-lease-rename","id":"FA-20571","implementations":{"attempt":{"sha256":"7bab261c5c8e0e2b23f536b90245dedc344cd1252bd857a86eb2418954f192a7","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]); leases[e[2]][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":"c313437ccec4d2a44f7cd9d152978d7dc4c8f1f841a3662ef7d40e9adee0f072","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]]=list(leases[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-rename","generated_at":"2026-09-29T14:40:20.228759+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: leases[e[2]]=leases.pop(e[1])","root_cause":"Fault site: leases[e[2]]=leases.pop(e[1]) is implemented as leases[e[2]]=list(leases[e[1]])","sha256":"f1b999a24c7348104b54ea308f40aa67ae0c716ac036db73148c129d1bb4a653","title":"Renamed source retains the old live alias · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.728,"exit_code":1,"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":[[],0,[["b",[1,""]]]],"check":"trace-4","expected":[["hello"],0,[["b",[1,"hello"]]]],"passed":false},{"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\": [[], 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\": [[], 0, [[\"b\", [1, \"\"]]]], \"expected\": [[\"hello\"], 0, [[\"b\", [1, \"hello\"]]]], \"passed\": false}, {\"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"},"broken":{"elapsed_ms":40.47,"exit_code":1,"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","hello"],0,[["a",[1,"hello"]],["b",[1,"hello"]]]],"check":"trace-4","expected":[["hello"],0,[["b",[1,"hello"]]]],"passed":false},{"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\": [[], 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\", \"hello\"], 0, [[\"a\", [1, \"hello\"]], [\"b\", [1, \"hello\"]]]], \"expected\": [[\"hello\"], 0, [[\"b\", [1, \"hello\"]]]], \"passed\": false}, {\"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":45.409,"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"}