{"abstract":"The announcement trace violates the stated producer-readiness contract.","category":"Assistive announcements","checks":7,"contract":"Announcement producer has booting/ready/failed state and generation. Start increments generation, enters booting, clears deferred messages. Publish during booting queues; ready publishes directly; failed drops. Ready callback must match generation, drains queued messages FIFO, and is ignored after failure. Fail matching generation clears deferred and announces unavailable once. Retry is a start. Stop fails silently and advances generation. Report speech,state,generation,deferred.","evaluation_group":"s3-announcement-producer-readiness","failed_approach":"The attempted repair substitutes state='failed'\n            out.extend and still violates a regression oracle.","family":"s3-assistive-announcements-producer-readiness-ready-state","id":"FA-21671","implementations":{"attempt":{"sha256":"2ef93f04bc926fc65d5f91ecf5df77cbaa25afac34e804be492631b7bf0e218e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    state='failed'; generation=0; pending=[]; out=[]\n    for e in events:\n        if e[0] in ('start','retry'):\n            generation+=1; state='booting'; pending=[]\n        elif e[0]=='stop': state='failed'; generation+=1; pending=[]\n        elif e[0]=='publish':\n            if state=='booting': pending.append(e[1])\n            elif state=='ready': out.append(e[1])\n        elif e[0] in ('ready','fail'):\n            if e[1]!=generation: continue\n            if state!='booting': continue\n            if e[0]=='ready':\n                state='failed'\n                out.extend(pending)\n                pending.clear()\n            else:\n                state='failed'; pending.clear(); out.append('unavailable')\n    return [out,state,generation,pending]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['start'],['publish','first'*N],['publish','second'],['ready',1],['publish','third']]\", \"[['start'],['publish','old'],['retry'],['publish','new'*N],['ready',1]]\", \"[['start'],['publish','deferred'*N],['fail',1],['ready',1],['publish','should-drop']]\", \"[['start'],['publish','deferred'*N],['stop'],['ready',1]]\", \"[['start'],['fail',1],['fail',1],['retry'],['publish','retry'*N],['ready',2]]\", \"[['publish','dropped'*N],['ready',0]]\", '[]']\nexpected = {1: [[['first', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['new']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 2: [[['firstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 3: [[['firstfirstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnewnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 4: [[['firstfirstfirstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnewnewnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretryretryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 5: [[['firstfirstfirstfirstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnewnewnewnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretryretryretryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 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":"36d14fdf0c35db53f35abd339c1e7e50976148a53ee53e90ea3195b41f4aa460","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    state='failed'; generation=0; pending=[]; out=[]\n    for e in events:\n        if e[0] in ('start','retry'):\n            generation+=1; state='booting'; pending=[]\n        elif e[0]=='stop': state='failed'; generation+=1; pending=[]\n        elif e[0]=='publish':\n            if state=='booting': pending.append(e[1])\n            elif state=='ready': out.append(e[1])\n        elif e[0] in ('ready','fail'):\n            if e[1]!=generation: continue\n            if state!='booting': continue\n            if e[0]=='ready':\n                state='booting'\n                out.extend(pending)\n                pending.clear()\n            else:\n                state='failed'; pending.clear(); out.append('unavailable')\n    return [out,state,generation,pending]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['start'],['publish','first'*N],['publish','second'],['ready',1],['publish','third']]\", \"[['start'],['publish','old'],['retry'],['publish','new'*N],['ready',1]]\", \"[['start'],['publish','deferred'*N],['fail',1],['ready',1],['publish','should-drop']]\", \"[['start'],['publish','deferred'*N],['stop'],['ready',1]]\", \"[['start'],['fail',1],['fail',1],['retry'],['publish','retry'*N],['ready',2]]\", \"[['publish','dropped'*N],['ready',0]]\", '[]']\nexpected = {1: [[['first', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['new']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 2: [[['firstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 3: [[['firstfirstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnewnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 4: [[['firstfirstfirstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnewnewnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretryretryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 5: [[['firstfirstfirstfirstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnewnewnewnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretryretryretryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 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":"f52c75e4328c7260e45f1f37a25998915ef45e21adbd89a998ab5a99263e9daa","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    state='failed'; generation=0; pending=[]; out=[]\n    for e in events:\n        if e[0] in ('start','retry'):\n            generation+=1; state='booting'; pending=[]\n        elif e[0]=='stop': state='failed'; generation+=1; pending=[]\n        elif e[0]=='publish':\n            if state=='booting': pending.append(e[1])\n            elif state=='ready': out.append(e[1])\n        elif e[0] in ('ready','fail'):\n            if e[1]!=generation: continue\n            if state!='booting': continue\n            if e[0]=='ready':\n                state='ready'\n                out.extend(pending)\n                pending.clear()\n            else:\n                state='failed'; pending.clear(); out.append('unavailable')\n    return [out,state,generation,pending]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['start'],['publish','first'*N],['publish','second'],['ready',1],['publish','third']]\", \"[['start'],['publish','old'],['retry'],['publish','new'*N],['ready',1]]\", \"[['start'],['publish','deferred'*N],['fail',1],['ready',1],['publish','should-drop']]\", \"[['start'],['publish','deferred'*N],['stop'],['ready',1]]\", \"[['start'],['fail',1],['fail',1],['retry'],['publish','retry'*N],['ready',2]]\", \"[['publish','dropped'*N],['ready',0]]\", '[]']\nexpected = {1: [[['first', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['new']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 2: [[['firstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 3: [[['firstfirstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnewnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 4: [[['firstfirstfirstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnewnewnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretryretryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 0, []]], 5: [[['firstfirstfirstfirstfirst', 'second', 'third'], 'ready', 1, []], [[], 'booting', 2, ['newnewnewnewnew']], [['unavailable'], 'failed', 1, []], [[], 'failed', 2, []], [['unavailable', 'retryretryretryretryretry'], 'ready', 2, []], [[], 'failed', 0, []], [[], 'failed', 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-producer-readiness-ready-state","generated_at":"2026-09-29T14:40:31.109607+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: state='ready'\n            out.extend","root_cause":"Fault site: state='ready'\n            out.extend is implemented as state='booting'\n            out.extend","sha256":"128a6ca41553f20f20b4b058c2f3f4e30ebe747df90218bd1c12ca0aed24cd0b","title":"Ready callback drains but leaves producer booting · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.859,"exit_code":1,"observations":[{"actual":[["first","second"],"failed",1,[]],"check":"trace-1","expected":[["first","second","third"],"ready",1,[]],"passed":false},{"actual":[[],"booting",2,["new"]],"check":"trace-2","expected":[[],"booting",2,["new"]],"passed":true},{"actual":[["unavailable"],"failed",1,[]],"check":"trace-3","expected":[["unavailable"],"failed",1,[]],"passed":true},{"actual":[[],"failed",2,[]],"check":"trace-4","expected":[[],"failed",2,[]],"passed":true},{"actual":[["unavailable","retry"],"failed",2,[]],"check":"trace-5","expected":[["unavailable","retry"],"ready",2,[]],"passed":false},{"actual":[[],"failed",0,[]],"check":"trace-6","expected":[[],"failed",0,[]],"passed":true},{"actual":[[],"failed",0,[]],"check":"trace-7","expected":[[],"failed",0,[]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"first\", \"second\"], \"failed\", 1, []], \"expected\": [[\"first\", \"second\", \"third\"], \"ready\", 1, []], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[], \"booting\", 2, [\"new\"]], \"expected\": [[], \"booting\", 2, [\"new\"]], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"unavailable\"], \"failed\", 1, []], \"expected\": [[\"unavailable\"], \"failed\", 1, []], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[], \"failed\", 2, []], \"expected\": [[], \"failed\", 2, []], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"unavailable\", \"retry\"], \"failed\", 2, []], \"expected\": [[\"unavailable\", \"retry\"], \"ready\", 2, []], \"passed\": false}, {\"check\": \"trace-6\", \"actual\": [[], \"failed\", 0, []], \"expected\": [[], \"failed\", 0, []], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], \"failed\", 0, []], \"expected\": [[], \"failed\", 0, []], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.692,"exit_code":1,"observations":[{"actual":[["first","second"],"booting",1,["third"]],"check":"trace-1","expected":[["first","second","third"],"ready",1,[]],"passed":false},{"actual":[[],"booting",2,["new"]],"check":"trace-2","expected":[[],"booting",2,["new"]],"passed":true},{"actual":[["unavailable"],"failed",1,[]],"check":"trace-3","expected":[["unavailable"],"failed",1,[]],"passed":true},{"actual":[[],"failed",2,[]],"check":"trace-4","expected":[[],"failed",2,[]],"passed":true},{"actual":[["unavailable","retry"],"booting",2,[]],"check":"trace-5","expected":[["unavailable","retry"],"ready",2,[]],"passed":false},{"actual":[[],"failed",0,[]],"check":"trace-6","expected":[[],"failed",0,[]],"passed":true},{"actual":[[],"failed",0,[]],"check":"trace-7","expected":[[],"failed",0,[]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"first\", \"second\"], \"booting\", 1, [\"third\"]], \"expected\": [[\"first\", \"second\", \"third\"], \"ready\", 1, []], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[], \"booting\", 2, [\"new\"]], \"expected\": [[], \"booting\", 2, [\"new\"]], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"unavailable\"], \"failed\", 1, []], \"expected\": [[\"unavailable\"], \"failed\", 1, []], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[], \"failed\", 2, []], \"expected\": [[], \"failed\", 2, []], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"unavailable\", \"retry\"], \"booting\", 2, []], \"expected\": [[\"unavailable\", \"retry\"], \"ready\", 2, []], \"passed\": false}, {\"check\": \"trace-6\", \"actual\": [[], \"failed\", 0, []], \"expected\": [[], \"failed\", 0, []], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], \"failed\", 0, []], \"expected\": [[], \"failed\", 0, []], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.567,"exit_code":0,"observations":[{"actual":[["first","second","third"],"ready",1,[]],"check":"trace-1","expected":[["first","second","third"],"ready",1,[]],"passed":true},{"actual":[[],"booting",2,["new"]],"check":"trace-2","expected":[[],"booting",2,["new"]],"passed":true},{"actual":[["unavailable"],"failed",1,[]],"check":"trace-3","expected":[["unavailable"],"failed",1,[]],"passed":true},{"actual":[[],"failed",2,[]],"check":"trace-4","expected":[[],"failed",2,[]],"passed":true},{"actual":[["unavailable","retry"],"ready",2,[]],"check":"trace-5","expected":[["unavailable","retry"],"ready",2,[]],"passed":true},{"actual":[[],"failed",0,[]],"check":"trace-6","expected":[[],"failed",0,[]],"passed":true},{"actual":[[],"failed",0,[]],"check":"trace-7","expected":[[],"failed",0,[]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"first\", \"second\", \"third\"], \"ready\", 1, []], \"expected\": [[\"first\", \"second\", \"third\"], \"ready\", 1, []], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[], \"booting\", 2, [\"new\"]], \"expected\": [[], \"booting\", 2, [\"new\"]], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"unavailable\"], \"failed\", 1, []], \"expected\": [[\"unavailable\"], \"failed\", 1, []], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[], \"failed\", 2, []], \"expected\": [[], \"failed\", 2, []], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"unavailable\", \"retry\"], \"ready\", 2, []], \"expected\": [[\"unavailable\", \"retry\"], \"ready\", 2, []], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], \"failed\", 0, []], \"expected\": [[], \"failed\", 0, []], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], \"failed\", 0, []], \"expected\": [[], \"failed\", 0, []], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}