From c4c5e366addf121bd665045b06eaeb579c0b07d0 Mon Sep 17 00:00:00 2001 From: doxa-maps-88655c70 <88627970+doxa-maps-88655c70@users.noreply.github.com> Date: Wed, 23 Sep 2026 07:53:31 +0000 Subject: [PATCH] Say what the embed-smoke node count does and does not mean MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit smoke:embeds reports a node count per profile, and the counts vary enormously: dashboard-plus-grid mounts 1,499 nodes with a canvas, big-picture 262, research-map-plus-grid twelve. Read side by side that last one looks like a capability-4 composite whose two children never rendered. It is not. Measured with a recursive shadow-root walk at mobile viewport: 518 nodes, 1 canvas, both children present as real custom elements (doxa-research-map and people-groups-grid), 13,867px of content, zero console errors and zero responses >= 400. The gate counts ONE shadow level. research-map-plus-grid nests its children by TAG and bundle URL rather than importing their .vue files — deliberately, and its meta.json explains why: importing the research map's component directly would bypass doxa-research-map/index.js and silently drop that bundle's private colour strategies, its profileModules registry, its Pinia/i18n pair and the RTL plugin. Children mounted that way live in their own shadow roots, which a single-level querySelectorAll cannot see. So the count is a MOUNT signal, not a quality signal, and the `< 5` bar it feeds is still exactly right — that bar catches a mount which produced nothing, which is what this gate exists to assert. Only the reading was wrong, so only a comment changes here. Worth recording because this repo already carries the lesson that shadow DOM does not pierce, and it cost three wrong diagnoses of a non-bug once before. It reappeared inside a gate rather than in an ad-hoc probe, where it is harder to notice: the gate is green, the number is simply not measuring what a reader assumes. A near-miss, caught by checking the outlier in a browser instead of filing it. Whole run for the record: 43/43 pages mount cleanly, enumerated generically from manifest.json — every bundle x every profile, not a hardcoded list. That is the "Playwright coverage over every plugin" item on the standing work list, and it is real coverage. --- internal/embed-smoke.mjs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internal/embed-smoke.mjs b/internal/embed-smoke.mjs index ff0406bf7..e55fcdc57 100644 --- a/internal/embed-smoke.mjs +++ b/internal/embed-smoke.mjs @@ -104,6 +104,15 @@ for (const t of list) { return el && el.shadowRoot && el.shadowRoot.childElementCount > 0 }, t.element, { timeout: 25000 }) await page.waitForTimeout(4000) + // ★ THE NODE COUNT IS A MOUNT SIGNAL, NOT A QUALITY SIGNAL — do not read it as "how much + // rendered". This counts ONE shadow level, so a composite that nests its children BY TAG (the + // stack-demo element/src contract, used by research-map-plus-grid to avoid bypassing the child + // bundle's own index.js) reports only its wrapper: 12 nodes, no canvas, while a recursive walk + // of the same page finds 518 nodes, 1 canvas, both children present and 13,867px of content. + // That reads as a broken composite beside dashboard-plus-grid's 1,499, and it is not one — + // measured 2026-09-23 after chasing it as a defect. Shadow DOM does not pierce; a single-level + // querySelectorAll cannot see a tag-composed child. The `< 5` bar below is still the right + // assertion, because it catches a mount that produced NOTHING, which is what this gate is for. const verdict = await page.evaluate((tag) => { const el = document.querySelector(tag) const sr = el.shadowRoot