doxa-maps/library/scripts/posters
Doxa Maps 3ef164c014 The deaf zone could not be generated at all, and five more resolved to nothing
check:packets-all reported "zones covered : 2 of 28", which reads as twenty-six nobody had got
round to. Six of those twenty-six could not be generated by ANY command, for two causes, and the
report could not tell the difference between a gap you close by working harder and a gap you
cannot close at all.

1. `deaf` WAS UNREACHABLE BY CONSTRUCTION. allZones() looped three keys of clusters.json —
   lists (13) + asia_lists (12) + uncovered_lists (2) = 27 — and the file carries zones in a
   FOURTH, deaf_lists (2), which legend-tree.js collapses into ONE unified leaf (affinity bloc
   A017). legend-tree.js:106 states the real arithmetic: "13 + 12 + 2 + 1 deaf = 28". So `deaf`
   was a poster and a legend row with no obtainable packet: ONLY=deaf exited 1, "no zone matches".
   Fixed by enumerating through leafZones(buildLegendNodes(...)) — the SAME seam the poster
   generator and upg-100-list.vue use, so all three now agree on what a zone is. Leaves do not
   carry selectors, so they are re-attached by id exactly as generate.mjs:2801-2808 does it.

2. THE FIELD LIST WAS PART OF THE SELECTOR CONTRACT AND NOBODY HAD SAID SO. The records query
   asked for country_code and no other selector field, while selector-evaluator reads three more:
   rop1 (affinity_bloc -> deaf), wagf_block (west/east/central-africa) and wagf_region (europe,
   and the southern-africa-islands union). Those six zones evaluated to an EMPTY set for every
   record and were skipped as "no groups resolved" — which reads as missing DATA and was missing
   FIELDS. The tell: the records cache holds 123 groups with "Deaf" in the name and evaluate()
   still returned 0 slugs. Verified both directions against the evaluator — 0 slugs when a record
   lacks the field, the correct slug (and only that one) when it carries it, for all six selectors.
   The list is now DERIVED from presentation fields + the evaluator's own requirements, so a new
   selector type is a change in one place rather than a superset someone must remember to widen.

3. OFFLINE=1 WAS DOCUMENTED AT THE TOP OF THIS FILE AND COULD NEVER HAVE WORKED. loadRecords()
   has an OFFLINE branch that needs no API, but the fail-closed guard ran first and exited 1
   without consulting it. The note above that guard records it being taught about PACKET_RECORDS
   for this exact reason; OFFLINE was never added. Worse than an undocumented flag: it sends a
   reader down a route the program refuses. Any env var that makes the API unnecessary is now
   named at the guard.

MEASURED, not assumed: an ordinary zone still builds identically through the new enumeration
(Tibet, 43 groups / 7 pages, check-packet-render PASS with --expect-funnel), all 28 zones now
carry a selector, and OFFLINE=1 generated 22 of them from the cache. The other six need a
records source carrying wagf_block/wagf_region/rop1; the cache predates the fixed field list, so
their render is still unverified and the gate now says so by name rather than by count.
2026-09-27 01:27:47 +00:00
..
data feat(posters): capitals and major cities on the country maps 2026-09-24 02:21:03 +00:00
fixtures packets: fixtures at the PAGE BOUNDARY, which nothing had ever rendered 2026-09-24 23:53:07 +00:00
snapshots Complete app-profiles->plugin-designs sweep across comments/docs; build green; layouts kept at root (load-bearing) 2026-09-17 18:18:19 +00:00
build-gallery.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
build-hd-gallery.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
emit-countries.mjs Regions: expand a region to its country posters, reusing the shared wall 2026-09-24 04:26:29 +00:00
export-public.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
generate.mjs fix(posters): measure the full-version header instead of guessing 460 2026-09-24 03:31:01 +00:00
make-previews.py 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
osm-basemap.mjs Prepare repo to the vision: BLUF vision-cast README, library warning, SRI injection, term scrub 2026-09-15 22:58:19 +00:00
packet-strings.json A packet says which list it holds, in the reader's language 2026-09-26 07:39:35 +00:00
packet.mjs The deaf zone could not be generated at all, and five more resolved to nothing 2026-09-27 01:27:47 +00:00
poster-regions.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
publish-html.mjs The poster print preview rasterises too, and a deployment can ship sources without rasters 2026-09-24 08:07:22 +00:00
README.md consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
serve-persist.sh doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
serve.sh doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
shoot.mjs doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
verify-posters.mjs Simple Research + Big Picture: the host's style stops at the box, and the last English goes 2026-09-25 08:19:56 +00:00

library/scripts/posters/ — UPG-100 poster generator

Renders one 3ft × 3ft print poster per zone (28 today) for the my-upg-100-list profile, from the profile's own data. It ships inside the repo alongside that data on purpose — reaching for the data via an env var once silently rendered stale posters (Nepal, Bangladesh, Bhutan vanished).

  bun run posters  ->  posters:shoot  ->  (WebP previews)  ->  bun run build
   HTML per zone       PNG @3000²        assets/previews/     app shows them
  • generate.mjs is the template; shoot.mjs screenshots to PNG (Firefox only — privacy-first policy).
  • A template change is not visible in the app until previews are regenerated and the app rebuilt.
  • Exported PNGs go to a sibling folder (../../../upg-100-posters/), never public/ — Capacitor packages public/ wholesale.
  • snapshots/ holds frozen template versions (v5 is the approved current); each has its own README.

Full reference — files, env vars, gotchas, measurement discipline: ../../../documentation/architecture/poster-generation.md.