diff --git a/internal/check-region-fill-repaint.mjs b/internal/check-region-fill-repaint.mjs index afefb955d..c0e720ef0 100644 --- a/internal/check-region-fill-repaint.mjs +++ b/internal/check-region-fill-repaint.mjs @@ -5,8 +5,14 @@ * after a reload. This gate guards ONE ordering that can reach a flat-grey fill (points arriving * after the layer and its mount repaint). On built bundles that ordering did NOT reproduce the grey * tab (0 of 20 loads grey, the fill present with its expression at addLayer), so the reported bug is - * still open; the lead is the dev/HMR re-mount path. The repaint below is idempotent, so guarding - * this ordering costs nothing. + * still open. The repaint below is idempotent, so guarding this ordering costs nothing. + * + * ★ NARROWED AFTER LANDING, and this is what the next reader needs: the ordering is not merely + * "not the cause" — it is UNCONSTRUCTIBLE today. region-dashboards.vue:1091 gates the entire map + * subtree behind v-if="loading", and loadRegions assigns points inside the try while loading=false + * is in the finally, so the map CANNOT mount with empty points. rega measured 0 grey in 36 mounts, + * including a run with the prayer API held back 20s: the map was constructed AFTER the data, every + * time. So this gate guards a FUTURE refactor that drops that v-if data gate — not a live path. * * ★ THE MECHANISM, read out of RegionCountryMap.vue. The fill colour is a ['match'] built from * props.points; with no points regionFillExpression returns a FLAT no-data grey. addLayers() diff --git a/package.json b/package.json index 1505af249..39bccc42e 100644 --- a/package.json +++ b/package.json @@ -492,7 +492,7 @@ "check:provider-switch": "the provider switch must actually SWITCH: counts requests BY HOST (not window globals, which stay defined after a swap) and asserts the maplibre run stays within the leaf HTML's own declared api.mapbox.com preloads. Defaults to the upg-100 leaf; pass a URL or set BASE_URL for another. CONDITIONAL: SKIPs when nothing is served.", "check:published": "what readers are SERVED must be what we BUILT. Every other gate measures the local tree, so all of them stay green while a stale publish serves something else — and manufactures bug reports that cannot be reproduced. Compares the sha384 per bundle. SKIPs when the published host is unreachable (a network gate that goes red on flaky wifi gets ignored).", "check:quoted-scripts": "documentation/README-SECTION-3-cli-commands.md QUOTES the scripts block verbatim; it had silently drifted TWICE (a stale bunx cap:sync, and build:unlocked missing check:public-hygiene + check:label-joins). package.json is what RUNS — update the DOC.", - "check:region-fill-repaint": "the region fill must be repainted after its data arrives, in EVERY arrival order (hardening: this ordering is NOT the cause of the reported grey Regions tab, which stays open). fill-color is SNAPSHOTTED into the layer when addLayers creates it, from a match-expression built out of props.points — with no points that expression is a flat no-data grey, and applySubject guards every write on getLayer() so a change arriving before the layer exists is dropped and never retried. Models the arrival orders (asserting at least one DOES grey without the repaint, else the model proves nothing) and asserts the source carries the repaint INSIDE the .then() block that received the boundaries, brace-matched rather than within a character distance — a 1600-char window passed on an unrelated applySubject 1200 chars downstream.", + "check:region-fill-repaint": "the region fill must be repainted after its data arrives, in EVERY arrival order. ★ WHAT THIS NOW GUARDS, narrowed by measurement after it landed: the ordering is not merely uncaused-by-the-grey-tab, it is UNCONSTRUCTIBLE today — region-dashboards.vue:1091 gates the whole map subtree behind v-if=\"loading\", and loadRegions assigns points inside the try while loading=false is in the finally, so the map can never mount with empty points (rega: 0 grey in 36 mounts, including the API held back 20s). So this is a guard against a FUTURE refactor that drops that v-if data gate, not a live path. The grey Regions tab stays OPEN and is not this. fill-color is SNAPSHOTTED into the layer when addLayers creates it, from a match-expression built out of props.points — with no points that expression is a flat no-data grey, and applySubject guards every write on getLayer() so a change arriving before the layer exists is dropped and never retried. Models the arrival orders (asserting at least one DOES grey without the repaint, else the model proves nothing) and asserts the source carries the repaint INSIDE the .then() block that received the boundaries, brace-matched rather than within a character distance — a 1600-char window passed on an unrelated applySubject 1200 chars downstream.", "check:religion-label-not-value": "the library's two RELIGION_FAMILIES sites (useLegendData, useSearch) show religionFamilyLabel() to the reader, while the value a filter or search matches on stays the canonical English family name: a translated label must never become a wire value.", "check:ring-vocabulary": "the ring names the printed packet uses (packet-strings.json) agree with the ones the screen uses (gospelInternet.json) in every locale, so a packet and the map cannot name the same ring two ways. By the UPG-100 owner. Headless; in gates:pre.", "check:scrim-viewport": "a full-screen SCRIM must cover the VIEWPORT, not just the content pane. A position:fixed;inset:0 scrim is PANE-relative wherever an ancestor sets contain/transform — VerticalTabsLayout sets contain:layout on .vtl-content — so a scrim dimmed 1024x793 @ (256,107) at a 1280x900 viewport and left the 256px rail CLICKABLE behind a modal. A source grep cannot see it: the declaration is correct, the ANCESTOR is the variable. Needs `bun run dev`; browser gate, not in build:unlocked.",