{"abstract":"Disabled tabs remain keyboard navigable.","category":"Tab interfaces","checks":9,"contract":"Focus traverses enabled tabs; automatic mode activates on focus, manual mode requires Enter or Space; removed focus or selection falls back to first enabled tab.","evaluation_group":"xi-tab-panels","failed_approach":"Keeping only disabled tabs excludes all usable panels.","family":"xi-tab-panels-disabled-tab","id":"FA-8581","implementations":{"attempt":{"sha256":"9489251ebe81c93f3025476da558c692092ae8623b3302cbbd039b855cd65187","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(tabs, focused, selected, key, automatic, disabled):\n    available = [t for t in tabs if t in disabled]\n    if not available: return (None, None)\n    if focused not in available: focused = available[0]\n    if key == 'Next': focused = available[(available.index(focused)+1) % len(available)]\n    if key == 'Previous': focused = available[(available.index(focused)-1) % len(available)]\n    if automatic or key in ('Enter','Space'): selected = focused\n    if selected not in available: selected = available[0]\n    return (focused, selected)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('disabled', solve(['a','b','c'], 'a', 'a', 'Next', True, ['b']), ('c', 'c'))\ncheck('removed focus', solve(['a','b','c'], 'gone', 'a', 'none', False, []), ('a', 'a'))\ncheck('next', solve(['a','b','c'], 'a', 'a', 'Next', True, []), ('b', 'b'))\ncheck('manual', solve(['a','b','c'], 'a', 'a', 'Next', False, []), ('b', 'a'))\ncheck('space', solve(['a','b'], 'b', 'a', 'Space', False, []), ('b', 'b'))\ncheck('removed selection', solve(['a','b'], 'b', 'gone', 'none', False, []), ('b', 'a'))\ncheck('empty', solve([], None, None, 'Next', True, []), (None, None))\ncheck('parameterized tab identities', solve(list(range(N+2)), N, N, 'Next', True, []), (N+1,N+1))\nfor repetition in range(N):\n    check('repeat empty', solve([], None, None, 'Next', True, []), (None, None))\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":"84ae8837163379dd76fd17970147f551ec972bfbbc0502dbb95b65964bd0f9f5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(tabs, focused, selected, key, automatic, disabled):\n    available = [t for t in tabs if True]\n    if not available: return (None, None)\n    if focused not in available: focused = available[0]\n    if key == 'Next': focused = available[(available.index(focused)+1) % len(available)]\n    if key == 'Previous': focused = available[(available.index(focused)-1) % len(available)]\n    if automatic or key in ('Enter','Space'): selected = focused\n    if selected not in available: selected = available[0]\n    return (focused, selected)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('disabled', solve(['a','b','c'], 'a', 'a', 'Next', True, ['b']), ('c', 'c'))\ncheck('removed focus', solve(['a','b','c'], 'gone', 'a', 'none', False, []), ('a', 'a'))\ncheck('next', solve(['a','b','c'], 'a', 'a', 'Next', True, []), ('b', 'b'))\ncheck('manual', solve(['a','b','c'], 'a', 'a', 'Next', False, []), ('b', 'a'))\ncheck('space', solve(['a','b'], 'b', 'a', 'Space', False, []), ('b', 'b'))\ncheck('removed selection', solve(['a','b'], 'b', 'gone', 'none', False, []), ('b', 'a'))\ncheck('empty', solve([], None, None, 'Next', True, []), (None, None))\ncheck('parameterized tab identities', solve(list(range(N+2)), N, N, 'Next', True, []), (N+1,N+1))\nfor repetition in range(N):\n    check('repeat empty', solve([], None, None, 'Next', True, []), (None, None))\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":"24b067ee7c267640bce77689f59f81c95f3b775417fb66162bf9320502e4db9d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(tabs, focused, selected, key, automatic, disabled):\n    available = [t for t in tabs if t not in disabled]\n    if not available: return (None, None)\n    if focused not in available: focused = available[0]\n    if key == 'Next': focused = available[(available.index(focused)+1) % len(available)]\n    if key == 'Previous': focused = available[(available.index(focused)-1) % len(available)]\n    if automatic or key in ('Enter','Space'): selected = focused\n    if selected not in available: selected = available[0]\n    return (focused, selected)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('disabled', solve(['a','b','c'], 'a', 'a', 'Next', True, ['b']), ('c', 'c'))\ncheck('removed focus', solve(['a','b','c'], 'gone', 'a', 'none', False, []), ('a', 'a'))\ncheck('next', solve(['a','b','c'], 'a', 'a', 'Next', True, []), ('b', 'b'))\ncheck('manual', solve(['a','b','c'], 'a', 'a', 'Next', False, []), ('b', 'a'))\ncheck('space', solve(['a','b'], 'b', 'a', 'Space', False, []), ('b', 'b'))\ncheck('removed selection', solve(['a','b'], 'b', 'gone', 'none', False, []), ('b', 'a'))\ncheck('empty', solve([], None, None, 'Next', True, []), (None, None))\ncheck('parameterized tab identities', solve(list(range(N+2)), N, N, 'Next', True, []), (N+1,N+1))\nfor repetition in range(N):\n    check('repeat empty', solve([], None, None, 'Next', True, []), (None, None))\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":" 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":"xi-tab-panels-disabled-tab","generated_at":"2026-09-29T14:38:22.636275+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"A deterministic model of tab selection and activation mode; this isolates one interface invariant without requiring a browser.","repair":"Implement the disabled tab operation as `if t not in disabled`.","root_cause":"The disabled tab operation uses `if True` where the contract requires `if t not in disabled`.","sha256":"a246841529d1a6c838ff7c2cd5f2f4ebb03ac36bd5d353856d791ccc59ed9d92","title":"Tab selection and activation mode: Disabled tabs remain keyboard navigable · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.192,"exit_code":1,"observations":[{"actual":["b","b"],"check":"disabled","expected":["c","c"],"passed":false},{"actual":[null,null],"check":"removed focus","expected":["a","a"],"passed":false},{"actual":[null,null],"check":"next","expected":["b","b"],"passed":false},{"actual":[null,null],"check":"manual","expected":["b","a"],"passed":false},{"actual":[null,null],"check":"space","expected":["b","b"],"passed":false},{"actual":[null,null],"check":"removed selection","expected":["b","a"],"passed":false},{"actual":[null,null],"check":"empty","expected":[null,null],"passed":true},{"actual":[null,null],"check":"parameterized tab identities","expected":[2,2],"passed":false},{"actual":[null,null],"check":"repeat empty","expected":[null,null],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"disabled\", \"actual\": [\"b\", \"b\"], \"expected\": [\"c\", \"c\"], \"passed\": false}, {\"check\": \"removed focus\", \"actual\": [null, null], \"expected\": [\"a\", \"a\"], \"passed\": false}, {\"check\": \"next\", \"actual\": [null, null], \"expected\": [\"b\", \"b\"], \"passed\": false}, {\"check\": \"manual\", \"actual\": [null, null], \"expected\": [\"b\", \"a\"], \"passed\": false}, {\"check\": \"space\", \"actual\": [null, null], \"expected\": [\"b\", \"b\"], \"passed\": false}, {\"check\": \"removed selection\", \"actual\": [null, null], \"expected\": [\"b\", \"a\"], \"passed\": false}, {\"check\": \"empty\", \"actual\": [null, null], \"expected\": [null, null], \"passed\": true}, {\"check\": \"parameterized tab identities\", \"actual\": [null, null], \"expected\": [2, 2], \"passed\": false}, {\"check\": \"repeat empty\", \"actual\": [null, null], \"expected\": [null, null], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.472,"exit_code":1,"observations":[{"actual":["b","b"],"check":"disabled","expected":["c","c"],"passed":false},{"actual":["a","a"],"check":"removed focus","expected":["a","a"],"passed":true},{"actual":["b","b"],"check":"next","expected":["b","b"],"passed":true},{"actual":["b","a"],"check":"manual","expected":["b","a"],"passed":true},{"actual":["b","b"],"check":"space","expected":["b","b"],"passed":true},{"actual":["b","a"],"check":"removed selection","expected":["b","a"],"passed":true},{"actual":[null,null],"check":"empty","expected":[null,null],"passed":true},{"actual":[2,2],"check":"parameterized tab identities","expected":[2,2],"passed":true},{"actual":[null,null],"check":"repeat empty","expected":[null,null],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"disabled\", \"actual\": [\"b\", \"b\"], \"expected\": [\"c\", \"c\"], \"passed\": false}, {\"check\": \"removed focus\", \"actual\": [\"a\", \"a\"], \"expected\": [\"a\", \"a\"], \"passed\": true}, {\"check\": \"next\", \"actual\": [\"b\", \"b\"], \"expected\": [\"b\", \"b\"], \"passed\": true}, {\"check\": \"manual\", \"actual\": [\"b\", \"a\"], \"expected\": [\"b\", \"a\"], \"passed\": true}, {\"check\": \"space\", \"actual\": [\"b\", \"b\"], \"expected\": [\"b\", \"b\"], \"passed\": true}, {\"check\": \"removed selection\", \"actual\": [\"b\", \"a\"], \"expected\": [\"b\", \"a\"], \"passed\": true}, {\"check\": \"empty\", \"actual\": [null, null], \"expected\": [null, null], \"passed\": true}, {\"check\": \"parameterized tab identities\", \"actual\": [2, 2], \"expected\": [2, 2], \"passed\": true}, {\"check\": \"repeat empty\", \"actual\": [null, null], \"expected\": [null, null], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.484,"exit_code":0,"observations":[{"actual":["c","c"],"check":"disabled","expected":["c","c"],"passed":true},{"actual":["a","a"],"check":"removed focus","expected":["a","a"],"passed":true},{"actual":["b","b"],"check":"next","expected":["b","b"],"passed":true},{"actual":["b","a"],"check":"manual","expected":["b","a"],"passed":true},{"actual":["b","b"],"check":"space","expected":["b","b"],"passed":true},{"actual":["b","a"],"check":"removed selection","expected":["b","a"],"passed":true},{"actual":[null,null],"check":"empty","expected":[null,null],"passed":true},{"actual":[2,2],"check":"parameterized tab identities","expected":[2,2],"passed":true},{"actual":[null,null],"check":"repeat empty","expected":[null,null],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"disabled\", \"actual\": [\"c\", \"c\"], \"expected\": [\"c\", \"c\"], \"passed\": true}, {\"check\": \"removed focus\", \"actual\": [\"a\", \"a\"], \"expected\": [\"a\", \"a\"], \"passed\": true}, {\"check\": \"next\", \"actual\": [\"b\", \"b\"], \"expected\": [\"b\", \"b\"], \"passed\": true}, {\"check\": \"manual\", \"actual\": [\"b\", \"a\"], \"expected\": [\"b\", \"a\"], \"passed\": true}, {\"check\": \"space\", \"actual\": [\"b\", \"b\"], \"expected\": [\"b\", \"b\"], \"passed\": true}, {\"check\": \"removed selection\", \"actual\": [\"b\", \"a\"], \"expected\": [\"b\", \"a\"], \"passed\": true}, {\"check\": \"empty\", \"actual\": [null, null], \"expected\": [null, null], \"passed\": true}, {\"check\": \"parameterized tab identities\", \"actual\": [2, 2], \"expected\": [2, 2], \"passed\": true}, {\"check\": \"repeat empty\", \"actual\": [null, null], \"expected\": [null, null], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}