diff --git a/library/components/maps/RegionCountryMap.vue b/library/components/maps/RegionCountryMap.vue index 4e5fe9a2d..62a354d09 100644 --- a/library/components/maps/RegionCountryMap.vue +++ b/library/components/maps/RegionCountryMap.vue @@ -32,8 +32,7 @@ import { useMapInstance } from '@map/composables/useMapInstance.js' // useMapProvider's isMapboxMap; exp-shepherd has landed engineFor(map), which is stricter than // what I had — it instance-tests BOTH engines instead of inferring the second from the first — so // the expression is gone too. Three implementations were compared before swapping (the deleted -// copy, my interim expression, and this) and they decide identically in every engine combination: -// _qa-cycle/02-builder-cycle/_chk-glfor-equivalence.mjs. +// copy, my interim expression, and this) and they decide identically in every engine combination. import { engineFor, projectionOf, setProjectionOn } from '@map/composables/useMapProvider.js' import { resolveMapProvider } from '@map/composables/useMapProvider.js' import { resolveAssetsBase } from '@map/utils/embedBase.js' @@ -459,9 +458,8 @@ function popupHtml(p) { * ★ THIS USED TO BE `log2(width / 512)` — mercator's world is 512*2^z wide, so that is the zoom * which fits one mercator world. But the chooser renders under the GLOBE projection, and the same * mistake that made the region pages frame too wide (a mercator answer applied to a sphere) made - * this frame too SMALL. Found by LOOKING at _shot-chooser-map-desktop.png — a sphere adrift in - * white space — not by any assertion, and then measured by - * _qa-cycle/02-builder-cycle/_probe-chooser-globe-fill.mjs at 1200x780: + * this frame too SMALL. Found by LOOKING at a screenshot of the chooser — a sphere adrift in + * white space — not by any assertion, and then measured at 1200x780: * * zoom 1.229 (what the mercator formula returned) -> sphere diameter 390.61px = 50.1% of the * frame's short side. HALF THE FRAME WAS DEAD SPACE. @@ -550,8 +548,8 @@ function chooserZoom(m) { /** * Frame `bounds` the way THEIR CONSTRUCTOR frames it, not the way a post-load fitBounds does. * - * ★ MEASURED 2026-09-24, one page, one box, one engine (mapbox-gl 3.24.0 on both sides), by - * _qa-cycle/02-builder-cycle/_probe-fit-at-construction-vs-after-load.mjs: + * ★ MEASURED 2026-09-24, one page, one box, one engine (mapbox-gl 3.24.0 on both sides), framing the + * same bounds both ways: * * new mapboxgl.Map({ bounds, fitBoundsOptions }) -> zoom 3.210, getProjection() 'mercator' at t=0 * map.fitBounds(bounds, sameOptions) -> zoom 2.777, getProjection() 'globe' diff --git a/library/components/qa/QaCorner.vue b/library/components/qa/QaCorner.vue index b032f6b66..a18b75b19 100644 --- a/library/components/qa/QaCorner.vue +++ b/library/components/qa/QaCorner.vue @@ -2,8 +2,7 @@ /** * QaCorner.vue — the embeddable QA corner widget (bottom-right of any map). * - * Visible shell of the QA-agent bridge (see _qa-cycle/01-ideation-research/ - * qa-loops/qa-embeddable-qa-agent-bridge.md). OIDC-gated onboarding — NEVER a key. + * Visible shell of the QA-agent bridge. OIDC-gated onboarding — NEVER a key. * * AUTH: the widget detects the host's session via a same-origin GET /api/auth/me. * That only succeeds when the plugin iframe is SAME-ORIGIN (allow-same-origin). When diff --git a/library/composables/useCountryOutline.js b/library/composables/useCountryOutline.js index f3095e22f..61c3c37da 100644 --- a/library/composables/useCountryOutline.js +++ b/library/composables/useCountryOutline.js @@ -90,7 +90,7 @@ function countryFilter(code, isMaplibre) { // field, this cannot be bridged in the loader: there is no worldview to invent. It is a fact // about the Mapbox tileset's shape, so only the Mapbox path asks for it. // MEASURED: against the real 162 features, the clause admits 0 and the branch below admits its - // country — _qa-cycle/02-builder-cycle/_chk-worldview-clause-guarded-per-engine.mjs. + // country. if (isMaplibre) return byCode return [ 'all', diff --git a/library/scripts/boundaries/build-web-boundaries.mjs b/library/scripts/boundaries/build-web-boundaries.mjs index eb9ba54b7..999cff3af 100644 --- a/library/scripts/boundaries/build-web-boundaries.mjs +++ b/library/scripts/boundaries/build-web-boundaries.mjs @@ -21,8 +21,9 @@ * * VALIDATED, the run FAILS otherwise: the same feature count, the same keys, the same polygon-part * count (no dropped island), and the same property names and values on every feature. - * The measured report (size, parts, area error, point-in-polygon drift) is in - * _qa-cycle/03-deployment-cycle/REPORT-WEB-BOUNDARIES.md. + * MEASURED: the world file goes from 1,866 KB to 383 KB (134 KB gzipped) with all 162 features and all + * 572 polygon parts; India's from 1,796 KB to 227 KB with all 36 and all 452. A second run writes + * identical bytes. */ import { execFileSync } from 'node:child_process' import { readFileSync, statSync } from 'node:fs' diff --git a/library/scripts/posters/packet.mjs b/library/scripts/posters/packet.mjs index 68747113d..40873f503 100644 --- a/library/scripts/posters/packet.mjs +++ b/library/scripts/posters/packet.mjs @@ -1,7 +1,6 @@ // packet.mjs — the UPG-100 PRAYER PACKET generator. // -// One printable packet per zone. Structure is the Driver's, from the ideation -// (_qa-cycle/01-ideation-research/prayer-points.md): +// One printable packet per zone, page by page: // // page 1 the MAP — a lightweight vertical one-pager, NOT the poster format // pages 2..n the PEOPLE GROUPS — 20 per page, photo + name + brief detail diff --git a/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue b/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue index 012334db7..0c9d6d0d3 100644 --- a/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue +++ b/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue @@ -224,13 +224,8 @@ function detectHostLocale() { // exist in this SPA are OMITTED (never paint a dead nav row — nav.js's own navForTarget prunes empty // groups the same way). `folder:true` (Experimental) renders collapsible, starting closed. const NAV_MODEL = [ - // ── THREE SECTIONS, PER THE SPEC (2026-09-22 audio, transcribed to - // _qa-cycle/01-ideation-research/SPEC-the-six-map-product-and-its-tab-order.md — that file is - // AUTHORITATIVE; this comment explains how the code satisfies it, not the ruling itself). - // - // Driver, verbatim: "in one of the earlier messages i mentioned i wanted 3 tab sections. one - // called dashboards, one called prayer mobilization, one called gospel research. with two maps - // inside of each of them." + // ── THREE SECTIONS: Dashboards, Prayer Mobilization and Gospel Research, each holding its own maps. + // This comment explains how the code keeps that shape, not why the shape was chosen. // // A PRIOR CUT REMOVED DASHBOARDS ENTIRELY (see git history / the spec's "duplicate-key trap"), // because Big Picture had been declared TWICE — once as a one-row Dashboards section and once as @@ -253,8 +248,7 @@ const NAV_MODEL = [ // map + People Groups grid composite — "the mobile dashboard" per the spec — and it stays // reachable on desktop too, as the second dashboard row. { id: 'research-map-plus-grid', icon: 'map' }, - // 3. Regions — the THIRD dashboard the Driver named: "in the dashboard section I need to have - // the Big Picture dashboard, the Simple Research dashboard and the Regions dashboard." + // 3. Regions — the third dashboard, beside Big Picture and Simple Research. // Seven plugins across three sections was the ask; this row is the seventh. // // ★ WHAT SHIPS TODAY IS TAB 1 OF 2. regions-dashboard currently builds a single profile,