From e72afe7985f5d5e10ed023d28397b934c24fb713 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Sat, 26 Sep 2026 02:00:48 +0000 Subject: [PATCH 1/2] Gospel map: the country gap list says whether the training is there too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The rows under "No resource found" name the way in. For 182 of the 369 groups with nothing, that bridge language also carries the Zume discipleship course, and the row did not say so — which is the difference between "there is a way in" and "there is a way in and the course to train the first believers already exists in it". A mobiliser scanning a country is deciding where to start, and that is the deciding fact. The bridge's own name stays first, because the language is the decision and the training is what makes it actionable. It reads "way in: French · Discipleship training", with the label coming from the catalogue so it follows the reader's locale like every other label on the row. Nothing new is fetched or linked: it reads the same Zume URL already verified and already on the bridge panel, so the doctrine screen is unchanged at 16,963. --- .../gospel-resources/resources-map.vue | 10 ++++++- public/dx-maps/doxa-maps-spa/manifest.json | 12 ++++---- .../gospel-resources/charts/index.html | 2 +- .../gospel-resources/data-tables/index.html | 2 +- .../gospel-dashboard/index.html | 2 +- .../gospel-resources/gospel-resources.js | 28 +++++++++---------- .../resources-list/index.html | 2 +- .../gospel-resources/resources-map/index.html | 2 +- public/dx-maps/manifest.json | 12 ++++---- 9 files changed, 40 insertions(+), 32 deletions(-) diff --git a/plugin-designs/gospel-resources/resources-map.vue b/plugin-designs/gospel-resources/resources-map.vue index 07f943a51..5706d53b0 100644 --- a/plugin-designs/gospel-resources/resources-map.vue +++ b/plugin-designs/gospel-resources/resources-map.vue @@ -797,7 +797,15 @@ const wayInFor = (g) => { if (c && c.sg === 1) return pinSun.value ? 'SUN (signed)' : '' const key = `${code}|${iso3}` const b = pinBridges.value[key] || pinCandidates.value[key] - return b ? b.l : '' + if (!b) return '' + /* Say whether the TRAINING is there too, not only the Scripture. A mobiliser scanning a + country's gap list is deciding where to start, and "there is a way in AND the discipleship + course exists in it" is a different proposition from "there is a way in". MEASURED: 182 of + the 369 groups with nothing have a bridge that carries Zume, so this is the common case, + not a footnote. The bridge's own name stays first, because the language is the decision and + the training is what makes it actionable. */ + const bc = pinCodes.value[b.c] + return bc && bc.z ? `${b.l} · ${t('gospel.res.training')}` : b.l } // The header must count the SAME set the list below it shows. It used to read diff --git a/public/dx-maps/doxa-maps-spa/manifest.json b/public/dx-maps/doxa-maps-spa/manifest.json index cf766b692..6d44c18da 100644 --- a/public/dx-maps/doxa-maps-spa/manifest.json +++ b/public/dx-maps/doxa-maps-spa/manifest.json @@ -579,7 +579,7 @@ "bundle": "gospel-resources", "scriptUrl": "./gospel-resources/gospel-resources.js", "output": "dx-maps/gospel-resources/gospel-resources.js", - "integrity": "sha384-MIeNmORzx4w05Z/o2zkekcwmE4QVX1ndyGhEXA2VxYJqm2uLd4fx9S5f37yo7umX", + "integrity": "sha384-1vo8W4mXKdyTBlaXJv6Cbyt9Y7zgXXu//hOupcILnQspA8GCM/pnmj+g1STS9btO", "elements": [ "gospel-resources-map" ], @@ -599,7 +599,7 @@ "scriptUrl": "./gospel-resources/gospel-resources.js", "embed": { "iframe": "", - "script": "\n\n" + "script": "\n\n" } }, { @@ -613,7 +613,7 @@ "scriptUrl": "./gospel-resources/gospel-resources.js", "embed": { "iframe": "", - "script": "\n\n" + "script": "\n\n" } }, { @@ -627,7 +627,7 @@ "scriptUrl": "./gospel-resources/gospel-resources.js", "embed": { "iframe": "", - "script": "\n\n\n\n" + "script": "\n\n\n\n" } }, { @@ -641,7 +641,7 @@ "scriptUrl": "./gospel-resources/gospel-resources.js", "embed": { "iframe": "", - "script": "\n\n" + "script": "\n\n" } }, { @@ -655,7 +655,7 @@ "scriptUrl": "./gospel-resources/gospel-resources.js", "embed": { "iframe": "", - "script": "\n\n\n\n" + "script": "\n\n\n\n" } } ] diff --git a/public/dx-maps/gospel-resources/charts/index.html b/public/dx-maps/gospel-resources/charts/index.html index cdbd3a788..2f539ce16 100644 --- a/public/dx-maps/gospel-resources/charts/index.html +++ b/public/dx-maps/gospel-resources/charts/index.html @@ -26,7 +26,7 @@ - + - + - + - + - + \n\n" + "script": "\n\n" } }, { @@ -613,7 +613,7 @@ "scriptUrl": "./gospel-resources/gospel-resources.js", "embed": { "iframe": "", - "script": "\n\n" + "script": "\n\n" } }, { @@ -627,7 +627,7 @@ "scriptUrl": "./gospel-resources/gospel-resources.js", "embed": { "iframe": "", - "script": "\n\n\n\n" + "script": "\n\n\n\n" } }, { @@ -641,7 +641,7 @@ "scriptUrl": "./gospel-resources/gospel-resources.js", "embed": { "iframe": "", - "script": "\n\n" + "script": "\n\n" } }, { @@ -655,7 +655,7 @@ "scriptUrl": "./gospel-resources/gospel-resources.js", "embed": { "iframe": "", - "script": "\n\n\n\n" + "script": "\n\n\n\n" } } ] From 694dad7babb31d7d546289af0e1fe46b4666884b Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Sat, 26 Sep 2026 01:45:36 +0000 Subject: [PATCH 2/2] Docs: an iframe updates itself; a script embed's integrity hash pins the bytes, so re-copy it after each release From the critic's SRI check. how-to's embed section had no word on it; the CLI section said the hash changes on every build, which is only true when the bundle's bytes change. --- documentation/README-SECTION-3-cli-commands.md | 4 +++- documentation/how-to.md | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/documentation/README-SECTION-3-cli-commands.md b/documentation/README-SECTION-3-cli-commands.md index c54dae6b5..d45b294aa 100644 --- a/documentation/README-SECTION-3-cli-commands.md +++ b/documentation/README-SECTION-3-cli-commands.md @@ -127,7 +127,9 @@ scaffolded; iOS is not set up. ``` -**The hash changes on every build**, so always copy it from the current `manifest.json`. The element +**The hash pins the exact bytes.** Whenever the bundle changes, the old hash stops matching and the +browser refuses to run the script, so re-copy the snippet from the current `manifest.json` after each +release. (An iframe embed updates automatically.) The element takes props and emits events, so it can wire into the surrounding page. **On a partner's site, a JS embed needs two values an iframe does not.** An iframe carries its own diff --git a/documentation/how-to.md b/documentation/how-to.md index f95f87157..aef1e5616 100644 --- a/documentation/how-to.md +++ b/documentation/how-to.md @@ -63,6 +63,10 @@ You never write these snippets by hand — `public/dx-maps/manifest.json` lists `embed.iframe` and `embed.script` snippet for every profile, and the staging pages show them copy-paste ready. Design details: [architecture/embeddability.md](./architecture/embeddability.md). +**After each release:** iframe embeds update automatically. A script embed with an `integrity` +hash pins the exact bytes, so re-copy its snippet from `manifest.json` after each release — once +the bundle changes, the old hash stops matching and the browser refuses to run the script. + --- ## Add a new map profile