doxa-maps/public
Doxa Maps e643e8a30e country-map: key the refetch by value, let only the newest response win, show the wait
Three defects on country-map/country-map, which is production -- DX Life's
country pages. Found by auditing the element rather than from a report.

1. ANY profile-config change refetched all 2,106 records. The watch getter
   returned a NEW ARRAY literal, and Vue compares a watch value with Object.is,
   so a fresh array always reads as changed; both computeds read the injected
   cfg, so the effect re-ran on every config change and the callback then fired
   unconditionally. MEASURED with real Vue: flipping isDark refetched the whole
   endpoint and redrew the map, and so did a host adding pinHint. A joined
   STRING compares by value, so only a real language or country change refetches
   -- which must still refetch, because the API localises the names.
   This was latent waste until the composite re-forward made config writes
   routine. It is now on every upstream locale switch, so the two changes are
   complementary rather than independent.

2. A SLOW EARLIER RESPONSE OVERWROTE A NEWER ONE. loadPoints is async and had no
   sequencing at all -- 0 abort or generation tokens in the file -- so two runs
   could be in flight and the one that STARTED first could FINISH last. Both
   assigned points, so the map showed the previous country's pins with no error
   and nothing for the reader to notice. Every run now takes a ticket and a stale
   ticket writes nothing: not the points, not loadFailed, not the spinner the
   current run is still using. fetch is left to complete rather than aborted,
   because the response is cached for the next switch back.

3. `loading` WAS WRITE-ONLY: assigned in three places and read in none, zero
   template references. A reader on a country page waited on an empty map -- no
   outline, no pins, no message -- which is indistinguishable from a country that
   genuinely has no people groups, and this element fetches the whole list before
   it can draw one pin. "Loading results..." was already in the catalogue in all
   eleven locales, so saying so cost no new string and no parity debt.

check:country-map-refetch guards all three. It drives the REAL reactive chain
with real Vue and takes the watch key expression OUT OF THE SHIPPED SFC, because
bug 1 is entirely a question of what Vue considers changed and is invisible to
any test that fakes reactivity or re-types the watch.

Mutation-tested, 5 mutations, all caught by name. The first version of the gate
MISSED one: a bare /if \(!current\(\)\) return/ grep matched the guard in the
catch block, so removing only the guard before the points write still passed.
The assertions are positional now -- the guard must sit immediately before the
assignment it protects -- and the catch guard is asserted separately. That hole
existed because the behavioural half of the test reproduced the guard's shape
inside the gate instead of reading the component, which is the self-consistent
oracle this repo's other geometry gate explicitly warns against.

Registered in scripts and gates:pre, verified by re-parsing: one key, 107
checks. Bundle rebuilt (BUNDLE=country-map), then tree, then fix:sri.
2026-09-29 19:11:37 +00:00
..
dx-maps country-map: key the refetch by value, let only the newest response win, show the wait 2026-09-29 19:11:37 +00:00
README.md Gate the country-name join, and record that the wiring was already done 2026-09-29 01:38:07 +00:00

public/ — the built output

This folder is GENERATED by bun run build; do not edit it by hand. It holds exactly one thing:

  • dx-maps/ — the output folder: 25 plugin bundles and 37 pages, self-contained. Copy this one folder to any web host (or open it from disk) and it works.
    • dx-maps/index.html — the front page: the Plugin Studio, every plugin in one place.
    • dx-maps/<plugin>/<plugin>.js — a plugin's bundle (a custom element; load it with a <script> tag).
    • dx-maps/<plugin>/<page>/index.html — a ready-made page for one plugin view (embed it in an <iframe>).
    • dx-maps/manifest.json — every plugin, page and embed snippet, machine-readable.
    • dx-maps/assets/ — the data, fonts and images the plugins fetch at runtime.

The folder's name comes from name in vite.doxa-maps-build-config.json. Sources live in plugin-designs/, library/ and data/; rm -rf public/ && bun run build recreates all of this.