{"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 words=[]; done=True and still violates a regression oracle.","family":"s3-assistive-announcements-speech-cursor-cancel","id":"FA-20416","implementations":{"attempt":{"sha256":"d3ffb6adb45e904e9c8cf7ecc924612a9349ec033bafa30406873a53e5624a6e","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=[]; 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"},"broken":{"sha256":"6b6dddeabae24c2d54f3f0ad347583b34d6fe9f4f7928f8c9e7592ecf23fd97e","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': 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"},"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-cancel","generated_at":"2026-09-29T14:40:18.764719+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: words=[]; cursor=0; done=True","root_cause":"Fault site: words=[]; cursor=0; done=True is implemented as cursor=0; done=True","sha256":"721e6d0cae976f17186fe34c3db14b382b660ffa80a8bbb2351c5773533b018c","title":"Cancel leaves readable words in the engine buffer · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":45.66,"exit_code":1,"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,2,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\", \"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, 2, 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":42.004,"exit_code":1,"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","x"],0,1,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\", \"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\", \"x\"], 0, 1, 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"},"fixed":{"elapsed_ms":42.941,"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"}