FA-21681 / Assistive announcements / Open access
Readiness flush leaves deferred payloads retained · case 01
The announcement trace violates the stated producer-readiness contract.
ROOT CAUSE
Fault site: pending.clear() else: is implemented as pass else:
VERIFIED REPAIR
Restore the stated transition: pending.clear() else:
Unsuccessful approach: The attempted repair substitutes pending[:]=pending[:1] else: and still violates a regression oracle.
Case 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.
Why this case matters
Deterministic controlled model of assistive announcement delivery.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(events):
state='failed'; generation=0; pending=[]; out=[]
for e in events:
if e[0] in ('start','retry'):
generation+=1; state='booting'; pending=[]
elif e[0]=='stop': state='failed'; generation+=1; pending=[]
elif e[0]=='publish':
if state=='booting': pending.append(e[1])
elif state=='ready': out.append(e[1])
elif e[0] in ('ready','fail'):
if e[1]!=generation: continue
if state!='booting': continue
if e[0]=='ready':
state='ready'
out.extend(pending)
pass
else:
state='failed'; pending.clear(); out.append('unavailable')
return [out,state,generation,pending]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = ["[['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]]", '[]']
expected = {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]
for i, expression in enumerate(fixtures):
check("trace-"+str(i+1), solve(eval(expression)), expected[i])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| trace-1 | [['first', 'second', 'third'], 'ready', 1, ['first', 'second']] | [['first', 'second', 'third'], 'ready', 1, []] | Failed |
| trace-2 | [[], 'booting', 2, ['new']] | [[], 'booting', 2, ['new']] | Passed |
| trace-3 | [['unavailable'], 'failed', 1, []] | [['unavailable'], 'failed', 1, []] | Passed |
| trace-4 | [[], 'failed', 2, []] | [[], 'failed', 2, []] | Passed |
| trace-5 | [['unavailable', 'retry'], 'ready', 2, ['retry']] | [['unavailable', 'retry'], 'ready', 2, []] | Failed |
| trace-6 | [[], 'failed', 0, []] | [[], 'failed', 0, []] | Passed |
| trace-7 | [[], 'failed', 0, []] | [[], 'failed', 0, []] | Passed |
SHA-256 / 327e4bdd4c188f50a1c37ce1dd8c4a8de2c0a429d1362e394c3351d347d254d6
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(events):
state='failed'; generation=0; pending=[]; out=[]
for e in events:
if e[0] in ('start','retry'):
generation+=1; state='booting'; pending=[]
elif e[0]=='stop': state='failed'; generation+=1; pending=[]
elif e[0]=='publish':
if state=='booting': pending.append(e[1])
elif state=='ready': out.append(e[1])
elif e[0] in ('ready','fail'):
if e[1]!=generation: continue
if state!='booting': continue
if e[0]=='ready':
state='ready'
out.extend(pending)
pending[:]=pending[:1]
else:
state='failed'; pending.clear(); out.append('unavailable')
return [out,state,generation,pending]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = ["[['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]]", '[]']
expected = {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]
for i, expression in enumerate(fixtures):
check("trace-"+str(i+1), solve(eval(expression)), expected[i])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| trace-1 | [['first', 'second', 'third'], 'ready', 1, ['first']] | [['first', 'second', 'third'], 'ready', 1, []] | Failed |
| trace-2 | [[], 'booting', 2, ['new']] | [[], 'booting', 2, ['new']] | Passed |
| trace-3 | [['unavailable'], 'failed', 1, []] | [['unavailable'], 'failed', 1, []] | Passed |
| trace-4 | [[], 'failed', 2, []] | [[], 'failed', 2, []] | Passed |
| trace-5 | [['unavailable', 'retry'], 'ready', 2, ['retry']] | [['unavailable', 'retry'], 'ready', 2, []] | Failed |
| trace-6 | [[], 'failed', 0, []] | [[], 'failed', 0, []] | Passed |
| trace-7 | [[], 'failed', 0, []] | [[], 'failed', 0, []] | Passed |
SHA-256 / d72ad9c7709ecf19e21c6370914849d06e56b9fdeb5cba045b29ee731a542cef
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(events):
state='failed'; generation=0; pending=[]; out=[]
for e in events:
if e[0] in ('start','retry'):
generation+=1; state='booting'; pending=[]
elif e[0]=='stop': state='failed'; generation+=1; pending=[]
elif e[0]=='publish':
if state=='booting': pending.append(e[1])
elif state=='ready': out.append(e[1])
elif e[0] in ('ready','fail'):
if e[1]!=generation: continue
if state!='booting': continue
if e[0]=='ready':
state='ready'
out.extend(pending)
pending.clear()
else:
state='failed'; pending.clear(); out.append('unavailable')
return [out,state,generation,pending]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = ["[['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]]", '[]']
expected = {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]
for i, expression in enumerate(fixtures):
check("trace-"+str(i+1), solve(eval(expression)), expected[i])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| trace-1 | [['first', 'second', 'third'], 'ready', 1, []] | [['first', 'second', 'third'], 'ready', 1, []] | Passed |
| trace-2 | [[], 'booting', 2, ['new']] | [[], 'booting', 2, ['new']] | Passed |
| trace-3 | [['unavailable'], 'failed', 1, []] | [['unavailable'], 'failed', 1, []] | Passed |
| trace-4 | [[], 'failed', 2, []] | [[], 'failed', 2, []] | Passed |
| trace-5 | [['unavailable', 'retry'], 'ready', 2, []] | [['unavailable', 'retry'], 'ready', 2, []] | Passed |
| trace-6 | [[], 'failed', 0, []] | [[], 'failed', 0, []] | Passed |
| trace-7 | [[], 'failed', 0, []] | [[], 'failed', 0, []] | Passed |
SHA-256 / f52c75e4328c7260e45f1f37a25998915ef45e21adbd89a998ab5a99263e9daa
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:40:31.195146+00:00.
Case digest / f79b13b8aa270f1abd0f645b54f1783fc8492ff1fba7671c193006ec5712497d