deriveTreeBase() called inside build() returned '' (document.currentScript is
null by then), so the India boundaries loaded from /assets (the host's HTML
page) and the poster failed with 'Unexpected token <'. Use the house helper
resolveAssetsBase(profileConfig): the shells pass an absolute assetsBase, and
the standalone leaf falls back to the bundle's own tree root (import.meta.url,
captured at load). Verified: the leaf draws the 3-sheet poster, 0 errors.
The Experimental folder gains a bless-india-posters row, provisional until
its bundle is in the tree (a missing bundle prunes the row, so nothing shows
before it lands), with its label in all 11 locales. Its root is a
natural-height page of poster cards, so a row may set scroll: the element is
then mounted unpinned at its natural height and the pane scrolls it, instead
of being pinned to the pane, which would trap the page's own content.
check:posterverse-shelf expects the row and the scroll set by name; its
self-test drops the row and drops the flag.
A public preview plugin for the whole-India poster: every India people
group on one printable sheet, generated live from the current data
(nothing stored) and shown as its printable sheets with the glue strips.
Each poster carries the blessing — header "Bless India in Jesus' name"
and the Aaronic blessing (Numbers 6:24-26), switchable.
Generates with the plugin's own copy of the renderer; shows the sheets
via the shared PanelSheets and prints as a document at true size.
Public and experimental; a phone sees the preview but Print is blocked
(desktop only) until a design is proven phone-safe. Registers the
blessIndia poster type for the catalogue; label translated in 11
locales. Replaces the earlier India Posters review draft (not landed).
Element <bless-india-posters>.
Every bundle in the landing freshness scope was rebuilt once (21; 12 came out byte-identical), then
the tree and SRI. Nine bundles change. With data-v ids normalised and the old->new wording applied,
seven are identical and gospel-resources differs only by minifier renaming. gospel-internet's one
further change is notice.pin no longer passing {country}. The tree restages the four corrected
tables, and pages and manifests change only their integrity hashes.
Switch forkRoute/placePinsInState to static imports from their sibling
library modules (now on development) and delete the vendored forkRoute
fallback; opts may still override for a Worker. Re-register
check:circular-layout (script + gates:pre + description) after the merge
took development's package.json.
Re-adds the fork-leaders catalogue entries after merging the pilot
(the merge took the pilot's package.json; this restores the new gate's
registration in a separate, reviewable commit).
country-poster.letter, upg100-territory-poster.letter / .3x3 / .3x4 and
wall.bless-36x48 / -24x36 / -60x96 join src/catalogue-names.json, so they
can never be renamed or removed. poster-design rebuilt; tree and SRI
regenerated (the manifest carries the seven blocks and their titles).
Styles and Sizes now name every size the one way (src/sizeText.js, shared):
templates.js carries each size as data (inches, side lanes, panels, paper),
and posterDesign.sizes gains sideLanes, packetPage1, panels and anySize in
all 11 locales, so Arabic readers no longer see "5 x 8 ft, side lanes" or
"Letter, portrait". A plugin's declared size (a ladder key, letter, a4) is
named through the shared ladder.
A plugin's design title came from its labelKey, but Poster Design's bundle
ships only the catalogue areas its own code names, so a plugin's own area
(upgMap, ...) read English. internal/profile-meta.mjs now resolves each
block's labelKey in every locale at build time and carries the titles in
manifest.json (posterDesignLabels, only beside a posterDesign block), and
Styles reads the reader's language from there.
Add a posterDesign block to bible-posters.meta.json (family biblePoster,
name bible-poster.36x60, size 36x60, mobileFriendly false — a whole-book poster
is a large-format print) and a biblePosters.posterDesign.label key in all 11
locales, so the Bible Posters design appears as a reference card in Poster Design.
The profile's meta.json declares one posterDesign block per poster the Wall prints, so they show under
Poster Design, Styles, From other plugins: wall.bless-36x48 (3 x 4 ft), wall.bless-24x36 (2 x 3 ft) and
wall.bless-60x96 (5 x 8 ft, three glued sheets). Family wall, not mobile-friendly (the Wall is desktop only),
titled by the existing wall.blessBanner key (all 11 locales). check:poster-design-catalogue: PASS, 3 valid
blocks, 3 new ledger names; its self-test PASS; i18n-keys-exist PASS.
poster-wall.meta.json declares the poster designs this plugin makes, one block
each (family upgList):
- upg100-territory-poster.letter: the home-printer print (the sheet is generated
at the click). mobileFriendly: true.
- upg100-territory-poster.3x3 and upg100-territory-poster.3x4: the large-format
downloads. mobileFriendly: false (not measured on a phone, so not claimed).
The card title is upgMap.posterDesignTerritory, "UPG-100 territory poster", in
all 11 locales. It uses the word the plugin already uses for a territory in each
language.
P2: test fourSides numbering against GEOMETRY per side (L cy↓, R y↑,
T x↑, B x↓) with a de-overlap drift tolerance, not label-emission order
(which numbering walks, so it could never fail). P3: assert every
pairedRows leader carries polys.length===2. Both mutation-tested: a
reversed side sort and a dropped polys each make the gate FAIL.
Clear check:no-fleet-names (neutral wording for the classic4 reference,
the vendored-fork note, the browser-budget comment, the gate's format
comment and the package.json description). Fix pairedRows leaders[].polys
(was null on every leader — store fork.polys; drop dead polysForCount).
Tie-break ids by code unit (cmpId), not localeCompare, for byte-identity
across runtimes/locales. Harden the gate: assert the fourSides side
sequence L<T<R<B and monotone numbering within each side (by label
emission order), and recount pins-outside-state and pairedRows crossings
from the OUTPUT, not from stats.
Closed, the folder sat mid-drawer under the one short Posters section with
empty space below, so it read as a caption with nothing under it and was easy
to miss on a phone. Open, its plugins show like any section's rows; a reader
can still collapse it. check:posterverse-shelf asserts the open default, and
its self-test plants a closed folder.
The samples arm is now a function the self-test can poison: with withholding
switched off, India (no sheet tier, no outlines) must fail as a sample that
cannot be drawn. Closes the branch the arm had no poison for.
New library/packet/circularLayout.js: ring order, leader routing,
numbered four-sides and paired-row forks as a single pure, Worker-safe
module (geometry in, geometry out; no SVG, no DOM, deterministic). Modes
sideLanes (today's L/R), fourSides (numbered, no leaders) and pairedRows
(two leaders per row). measure/slotOf and placePinsInState/forkRoute are
injected; forkRoute falls back to a vendored copy until fork-leaders is
on this tree. Adds check:circular-layout (frozen 855-pin 60x96 fixture:
ring order, 0 dupes, 0 pins-outside-state, 0 crossings on paired rows,
determinism, a poison, and a node time/heap budget).
India, the one large-sheet country, now prints at 5 x 8 ft only, so the
5.5 x 5.5 ft and 3 x 5 ft side-lane cards would have drawn India's 60x96 sheet
under their own label. They now sample the largest drawable countries (China
at 66x66, Sudan at 36x60) through the same shared sheet path, and their
details say that no country prints at this size today
(posterDesign.missing.noCountryAtSize, 11 locales). The 60x96 card keeps
India and stays withheld. check:poster-design-catalogue now checks every
sample: drawable, or withheld by countrySheet.js.