{"abstract":"The announcement trace violates the stated confirmation-gate contract.","category":"Assistive announcements","checks":8,"contract":"Sensitive announcements require a one-use consent token bound to message ID and text revision. Draft replaces text and increments revision. Grant captures current revision. Speak requires current matching consent, emits text and consumes consent. Revoke removes consent; delete removes draft and consent. Nonsensitive preview emits only fixed redacted cue without consuming consent. Expire removes all grants but preserves drafts. Return speech and remaining grant/draft revisions.","evaluation_group":"s3-announcement-confirmation-gate","failed_approach":"The attempted repair substitutes elif e[0]=='expire': pass and still violates a regression oracle.","family":"s3-assistive-announcements-confirmation-gate-expiry","id":"FA-21111","implementations":{"attempt":{"sha256":"726cc762d15d9d494479dcd53614ff4c7918d4ef0049925932b525f2bc0be830","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    drafts={}; grants={}; out=[]\n    for e in events:\n        if e[0]=='draft': drafts[e[1]]=[drafts.get(e[1],[0,''])[0]+1,e[2]]\n        elif e[0]=='grant' and e[1] in drafts: grants[e[1]]=drafts[e[1]][0]\n        elif e[0]=='revoke': grants.pop(e[1],None)\n        elif e[0]=='delete': drafts.pop(e[1],None); grants.pop(e[1],None)\n        elif e[0]=='expire': pass\n        elif e[0]=='preview' and e[1] in drafts: out.append('private announcement available')\n        elif e[0]=='speak':\n            if e[1] not in drafts: continue\n            if grants.get(e[1])!=drafts[e[1]][0]: continue\n            out.append(drafts[e[1]][1])\n            grants.pop(e[1],None)\n    return [out,sorted(grants.items()),[[k,v[0]] for k,v in drafts.items()]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['draft','a','secret'*N],['grant','a'],['speak','a'],['speak','a']]\", \"[['draft','a','old'],['grant','a'],['draft','a','new'*N],['speak','a'],['grant','a'],['speak','a']]\", \"[['draft','a','secret'*N],['draft','b','other'],['grant','a'],['grant','b'],['revoke','a'],['speak','b']]\", \"[['draft','a','secret'*N],['grant','a'],['preview','a'],['speak','a']]\", \"[['draft','a','secret'*N],['grant','a'],['delete','a'],['speak','a']]\", \"[['draft','a','secret'*N],['grant','a'],['expire'],['speak','a']]\", \"[['speak','missing']]\", \"[['draft','a','a'*N],['draft','b','b'],['grant','a'],['grant','b'],['speak','a']]\"]\nexpected = {1: [[['secret'], [], [['a', 1]]], [['new'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['a'], [('b', 1)], [['a', 1], ['b', 1]]]], 2: [[['secretsecret'], [], [['a', 1]]], [['newnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aa'], [('b', 1)], [['a', 1], ['b', 1]]]], 3: [[['secretsecretsecret'], [], [['a', 1]]], [['newnewnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aaa'], [('b', 1)], [['a', 1], ['b', 1]]]], 4: [[['secretsecretsecretsecret'], [], [['a', 1]]], [['newnewnewnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecretsecretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aaaa'], [('b', 1)], [['a', 1], ['b', 1]]]], 5: [[['secretsecretsecretsecretsecret'], [], [['a', 1]]], [['newnewnewnewnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecretsecretsecretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aaaaa'], [('b', 1)], [['a', 1], ['b', 1]]]]}[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":"f0624eb6195a48ac3392d03cc38c8c46549fea7233e02d34f84f7cad99e5c673","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    drafts={}; grants={}; out=[]\n    for e in events:\n        if e[0]=='draft': drafts[e[1]]=[drafts.get(e[1],[0,''])[0]+1,e[2]]\n        elif e[0]=='grant' and e[1] in drafts: grants[e[1]]=drafts[e[1]][0]\n        elif e[0]=='revoke': grants.pop(e[1],None)\n        elif e[0]=='delete': drafts.pop(e[1],None); grants.pop(e[1],None)\n        elif e[0]=='expire': grants.clear(); drafts.clear()\n        elif e[0]=='preview' and e[1] in drafts: out.append('private announcement available')\n        elif e[0]=='speak':\n            if e[1] not in drafts: continue\n            if grants.get(e[1])!=drafts[e[1]][0]: continue\n            out.append(drafts[e[1]][1])\n            grants.pop(e[1],None)\n    return [out,sorted(grants.items()),[[k,v[0]] for k,v in drafts.items()]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['draft','a','secret'*N],['grant','a'],['speak','a'],['speak','a']]\", \"[['draft','a','old'],['grant','a'],['draft','a','new'*N],['speak','a'],['grant','a'],['speak','a']]\", \"[['draft','a','secret'*N],['draft','b','other'],['grant','a'],['grant','b'],['revoke','a'],['speak','b']]\", \"[['draft','a','secret'*N],['grant','a'],['preview','a'],['speak','a']]\", \"[['draft','a','secret'*N],['grant','a'],['delete','a'],['speak','a']]\", \"[['draft','a','secret'*N],['grant','a'],['expire'],['speak','a']]\", \"[['speak','missing']]\", \"[['draft','a','a'*N],['draft','b','b'],['grant','a'],['grant','b'],['speak','a']]\"]\nexpected = {1: [[['secret'], [], [['a', 1]]], [['new'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['a'], [('b', 1)], [['a', 1], ['b', 1]]]], 2: [[['secretsecret'], [], [['a', 1]]], [['newnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aa'], [('b', 1)], [['a', 1], ['b', 1]]]], 3: [[['secretsecretsecret'], [], [['a', 1]]], [['newnewnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aaa'], [('b', 1)], [['a', 1], ['b', 1]]]], 4: [[['secretsecretsecretsecret'], [], [['a', 1]]], [['newnewnewnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecretsecretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aaaa'], [('b', 1)], [['a', 1], ['b', 1]]]], 5: [[['secretsecretsecretsecretsecret'], [], [['a', 1]]], [['newnewnewnewnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecretsecretsecretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aaaaa'], [('b', 1)], [['a', 1], ['b', 1]]]]}[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":"65dcfa94088a4b077d65c157fa3bf0ff8d2f6c61aeba16d9fc18dce9ecf8d1da","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    drafts={}; grants={}; out=[]\n    for e in events:\n        if e[0]=='draft': drafts[e[1]]=[drafts.get(e[1],[0,''])[0]+1,e[2]]\n        elif e[0]=='grant' and e[1] in drafts: grants[e[1]]=drafts[e[1]][0]\n        elif e[0]=='revoke': grants.pop(e[1],None)\n        elif e[0]=='delete': drafts.pop(e[1],None); grants.pop(e[1],None)\n        elif e[0]=='expire': grants.clear()\n        elif e[0]=='preview' and e[1] in drafts: out.append('private announcement available')\n        elif e[0]=='speak':\n            if e[1] not in drafts: continue\n            if grants.get(e[1])!=drafts[e[1]][0]: continue\n            out.append(drafts[e[1]][1])\n            grants.pop(e[1],None)\n    return [out,sorted(grants.items()),[[k,v[0]] for k,v in drafts.items()]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['draft','a','secret'*N],['grant','a'],['speak','a'],['speak','a']]\", \"[['draft','a','old'],['grant','a'],['draft','a','new'*N],['speak','a'],['grant','a'],['speak','a']]\", \"[['draft','a','secret'*N],['draft','b','other'],['grant','a'],['grant','b'],['revoke','a'],['speak','b']]\", \"[['draft','a','secret'*N],['grant','a'],['preview','a'],['speak','a']]\", \"[['draft','a','secret'*N],['grant','a'],['delete','a'],['speak','a']]\", \"[['draft','a','secret'*N],['grant','a'],['expire'],['speak','a']]\", \"[['speak','missing']]\", \"[['draft','a','a'*N],['draft','b','b'],['grant','a'],['grant','b'],['speak','a']]\"]\nexpected = {1: [[['secret'], [], [['a', 1]]], [['new'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['a'], [('b', 1)], [['a', 1], ['b', 1]]]], 2: [[['secretsecret'], [], [['a', 1]]], [['newnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aa'], [('b', 1)], [['a', 1], ['b', 1]]]], 3: [[['secretsecretsecret'], [], [['a', 1]]], [['newnewnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aaa'], [('b', 1)], [['a', 1], ['b', 1]]]], 4: [[['secretsecretsecretsecret'], [], [['a', 1]]], [['newnewnewnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecretsecretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aaaa'], [('b', 1)], [['a', 1], ['b', 1]]]], 5: [[['secretsecretsecretsecretsecret'], [], [['a', 1]]], [['newnewnewnewnew'], [], [['a', 2]]], [['other'], [], [['a', 1], ['b', 1]]], [['private announcement available', 'secretsecretsecretsecretsecret'], [], [['a', 1]]], [[], [], []], [[], [], [['a', 1]]], [[], [], []], [['aaaaa'], [('b', 1)], [['a', 1], ['b', 1]]]]}[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-confirmation-gate-expiry","generated_at":"2026-09-29T14:40:25.492978+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: elif e[0]=='expire': grants.clear()","root_cause":"Fault site: elif e[0]=='expire': grants.clear() is implemented as elif e[0]=='expire': grants.clear(); drafts.clear()","sha256":"9b7d8d73a95a04da4d139be38fb42806d9fd95e2261326e0b77bf039c7aa1411","title":"Consent expiry also discards pending private messages · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.292,"exit_code":1,"observations":[{"actual":[["secret"],[],[["a",1]]],"check":"trace-1","expected":[["secret"],[],[["a",1]]],"passed":true},{"actual":[["new"],[],[["a",2]]],"check":"trace-2","expected":[["new"],[],[["a",2]]],"passed":true},{"actual":[["other"],[],[["a",1],["b",1]]],"check":"trace-3","expected":[["other"],[],[["a",1],["b",1]]],"passed":true},{"actual":[["private announcement available","secret"],[],[["a",1]]],"check":"trace-4","expected":[["private announcement available","secret"],[],[["a",1]]],"passed":true},{"actual":[[],[],[]],"check":"trace-5","expected":[[],[],[]],"passed":true},{"actual":[["secret"],[],[["a",1]]],"check":"trace-6","expected":[[],[],[["a",1]]],"passed":false},{"actual":[[],[],[]],"check":"trace-7","expected":[[],[],[]],"passed":true},{"actual":[["a"],[["b",1]],[["a",1],["b",1]]],"check":"trace-8","expected":[["a"],[["b",1]],[["a",1],["b",1]]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"secret\"], [], [[\"a\", 1]]], \"expected\": [[\"secret\"], [], [[\"a\", 1]]], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"new\"], [], [[\"a\", 2]]], \"expected\": [[\"new\"], [], [[\"a\", 2]]], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"other\"], [], [[\"a\", 1], [\"b\", 1]]], \"expected\": [[\"other\"], [], [[\"a\", 1], [\"b\", 1]]], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"private announcement available\", \"secret\"], [], [[\"a\", 1]]], \"expected\": [[\"private announcement available\", \"secret\"], [], [[\"a\", 1]]], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[\"secret\"], [], [[\"a\", 1]]], \"expected\": [[], [], [[\"a\", 1]]], \"passed\": false}, {\"check\": \"trace-7\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[\"a\"], [[\"b\", 1]], [[\"a\", 1], [\"b\", 1]]], \"expected\": [[\"a\"], [[\"b\", 1]], [[\"a\", 1], [\"b\", 1]]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.963,"exit_code":1,"observations":[{"actual":[["secret"],[],[["a",1]]],"check":"trace-1","expected":[["secret"],[],[["a",1]]],"passed":true},{"actual":[["new"],[],[["a",2]]],"check":"trace-2","expected":[["new"],[],[["a",2]]],"passed":true},{"actual":[["other"],[],[["a",1],["b",1]]],"check":"trace-3","expected":[["other"],[],[["a",1],["b",1]]],"passed":true},{"actual":[["private announcement available","secret"],[],[["a",1]]],"check":"trace-4","expected":[["private announcement available","secret"],[],[["a",1]]],"passed":true},{"actual":[[],[],[]],"check":"trace-5","expected":[[],[],[]],"passed":true},{"actual":[[],[],[]],"check":"trace-6","expected":[[],[],[["a",1]]],"passed":false},{"actual":[[],[],[]],"check":"trace-7","expected":[[],[],[]],"passed":true},{"actual":[["a"],[["b",1]],[["a",1],["b",1]]],"check":"trace-8","expected":[["a"],[["b",1]],[["a",1],["b",1]]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"secret\"], [], [[\"a\", 1]]], \"expected\": [[\"secret\"], [], [[\"a\", 1]]], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"new\"], [], [[\"a\", 2]]], \"expected\": [[\"new\"], [], [[\"a\", 2]]], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"other\"], [], [[\"a\", 1], [\"b\", 1]]], \"expected\": [[\"other\"], [], [[\"a\", 1], [\"b\", 1]]], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"private announcement available\", \"secret\"], [], [[\"a\", 1]]], \"expected\": [[\"private announcement available\", \"secret\"], [], [[\"a\", 1]]], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], [], []], \"expected\": [[], [], [[\"a\", 1]]], \"passed\": false}, {\"check\": \"trace-7\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[\"a\"], [[\"b\", 1]], [[\"a\", 1], [\"b\", 1]]], \"expected\": [[\"a\"], [[\"b\", 1]], [[\"a\", 1], [\"b\", 1]]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.621,"exit_code":0,"observations":[{"actual":[["secret"],[],[["a",1]]],"check":"trace-1","expected":[["secret"],[],[["a",1]]],"passed":true},{"actual":[["new"],[],[["a",2]]],"check":"trace-2","expected":[["new"],[],[["a",2]]],"passed":true},{"actual":[["other"],[],[["a",1],["b",1]]],"check":"trace-3","expected":[["other"],[],[["a",1],["b",1]]],"passed":true},{"actual":[["private announcement available","secret"],[],[["a",1]]],"check":"trace-4","expected":[["private announcement available","secret"],[],[["a",1]]],"passed":true},{"actual":[[],[],[]],"check":"trace-5","expected":[[],[],[]],"passed":true},{"actual":[[],[],[["a",1]]],"check":"trace-6","expected":[[],[],[["a",1]]],"passed":true},{"actual":[[],[],[]],"check":"trace-7","expected":[[],[],[]],"passed":true},{"actual":[["a"],[["b",1]],[["a",1],["b",1]]],"check":"trace-8","expected":[["a"],[["b",1]],[["a",1],["b",1]]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"secret\"], [], [[\"a\", 1]]], \"expected\": [[\"secret\"], [], [[\"a\", 1]]], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"new\"], [], [[\"a\", 2]]], \"expected\": [[\"new\"], [], [[\"a\", 2]]], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"other\"], [], [[\"a\", 1], [\"b\", 1]]], \"expected\": [[\"other\"], [], [[\"a\", 1], [\"b\", 1]]], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"private announcement available\", \"secret\"], [], [[\"a\", 1]]], \"expected\": [[\"private announcement available\", \"secret\"], [], [[\"a\", 1]]], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], [], [[\"a\", 1]]], \"expected\": [[], [], [[\"a\", 1]]], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"trace-8\", \"actual\": [[\"a\"], [[\"b\", 1]], [[\"a\", 1], [\"b\", 1]]], \"expected\": [[\"a\"], [[\"b\", 1]], [[\"a\", 1], [\"b\", 1]]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}