{"abstract":"A cell announces a group header belonging to a different section or inferred headers alongside explicit ones.","category":"Accessibility interaction semantics","checks":7,"contract":"Controlled table model: each header is [id,scope,index,group], scope is row, col, rowgroup or colgroup. Cell is [row,col,rowgroup,colgroup]. None explicit IDs enables inference: row/col match index, group scopes match corresponding group. An explicit list, even empty, disables inference; resolve its existing IDs in given order, deduplicating. Return IDs; fixture IDs are unique and every header has one scope.","evaluation_group":"model-1881013b49056aa1","failed_approach":"Matching groups repairs inferred associations but still merges inferred headers into an explicit header list.","family":"z-accessibility-table-header-scope","id":"FA-11411","implementations":{"attempt":{"sha256":"26dc338b8d8a43ff9e772c9d6f39220f21e87d3ba57f3874d1928d46799e5c64","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(headers, cell, explicit):\n    inferred = [ident for ident,scope,index,group in headers if (scope == 'row' and index == cell[0]) or (scope == 'col' and index == cell[1]) or (scope == 'rowgroup' and group == cell[2]) or (scope == 'colgroup' and group == cell[3])]\n    known = {h[0] for h in headers}\n    return list(dict.fromkeys(([x for x in explicit if x in known] if explicit is not None else []) + inferred))\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('row group boundary', solve([('old','rowgroup',0,'old'),('current','rowgroup',0,str(N))], [N,0,str(N),'c'], None), ['current'])\ncheck('column group boundary', solve([('old','colgroup',0,'old'),('current','colgroup',0,str(N))], [0,N,'r',str(N)], None), ['current'])\ncheck('explicit overrides inference', solve([('inferred','row',N,'r'),('chosen','col',100,'c')], [N,0,'r','c'], ['chosen']), ['chosen'])\ncheck('empty explicit suppresses inference', solve([('row','row',N,'r')], [N,0,'r','c'], []), [])\ncheck('explicit order and dedup', solve([('a','row',N,'r'),('b','col',N,'c')], [N,N,'r','c'], ['b','gone','a','b']), ['b','a'])\ncheck('row and column inference', solve([('row','row',N,'r'),('col','col',N+1,'c'),('other','row',N+1,'r')], [N,N+1,'r','c'], None), ['row','col'])\ncheck('empty table', solve([], [N,N,'r','c'], 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":"29651f45eaee63b3efd780cb496ff6fb8e3fb7bc5029cbcf92c6c0af22cdd763","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(headers, cell, explicit):\n    return [ident for ident,scope,index,group in headers if scope in ('rowgroup','colgroup') or (scope == 'row' and index == cell[0]) or (scope == 'col' and index == cell[1])]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('row group boundary', solve([('old','rowgroup',0,'old'),('current','rowgroup',0,str(N))], [N,0,str(N),'c'], None), ['current'])\ncheck('column group boundary', solve([('old','colgroup',0,'old'),('current','colgroup',0,str(N))], [0,N,'r',str(N)], None), ['current'])\ncheck('explicit overrides inference', solve([('inferred','row',N,'r'),('chosen','col',100,'c')], [N,0,'r','c'], ['chosen']), ['chosen'])\ncheck('empty explicit suppresses inference', solve([('row','row',N,'r')], [N,0,'r','c'], []), [])\ncheck('explicit order and dedup', solve([('a','row',N,'r'),('b','col',N,'c')], [N,N,'r','c'], ['b','gone','a','b']), ['b','a'])\ncheck('row and column inference', solve([('row','row',N,'r'),('col','col',N+1,'c'),('other','row',N+1,'r')], [N,N+1,'r','c'], None), ['row','col'])\ncheck('empty table', solve([], [N,N,'r','c'], 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":"f98788bfecb65c5c64931527d3bea9c957155119d787da832fbeb1cc1dda18ce","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(headers, cell, explicit):\n    known = {h[0] for h in headers}\n    if explicit is not None: return list(dict.fromkeys(x for x in explicit if x in known))\n    return [ident for ident,scope,index,group in headers if (scope == 'row' and index == cell[0]) or (scope == 'col' and index == cell[1]) or (scope == 'rowgroup' and group == cell[2]) or (scope == 'colgroup' and group == cell[3])]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('row group boundary', solve([('old','rowgroup',0,'old'),('current','rowgroup',0,str(N))], [N,0,str(N),'c'], None), ['current'])\ncheck('column group boundary', solve([('old','colgroup',0,'old'),('current','colgroup',0,str(N))], [0,N,'r',str(N)], None), ['current'])\ncheck('explicit overrides inference', solve([('inferred','row',N,'r'),('chosen','col',100,'c')], [N,0,'r','c'], ['chosen']), ['chosen'])\ncheck('empty explicit suppresses inference', solve([('row','row',N,'r')], [N,0,'r','c'], []), [])\ncheck('explicit order and dedup', solve([('a','row',N,'r'),('b','col',N,'c')], [N,N,'r','c'], ['b','gone','a','b']), ['b','a'])\ncheck('row and column inference', solve([('row','row',N,'r'),('col','col',N+1,'c'),('other','row',N+1,'r')], [N,N+1,'r','c'], None), ['row','col'])\ncheck('empty table', solve([], [N,N,'r','c'], 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":"z-accessibility-table-header-scope","generated_at":"2026-09-29T14:38:47.694828+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"A controlled offline accessibility-data model. It isolates the stated contract; it does not simulate browser accessibility APIs or claim full ARIA conformance.","repair":"When explicit IDs are present resolve only them; otherwise associate by row, column, or exact group scope.","root_cause":"Header inference ignores the cell’s group identity and explicit-association boundary.","sha256":"37ff8bc28a44a8637545e6efd41965d58e2c47374933bb865791e6b599551dc9","title":"Table headers leak across row groups or override explicit associations · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.81,"exit_code":1,"observations":[{"actual":["current"],"check":"row group boundary","expected":["current"],"passed":true},{"actual":["current"],"check":"column group boundary","expected":["current"],"passed":true},{"actual":["chosen","inferred"],"check":"explicit overrides inference","expected":["chosen"],"passed":false},{"actual":["row"],"check":"empty explicit suppresses inference","expected":[],"passed":false},{"actual":["b","a"],"check":"explicit order and dedup","expected":["b","a"],"passed":true},{"actual":["row","col"],"check":"row and column inference","expected":["row","col"],"passed":true},{"actual":[],"check":"empty table","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"row group boundary\", \"actual\": [\"current\"], \"expected\": [\"current\"], \"passed\": true}, {\"check\": \"column group boundary\", \"actual\": [\"current\"], \"expected\": [\"current\"], \"passed\": true}, {\"check\": \"explicit overrides inference\", \"actual\": [\"chosen\", \"inferred\"], \"expected\": [\"chosen\"], \"passed\": false}, {\"check\": \"empty explicit suppresses inference\", \"actual\": [\"row\"], \"expected\": [], \"passed\": false}, {\"check\": \"explicit order and dedup\", \"actual\": [\"b\", \"a\"], \"expected\": [\"b\", \"a\"], \"passed\": true}, {\"check\": \"row and column inference\", \"actual\": [\"row\", \"col\"], \"expected\": [\"row\", \"col\"], \"passed\": true}, {\"check\": \"empty table\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.532,"exit_code":1,"observations":[{"actual":["old","current"],"check":"row group boundary","expected":["current"],"passed":false},{"actual":["old","current"],"check":"column group boundary","expected":["current"],"passed":false},{"actual":["inferred"],"check":"explicit overrides inference","expected":["chosen"],"passed":false},{"actual":["row"],"check":"empty explicit suppresses inference","expected":[],"passed":false},{"actual":["a","b"],"check":"explicit order and dedup","expected":["b","a"],"passed":false},{"actual":["row","col"],"check":"row and column inference","expected":["row","col"],"passed":true},{"actual":[],"check":"empty table","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"row group boundary\", \"actual\": [\"old\", \"current\"], \"expected\": [\"current\"], \"passed\": false}, {\"check\": \"column group boundary\", \"actual\": [\"old\", \"current\"], \"expected\": [\"current\"], \"passed\": false}, {\"check\": \"explicit overrides inference\", \"actual\": [\"inferred\"], \"expected\": [\"chosen\"], \"passed\": false}, {\"check\": \"empty explicit suppresses inference\", \"actual\": [\"row\"], \"expected\": [], \"passed\": false}, {\"check\": \"explicit order and dedup\", \"actual\": [\"a\", \"b\"], \"expected\": [\"b\", \"a\"], \"passed\": false}, {\"check\": \"row and column inference\", \"actual\": [\"row\", \"col\"], \"expected\": [\"row\", \"col\"], \"passed\": true}, {\"check\": \"empty table\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.531,"exit_code":0,"observations":[{"actual":["current"],"check":"row group boundary","expected":["current"],"passed":true},{"actual":["current"],"check":"column group boundary","expected":["current"],"passed":true},{"actual":["chosen"],"check":"explicit overrides inference","expected":["chosen"],"passed":true},{"actual":[],"check":"empty explicit suppresses inference","expected":[],"passed":true},{"actual":["b","a"],"check":"explicit order and dedup","expected":["b","a"],"passed":true},{"actual":["row","col"],"check":"row and column inference","expected":["row","col"],"passed":true},{"actual":[],"check":"empty table","expected":[],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"row group boundary\", \"actual\": [\"current\"], \"expected\": [\"current\"], \"passed\": true}, {\"check\": \"column group boundary\", \"actual\": [\"current\"], \"expected\": [\"current\"], \"passed\": true}, {\"check\": \"explicit overrides inference\", \"actual\": [\"chosen\"], \"expected\": [\"chosen\"], \"passed\": true}, {\"check\": \"empty explicit suppresses inference\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"explicit order and dedup\", \"actual\": [\"b\", \"a\"], \"expected\": [\"b\", \"a\"], \"passed\": true}, {\"check\": \"row and column inference\", \"actual\": [\"row\", \"col\"], \"expected\": [\"row\", \"col\"], \"passed\": true}, {\"check\": \"empty table\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}