What
Auditing a hash-routed tabbed page (5 tab-panes, only one display:block at a time):
- Only the initial tab is audited. The 4 hidden panes never render — their layout/overflow/contrast issues are invisible to the audit. For tabbed docs/SPAs the audit silently covers ~20% of the page.
- Hidden panes still produce contrast findings. The report contains rows like
span: APCA Lc 0 < 60 / Lc 2 / Lc 5 — consistent with measuring text in display:none subtrees against the wrong background (Lc ~0 = fg/bg compute to the same lightness, or measurement of unpainted elements). This is noise that buries real findings.
Repro
node engine/audit.mjs <page-with-js-tabs>.html --out . — page uses .tab-pane{display:none} .tab-pane.active{display:block} + hash routing.
Suggestions
- Skip contrast checks on elements with a
display:none ancestor (visibility-aware traversal)
- View coverage for tabbed pages, pick any:
- accept
#fragment in path mode (load file://…#flow2 so hash-routed pages work)
--view-script <path> executed before each screenshot pass
- auto-detect
[data-tab-view] / .tab-pane targets and render one screenshot set per view, reporting per-view gates
- Report should state which views were audited (coverage honesty — analogous to test coverage)
Environment
keystone @getpipher/keystone (pi npm install), engine/audit.mjs path mode, 2026-08-30 run on a 5-tab architecture diagram.
What
Auditing a hash-routed tabbed page (5
tab-panes, only onedisplay:blockat a time):span: APCA Lc 0 < 60/Lc 2/Lc 5— consistent with measuring text indisplay:nonesubtrees against the wrong background (Lc ~0 = fg/bg compute to the same lightness, or measurement of unpainted elements). This is noise that buries real findings.Repro
node engine/audit.mjs <page-with-js-tabs>.html --out .— page uses.tab-pane{display:none} .tab-pane.active{display:block}+ hash routing.Suggestions
display:noneancestor (visibility-aware traversal)#fragmentin path mode (loadfile://…#flow2so hash-routed pages work)--view-script <path>executed before each screenshot pass[data-tab-view]/.tab-panetargets and render one screenshot set per view, reporting per-view gatesEnvironment
keystone @getpipher/keystone (pi npm install), engine/audit.mjs path mode, 2026-08-30 run on a 5-tab architecture diagram.