Commit graph

1094 commits

Author SHA1 Message Date
Doxa Maps
0b13b58ecb Gates start no dev backend: DOXA_NO_DEV_BACKEND=1 (set by the gate runner) keeps vite's offline answers and skips the PocketBase download, the process and its port 2026-10-01 13:38:28 +00:00
Doxa Maps
c4b756b65a Merge remote-tracking branch 'origin/development' into upg100/pg-names
# Conflicts:
#	package.json
2026-10-01 13:25:01 +00:00
Doxa Maps
ea5a5bf8ae Merge origin/development into gospel/b14-gate-fp 2026-10-01 12:50:29 +00:00
Doxa Maps
84d5800106 Merge origin/development into gospel/b14-gate-fp 2026-10-01 11:57:59 +00:00
Doxa Maps
c626a1fc02 Packet fixtures build in their own directory, so the real Tibet zone packet survives check:packet-offline 2026-10-01 10:52:55 +00:00
Doxa Maps
81fd6dc7d5 Landing precondition: a library change's freshness scope includes shipped bundles the manifest does not list (template-bundle) 2026-10-01 10:52:55 +00:00
Doxa Maps
448ef0ac70 Merge development (a77a3280f: the shell header, the docs) into the whole-India landing
# Conflicts:
#	package.json
2026-10-01 10:02:25 +00:00
Doxa Maps
a77a3280f3 Merge origin/development (d6950c008) into studio/shell-header 2026-10-01 09:52:20 +00:00
Doxa Maps
edda4017b3 Merge development (d6a53486f, UPG-100 wall count) into the whole-India landing
# Conflicts:
#	package.json
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/my-upg-100-list/my-upg-100-list.js
#	public/dx-maps/my-upg-100-list/poster-wall/index.html
#	public/dx-maps/my-upg-100-list/upg-100-list/index.html
#	public/dx-maps/my-upg-100-list/upg-100-mfe/index.html
2026-10-01 09:46:12 +00:00
Doxa Maps
2f163e04c1 Large side-lane sheets: photos print in the sheet's own document, and a raster never draws a broken image
Measured on the 60x96 print: every photo beside a name rasterised as the browser's broken-image glyph. An SVG
rasterised through <img> is an isolated document that fetches no external resource, and none of the people-group
photo hosts (media.joshuaproject.net, joshuaproject.net, images.peoplegroups.org and its resizer,
peoplegroupspublic.blob.core.windows.net, s3.doxa.life) sends CORS, so a photo cannot be inlined as data: in the
browser either.
- poster-raster.js: rasterPoster drops every <image> whose href is not data: (the basemap tiles are data: and stay),
  so a download shows the paper, never the glyph. hasExternalImages() says when a sheet carries such photos.
- PosterWall: printing a generated sheet that carries photos prints THE SHEET ITSELF through printDocument, where
  the photos load, on its own @page (60in 96in), instead of a raster shrunk onto letter. Same HUD steps.
- check:side-lanes: photo arms (0 external images reach the raster; the wall prints such a sheet as a document),
  each with a poison in its self-test.
- check:side-lane-photo-pixels: the pixel side, a browser gate (a data: photo draws red; 99/99 external slots stay
  flat; without the strip 0/99 do). Declared on-demand until its first browser-seat run.
2026-10-01 09:45:33 +00:00
Doxa Maps
d6a53486f6 Merge remote-tracking branch 'origin/development' into upg100/wall-count
# Conflicts:
#	package.json
2026-10-01 09:34:09 +00:00
Doxa Maps
9a40b864bd Merge origin/development (42bc19889) into studio/shell-header 2026-10-01 08:42:57 +00:00
Doxa Maps
1e925c4d71 Gospel checks: the field-card shards are expected from the roster, not read as one file, and German 'Ring' is the same word on purpose 2026-10-01 08:37:17 +00:00
Doxa Maps
b8cf0db0c8 Merge remote-tracking branch 'origin/development' into upg100/pg-names
# Conflicts:
#	package.json
2026-10-01 08:35:25 +00:00
Doxa Maps
8896ad2130 Merge remote-tracking branch 'origin/development' into upg100/wall-count
# Conflicts:
#	internal/check-batch-selection-export.mjs
#	package.json
#	plugin-designs/my-upg-100-list/data/selection-export.js
#	plugin-designs/my-upg-100-list/poster-wall.vue
#	plugin-designs/my-upg-100-list/upg-100-list.vue
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/my-upg-100-list/my-upg-100-list.js
#	public/dx-maps/my-upg-100-list/poster-wall/index.html
#	public/dx-maps/my-upg-100-list/upg-100-list/index.html
#	public/dx-maps/my-upg-100-list/upg-100-mfe/index.html
2026-10-01 08:24:48 +00:00
Doxa Maps
cbafb21921 Merge origin/development (86a81cc44) into studio/shell-header 2026-10-01 07:49:52 +00:00
Doxa Maps
9b0f815e7c Merge origin/development (86a81cc44) into studio/poster-sizes 2026-10-01 07:49:08 +00:00
Doxa Maps
7ea7195646 Pin hint: an inner scroller counts as a scrolling page, a map off the viewport is on one, and a stale lift is dropped
DX Life's /pray at 1440 kept the pill at the viewport's bottom until the map's bottom came into view: the page
scrolls a container, not the document, so the document-only test saw a full-screen page and kept the fold.
pageScrolls now also walks out from the pill, across shadow roots, for an ancestor scroller whose content is
taller than it; a map wholly below or above the viewport is treated as on a scrolling page; and a lift is
cleared when the pill goes off screen, so a lift set while the map was half visible does not survive into the
next view. check:pin-hint-floor adds the inner-scroller, shadow-crossing and map-below-the-fold fixtures; its
self-test refuses 9 planted defects.
2026-10-01 07:11:18 +00:00
Doxa Maps
9e0b52386d Merge origin/development (6dc2206c8) into studio/pinhint 2026-10-01 06:56:45 +00:00
Doxa Maps
ba022f68f9 Merge origin/development (d3b879c94) into studio/pinhint 2026-10-01 06:32:47 +00:00
Doxa Maps
852437e981 Merge remote-tracking branch 'origin/development' into upg100/state-packet 2026-10-01 06:32:09 +00:00
Doxa Maps
cdbda65a06 People-group names: the threshold pinned, no trust without Latin evidence, raw indexing flagged
Folds in the review's four points:
(a) check:pg-name-gate plants a row with EXACTLY two far Latin locales, which must
    show English, so a rule that needs three fails.
(b) A row with fewer than two Latin names cannot be checked (117 rows), so it now
    shows English too. The whole table: 8,172 of 21,419 (38.2%).
(c) The one-reader scan also flags a file that imports the helper but still
    indexes rows itself (`.names[`), with negative controls both ways.
(d) The helper documents that callers always pass `english`.
Seven mutants of the helper each fail the gate.
2026-10-01 06:04:41 +00:00
Doxa Maps
31e5c3e5f9 UPG-100 batch selection: a state-only selection prints its Prayer list and Card deck
The packet and card-deck title named the selection's zones and countries only.
Since India's states bring people, a selection of states alone had no names, and
reduce() threw "Reduce of empty array with no initial value" at the reader.
selectionTitleNames (data/selection-export.js, pure) adds the states and union
territories that brought people. A province with no table is not named. A
selection that brought nobody (Mizoram or Nagaland alone) gives the keyed
"no people groups to print" instead.

check:batch-selection-export arm A6 tests it on the real served table: Gujarāt
alone is titled "Gujarāt", a state + a country names both, a province beside it is
not named, and Mizoram alone reads the keyed text. Its negative control shows the
old naming is empty and reduce() throws. The call site is pinned in arm C. Four
mutants each fail.
2026-10-01 06:00:55 +00:00
Doxa Maps
6e80da212c People-group names: one helper decides when a localized name can be shown
library/utils/peopleGroupName.js (pure) returns a group's name in the reader's
language only when the row's names are transliterations. When two or more of its
Latin-script names (fr pt es tl id de) are far from the English one (bigram Dice
< 0.5), the row was machine-translated as words (Balantak → "Balance",
Balo → "Sac à dos"), and every locale of that group shows English. That is
8,055 of 21,419 rows (37.6%). it and ro have no column and show English; zh
reads zh_CN. A fallback shows the caller's own English name.

check:pg-name-gate (gates:pre) proves it on the real table: the 4 known
translated rows show English in 7 locales, Balangao Bontoc keeps its names,
planted rows are two-sided, the whole-table fallback stays between 30% and 45%,
and no file outside the helper reads pg-names rows (pplr-data-maps is the
exception; the scanner is negative-controlled). Five mutants of the helper each
fail it. No consumer is wired yet.
2026-10-01 05:52:31 +00:00
Doxa Maps
59afad5a33 check:no-fleet-names: names in any case, the plugin agents' names, and the translation catalogues scanned too; the self-test plants each 2026-10-01 05:42:24 +00:00
Doxa Maps
2f7eaae8e3 check:no-fleet-names: source names no build-team member, attributes no request to a user, carries no dated QA tag
A sweep brought tracked source to 0 such lines; this gate keeps it there. It scans every tracked text file
except research data, build output and the translation catalogues, and allows only named lines (a file plus
the exact line, with its reason), never a whole file; the list is empty, since the gate builds its own
patterns from parts. gates:pre runs it; gates:post runs its self-test, which plants each class and checks
the per-line allowance.
2026-10-01 05:36:29 +00:00
Doxa Maps
cc4cbb7955 P assembly: a gate comment names the browser check, not who ran it 2026-10-01 05:32:44 +00:00
Doxa Maps
77751ddcb6 Merge origin/development (53fcf6d09) into studio/p-assembly 2026-10-01 05:32:16 +00:00
Doxa Maps
b6777218e3 Merge remote-tracking branch 'origin/development' into poster-design-plugin/zero
# Conflicts:
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/my-upg-100-list/my-upg-100-list.js
#	public/dx-maps/my-upg-100-list/poster-wall/index.html
#	public/dx-maps/my-upg-100-list/upg-100-list/index.html
#	public/dx-maps/my-upg-100-list/upg-100-mfe/index.html
2026-10-01 05:18:28 +00:00
Doxa Maps
289d31e3f4 Merge remote-tracking branch 'origin/development' into upg100/batch-tap
# Conflicts:
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/manifest.json
#	public/dx-maps/my-upg-100-list/my-upg-100-list.js
#	public/dx-maps/my-upg-100-list/poster-wall/index.html
#	public/dx-maps/my-upg-100-list/upg-100-list/index.html
#	public/dx-maps/my-upg-100-list/upg-100-mfe/index.html
2026-10-01 05:12:05 +00:00
Doxa Maps
f3851da57c PosterWall: sectionItemCountKey, so one section can be counted in its own words
The Country Posters India section headed "855 people groups · 37
countries", which is untrue: its cards are India's own and one per state
and union territory. sectionItemCountKey (default null: every section
counted with item-count-key, as before) lets a wall answer, per section,
an i18n plural key, or { key, n } to count n rather than the section's
card count, or null to keep the default.

Walls that do not pass it render byte-identical trees before and after
(a differential render of an upg100-style and a country-posters-style
wall). check:poster-wall-host-seams arm K: a named section counts in its
own key and number, an unnamed one keeps the default; it fails with the
prop ignored.
2026-10-01 05:10:55 +00:00
Doxa Maps
24f3e4176a PosterWall: a section head names its people-group total only when there is one
A section head read "<n> people groups · <items>" always, so a wall whose
cards count no people (Poster Design's gallery of templates) showed
"0 people groups · 4 lists" on every head. The total and its " · " now
leave together when the total is 0, the rule the cards already follow with
v-if="item.count". The head is still one string in one interpolation, so a
section with a total renders exactly the text it always did, whitespace
included: a differential render of an upg100-style wall and a
country-posters-style wall, before and after, gives identical trees.

check:poster-wall-host-seams gains arm J (a head with people keeps its
total; one without reads its items alone); the old head line fails it.
2026-10-01 05:10:55 +00:00
Doxa Maps
4b8e9de925 check:batch-selection-export A5: bound the refused-connection probe at 2 s, so a host running the discard service on port 9 cannot hang the gate 2026-10-01 05:05:30 +00:00
Doxa Maps
0907d96de2 UPG-100: one digit system per sentence, and no raw error after a failed load
The wall intro writes its total in the digits the translated sentence already uses
(countInSentence): ar shows ٢٬١٠٧ beside its own ٢٧ and ٩:١٤, while CLDR's bare
'ar' would have formatted 2,107. Locales whose sentence uses Western digits are
unchanged. The fetching status goes through the same helper.

A people-group load that fails without a catalogue key (the 30 s abort, a dropped
network) now reads as the stall text, "still loading, try again in a moment",
instead of the browser's own English ("signal is aborted without reason"). Keyed
errors keep their own text, and the failed load leaves the cache, so the next Copy
fetches again.

check:upg-count arm E renders the intro through each locale's catalogue and
requires one digit system, with a negative control on the old ar render. Its
separator scan now also reads fr U+202F and ru U+00A0. check:batch-selection-export
arm A5 aborts a real fetch and refuses a real connection; both must read as the
stall text, and the old path must still show the raw message.
2026-10-01 01:06:44 +00:00
Doxa Maps
f526ef3d4f P: merge 9ed84bd56 2026-10-01 00:56:02 +00:00
Doxa Maps
a204752597 P: merge 2c397d25e 2026-10-01 00:55:59 +00:00
Doxa Maps
c5687142ae Merge origin/development into studio/scrub 2026-10-01 00:46:07 +00:00
Doxa Maps
2c397d25ef Source comments state design history and measurements as facts, without quoting or naming anyone
Comments in library/ and internal/ that quoted a person, attributed a decision to one, used first person,
named fleet agents or carried private host names now state the same technical fact in neutral words:
poster-render (including the comments it writes into generated posters), packet-render, the poster and
research scripts, PosterWall, DataTable, the legends, the layouts and the gates. The network-policy note
states the policy itself. Behaviour is unchanged: a few printed gate messages and reason labels drop an
agent name, the poster-render integrity pin follows its comment-only edit, and series.json changes only in
its _meta and _why notes. The historical poster design snapshots (library/scripts/posters/snapshots/),
which nothing reads, are removed.
2026-10-01 00:37:17 +00:00
Doxa Maps
9ed84bd56c P (repo), follow-up: three more lines without a quote or an agent name
staging-reference-v2.html's header states its design in plain words instead of a dated quote
(nothing reads the file; only file-map.md names it). THIRD-PARTY.md and
reference-universal-props.md no longer name an agent.
2026-10-01 00:28:26 +00:00
Doxa Maps
2eaea5cedf P (repo): neutral wording in the gates and docs, and no private-process checks
Comments, messages and docs only; no check logic changes.
- The role-word gate is renamed check-no-internal-role-nouns (and its baseline fixture). Same
  logic: it builds the word from parts so the file does not carry it, and a planted line in
  title case and in capitals still fails it while WebDriver and "GPU driver" do not.
- public-hygiene-check: the two role patterns are built from parts (the regexes are byte-
  identical), the header loses the forge and date wording, and the prayer comment loses its
  decision date. Its output on the tree is identical in normal and --strict modes.
- landing-preconditions, check-no-public-binds, check-published-tree-weight: no fleet tool
  name, no "this box", no forge name in comments and messages.
- Removed: check-backlog-refs, check-backlog-status-enum, check-done-evidence,
  check-verification-tags and check-dxlife-untouched (they police a private backlog and
  workspace), with their scripts, docs, gate-list entries and orphan-baseline entry, and the
  committed needs-eyes pages (check-embedded-rtl --emit writes them on demand).
- package.json docs: no agent names. Docs: the stale check mentions and the snapshot
  references are gone (the snapshots themselves leave in the studio P commit).
gates:pre: PASS 115, FAIL 0, NOT MEASURED 1 (browser seat).
2026-10-01 00:25:38 +00:00
Doxa Maps
7b1730e8aa Comments name what measured a fact, not who: the tree generator, the Mapbox draw gate, the profile metadata and the admin proxy 2026-10-01 00:07:34 +00:00
Doxa Maps
c870daa803 Pin hint: on a page that scrolls, the pill sits at the map's bottom instead of hanging at the fold
On a partner home page the map is a block in a scrolling page. The clamp floored the pill at the viewport
fold, so a map whose bottom was below the fold at load had its pill lifted to mid-map, re-set by the settle
timers and resize observers, and left there after a scroll, then dropped. The fold now counts only on a
page that does not scroll (a full-screen pane or leaf, where a phone's browser bar can cover the bottom);
the legend sheet and the licence credit still lift the pill everywhere. The floor is a pure function
(pinHintFloor.js), and check:pin-hint-floor proves both cases; its self-test refuses 5 planted defects.
2026-09-30 23:57:11 +00:00
Doxa Maps
1bfe4d7353 Poster sizes: the ladder offers eight sizes (paper, 18x24, 36x36, 36x48, 36x60, 36x66, 66x66, 60x96)
Every size up to 36x66 prints on one sheet; 66x66 is two 36x66 sheets glued side by side over 6 in, and 60x96
is three 36x60 sheets stacked over 6 in overlaps. 36x48 moves from legacy into the ladder (3x4ft still
resolves to it); 24x36 stays legacy. check:poster-sizes now also refuses a size that is both offered and
legacy, and a glued size other than 66x66 and 60x96; its self-test refuses 10 broken tables.
2026-09-30 23:49:05 +00:00
Doxa Maps
51524b7897 A poster series for India's states and union territories; series-isolation sees shared wording and poster text correctly
series.json: a new `indiaState` series, modelled on `country`, so a state poster names itself honestly
("India State Maps", "What is a State Prayer Map?", one sheet for each state and union territory of India,
"which state God has put on their heart"). The country series' text would have called Gujarāt one of the
~170 Country Maps. Approved as the default wording; shown as editable.

check:series-isolation, two blind spots found by adding a third series:
- Shared wording was dropped from only the EARLIER series (sets were mutated while still being compared),
  so the later one kept it as a fingerprint and the earlier failed for carrying it. The shared set is now
  found on the original sets. Self-test: three series in any order; the old loop fails it.
- The contamination scan never read a series' `poster` block, where a country poster once printed the
  UPG-100 side box. It does now. The phrases that NAME country and indiaState are hand-listed, so a
  verbatim copy of one's framing into the other is caught even though symmetric dropping treats it as shared.
  Self-test 9/9, including both directions of a country/state copy.

countrySheet.js: the seriesFor comment no longer says "map 1 of 0" was printed; it was latent (the map-only
packet page prints no series line, and the India poster is gated), as a rendered check showed.
2026-09-30 23:33:34 +00:00
Doxa Maps
0b266d8110 UPG-100 batch selection: a stalled people-group load can never hang Copy. Copy waits at most 8 s (settleWithin), then copies the territory lines apply-grouping needs and says the people groups are still loading (11 locales); the records fetch aborts after 30 s and leaves the cache. The gate proves a never-settling source still settles in time 2026-09-30 23:28:59 +00:00
Doxa Maps
25982d717f Shell header: a phone bar and a rail-bottom language slot for header-off shells, and a shared language menu that asks the host first
VerticalTabsLayout, header off: on a phone a 44px bar (a real grid row) replaces the floating corner
circle, with the rail toggle at the inline start and a #phone-end slot at the end; on a desktop a
#rail-end slot sits at the bottom of the rail (it receives `collapsed`). Neither renders with a header
on, so header-on consumers and desktop layouts without a filler are unchanged. The --map-fab-* footprint
is no longer published; its readers fall back to their plain insets.

ShellLanguageMenu fills either slot: the switcher's languages plus the current one, a native select
under a globe face. A pick dispatches one cancelable, composed, bubbling doxa-language-request on the
host element (library/utils/languageRequest.js). A host that cancels keeps the language; otherwise the
menu emits 'switch' and writes ?lang= only on a page the tree generated.

check:shell-header (gates:pre, Vite SSR) asserts where the bar and the rail slot render, the event's
shape and count, cancel and no-cancel, the ?lang= rule and the language list; its self-test (gates:post)
refuses 11 planted defects. check:nav-reachable now presses the bar's toggle.
2026-09-30 23:28:52 +00:00
Doxa Maps
85508b899d UPG-100: the list's total is never written into a sentence. The wall intro (upgMap.wallIntroA, {n} in 11 locales) and the fetching status take it from the funnel's last step (2,107 today; the intro printed a stale 2,106), formatted for the reader. New gate check:upg-count (gates:pre), mutation-tested 2026-09-30 23:27:02 +00:00
Doxa Maps
9f246e4710 UPG-100 batch-tap gate: the pin handler adds no second territory toggle (one pin tap in batch mode = exactly one toggle, from the tapestry listener); a double-toggle variant FAILS 2026-09-30 23:18:11 +00:00
Doxa Maps
2e6f6a59e6 UPG-100 batch mode: a tap on a people-group pin selects the territory under it and opens no detail sheet (the sheet covered the whole batch HUD on a phone, and in a dense state nearly every tap lands on a pin); outside batch mode pins behave as before. Gated; my-upg-100-list rebuilt with the tree and SRI 2026-09-30 23:17:20 +00:00
Doxa Maps
aace7cf884 Poster sizes: one shared ladder for every print surface (paper, 3x3 ft, 3x5 ft, 5.5x5.5 ft, 5x8 ft)
library/constants/posterSizes.js gains POSTER_LADDER: five portrait sizes keyed WxH in inches, each with the
sheets a printer feeds (named as panelSheets.js planPanels() takes them), whether a photo slot fits, and how
it reaches paper (the browser's print for paper, a print-shop PDF for the rest). Legacy 24x36 and 36x48
still resolve, older names (3x3ft, 5x8ft, letter, a4...) alias to the ladder, and paperFor() picks Letter
or A4 from a locale's region. The existing map-export presets are unchanged.

check:poster-sizes (gates:pre) audits the table: the order matches the ladder, keys are dot-free, every
size is portrait, the sheets glue up to the finished size, photos on exactly the two large sizes, paths,
aliases and the paper fixtures. Its --self-test refuses 8 broken tables.
2026-09-30 23:03:39 +00:00