{"abstract":"The announcement trace violates the stated speech-cursor contract.","category":"Assistive announcements","checks":7,"contract":"Finite word arrays model announcements. Load copies words and resets cursor and completion. Speak advances one word only while unpaused. Seek clamps to [0,length]. Rewind moves one word. Cancel discards current words. Completion is logged exactly once when a speak reaches end, never for an empty load. Speed changes do not move word cursor. Return spoken words, completion count, cursor and paused flag.","evaluation_group":"s3-announcement-speech-cursor","failed_approach":"The attempted repair substitutes spoken.append(words[cursor]); cursor=len(words) and still violates a regression oracle.","family":"s3-assistive-announcements-speech-cursor-word-step","id":"FA-20431","implementations":{"attempt":{"sha256":"8beaaaa8ec59efdaaa307354dfae807966a2479c15dd57b57391851ef6cb68e6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    words=[]; cursor=0; paused=False; done=False; spoken=[]; completions=0\n    for e in events:\n        if e[0]=='load':\n            words=list(e[1]); cursor=0; done=False\n        elif e[0]=='pause': paused=True\n        elif e[0]=='resume': paused=False\n        elif e[0]=='seek': cursor=max(0,min(e[1],len(words)))\n        elif e[0]=='rewind': cursor=max(0,cursor-1)\n        elif e[0]=='cancel': words=[]; cursor=0; done=True\n        elif e[0]=='speed': pass\n        elif e[0]=='speak':\n            if paused: continue\n            if cursor<len(words):\n                spoken.append(words[cursor]); cursor=len(words)\n            if words and cursor==len(words) and not done:\n                completions+=1; done=True\n    return [spoken,completions,cursor,paused]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['load',['word']*(N+3)],['speak'],['speak'],['rewind'],['speed',2],['speak'],['pause'],['speak'],['resume'],['speak']]\", \"[['load',['x']*(N+1)],['pause'],['speak'],['resume'],['speak'],['load',['a','b']],['speak']]\", \"[['load',['x']*N]]+[['speak']]*(N+2)+[['load',['y']],['speak'],['speak']]\", \"[['load',['x']*(N+2)],['speak'],['speak'],['cancel'],['speak']]\", \"[['load',['x']*N],['seek',N+5],['speak'],['seek',-2]]\", \"[['load',[]],['speak'],['cancel']]\", \"[['load',['x']*(N+4)],['seek',3],['rewind']]\"]\nexpected = {1: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 2: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 3: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 4: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 5: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'x', 'x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]]}[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":"4e0f94e53905c13584cb6feed02d1f6b170e838d0f601f3c910e464d679ce561","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    words=[]; cursor=0; paused=False; done=False; spoken=[]; completions=0\n    for e in events:\n        if e[0]=='load':\n            words=list(e[1]); cursor=0; done=False\n        elif e[0]=='pause': paused=True\n        elif e[0]=='resume': paused=False\n        elif e[0]=='seek': cursor=max(0,min(e[1],len(words)))\n        elif e[0]=='rewind': cursor=max(0,cursor-1)\n        elif e[0]=='cancel': words=[]; cursor=0; done=True\n        elif e[0]=='speed': pass\n        elif e[0]=='speak':\n            if paused: continue\n            if cursor<len(words):\n                spoken.append(words[cursor]); cursor+=2\n            if words and cursor==len(words) and not done:\n                completions+=1; done=True\n    return [spoken,completions,cursor,paused]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['load',['word']*(N+3)],['speak'],['speak'],['rewind'],['speed',2],['speak'],['pause'],['speak'],['resume'],['speak']]\", \"[['load',['x']*(N+1)],['pause'],['speak'],['resume'],['speak'],['load',['a','b']],['speak']]\", \"[['load',['x']*N]]+[['speak']]*(N+2)+[['load',['y']],['speak'],['speak']]\", \"[['load',['x']*(N+2)],['speak'],['speak'],['cancel'],['speak']]\", \"[['load',['x']*N],['seek',N+5],['speak'],['seek',-2]]\", \"[['load',[]],['speak'],['cancel']]\", \"[['load',['x']*(N+4)],['seek',3],['rewind']]\"]\nexpected = {1: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 2: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 3: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 4: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 5: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'x', 'x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]]}[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":"3033cd6d72a701382f4212e09c2b6d46e73043c310da0e486c7c7b29572437c1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    words=[]; cursor=0; paused=False; done=False; spoken=[]; completions=0\n    for e in events:\n        if e[0]=='load':\n            words=list(e[1]); cursor=0; done=False\n        elif e[0]=='pause': paused=True\n        elif e[0]=='resume': paused=False\n        elif e[0]=='seek': cursor=max(0,min(e[1],len(words)))\n        elif e[0]=='rewind': cursor=max(0,cursor-1)\n        elif e[0]=='cancel': words=[]; cursor=0; done=True\n        elif e[0]=='speed': pass\n        elif e[0]=='speak':\n            if paused: continue\n            if cursor<len(words):\n                spoken.append(words[cursor]); cursor+=1\n            if words and cursor==len(words) and not done:\n                completions+=1; done=True\n    return [spoken,completions,cursor,paused]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['load',['word']*(N+3)],['speak'],['speak'],['rewind'],['speed',2],['speak'],['pause'],['speak'],['resume'],['speak']]\", \"[['load',['x']*(N+1)],['pause'],['speak'],['resume'],['speak'],['load',['a','b']],['speak']]\", \"[['load',['x']*N]]+[['speak']]*(N+2)+[['load',['y']],['speak'],['speak']]\", \"[['load',['x']*(N+2)],['speak'],['speak'],['cancel'],['speak']]\", \"[['load',['x']*N],['seek',N+5],['speak'],['seek',-2]]\", \"[['load',[]],['speak'],['cancel']]\", \"[['load',['x']*(N+4)],['seek',3],['rewind']]\"]\nexpected = {1: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 2: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 3: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 4: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]], 5: [[['word', 'word', 'word', 'word'], 0, 3, False], [['x', 'a'], 0, 1, False], [['x', 'x', 'x', 'x', 'x', 'y'], 2, 1, False], [['x', 'x'], 0, 0, False], [[], 1, 0, False], [[], 0, 0, False], [[], 0, 2, False]]}[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-speech-cursor-word-step","generated_at":"2026-09-29T14:40:18.889356+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: spoken.append(words[cursor]); cursor+=1","root_cause":"Fault site: spoken.append(words[cursor]); cursor+=1 is implemented as spoken.append(words[cursor]); cursor+=2","sha256":"3d0829835fa8e07a48a93f807ad1de1c12cb4e8b245656d1b92e4456537200f1","title":"Word completion advances over the following token · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.573,"exit_code":1,"observations":[{"actual":[["word","word"],1,4,false],"check":"trace-1","expected":[["word","word","word","word"],0,3,false],"passed":false},{"actual":[["x","a"],2,2,false],"check":"trace-2","expected":[["x","a"],0,1,false],"passed":false},{"actual":[["x","y"],2,1,false],"check":"trace-3","expected":[["x","y"],2,1,false],"passed":true},{"actual":[["x"],1,0,false],"check":"trace-4","expected":[["x","x"],0,0,false],"passed":false},{"actual":[[],1,0,false],"check":"trace-5","expected":[[],1,0,false],"passed":true},{"actual":[[],0,0,false],"check":"trace-6","expected":[[],0,0,false],"passed":true},{"actual":[[],0,2,false],"check":"trace-7","expected":[[],0,2,false],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"word\", \"word\"], 1, 4, false], \"expected\": [[\"word\", \"word\", \"word\", \"word\"], 0, 3, false], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[\"x\", \"a\"], 2, 2, false], \"expected\": [[\"x\", \"a\"], 0, 1, false], \"passed\": false}, {\"check\": \"trace-3\", \"actual\": [[\"x\", \"y\"], 2, 1, false], \"expected\": [[\"x\", \"y\"], 2, 1, false], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"x\"], 1, 0, false], \"expected\": [[\"x\", \"x\"], 0, 0, false], \"passed\": false}, {\"check\": \"trace-5\", \"actual\": [[], 1, 0, false], \"expected\": [[], 1, 0, false], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], 0, 0, false], \"expected\": [[], 0, 0, false], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 0, 2, false], \"expected\": [[], 0, 2, false], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.013,"exit_code":1,"observations":[{"actual":[["word","word","word"],1,5,false],"check":"trace-1","expected":[["word","word","word","word"],0,3,false],"passed":false},{"actual":[["x","a"],2,2,false],"check":"trace-2","expected":[["x","a"],0,1,false],"passed":false},{"actual":[["x","y"],0,2,false],"check":"trace-3","expected":[["x","y"],2,1,false],"passed":false},{"actual":[["x","x"],0,0,false],"check":"trace-4","expected":[["x","x"],0,0,false],"passed":true},{"actual":[[],1,0,false],"check":"trace-5","expected":[[],1,0,false],"passed":true},{"actual":[[],0,0,false],"check":"trace-6","expected":[[],0,0,false],"passed":true},{"actual":[[],0,2,false],"check":"trace-7","expected":[[],0,2,false],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"word\", \"word\", \"word\"], 1, 5, false], \"expected\": [[\"word\", \"word\", \"word\", \"word\"], 0, 3, false], \"passed\": false}, {\"check\": \"trace-2\", \"actual\": [[\"x\", \"a\"], 2, 2, false], \"expected\": [[\"x\", \"a\"], 0, 1, false], \"passed\": false}, {\"check\": \"trace-3\", \"actual\": [[\"x\", \"y\"], 0, 2, false], \"expected\": [[\"x\", \"y\"], 2, 1, false], \"passed\": false}, {\"check\": \"trace-4\", \"actual\": [[\"x\", \"x\"], 0, 0, false], \"expected\": [[\"x\", \"x\"], 0, 0, false], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[], 1, 0, false], \"expected\": [[], 1, 0, false], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], 0, 0, false], \"expected\": [[], 0, 0, false], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 0, 2, false], \"expected\": [[], 0, 2, false], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.004,"exit_code":0,"observations":[{"actual":[["word","word","word","word"],0,3,false],"check":"trace-1","expected":[["word","word","word","word"],0,3,false],"passed":true},{"actual":[["x","a"],0,1,false],"check":"trace-2","expected":[["x","a"],0,1,false],"passed":true},{"actual":[["x","y"],2,1,false],"check":"trace-3","expected":[["x","y"],2,1,false],"passed":true},{"actual":[["x","x"],0,0,false],"check":"trace-4","expected":[["x","x"],0,0,false],"passed":true},{"actual":[[],1,0,false],"check":"trace-5","expected":[[],1,0,false],"passed":true},{"actual":[[],0,0,false],"check":"trace-6","expected":[[],0,0,false],"passed":true},{"actual":[[],0,2,false],"check":"trace-7","expected":[[],0,2,false],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"word\", \"word\", \"word\", \"word\"], 0, 3, false], \"expected\": [[\"word\", \"word\", \"word\", \"word\"], 0, 3, false], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"x\", \"a\"], 0, 1, false], \"expected\": [[\"x\", \"a\"], 0, 1, false], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"x\", \"y\"], 2, 1, false], \"expected\": [[\"x\", \"y\"], 2, 1, false], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"x\", \"x\"], 0, 0, false], \"expected\": [[\"x\", \"x\"], 0, 0, false], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[], 1, 0, false], \"expected\": [[], 1, 0, false], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[], 0, 0, false], \"expected\": [[], 0, 0, false], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[], 0, 2, false], \"expected\": [[], 0, 2, false], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}