Commit graph

231 commits

Author SHA1 Message Date
doxa-maps-88655c70
d0568ebd35 prove the live server serves the catalog's exact bytes
Card 1 asks that one public Forgejo repo be the live catalog source and that the merge
lose nothing. Both halves were marked done-verified on 2026-09-19, two publishes ago, so
this re-measures rather than trusting the field: the catalog is still a zero-diff match
for the freshly-built tree, all 17 live bundles hash to their own manifest integrity, and
the live public manifest is byte-identical to the catalog's.

An HTTP status cannot make that claim. /app/doxa-maps/manifest.json returns 200 and is a
2,872-byte HTML sign-in page, so a status check reads the login wall as healthy. Every
profile already carries an integrity hash the build computed for an unrelated reason, so
comparing it against the live bytes is a cryptographic identity proof with no new source
of truth to keep in sync.

Network-dependent, so not in build:unlocked and not in CI. It distinguishes "could not
reach" from "reached and wrong" and only the latter fails, because a gate that fails on a
network blip gets switched off.

Negative-tested four ways: the login wall fails with the reason, an unreachable host
skips at exit 0, the catalog-comparison mode confirms the sha256 match, and the baseline
proves 17 of 17.
2026-09-21 12:46:48 +00:00
doxa-maps-88655c70
466493ed80 generate the capability exemplar table so the answer stops being remembered
"Which bundle is the capability-N example?" has been answered wrongly in three separate
artifacts, each fixed in isolation while the others kept the bug: verify-5-capabilities
cited doxa-vision-card as cap-1, the README made the identical claim, and the
/plugin-designer skill still cites both that and unified-research-dashboard, a bundle
that does not exist.

The skill cannot be gated from this repo. It lives in the session config directory, in
no git repo, so a checker pointed at it would pass here and skip silently everywhere
else — the gate-that-cannot-fail shape. So instead of policing the skill, give the repo
an authoritative generated answer that prose can cite and a gate can verify.

The table derives from manifest.json, which the build computed from each folder's real
shape, and reference.md now points at it with the reason: a folder's apparent simplicity
does not decide its tier. doxa-vision-card looks like the lightest thing in the repo and
is capability 2, because it ships an instances file.

check:capability-exemplars regenerates and content-compares rather than checking mtimes,
because a full build rewrites manifest.json every time and a gate that cries wolf after
every build gets switched off.
2026-09-21 12:38:50 +00:00
doxa-maps-88655c70
88f01b9a95 lift the pin hint into view when its host clips it
The cap-4 composite shipped the coach-mark sliced through the middle of its sentence.
Measured, same component and viewport: the leaf renders the pill at bottom 864 of 900,
the composite at 919 — clipped by 17px, because the composite adds a ~53px header above
its nested child's stage and findMapBox() finds no positioned container to re-parent into.

The component's header promises that case degrades to "stay put — a degraded anchor, never
a crash". A graceful degradation that degrades to invisible is a failure, not a fallback,
so the clamp measures the rendered rect and only ever lifts a pill that is actually clipped.

Two wrong attempts are recorded in the code because the reasons matter. Setting
style.transform would have destroyed the wrapper's translateX(-50%) centring, and the
pill's computed transform also carries the bob animation, so a computed reading is never
just my offset. Adjusting the bottom offset composes with the attribution clearance
instead of fighting it. Clamping only at nextTick also missed: the composite's layout has
not settled then, so the clamp now runs from syncAttribClearance, which already re-fires
from a ResizeObserver, plus a second observer on the pill's own layout parent.

Verified on six surfaces: the composite lifts 30px to bottom 888, every other surface
reports lift 0 and is byte-identical in behaviour, and all six keep centreDelta 0.
2026-09-21 12:30:11 +00:00
doxa-maps-88655c70
c7a228e941 shoot a real cap-1 element and gate README capability claims against the manifest
The CAP 1 slot shot doxa-vision-card, which is not a single element: it ships
doxa-vision-card.instances.json with two instances, so discover.mjs types it
parameterized and manifest.json records "parameterized" — capability 2.

The same error had already been found and fixed in verify-5-capabilities.mjs, whose own
comment records that it had been sampling cap-2 twice and cap-1 never. That fix landed in
the gate and never reached the README: two artifacts encoding one fact, with nothing
forcing agreement. Fixing one copy was not fixing the fact.

all-people-groups is a genuine cap-1 — one .vue, no instances file, manifest type single.
The README now also says what decides the tier, since the folder's apparent simplicity is
the trap: doxa-vision-card looks like the lightest thing in the repo.

check:capability-citations compares every README capability claim against the manifest,
blocking in CI. Its first matcher used \Z, which is not JavaScript, so it matched zero
sections while still reporting a citation count — a gate reporting a number it had not
verified. It now splits on headings and the count reflects real matches.
2026-09-21 12:02:18 +00:00
doxa-maps-88655c70
dc878584bd re-shoot README images after the rebuild
No bundle .js changed — the rebuild was deterministic and the catalog needs no publish.
The images move only because check:shots compares each PNG against its bundle mtime, and
a full build was required to clear the composite staleness my negative test introduced.
2026-09-21 11:53:18 +00:00
doxa-maps-88655c70
029cffc01f gate the blank-basemap class: 7 of 10 map bundles draw geography from Mapbox tiles only
Reading the cap-2 screenshots found all three doxa-simple-map shots rendering data dots
on an empty dark field: no coastlines, no country fills, no labels. Every shot reported
OK, because the page loads, the element mounts, and the legend, controls and data layer
are all correct.

The reason no signal can see it: the Mapbox STYLE DOCUMENT returns 200 from every origin,
so the map genuinely boots. Only the TILESETS are restricted — mapbox-streets-v8, which
is the basemap itself, plus bathymetry-v2 and country-boundaries-v1, all 403 off
doxa.life and 200 with its referer. A booted map showing its own UI and its own data
looks like a working map; only the geography is absent.

This also explains a near-misdiagnosis. cap4-upg100-list paints perfectly beside four
blank maps, which looked like a per-bundle bug. It is not: my-upg-100-list ships its own
world-adm0.geojson and draws geography from self-hosted data. Three bundles do that and
survive; seven do not.

The dark basemap in those shots is deliberate, not a theme violation — useMapTheme's
lookForStrategy keeps prayer, adoption and engagement on the night preset by design.

Negative-tested: marking every affected bundle as self-hosted removes the finding, and
removing the markers brings it back.
2026-09-21 11:46:36 +00:00
doxa-maps-88655c70
dfe6c3d1fa correct the "research-dashboard owns no map" premise and gate the blank-tileset class
A previous reader measured ZERO <canvas> on research-dashboard and concluded the surface
owns no map, recording it as an architectural fact and relaxing the shot's readiness
check to match. The measurement was real; the inference inverted it. The page imports
useMapInstance, injects mapboxToken and adds a vector source, and re-measured live it
builds a mapboxgl-canvas at 878x445. Zero canvas meant the map failed to initialise.

The cost was not the blank image. A weakened assertion that makes a failing check pass
promotes a defect to a design note, and the README's deploy-3 proof has shown a blank
grey map pane since.

Why it is blank, measured: the shared pk. token is URL-restricted to doxa.life. Against
country-boundaries-v1, Referer doxa.life returns 200 on three attempts, 127.0.0.1 and no
referer return 403. The style endpoint returns 200 from every origin, which is why most
maps paint here and only the tileset-backed choropleth blanks. A first reading of that
asymmetry looked like a missing tileset scope; re-testing with the doxa.life referer
disproved it.

check:shot-fidelity now reports this class alongside the missing emoji font, and no
longer exits early after the first finding.
2026-09-21 11:39:06 +00:00
doxa-maps-88655c70
15ce17f907 fix the impossible 27/26 zone badge and replace a faked page-2 shot with the real third profile
The badge read "27/26 zones" — a count exceeding its own total — in two shipped README
screenshots. 26 was the leaf count before slice 09b-6 added the Frontier-Asia uncovered
rows; the literal was never updated, so it drifted the moment the data grew. The
denominator is now derived from perZone.size, which tracks the zone list automatically
and cannot disagree again. Measured from clusters.json: 13 regional + 12 asia + 2
uncovered + 1 deaf = 28. The corrected badge also surfaces 1 genuinely unresolved zone
that the stale denominator was masking.

legend-tree.js asserted "33 leaves" and "7 Frontier-Asia uncovered" in a comment; the
shipped data carries 28 and 2. Corrected to point at the arrays instead of a count.

README showed "List — page 1" and "List — page 2" as the same picture. The shot loaded
one URL twice and tried to reach a page 2 by scrolling and clicking Next; neither exists,
the list has no pagination, and every attempt sat in try/catch so the miss was silent.
The PNGs differed by 0.16% render noise, so no checksum would have caught them. Mean-
while poster-wall — a real manifest-listed profile — had no screenshot at all. Shoot the
real third thing rather than fake a fourth.

check:shot-distinctness gates this, blocking in CI. It keys on url+viewport, so the
deploy2 mobile shot of the same SPA stays legitimate rather than a false positive.
2026-09-21 11:29:25 +00:00
doxa-maps-88655c70
5567134978 shoot the plugin-studio element and stop captioning the product SPA as the studio
README drew the two cap-5 products apart in prose and even warned that captioning a
studio shot as the product SPA is a documented mistake — then filled its plugin-studio
slot with cap5-doxa-maps-spa.png. Both cap-5 figures showed the same app and no
plugin-studio screenshot existed anywhere in the repo.

A slot filled with the wrong real image looks exactly like a correct one; nothing 404s.
So the fix is to shoot the missing artifact, not re-caption around the gap. Both cap-5
slots now use generated, freshness-gated images.

Also adds check:shot-fidelity. The shot run reported 13x OK while every emoji rendered
as a tofu box: this machine has no emoji font. Measured rather than assumed — the DOM
carries 27 correct codepoints, so the markup is right and the defect belongs to the shot
machine. Reports by default because installing a font is a Driver call; --strict blocks
once one is present.
2026-09-21 10:59:28 +00:00
doxa-maps-88655c70
a853081e3f gate the docs' quoted scripts block against package.json
README-SECTION-3 reproduces the scripts block verbatim and carries its own plea to
re-transcribe after every package.json edit. It drifted anyway, twice: cap:sync still
showed the bunx form that does not exist here, and build:unlocked was missing
check:public-hygiene and check:label-joins.

The second is the dangerous shape. An omission in a quoted list has no wrong character
to notice, so a reader auditing what the build verifies concludes the secret scan is not
in the chain. The warning was already there and did not work, because re-transcribing by
hand is what gets skipped when the edit felt unrelated.

Blocking in CI: it diffs two files already in the checkout, so a failure is always real.
Negative-tested both ways, including a matcher that matches too little failing rather
than passing vacuously.
2026-09-21 10:47:51 +00:00
doxa-maps-88655c70
2fa4bf992a point docs at library/layouts and fix the stale bunx and provider-ladder claims
The top-level layouts/ directory does not exist; the wrappers live in library/layouts/.
Six references across four docs named the phantom path, including a copy-pasteable
cd command and a README-longform link that resolved to docs/layouts/README.md (a 404).

how-to.md taught bunx for the iOS scaffold. bunx is not on PATH here, which is the
exact failure package.json already documents in cap:sync; point both at the local bin.

useMapProvider.js's own header listed three resolution rungs, omitting ?provider= and
misnumbering window.MAP_PROVIDER. The function implements four. how-to.md was correct.
2026-09-21 10:43:11 +00:00
doxa-maps-88655c70
70d0e36ad3 point the tutorial at the studio folder and separate build from publish 2026-09-21 07:38:50 +00:00
doxa-maps-88655c70
51b6fa3f6d document the standalone gates and why they sit outside the build 2026-09-21 07:35:11 +00:00
doxa-maps-88655c70
f8c7e77748 carry the push buffer flag in the golden path, not only the runbook 2026-09-21 07:34:05 +00:00
doxa-maps-88655c70
f4c265e72a report a stale library menu in ci by regenerating and diffing 2026-09-21 07:26:18 +00:00
doxa-maps-88655c70
e3136a4ec1 generate the library menu and gate it against library drift 2026-09-21 07:25:18 +00:00
doxa-maps-88655c70
b6debf2bfb verify the wordpress embed contract in ci when php is available 2026-09-21 07:18:13 +00:00
doxa-maps-88655c70
c26b3bb597 report stale readme screenshots in ci 2026-09-21 07:14:54 +00:00
doxa-maps-88655c70
a4d6062e96 assert the token path the client requests, not only the typed one 2026-09-21 07:13:55 +00:00
doxa-maps-88655c70
32e6c1231e gate readme screenshots against the bundle they show; wire the generator 2026-09-21 07:05:00 +00:00
doxa-maps-88655c70
7276ade0e6 wait for svg not canvas on the chart dashboard; refresh all readme shots 2026-09-21 06:58:48 +00:00
doxa-maps-88655c70
f160494567 let the capability verifier carry a token so it measures capabilities 2026-09-21 06:46:15 +00:00
doxa-maps-88655c70
22d4c9bedb require evidence on a done card; baseline the ten pre-existing 2026-09-21 06:34:30 +00:00
doxa-maps-88655c70
bd4dec7db2 build lock 2026-09-21 06:23:39 +00:00
doxa-maps-88655c70
9e3443333f track html comments so prose backticks stop desyncing the scanner 2026-09-21 06:19:37 +00:00
doxa-maps-88655c70
08cbccb7ba build lock 2026-09-21 06:15:34 +00:00
doxa-maps-88655c70
7ebbad0277 build lock 2026-09-21 06:06:57 +00:00
doxa-maps-88655c70
41d089de10 add a composite-freshness gate for stale nested children 2026-09-21 06:06:29 +00:00
doxa-maps-88655c70
6850d2ffb4 rebuild composites so nested grid carries the visible-filters fix 2026-09-21 05:58:37 +00:00
doxa-maps-88655c70
112aa2400c rebuild people-groups-grid with visible filters 2026-09-21 05:50:19 +00:00
doxa-maps-88655c70
4c9aca1321 show the grid filters by default and make the toggle a real control 2026-09-21 05:50:19 +00:00
doxa-maps-88655c70
a551fd804b rebuild simple-map bundle and leaves with the light loading overlay 2026-09-21 01:11:18 +00:00
doxa-maps-88655c70
702333d6de light the simple-map loading overlay; both synced copies 2026-09-21 01:11:05 +00:00
doxa-maps-88655c70
5f0c30b880 catch the extensionless token file by name and by content 2026-09-20 09:57:22 +00:00
doxa-maps-88655c70
bbe8cde47a write the extensionless token path the client actually requests; ignore it too 2026-09-20 09:55:39 +00:00
doxa-maps-88655c70
ab04635e58 add a VCS-independent witness for the read-only DX-life clone 2026-09-20 09:45:25 +00:00
doxa-maps-88655c70
c49a2a2dd6 document what a foreign-host embed needs, measured for both methods 2026-09-20 09:37:41 +00:00
doxa-maps-88655c70
1727f14241 deploy-3 is now verified on a foreign host, not only same-root 2026-09-20 09:34:22 +00:00
doxa-maps-88655c70
2e0591161d rebuild output: embed snippets carry the asset and API bases 2026-09-20 09:34:10 +00:00
doxa-maps-88655c70
ce870b6923 emit assetsBase and the API-base global into the direct-JS embed snippet 2026-09-20 09:32:37 +00:00
doxa-maps-88655c70
f0fc54971a scope the deploy-3 proven claim to same-root pages 2026-09-20 09:23:46 +00:00
doxa-maps-88655c70
b8ef7bdfdc rebuild output: leaf pages release the load backdrop on mount 2026-09-20 09:18:38 +00:00
doxa-maps-88655c70
38fd121c70 release the dark load backdrop when a leaf's element mounts 2026-09-20 09:16:46 +00:00
doxa-maps-88655c70
4970059e55 add a label-join gate: fail on any new equality predicate comparing two independently-derived values 2026-09-20 09:05:18 +00:00
doxa-maps-88655c70
0149b686a2 wire the public-hygiene gate into the build; the 41 findings it was blocked on are gone 2026-09-20 08:39:41 +00:00
doxa-maps-88655c70
3516a854b2 document the toolchain-free mobile contract check in both deploy tables 2026-09-20 08:19:30 +00:00
doxa-maps-88655c70
cdfb895a9d add check:mobile, a deploy-2 contract gate that needs no toolchain 2026-09-20 08:19:13 +00:00
doxa-maps-88655c70
fc230bd218 invoke the local capacitor CLI directly; bunx is not on PATH and broke the mobile deploy chain 2026-09-20 08:18:25 +00:00
doxa-maps-88655c70
ebb2262317 correct the WordPress deploy status and re-transcribe the drifted build-script block 2026-09-20 08:15:24 +00:00
doxa-maps-88655c70
0645b78b09 validate @element is a bare tag; warn when an inferred tier contradicts a bundle's complexity 2026-09-20 08:08:01 +00:00