Its catalog entry was the raw build-manifest record: no category, no staging
page, and an embed that was an object of snippets instead of a staging path.
The library groups by category and opens the staging page, so it could not
list or open it. Now matches the catalog contract (same shape as doxa-maps-spa).
Three bundles stale — country-posters, gospel-resources, regions-dashboard —
all SAME SIZE, DIFFERENT HASH, which is why this is compared by sha384 and not
byte length.
Diagnosed before publishing rather than assuming. Source main had NOT moved
(zero commits since the last publish) and the catalog HEAD was still my own
previous publish, so neither end had changed. The bundles' mtimes settled it:
all three were rebuilt at 02:51:50, six minutes AFTER the 02:45:21 publish.
Another agent rebuilt in this shared worktree, and the rebuild compiled
translation refinements that were already committed but not yet in those
bundles.
The changes are deliberate corrections, verified present in main's committed
source and the superseded forms absent from it:
ru "Загрузить еще" -> "Загрузить ещё" (the ё it should always have had)
ru "Поиск по именам" -> "Поиск по названиям" (names -> titles)
ar "إبحث عن الأسماء" -> "ابحث عن الأسماء" (hamza corrected)
A token-set comparison shows 6 lost and 6 gained per bundle — the same strings
in better form, nothing dropped.
Verified before push: 24 bundles, 22 manifest bundles resolving, 57 leaves with
zero unresolved script srcs, zero bundles carrying the old broken asset path,
tree settled, diff scoped to app/doxa-maps.
check:published found one bundle stale again, one tick after the last publish —
regions-dashboard, 558,958 bytes served against 559,482 built. The PUBLISHED
copy was LARGER's inverse: smaller, which is the direction that warrants a look
before overwriting, since a shrinking bundle can mean something was lost.
Diffed them rather than assuming. The sole difference is a
`@media (prefers-reduced-motion: reduce)` block present locally and absent live
— an accessibility rule honouring readers whose OS asks for less animation.
A token-set comparison found ZERO strings present live and missing locally, so
this publish is strictly additive: nothing is lost, one accessibility feature is
gained.
Nobody had pushed to source since the last publish, so this was not unpublished
work waiting on a merge — it was work that reached main and never got published,
the continuous-drift gap recorded in
OPS-PUBLISH-DRIFT-IS-CONTINUOUS-AND-NOTHING-PROMPTS-A-PUBLISH, demonstrated a
second time.
Verified before push: 24 bundles, 22 manifest bundles resolving, 57 leaves with
zero unresolved script srcs, zero bundles carrying the old broken asset path,
tree settled, diff scoped to app/doxa-maps.
check:published found one bundle drifted since the last publish —
regions-dashboard, 546KB served against 546KB built. SAME SIZE, DIFFERENT HASH,
which is the case the gate compares sha384 for: two builds can coincide in
length and a size check would call that a match.
The drift is real work, not noise: regions landed a395e7bf ("Country page: six
more terms the clone had and live has moved past") after the last publish, so
six translation terms were sitting unpublished.
Verified before push: 24 bundles, 22 manifest bundles all resolving, 57 leaves
with zero unresolved script srcs, zero bundles carrying the old broken asset
path, tree settled, diff scoped to app/doxa-maps and confined to the one bundle
plus the two index files it touches.
852310d0 fixed resolveAssetsBase at source; only my-upg-100-list was rebuilt, so
thirteen other bundles were still published with the off-by-one and their assets
404'd. Found by running check:poster-card-fits against the newly-current live
site: country-posters passed locally and failed live with four preview images
404ing at /plugin-assets/assets/previews/country-*.webp.
All 24 bundles rebuilt (7c8fc15d). Verified before push: zero bundles contain
the +"/../assets" concatenation, 57 leaves with zero unresolved script srcs,
tree settled, diff scoped to app/doxa-maps only.
The previous attempt at this publish (b7fea73, reverted as bb160bc) broke the
live map: resolveAssetsBase computed <treeRoot>/../assets, one segment too high,
so boundary geojson 404'd and the map painted a basemap with none of our data.
Fixed at source in 852310d0 -- the asset pool lives INSIDE the tree, which is
what a leaf's own '../../assets' has always meant and what generate-tree stages.
Now covered by check:embed-base, pure path arithmetic, mutation-tested against
the exact off-by-one.
Verified before push: 24 bundles, 22 manifest bundles all resolving, 57 leaves
with zero unresolved script srcs, boundaries present at the path the fix
targets, tree settled, diff scoped to app/doxa-maps only.
The catalog was serving a tree many merges behind the source. Measured before
this publish: 19 of 19 comparable leaves STALE by SRI hash, 0 current, and three
bundles absent from the catalog entirely (prayer-walk-planner, regions-dashboard,
upg-neighbor) while present in the build.
After: 24 bundles, 57 leaves, every leaf's baked integrity matching the bundle it
loads, every leaf script src resolving, and all 22 manifest bundles present on
disk.
Built tree verified settled before merge (builders=0, waiters=0, churn=0, quiet
465s) and scoped to app/doxa-maps only — no other team's subtree touched.
KNOWN PRE-EXISTING, NOT INTRODUCED HERE: app/index.json references 12
<bundle>.iife.js paths that no build produces. Zero .iife.js files existed in the
previous catalog commit and zero exist in the source tree, and the live site
already 404s them today while the .js files beside them serve 200. That file is
outside app/doxa-maps and is untouched by this publish.