doxa-maps/internal
Doxa Maps 127a2e0930 The funnel states the list it was actually drawn from
A LIVE WRONG NUMBER, not a future risk. The universal `list` prop is already on
main (e3d25ff6) and this profile already honours it — applyPeopleGroupList()
filters the rows at all four fetch sites, packetRecords included — and the
membership files are on disk. So under ?list=frontier-500k the packet's rows were
the 71 network groups that are Project 700, while the funnel took its denominator
from the last step of vision-funnel.json and printed "of the 2,107". Off by a
factor of 30, with nothing on the page looking broken.
Measured from data/people-groups/lists/*.json (counts.doxa, what a Tier A map
shows): frontier-500k 71 · frontier 1,745 · unengaged 1,929 · unreached 2,082 ·
the default 2,107.

THREE NUMBERS WERE WRONG, NOT ONE, because all three descended from one total:
the share's denominator; the footnote's "N are in no list" (total minus assigned);
and "1 of 27 lists", which is a property of the UPG-100 ZONE CATALOGUE, not of the
active list — the zones partition the default list and nothing else.
A non-default list now gets its own step, labelled with the list's own label, so
the narrowing does not jump from one list's total to another list's packet.

AND EACH CLAUSE IS SUPPRESSED SEPARATELY, because they are provable separately.
A first pass dropped the whole share line whenever listCount was absent, throwing
away a true statement ("5.4% of the 1,745") to avoid an unprovable one. The
footnote splits the same way: provenance holds for every list, coverage does not.
⚠ The footnote is NOT split by parsing the translated sentence — hi ends in "।"
and zh in "。", and reading translated prose for structure is the trap
check-packet-render's own comment warns about. It is a second key.
⚠ And `funnel.unassigned ?? 0` would have printed "0 of the 1,745 are not yet in
any list" — a confident falsehood whose zero reads as a completeness claim.

── AND THREE FINDINGS FROM rega'S RENDER, none of which I could see ──────────
"0 people" PRINTED ON THE READER'S ROW OF EVERY PACKET. Number(null) is 0 (only
Number(undefined) is NaN), so `Number.isFinite(Number(x))` admitted the
deliberate `population: null` marker as the number zero. I asked "is this a
finite number?" when the question was "did anyone give me a population?" — the
same presence-vs-value confusion as inferring "did it work" from a field that
answers "did it isolate". Zero is suppressed too: a people group with no people
is missing data wearing a number's clothes.

THE SHARE LINE READ AS PART OF THE FOOTNOTE. Measured: 218px below the reader's
row, 42px above the footnote, because the last row kept the full inter-row gap.
Proximity is the only thing grouping them, so an even gap grouped the share with
the wrong element. The last row's margin is now 14px: share 14px under its row,
288px clear of the footnote.

THE GATE ASSERTED PAGE 2 AND PRINTED NOTHING ABOUT IT. rega: "a reader cannot see
WHAT it asserted." A silent pass is the mirror of a printed-but-unasserted number
— the check is real and the evidence invisible. It now reports rows, bars and the
share line, and gained two assertions: every row must have a BAR (the reader's
step had none, so the funnel never visibly narrowed to "yours"), and no row may
print a zero population.

Verified: all five list cases render their own true numbers — doxa keeps the full
claim, unreached/frontier/unengaged get their own step and a percentage with no
false "1 of K", frontier-500k reads "100% of the 71" with the duplicate row
suppressed (a step that repeats its neighbour is not a step). The four fixtures
are byte-for-byte unchanged on the default path, so the list-awareness is purely
additive. check:packet-strings-parity PASS with the three new keys. Both new gate
assertions mutation-tested in en and ar: removing a bar is DETECTED, injecting a
zero population is DETECTED. 5 rows = 5 bars, 0 zero-population rows, "0 people"
absent. Six-row layout recomputed: fits with 318px headroom, 206px if every label
wraps. BUNDLE=my-upg-100-list vite build clean.

NOT re-rendered in a browser: rega measured the previous state and these are
responses to it, so the new geometry wants one more look.
2026-09-26 08:13:34 +00:00
..
acceptance Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
element-census Match the live page's wording where we differed only by case 2026-09-25 17:08:16 +00:00
fixtures
lib
plugin-gallery Dev server: listens on this machine only, never serves .git or .env, and shows data/ edits at once 2026-09-26 03:34:31 +00:00
_serve-reaped.mjs Make a gate's dev server die with the gate 2026-09-24 22:54:11 +00:00
_serves-this-tree.mjs The docs stop handing the next reader a 404 2026-09-25 22:49:37 +00:00
_tree-name.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
atomic-public-swap.sh public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
browser-slot.sh One browser slot on this machine: a second browser run queues instead of racing 2026-09-26 03:34:13 +00:00
build-lock.sh public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
build-packet-fixtures.mjs packets: fixtures at the PAGE BOUNDARY, which nothing had ever rendered 2026-09-24 23:53:07 +00:00
check-a11y-button-names.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-aria-labels-localized.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-auto-engine.mjs The default engine is auto: Mapbox when a token is available, MapLibre when none is 2026-09-26 03:34:12 +00:00
check-backlog-refs.mjs poster cards: the print-options row stays inside its own card 2026-09-24 19:19:02 +00:00
check-backlog-status-enum.mjs
check-basemap-labels-localized.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-capability-citations.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-capability-exemplars.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-card-deck.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-catalog-currency.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-catalog-identity.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-cdn-pins.mjs Every runtime CDN script and stylesheet is an exact version with an integrity hash 2026-09-26 05:50:24 +00:00
check-composite-embed-knobs.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-composite-freshness.mjs Freshness covers every bundle a landing can have staled; SRI repairs keep the gallery's manifest copy 2026-09-25 22:09:40 +00:00
check-composite-interop.mjs check:composite-interop: drop the emitFilterState exemption, now that 9384c1ba fixed it 2026-09-26 07:56:40 +00:00
check-composite-registration.mjs
check-composite-srcs.mjs The docs stop handing the next reader a 404 2026-09-25 22:49:37 +00:00
check-composites-mount.mjs check:profiles-mount: every profile and preset instance mounts in en and ar, not only composites 2026-09-26 05:16:02 +00:00
check-csv-export-shape.mjs
check-deck-click.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-dependency-names.mjs
check-dev-assets.mjs check:dev-assets: every leaf of the seven studio maps, with bytes that parse and a bogus-path control 2026-09-25 23:22:27 +00:00
check-doc-quotes-scripts.mjs
check-done-evidence.mjs
check-dxlife-untouched.mjs
check-element-census-vs-live.mjs check:element-census-vs-live: sanctioned PAIRS, so an allowed difference leaves no phantom omission 2026-09-25 20:57:39 +00:00
check-embed-base-resolution.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-embed-basemap-paints.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-embed-targets-exist.mjs
check-embedded-rtl.mjs The partner-embed check becomes something a person can open 2026-09-26 00:47:12 +00:00
check-experimental-shelf.mjs check:experimental-shelf looks at the map: paint arm with its own poisons, and settled counts 2026-09-25 19:54:41 +00:00
check-facet-cascade.mjs
check-facet-changes-map.mjs The docs stop handing the next reader a 404 2026-09-25 22:49:37 +00:00
check-facet-one-field.mjs
check-filter-width-stable.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-fits-the-screen.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-fixed-anchoring.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-gospel-all.mjs Gospel checks: one dev-assets gate, and cover the gap it leaves 2026-09-25 23:50:31 +00:00
check-gospel-composed-filters.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-gospel-coverage-consistent.mjs Hold the gap table to the split it publishes 2026-09-25 00:24:29 +00:00
check-gospel-english-leaks.mjs Gospel charts: the titles and the counts inside them are translatable 2026-09-25 20:39:19 +00:00
check-gospel-leaves-mount.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-gospel-map-paints.mjs check-gospel-map-paints reads the tree's name from the build config too 2026-09-25 16:26:03 +00:00
check-gospel-rtl-shaping.mjs Merge branch 'main' of https://git.nuxtbase.app/doxa-life/doxa-maps into bundler-3/work 2026-09-25 22:55:49 +00:00
check-gospel-tables-staged.mjs Gospel map: provinces for India and China, fetched only when someone looks 2026-09-26 06:53:22 +00:00
check-heartbeat-threshold.mjs Gates: pin-dim-slider runs again, heartbeat follows the translated panel, and the new engine checks are registered 2026-09-26 03:35:18 +00:00
check-host-locale-contract.mjs browser-slot: a long gate declares its own hold limit; check:host-locale-contract takes 2700 s 2026-09-25 16:25:22 +00:00
check-i18n-never-translated.mjs The never-translated gate goes green on what it has settled 2026-09-25 15:49:47 +00:00
check-i18n-parity.mjs
check-i18n-treeshake.mjs Each bundle carries only the translation areas it uses (people-groups-grid 611 KB -> 210 KB) 2026-09-26 07:24:25 +00:00
check-kpi-unit-once.mjs Translate the chrome that was English in all eleven locales 2026-09-25 06:10:27 +00:00
check-label-joins.mjs
check-leaf-engine-per-provider.mjs Flower Mesh opens on an SVG lens: the leaf-engine gate stops expecting a canvas there 2026-09-26 04:21:49 +00:00
check-leaf-english-leaks.mjs Three gates read the tree's name instead of assuming it 2026-09-25 22:27:09 +00:00
check-legend-export-reachable.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-legend-info-localized.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-legend-matches-source.mjs gates: two unwired checks were red on main, and nothing could tell us 2026-09-24 15:53:58 +00:00
check-library-index.mjs library-index gate: ask whether the menu drifted, not whether a file is older 2026-09-24 13:29:58 +00:00
check-link-rot-sample.mjs Check 5fish links too, and say why YouVersion stays out 2026-09-25 02:44:37 +00:00
check-list-prop-unit.mjs The people-group list is a universal prop: the same maps can show any project's list 2026-09-26 05:16:02 +00:00
check-locale-reachable.mjs Rename the output folder to dx-maps 2026-09-25 19:26:14 +00:00
check-manifest-covers-discovery.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-map-data-painted.mjs A map leaf must have our data on it, not just a basemap 2026-09-26 04:38:59 +00:00
check-map-embed-cells.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-map-fly-reduced-motion.mjs Maps stop flying for readers who ask for reduced motion: useMapFly decides it for every camera move 2026-09-26 04:38:59 +00:00
check-map-props-unit.mjs Engine and token props: a token-service URL is honoured, Clear clears, and a pending token is awaited 2026-09-26 03:34:15 +00:00
check-map-unmount-guard.mjs useMapInstance: a map unmounted mid-initialise returns quietly instead of throwing 2026-09-25 05:01:13 +00:00
check-map-unmount-mid-init.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-maplibre-layer-drops.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-mfe-two-tab.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-mjs-parses.mjs
check-mst-clustering.mjs "MST" clustering draws again: a true spanning tree in under a second instead of a 12-second freeze 2026-09-26 04:38:59 +00:00
check-nav-reachable-mobile.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-nested-token-delivery.mjs Token gates follow the auto engine: no token ships, and an explicit engine beats an available token 2026-09-26 03:37:53 +00:00
check-no-absolute-paths.mjs
check-no-conflict-markers.mjs Correct the record: the dead bundle was my merge, not a duplicate import 2026-09-25 10:19:07 +00:00
check-no-eval.mjs No bundle needs CSP 'unsafe-eval': translations compile without eval, and the partner CSP is documented 2026-09-26 05:50:24 +00:00
check-no-internal-codename.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-no-orphan-gates.mjs
check-no-public-binds.mjs
check-no-stale-sweep-claim.mjs Stop telling readers the audio sweep is unfinished — it finished 2026-09-25 02:57:50 +00:00
check-one-palette.mjs check:one-palette reads only the PALETTE export's values, not every hex to the end of the file 2026-09-26 08:03:23 +00:00
check-packet-browser.mjs Queue the browser gates, and let them serve their own tree 2026-09-24 17:43:32 +00:00
check-packet-render.mjs The funnel states the list it was actually drawn from 2026-09-26 08:13:34 +00:00
check-packet-strings-parity.mjs
check-packets-all.mjs Something in CI actually requires page 2 2026-09-26 08:13:34 +00:00
check-pinned-umd.mjs One pinned-UMD loader for PPLR and the Wall: library/utils/loadPinnedUmd.js 2026-09-26 07:24:25 +00:00
check-popup-escaping.mjs Map popups show data as text: a people-group name or country field can no longer run script 2026-09-26 05:50:24 +00:00
check-poster-card-fits.mjs Three gates read the tree's name instead of assuming it 2026-09-25 22:27:09 +00:00
check-poster-degrades-honestly.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-poster-print-fallback.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-poster-prints.mjs Six more browser gates measure THIS build or nothing 2026-09-25 10:03:16 +00:00
check-poster-raster.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-poster-wall-localised.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-prayer-walk-planner.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-print-geometry.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-profile-descriptions.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-provider-switch.mjs Token gates follow the auto engine: no token ships, and an explicit engine beats an available token 2026-09-26 03:37:53 +00:00
check-published-matches-build.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-published-tree-weight.mjs public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
check-quoted-scripts.mjs
check-raw-map-rtl-shaping.mjs Raw maps shape Arabic, Persian and Hebrew place names: cities-internet and key-cities 2026-09-25 18:59:31 +00:00
check-research-gallery-embed.mjs Export gate reads the tree name from the build config 2026-09-25 21:32:35 +00:00
check-scrim-covers-viewport.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-script-flags-reachable.mjs
check-sfc-script-parses.mjs
check-share-policy.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-shared-component-reached-bundles.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-shot-distinctness.mjs README: three outputs, not five methods; a Languages section; screenshot gates see every shot again 2026-09-25 19:40:03 +00:00
check-shot-fidelity.mjs
check-shot-fonts.mjs
check-shot-freshness.mjs README screenshots retaken after d1af039a; freshness-gate comments name the tree, not the old folder 2026-09-25 22:05:39 +00:00
check-snapshot-guard.mjs A half-finished catalogue fetch can no longer overwrite a good one 2026-09-24 11:59:48 +00:00
check-spa-tab-order.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-studio-every-plugin.mjs Browser gates: measure THIS build, or measure nothing 2026-09-25 08:20:11 +00:00
check-surfaces-read-the-tier.mjs Tell the curated tables that GRN and Scripture Earth exist 2026-09-24 22:15:53 +00:00
check-synced-css-copies.mjs
check-tab-radius-token.mjs
check-tabs-localized.mjs Six more browser gates measure THIS build or nothing 2026-09-25 10:03:16 +00:00
check-tauri-config.mjs
check-universal-props.mjs The people-group list is a universal prop: the same maps can show any project's list 2026-09-26 05:16:02 +00:00
check-upg-map-data-painted.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
check-url-resolver.mjs
check-verification-tags.mjs
check-vision-card-numbers.mjs Six more browser gates measure THIS build or nothing 2026-09-25 10:03:16 +00:00
check-zone-census.mjs
clean.mjs public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
dev-server.mjs The dev server says which commit it serves (/__dev-sha), and a helper finds the shared one 2026-09-26 03:34:30 +00:00
drop-portability-check.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
embed-smoke.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
fix-sri.mjs Freshness covers every bundle a landing can have staled; SRI repairs keep the gallery's manifest copy 2026-09-25 22:09:40 +00:00
generate-capability-exemplars.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
generate-gallery.mjs public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
generate-library-index.mjs
generate-packet-fixture.mjs packets: give CI something to check, instead of a sweep that always SKIPs 2026-09-24 14:33:36 +00:00
generate-tree.mjs A complete India ADM1 (36 states) is staged beside UPG-100's 34-unit partition 2026-09-26 08:13:33 +00:00
i18n-areas.mjs Each bundle carries only the translation areas it uses (people-groups-grid 611 KB -> 210 KB) 2026-09-26 07:24:25 +00:00
inline-parse-check.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
install-shell.mjs
landing-preconditions.mjs Landing precondition 0: no file in the commit, public/ included, may hold a merge-conflict marker 2026-09-26 07:58:06 +00:00
legend-columns-probe.mjs The last browser scripts refuse to measure a tree or dev server that is not this checkout 2026-09-25 11:10:34 +00:00
long-frames-probe.mjs The last browser scripts refuse to measure a tree or dev server that is not this checkout 2026-09-25 11:10:34 +00:00
measure-map-load.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
mobile-sheet-probe.mjs The last browser scripts refuse to measure a tree or dev server that is not this checkout 2026-09-25 11:10:34 +00:00
plugin-gallery-smoke.mjs The last browser scripts refuse to measure a tree or dev server that is not this checkout 2026-09-25 11:10:34 +00:00
public-hygiene-check.mjs public/ is one folder again: drop the stale doxa-maps/ bundles a rebuild re-added, and make that a hard failure 2026-09-25 19:54:59 +00:00
readme-shots-fix.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
readme-shots.mjs readme-shots: tokenless by default, so the README shows the MapLibre look keyless embeds get 2026-09-26 04:38:13 +00:00
run-parallel.mjs Browser gates: two slots with a memory floor, not one mutex 2026-09-25 07:37:26 +00:00
serve-strict.mjs public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
set-app-start-page.mjs public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
settled-tree-gate.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
share-roundtrip-smoke.mjs The last browser scripts refuse to measure a tree or dev server that is not this checkout 2026-09-25 11:10:34 +00:00
smoke-studio.mjs The last browser scripts refuse to measure a tree or dev server that is not this checkout 2026-09-25 11:10:34 +00:00
smoke.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
sri-consistency-check.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
staging-forge.css
staging-forge.js Host locale: gate the profile-config contract, forward ?lang= into staging embeds, stop losing gate stderr 2026-09-25 12:18:26 +00:00
staging-reference-v2.html Host locale: gate the profile-config contract, forward ?lang= into staging embeds, stop losing gate stderr 2026-09-25 12:18:26 +00:00
sync-app-shells.mjs public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
sync-dropin.mjs public/ is one folder: the output tree plus a README, with the Plugin Studio as its front page 2026-09-25 17:41:56 +00:00
template-literal-check.mjs
theme-flash-probe.mjs The last browser scripts refuse to measure a tree or dev server that is not this checkout 2026-09-25 11:10:34 +00:00
verify-5-capabilities.mjs The docs stop handing the next reader a 404 2026-09-25 22:49:37 +00:00
verify-browser-all.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
verify-gospel-map.mjs Merge branch 'main' of https://git.nuxtbase.app/doxa-life/doxa-maps into bundler-3/work 2026-09-25 21:38:20 +00:00
verify-map-paint.mjs Leaf pages load only the engine their provider asks for: no Mapbox requests under MapLibre 2026-09-25 23:44:04 +00:00
verify-shell-scroll.mjs Tooling reads the tree's name from the build config, in one place 2026-09-25 16:25:22 +00:00
vite-plugin-strip-shadow-css-comments.mjs
write-token.mjs