From dbb917cbed9c21504123c10ef5a0f204290debda Mon Sep 17 00:00:00 2001 From: doxa-maps-88655c70 <88627970+doxa-maps-88655c70@users.noreply.github.com> Date: Wed, 23 Sep 2026 08:41:26 +0000 Subject: [PATCH] Point the tab-order gate at a page that exists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit check:spa-tab-order was FAILING with "no .vtl-tab rows found in the composed tree", which reads as a missing tab rail. The rail is fine. The gate navigated to a DIRECTORY url — .../doxa-maps-spa/doxa-maps-spa/ — and `bun run serve` is serve-strict.mjs, which 404s a directory request with no index fallback because the live static layer does. Measured: the directory url returns 404, the explicit index.html returns 200. Under the old `python3 -m http.server` this line passed, since that server silently resolved a directory to index.html. So the gate was green locally and would have 404'd against production — the exact defect class serve-strict was introduced to expose, after it hid a bad url in verify-shell-scroll for a whole flight. A repo-wide sweep found this was the last remaining directory url in internal/. The symptom deserves recording because it was maximally misleading: a 404 page has no rail, so a missing PAGE and a missing FEATURE produce the same message, and the line immediately below warns about that same confusion arising from shadow roots. A correct warning about one cause makes the wrong diagnosis of another cause more tempting, not less. Now passes, and what it prints is the canonical Gate-1 chain: 12 rows opening Big Picture ("dashboard + people-groups grid, stacked"), UPG-100 List, Prayer Progress, Gospel Resources. Big Picture is tab-1 of the cap-5 SPA, as specified. --- internal/check-spa-tab-order.mjs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/internal/check-spa-tab-order.mjs b/internal/check-spa-tab-order.mjs index e93e170ec..82ac5a36e 100644 --- a/internal/check-spa-tab-order.mjs +++ b/internal/check-spa-tab-order.mjs @@ -46,7 +46,18 @@ const page = await browser.newPage({ viewport: { width: 1600, height: 900 } }) let rows = [] let err = null try { - await page.goto(`${BASE}/doxa-maps-spa/doxa-maps-spa/`, { waitUntil: 'load', timeout: 45000 }) + // ★ EXPLICIT index.html, never a directory URL. `bun run serve` is serve-strict.mjs, which 404s a + // directory request with no index fallback BECAUSE THE LIVE STATIC LAYER DOES. Under the old + // python3 -m http.server this line passed, since that server silently resolved the directory — + // so this gate was green locally and would have 404'd against production. Measured 2026-09-23: + // `.../doxa-maps-spa/doxa-maps-spa/` -> 404, `.../index.html` -> 200. The symptom was maximally + // misleading: a 404 page has no rail, so the gate reported "no .vtl-tab rows found in the composed + // tree", which reads as a missing tab strip rather than a missing page. Its own next line warns + // about exactly this confusion for a different cause (shadow roots), and that warning is what + // makes the wrong reading tempting. Same defect class serve-strict was built to expose after it + // hid a bad URL in verify-shell-scroll for a whole flight; a repo-wide sweep found this was the + // last remaining directory URL in internal/. + await page.goto(`${BASE}/doxa-maps-spa/doxa-maps-spa/index.html`, { waitUntil: 'load', timeout: 45000 }) await page.waitForTimeout(8000) rows = await page.evaluate( `(${WALK})('.vtl-tab').map(t => (t.textContent || '').trim().replace(/\\s+/g, ' '))`