From d3cdc2c3bc16d916e63c66f94d7564d280e22ac3 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Tue, 29 Sep 2026 14:55:35 +0000 Subject: [PATCH] Two gates the branch backlog turned red Seven Driver citations came back with the merged branches. Each keeps its engineering reason and its date, and loses the speaker: the overlap report, the poster's legend rule, the network-change defect, the chart's provenance. check:plural-forms crashed rather than failed. It built its locale list by listing the catalogue directory, so a README.md moved in beside the locale folders became a 'locale', passed the exists check because a file does exist, and crashed readdirSync on a non-directory. It now filters to directories. The gate on development has the same line and only survives because that README is not there yet -- so this is a fix for development, not a merge artefact. Both found by running the full 103-gate chain; the shortened chain the merge produced ran neither. --- internal/check-map-control-overlap.mjs | 2 +- internal/check-plural-forms.mjs | 7 +++++-- internal/check-poster-layout.mjs | 4 ++-- internal/check-retry-fetch.mjs | 2 +- library/charts/LanguageTreeChart.vue | 2 +- library/composables/retryFetch.js | 4 ++-- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/internal/check-map-control-overlap.mjs b/internal/check-map-control-overlap.mjs index 8ec852820..8f9b72c22 100644 --- a/internal/check-map-control-overlap.mjs +++ b/internal/check-map-control-overlap.mjs @@ -3,7 +3,7 @@ * check-map-control-overlap — two controls pinned to the same corner of the dashboard map must not * land on top of each other. * - * Driver, 2026-09-28 (test round 2, #3): "some map controls overlap each other". + * Reported 2026-09-28 (test round 2, #3): some map controls overlap each other. * * WHAT HAPPENED, because it is the interesting part. The projection toggle (.rd-proj) sits at * top:8px and the zoom toolbar (.rd-zoomtools) was pinned at top:34px — a hand-tuned number chosen diff --git a/internal/check-plural-forms.mjs b/internal/check-plural-forms.mjs index d4205a632..3505331ba 100644 --- a/internal/check-plural-forms.mjs +++ b/internal/check-plural-forms.mjs @@ -13,12 +13,15 @@ * English string written "none | one | {n}" changes MEANING at n=0 under the map. Every pipe * key is rendered at 0 and must not regress. */ -import { readFileSync, readdirSync, existsSync } from 'node:fs' +import { readFileSync, readdirSync, existsSync, statSync } from 'node:fs' import { join } from 'node:path' const LOC_DIR = new URL('../library/i18n/locales/', import.meta.url).pathname const SRC_DIRS = [new URL('../plugin-designs/', import.meta.url).pathname, new URL('../library/', import.meta.url).pathname] -const LOCALES = readdirSync(LOC_DIR).filter((d) => !d.startsWith('.')) +// DIRECTORIES ONLY. This listed every entry, so a README.md beside the locale folders entered +// the locale list, passed the existsSync below (a file does exist) and crashed readdirSync on a +// non-directory. A note explaining a catalogue belongs beside it; the gate has to tolerate one. +const LOCALES = readdirSync(LOC_DIR).filter((d) => !d.startsWith('.') && statSync(join(LOC_DIR, d)).isDirectory()) const fail = [] // Collect every pipe-bearing catalogue value, as ns.key -> { locale: value } diff --git a/internal/check-poster-layout.mjs b/internal/check-poster-layout.mjs index bd4511150..e936249ed 100644 --- a/internal/check-poster-layout.mjs +++ b/internal/check-poster-layout.mjs @@ -2,7 +2,7 @@ /** * check-poster-layout — the exported poster is a LAYOUT, not a map with things painted on it. * - * Driver, 2026-09-28, on the Simple Research poster: the legend must sit BESIDE the map, never over + * Required 2026-09-28, on the Simple Research poster: the legend must sit BESIDE the map, never over * it, with a proper header and footer. * * WHY BOTH ARMS. usePosterLayout.computeLayout has always produced the right geometry — it narrows @@ -37,7 +37,7 @@ const px = (spec) => ({ width: Math.round(spec.widthIn * spec.dpi), height: Math // ── ARM A: the geometry, on the sheets the two real callers actually ask for ── const SHEETS = [ - ['Simple Research, landscape (the Driver\'s poster)', { widthIn: 11, heightIn: 8.5, dpi: 200, orientation: 'landscape' }], + ['Simple Research, landscape (the reference poster)', { widthIn: 11, heightIn: 8.5, dpi: 200, orientation: 'landscape' }], ['Simple Research, portrait', { widthIn: 8.5, heightIn: 11, dpi: 200, orientation: 'portrait' }], ['country-posters, A4 portrait @150', { widthIn: 8.27, heightIn: 11.69, dpi: 150, orientation: 'portrait' }], ['a big 24x36 research poster @300', { widthIn: 24, heightIn: 36, dpi: 300, orientation: 'portrait' }], diff --git a/internal/check-retry-fetch.mjs b/internal/check-retry-fetch.mjs index b89d8d52c..69ebaa87d 100644 --- a/internal/check-retry-fetch.mjs +++ b/internal/check-retry-fetch.mjs @@ -2,7 +2,7 @@ /** * check-retry-fetch — a runtime data fetch survives a transport blip, and a real error still fails. * - * THE DEFECT (Driver, 2026-09-28): net::ERR_NETWORK_CHANGED killed an embedded UPG-100's load. + * THE DEFECT (reported 2026-09-28): net::ERR_NETWORK_CHANGED killed an embedded UPG-100's load. * * ★ THE URLs IN HIS CONSOLE CANNOT BE FIXED, BECAUSE THEY DO NOT EXIST IN PRODUCTION. They were module * URLs — locale JSON with ?import, useOptionalT.js, useShadowStyles.js, useMapTheme.js. The build is diff --git a/library/charts/LanguageTreeChart.vue b/library/charts/LanguageTreeChart.vue index 539117938..ee71f4710 100644 --- a/library/charts/LanguageTreeChart.vue +++ b/library/charts/LanguageTreeChart.vue @@ -2,7 +2,7 @@ /** * LanguageTreeChart.vue — every language family a roster belongs to, as a radial tree on a whiteboard. * - * Promoted from gospel-internet's GiTree (Driver brief §B). It is deliberately THIN: the drawing is + * Promoted from gospel-internet's GiTree (product brief §B). It is deliberately THIN: the drawing is * library/charts/whiteboard/tiered-points.js, the surface is library/maps/whiteboard-map.js, the * hierarchy is library/charts/whiteboard/language-tree-model.js and the camera is * library/charts/whiteboard/frame-target.js — all four tested headlessly. What is left here is wiring, diff --git a/library/composables/retryFetch.js b/library/composables/retryFetch.js index 9a65ee6ef..064c90c3a 100644 --- a/library/composables/retryFetch.js +++ b/library/composables/retryFetch.js @@ -1,7 +1,7 @@ /** * retryFetch.js — fetch(), with the same transient-blip retry the lazy components already get. * - * ★ THE DEFECT AND WHAT IT IS NOT. The Driver hit net::ERR_NETWORK_CHANGED on an embedded UPG-100 and + * ★ THE DEFECT AND WHAT IT IS NOT. A reader hit net::ERR_NETWORK_CHANGED on an embedded UPG-100 and * the load died. The URLs in his console were module URLs — locale JSON with ?import, useOptionalT.js, * useShadowStyles.js, useMapTheme.js — which look like lazy loads that need retrying. They are not: the * production build is IIFE with inlineDynamicImports (vite.config.js:216-220), so every one of those @@ -11,7 +11,7 @@ * ★ BUT THE FAILURE CLASS IS REAL IN PRODUCTION, one layer down. A built bundle still makes runtime * requests — the boundaries geojson, the people-group list, the prayer statistics, a detail lookup, a * token service — and not one of them retried. The same wifi switch, VPN flap or sleep-wake that killed - * the Driver's dev load takes out whichever of those happened to be in flight, and the feature is simply + * a dev load takes out whichever of those happened to be in flight, and the feature is simply * absent: an empty map, a missing outline, a statistic that never arrives. No error a reader can act on. * * So this is the fetch-shaped sibling of retryableAsyncComponent, deliberately with the SAME policy —