{"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 generation+=2; state='booting'; pending=[] and still violates a regression oracle.","family":"s3-assistive-announcements-producer-readiness-start-generation","id":"FA-21641","implementations":{"attempt":{"sha256":"784ee4f14e49ef8590443e8bf15361bed4ec599018baa0fbf50dc951ab2f81a7","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+=2; 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"},"broken":{"sha256":"2bbe480324490ba0bd7bdc05bca076400a99018ef786c1fb28f2cb789835b2e1","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"},"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-start-generation","generated_at":"2026-09-29T14:40:30.838522+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: generation+=1; state='booting'; pending=[]","root_cause":"Fault site: generation+=1; state='booting'; pending=[] is implemented as generation=1; state='booting'; pending=[]","sha256":"bdfad93ff1bee560c223ea74d153a94955e9721e80759cd65f0442ffa9e98271","title":"Restarted producer accepts old readiness callbacks · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.403,"exit_code":1,"observations":[{"actual":[[],"booting",2,["first","second","third"]],"check":"trace-1","expected":[["first","second","third"],"ready",1,[]],"passed":false},{"actual":[[],"booting",4,["new"]],"check":"trace-2","expected":[[],"booting",2,["new"]],"passed":false},{"actual":[[],"booting",2,["deferred","should-drop"]],"check":"trace-3","expected":[["unavailable"],"failed",1,[]],"passed":false},{"actual":[[],"failed",3,[]],"check":"trace-4","expected":[[],"failed",2,[]],"passed":false},{"actual":[[],"booting",4,["retry"]],"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\": [[], \"booting\", 2, [\"first\", \"second\", \"third\"]], \"expected\": [[\"first\", \"second\", \"third\"], \"ready\", 1, []], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[], \"booting\", 4, [\"new\"]], \"expected\": [[], \"booting\", 2, [\"new\"]], \"passed\": false}, {\"check\": \"trace-3\", \"actual\": [[], \"booting\", 2, [\"deferred\", \"should-drop\"]], \"expected\": [[\"unavailable\"], \"failed\", 1, []], \"passed\": false}, {\"check\": \"trace-4\", \"actual\": [[], \"failed\", 3, []], \"expected\": [[], \"failed\", 2, []], \"passed\": false}, {\"check\": \"trace-5\", \"actual\": [[], \"booting\", 4, [\"retry\"]], \"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":43.078,"exit_code":1,"observations":[{"actual":[["first","second","third"],"ready",1,[]],"check":"trace-1","expected":[["first","second","third"],"ready",1,[]],"passed":true},{"actual":[["new"],"ready",1,[]],"check":"trace-2","expected":[[],"booting",2,["new"]],"passed":false},{"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"],"booting",1,["retry"]],"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\", \"third\"], \"ready\", 1, []], \"expected\": [[\"first\", \"second\", \"third\"], \"ready\", 1, []], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"new\"], \"ready\", 1, []], \"expected\": [[], \"booting\", 2, [\"new\"]], \"passed\": false}, {\"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\"], \"booting\", 1, [\"retry\"]], \"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":46.197,"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"}