{"abstract":"The announcement trace violates the stated voice-negotiation contract.","category":"Assistive announcements","checks":7,"contract":"Voice inventory rows are [id,language,local,quality,features]. Request [language,offline,required-features,preferred-id]. Selection excludes unavailable or missing-feature voices, honors exact preferred only among eligible, then ranks exact language before base-language before en fallback, local before remote, higher quality, then lexical ID. Add replaces same ID; remove marks unavailable; enable restores it. Return selected IDs or None, inventory IDs and disabled IDs.","evaluation_group":"s3-announcement-voice-negotiation","failed_approach":"The attempted repair substitutes elif e[0]=='remove': disabled.update(voices) and still violates a regression oracle.","family":"s3-assistive-announcements-voice-negotiation-disable","id":"FA-21546","implementations":{"attempt":{"sha256":"ae2e96df13638aa72f78cd9733232ae1947c920900f7498d5059d763355cdf95","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    voices={}; disabled=set(); out=[]\n    for e in events:\n        if e[0]=='add': voices[e[1]]=e[1:]\n        elif e[0]=='remove': disabled.update(voices)\n        elif e[0]=='enable': disabled.discard(e[1])\n        elif e[0]=='request':\n            lang,offline,required,preferred=e[1:]\n            rows=[v for k,v in voices.items() if k not in disabled]\n            rows=[v for v in rows if not offline or v[2]]\n            rows=[v for v in rows if set(required)<=set(v[4])]\n            rows=[v for v in rows if v[1]==lang or v[1].split('-')[0]==lang.split('-')[0] or v[1]=='en']\n            if not rows: out.append(None); continue\n            def rank(v):\n                language_rank=0 if v[1]==lang else (1 if v[1].split('-')[0]==lang.split('-')[0] else 2)\n                return (v[0]!=preferred,language_rank,not v[2],-v[3],v[0])\n            out.append(min(rows,key=rank)[0])\n    return [out,list(voices),sorted(disabled)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['add','a','en',True,1,['marks']],['add','b','en',True,N+5,['marks','spell']],['request','en',True,['marks'],None]]\", \"[['add','a','fr',False,9,['marks']],['add','b','fr',True,1,['marks']],['request','fr',False,[],None],['request','fr',True,[],None],['request','fr',False,[],'a']]\", \"[['add','z','fr-CA',True,1,[]],['add','a','fr',True,9,[]],['add','e','en',True,1,[]],['request','fr-CA',False,[],None],['request','fr-BE',False,[],None],['request','fr-CA',False,[],'e']]\", \"[['add','a','en',True,9,['marks']],['add','b','en',True,2,['marks','spell','pause']],['request','en',True,['marks','spell'],None],['add','a','en',True,10,['marks','spell']],['request','en',True,['spell'],None]]\", \"[['add','a','en',True,N+5,[]],['add','b','en',True,1,[]],['remove','a'],['request','en',False,[],None],['remove','b'],['enable','b'],['request','en',False,[],None]]\", \"[['add','remote','ja',False,N,[]],['request','ja',False,[],None],['request','ja',True,[],None],['request','de',False,[],'remote']]\", \"[['request','en',True,[],None]]\"]\nexpected = {1: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 2: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 3: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 4: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 5: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]]}[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":"6762a0ce4ce0015969a59b807f0bbebd288ab8b05d2e640598de921e7c412705","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    voices={}; disabled=set(); out=[]\n    for e in events:\n        if e[0]=='add': voices[e[1]]=e[1:]\n        elif e[0]=='remove': pass\n        elif e[0]=='enable': disabled.discard(e[1])\n        elif e[0]=='request':\n            lang,offline,required,preferred=e[1:]\n            rows=[v for k,v in voices.items() if k not in disabled]\n            rows=[v for v in rows if not offline or v[2]]\n            rows=[v for v in rows if set(required)<=set(v[4])]\n            rows=[v for v in rows if v[1]==lang or v[1].split('-')[0]==lang.split('-')[0] or v[1]=='en']\n            if not rows: out.append(None); continue\n            def rank(v):\n                language_rank=0 if v[1]==lang else (1 if v[1].split('-')[0]==lang.split('-')[0] else 2)\n                return (v[0]!=preferred,language_rank,not v[2],-v[3],v[0])\n            out.append(min(rows,key=rank)[0])\n    return [out,list(voices),sorted(disabled)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['add','a','en',True,1,['marks']],['add','b','en',True,N+5,['marks','spell']],['request','en',True,['marks'],None]]\", \"[['add','a','fr',False,9,['marks']],['add','b','fr',True,1,['marks']],['request','fr',False,[],None],['request','fr',True,[],None],['request','fr',False,[],'a']]\", \"[['add','z','fr-CA',True,1,[]],['add','a','fr',True,9,[]],['add','e','en',True,1,[]],['request','fr-CA',False,[],None],['request','fr-BE',False,[],None],['request','fr-CA',False,[],'e']]\", \"[['add','a','en',True,9,['marks']],['add','b','en',True,2,['marks','spell','pause']],['request','en',True,['marks','spell'],None],['add','a','en',True,10,['marks','spell']],['request','en',True,['spell'],None]]\", \"[['add','a','en',True,N+5,[]],['add','b','en',True,1,[]],['remove','a'],['request','en',False,[],None],['remove','b'],['enable','b'],['request','en',False,[],None]]\", \"[['add','remote','ja',False,N,[]],['request','ja',False,[],None],['request','ja',True,[],None],['request','de',False,[],'remote']]\", \"[['request','en',True,[],None]]\"]\nexpected = {1: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 2: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 3: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 4: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 5: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]]}[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":"106057a0e719a31ce229386466b4b3f9f445e738eecdb6b0f6987d30a031c506","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    voices={}; disabled=set(); out=[]\n    for e in events:\n        if e[0]=='add': voices[e[1]]=e[1:]\n        elif e[0]=='remove': disabled.add(e[1])\n        elif e[0]=='enable': disabled.discard(e[1])\n        elif e[0]=='request':\n            lang,offline,required,preferred=e[1:]\n            rows=[v for k,v in voices.items() if k not in disabled]\n            rows=[v for v in rows if not offline or v[2]]\n            rows=[v for v in rows if set(required)<=set(v[4])]\n            rows=[v for v in rows if v[1]==lang or v[1].split('-')[0]==lang.split('-')[0] or v[1]=='en']\n            if not rows: out.append(None); continue\n            def rank(v):\n                language_rank=0 if v[1]==lang else (1 if v[1].split('-')[0]==lang.split('-')[0] else 2)\n                return (v[0]!=preferred,language_rank,not v[2],-v[3],v[0])\n            out.append(min(rows,key=rank)[0])\n    return [out,list(voices),sorted(disabled)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [\"[['add','a','en',True,1,['marks']],['add','b','en',True,N+5,['marks','spell']],['request','en',True,['marks'],None]]\", \"[['add','a','fr',False,9,['marks']],['add','b','fr',True,1,['marks']],['request','fr',False,[],None],['request','fr',True,[],None],['request','fr',False,[],'a']]\", \"[['add','z','fr-CA',True,1,[]],['add','a','fr',True,9,[]],['add','e','en',True,1,[]],['request','fr-CA',False,[],None],['request','fr-BE',False,[],None],['request','fr-CA',False,[],'e']]\", \"[['add','a','en',True,9,['marks']],['add','b','en',True,2,['marks','spell','pause']],['request','en',True,['marks','spell'],None],['add','a','en',True,10,['marks','spell']],['request','en',True,['spell'],None]]\", \"[['add','a','en',True,N+5,[]],['add','b','en',True,1,[]],['remove','a'],['request','en',False,[],None],['remove','b'],['enable','b'],['request','en',False,[],None]]\", \"[['add','remote','ja',False,N,[]],['request','ja',False,[],None],['request','ja',True,[],None],['request','de',False,[],'remote']]\", \"[['request','en',True,[],None]]\"]\nexpected = {1: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 2: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 3: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 4: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]], 5: [[['b'], ['a', 'b'], []], [['b', 'b', 'a'], ['a', 'b'], []], [['z', 'a', 'e'], ['z', 'a', 'e'], []], [['b', 'a'], ['a', 'b'], []], [['b', 'b'], ['a', 'b'], ['a']], [['remote', None, None], ['remote'], []], [[None], [], []]]}[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-voice-negotiation-disable","generated_at":"2026-09-29T14:40:29.839773+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: elif e[0]=='remove': disabled.add(e[1])","root_cause":"Fault site: elif e[0]=='remove': disabled.add(e[1]) is implemented as elif e[0]=='remove': pass","sha256":"97a7dfb6547936d2a9acf6d1c0756f3ef9c17e660b4f11ad23771370f02383e9","title":"Unavailable voice remains selectable · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.83,"exit_code":1,"observations":[{"actual":[["b"],["a","b"],[]],"check":"trace-1","expected":[["b"],["a","b"],[]],"passed":true},{"actual":[["b","b","a"],["a","b"],[]],"check":"trace-2","expected":[["b","b","a"],["a","b"],[]],"passed":true},{"actual":[["z","a","e"],["z","a","e"],[]],"check":"trace-3","expected":[["z","a","e"],["z","a","e"],[]],"passed":true},{"actual":[["b","a"],["a","b"],[]],"check":"trace-4","expected":[["b","a"],["a","b"],[]],"passed":true},{"actual":[[null,"b"],["a","b"],["a"]],"check":"trace-5","expected":[["b","b"],["a","b"],["a"]],"passed":false},{"actual":[["remote",null,null],["remote"],[]],"check":"trace-6","expected":[["remote",null,null],["remote"],[]],"passed":true},{"actual":[[null],[],[]],"check":"trace-7","expected":[[null],[],[]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"b\"], [\"a\", \"b\"], []], \"expected\": [[\"b\"], [\"a\", \"b\"], []], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"b\", \"b\", \"a\"], [\"a\", \"b\"], []], \"expected\": [[\"b\", \"b\", \"a\"], [\"a\", \"b\"], []], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"z\", \"a\", \"e\"], [\"z\", \"a\", \"e\"], []], \"expected\": [[\"z\", \"a\", \"e\"], [\"z\", \"a\", \"e\"], []], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"b\", \"a\"], [\"a\", \"b\"], []], \"expected\": [[\"b\", \"a\"], [\"a\", \"b\"], []], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[null, \"b\"], [\"a\", \"b\"], [\"a\"]], \"expected\": [[\"b\", \"b\"], [\"a\", \"b\"], [\"a\"]], \"passed\": false}, {\"check\": \"trace-6\", \"actual\": [[\"remote\", null, null], [\"remote\"], []], \"expected\": [[\"remote\", null, null], [\"remote\"], []], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[null], [], []], \"expected\": [[null], [], []], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.043,"exit_code":1,"observations":[{"actual":[["b"],["a","b"],[]],"check":"trace-1","expected":[["b"],["a","b"],[]],"passed":true},{"actual":[["b","b","a"],["a","b"],[]],"check":"trace-2","expected":[["b","b","a"],["a","b"],[]],"passed":true},{"actual":[["z","a","e"],["z","a","e"],[]],"check":"trace-3","expected":[["z","a","e"],["z","a","e"],[]],"passed":true},{"actual":[["b","a"],["a","b"],[]],"check":"trace-4","expected":[["b","a"],["a","b"],[]],"passed":true},{"actual":[["a","a"],["a","b"],[]],"check":"trace-5","expected":[["b","b"],["a","b"],["a"]],"passed":false},{"actual":[["remote",null,null],["remote"],[]],"check":"trace-6","expected":[["remote",null,null],["remote"],[]],"passed":true},{"actual":[[null],[],[]],"check":"trace-7","expected":[[null],[],[]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"b\"], [\"a\", \"b\"], []], \"expected\": [[\"b\"], [\"a\", \"b\"], []], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"b\", \"b\", \"a\"], [\"a\", \"b\"], []], \"expected\": [[\"b\", \"b\", \"a\"], [\"a\", \"b\"], []], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"z\", \"a\", \"e\"], [\"z\", \"a\", \"e\"], []], \"expected\": [[\"z\", \"a\", \"e\"], [\"z\", \"a\", \"e\"], []], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"b\", \"a\"], [\"a\", \"b\"], []], \"expected\": [[\"b\", \"a\"], [\"a\", \"b\"], []], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"a\", \"a\"], [\"a\", \"b\"], []], \"expected\": [[\"b\", \"b\"], [\"a\", \"b\"], [\"a\"]], \"passed\": false}, {\"check\": \"trace-6\", \"actual\": [[\"remote\", null, null], [\"remote\"], []], \"expected\": [[\"remote\", null, null], [\"remote\"], []], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[null], [], []], \"expected\": [[null], [], []], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.803,"exit_code":0,"observations":[{"actual":[["b"],["a","b"],[]],"check":"trace-1","expected":[["b"],["a","b"],[]],"passed":true},{"actual":[["b","b","a"],["a","b"],[]],"check":"trace-2","expected":[["b","b","a"],["a","b"],[]],"passed":true},{"actual":[["z","a","e"],["z","a","e"],[]],"check":"trace-3","expected":[["z","a","e"],["z","a","e"],[]],"passed":true},{"actual":[["b","a"],["a","b"],[]],"check":"trace-4","expected":[["b","a"],["a","b"],[]],"passed":true},{"actual":[["b","b"],["a","b"],["a"]],"check":"trace-5","expected":[["b","b"],["a","b"],["a"]],"passed":true},{"actual":[["remote",null,null],["remote"],[]],"check":"trace-6","expected":[["remote",null,null],["remote"],[]],"passed":true},{"actual":[[null],[],[]],"check":"trace-7","expected":[[null],[],[]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"trace-1\", \"actual\": [[\"b\"], [\"a\", \"b\"], []], \"expected\": [[\"b\"], [\"a\", \"b\"], []], \"passed\": true}, {\"check\": \"trace-2\", \"actual\": [[\"b\", \"b\", \"a\"], [\"a\", \"b\"], []], \"expected\": [[\"b\", \"b\", \"a\"], [\"a\", \"b\"], []], \"passed\": true}, {\"check\": \"trace-3\", \"actual\": [[\"z\", \"a\", \"e\"], [\"z\", \"a\", \"e\"], []], \"expected\": [[\"z\", \"a\", \"e\"], [\"z\", \"a\", \"e\"], []], \"passed\": true}, {\"check\": \"trace-4\", \"actual\": [[\"b\", \"a\"], [\"a\", \"b\"], []], \"expected\": [[\"b\", \"a\"], [\"a\", \"b\"], []], \"passed\": true}, {\"check\": \"trace-5\", \"actual\": [[\"b\", \"b\"], [\"a\", \"b\"], [\"a\"]], \"expected\": [[\"b\", \"b\"], [\"a\", \"b\"], [\"a\"]], \"passed\": true}, {\"check\": \"trace-6\", \"actual\": [[\"remote\", null, null], [\"remote\"], []], \"expected\": [[\"remote\", null, null], [\"remote\"], []], \"passed\": true}, {\"check\": \"trace-7\", \"actual\": [[null], [], []], \"expected\": [[null], [], []], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}