Commit graph

2150 commits

Author SHA1 Message Date
Doxa Maps
cdf39eaf76 Rudder in browser-audio mode hides the engine's microphone-list error
The engine's local device list does not apply when the page's own microphone is
used, so a server without pactl no longer shows its error above the draft.
2026-09-27 22:10:23 +00:00
Doxa Maps
1303d6a41a Rudder is idle the moment you press Stop, and a new recording can start while the last words arrive
On a loaded server the last words can land seconds after Stop, and the widget
read "Stop" until they did. Stop now releases the mic and returns to idle at
once while the session's socket stays open for the tail. Each engine session
sends its events to its own reader, so a session still draining never writes
into the next one, and Record again simply lets go of the old tail.
2026-09-27 22:08:45 +00:00
Doxa Maps
ec47023575 check:mjs-parses parses with node even when the gates run under bun
Under bun, process.execPath is bun, and bun --check runs the script instead of
parsing it; a cloud build hung inside check-link-rot-sample.mjs. The gate now
uses node under bun and fails plainly if node is missing.
2026-09-27 22:00:29 +00:00
Doxa Maps
b8f77630c6 Rudder's corner is a pill that shows it is hearing you, and its draft scrolls like a message thread
Collapsed, the pill reads "Rudder · voice to text". While recording it drops the
label for a red dot, a mic that lights only while speech is detected, and the
last few words on one truncated line, so a closed panel still shows the reader
is being heard. Rudder reports this through an `activity` event. Open, the
panel no longer scrolls: the draft fills it and scrolls on its own, stays
editable while recording, and notices sit above it; with settings or info
open the panel scrolls so they stay reachable.
2026-09-27 21:58:07 +00:00
Doxa Maps
bd2809f20c Rudder transcribes on a server: the page streams its own microphone to the engine
With RUDDER_AUDIO=browser the engine records no local microphone. The page
captures the reader's mic, converts it to 16 kHz mono PCM in an AudioWorklet,
and streams it over a WebSocket at /api/rudder/stream into the same speech
session a local recorder feeds. The words come back on that socket to that
reader only, never on the shared event stream. One session at a time; a second
reader is told the engine is busy. The engine honours RUDDER_HOME, accepts the
public host named in RUDDER_ALLOW_HOST, and refuses a socket from another
origin. The dev proxy now carries WebSockets to backends.
2026-09-27 21:52:16 +00:00
Doxa Maps
9e59157b89 Rebuild the consumers main left stale (build owner, README rule 5)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
check:composite-freshness found stale on main: none; also rebuilt: rudder-voice. Rebuilt, tree + SRI
regenerated; the landing precondition (fresh, one folder, SRI) passed in main-capture scan.
2026-09-27 21:38:33 +00:00
Doxa Maps
dab3980fc2 Rudder served from a remote host says it runs on your own computer, not that the engine is broken
The engine records the microphone of the machine it runs on, so a cloud dev
server has none by design. Off loopback (and not the desktop app), an absent
engine now reads "Runs on your computer" with where to open Rudder instead,
rather than build instructions for a missing binary.
2026-09-27 21:35:12 +00:00
Doxa Maps
3f8790ffce Cloud container v1: PocketBase dev + prod, a public CDN of the last good build, and an admin-only build trigger
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
deployment/cloud: PocketBase (pinned, sha256-checked) as dev (/pb/, signed in; its /_/ dashboard for
OIDC_ADMIN_GROUPS only) and prod (/api-prod/api/ public, dashboard never exposed), with the schema
as migrations in backend/pocketbase/pb_migrations and data on the /data volume; superuser from env.
admin.mjs routes /cdn/, /api-prod/, /pb/ and /admin/ behind oauth2-proxy (public: /cdn/ and
/api-prod/api/ only). build-cdn.sh: flock (409 on a second build), a snapshot of the pulled commit,
the public exclusions applied BEFORE the build, a heap-capped build, a check of the output that
REFUSES the swap if anything excluded remains (proved with planted fixtures: a field-access file,
'Visa Requirements' content, and key-cities one level down each fail; clean passes), then an atomic
swap; runtime-config.js carries the public API URL. public-exclusions.txt is the ONE list the
giveaway export and the CDN build share. Any git host via REPO_URL/BRANCH/GIT_TOKEN.
2026-09-27 21:32:46 +00:00
Doxa Maps
306178f0a2 Rebuild the consumers main left stale (build owner, README rule 5)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
check:composite-freshness found stale on main: all-people-groups
cities-internet
country-posters
dashboard-plus-grid
demo-map
doxa-research-map
doxa-simple-map
gospel-internet
gospel-resources
key-cities
my-upg-100-list
pplr-data-maps
regions-dashboard
research-dashboard
template-bundle
upg-neighbor
wall-of-people-groups; also rebuilt: rudder-voice plugin-studio. Rebuilt, tree + SRI
regenerated; the landing precondition (fresh, one folder, SRI) passed in main-capture scan.
2026-09-27 21:17:36 +00:00
Doxa Maps
cffb914a97 gospel.res: drop the unused newTestament and fullBible, and word nParts in ar without plural agreement
The Scripture chip reads gospel.charts.newTestament and fullBible, so the two
gospel.res copies had no reader. In Arabic the count now follows a label
("number of parts: {n}"), which is correct for every n.
2026-09-27 21:11:33 +00:00
Doxa Maps
3ae2390536 Rudder in the Studio corner is a chat-style bubble with a compact panel
Collapsed, the corner is a round bubble that turns red, pulses and shows a dot
while Rudder listens. Open, it is a 360px panel (a 60vh bottom sheet on a phone)
with a one-line header, the draft as the main element, and record and copy under
it; language, microphone, clear and debug sit behind a settings button.
Collapsing only hides the panel, so a recording keeps going and the draft stays.
2026-09-27 21:06:58 +00:00
Doxa Maps
4415519a83 Correct c18d4ffb's claim about the bundle
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
c18d4ffb says "the built bundle no longer contains the inline English". One of those eleven
strings IS still in the bundle: "The {engine} map engine did not load." is the en CATALOGUE's
value for messages.engineMissing, which every bundle compiles in. What changed is that the
SOURCE no longer carries a copy of it — that was the point of the commit, and the sentence
overstated it.

An empty commit rather than an amend, because the commit is already on the remote branch and
--force is not available here. A wrong sentence in the record is what the next reader trusts, so
it is corrected in the record rather than left for them to disprove.
2026-09-27 20:34:58 +00:00
Doxa Maps
c18d4ffb71 Drop eleven English fallbacks now their keys have landed
tOr() rendered English while a key was in flight. All eleven keys it guarded are on main, so it
is gone and every call site reads the catalogue: nParts, engineMissing, sheet.loading,
guide.wayInAll/wayInSome/wayInWhat, legend.hnrTip, guide.howNumbersMade, guide.isSignLanguage,
sheet.linkCopied, sheet.share.

I compared each default against the catalogue before deleting it, rather than assuming they
matched — deleting a fallback silently changes what a reader sees. Ten were identical. The
eleventh was not: gospel.sheet.share held my "Share this card" against the catalogue's "Share".
The catalogue wins, because it is translated in eleven locales where my phrase was not and a
button inside a card need not restate its container, so THE SHARE BUTTON NOW READS "Share" —
a visible change, deliberate, and the shorter label suits the 390px screen where those tap
targets were just fixed.

The four parameterised calls needed doing by hand: my regex for tOr(key, english, params)
stopped at the first ")" inside fmt(...), so it silently converted seven of eleven and left
four. Counted the remainder instead of trusting the count it printed.

gates:pre 11/11, ENGLISH-LEAKS PASS, and the built bundle no longer contains the inline English.
2026-09-27 20:33:29 +00:00
Doxa Maps
3e793b71f6 Rebuild the consumers main left stale (build owner, README rule 5)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
check:composite-freshness found stale on main: all-people-groups
cities-internet
country-posters
dashboard-plus-grid
demo-map
doxa-research-map
doxa-simple-map
gospel-internet
gospel-resources
key-cities
my-upg-100-list
pplr-data-maps
regions-dashboard
research-dashboard
template-bundle
upg-neighbor
wall-of-people-groups. Rebuilt, tree + SRI
regenerated; the landing precondition (fresh, one folder, SRI) passed in main-capture scan.
2026-09-27 20:23:46 +00:00
Doxa Maps
e5cecfecf8 gospel.res: New Testament, full Bible and {n} parts for the Scripture chip, in 11 locales
The Scripture chip names what the readable text covers from the publisher's part
count; the data carries only the number, and these keys name it.
2026-09-27 20:18:18 +00:00
Doxa Maps
9348d4917c Rebuild the consumers main left stale (build owner, README rule 5)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
check:composite-freshness found stale on main: none; also rebuilt: rudder-voice plugin-studio. Rebuilt, tree + SRI
regenerated; the landing precondition (fresh, one folder, SRI) passed in main-capture scan.
2026-09-27 20:12:38 +00:00
Doxa Maps
bac2431d02 On a phone, Rudder's notices sit below the draft so the draft stays in view
With the engine offline its notice pushed the draft below the fold of a
390x844 panel. At 480px wide and below, notices and hints follow the draft.
2026-09-27 20:09:03 +00:00
Doxa Maps
7746149037 Rudder's corner panel scrolls on a phone and keeps the draft in view
The panel clipped its content, so at 390x844 the lower controls and the draft
could not be reached. The widget element now scrolls inside the panel, the
panel height follows the dynamic viewport minus the safe-area insets, the
corner host sits inside the safe area, and on a narrow screen Rudder uses less
padding and a shorter draft so the draft stays visible below the controls.
2026-09-27 20:09:03 +00:00
Doxa Maps
30a02d2782 Rudder's corner shows a live mic when collapsed, and dev backends survive Vite restarts
Two gaps found while checking the corner widget (1775f5ac: "Needs eyes: open, HMR, collapse" — all
three verified in Firefox against the running Plugin Studio: opens, keeps the SAME element across a
Studio hot update, collapses).

- LIVE MIC WHEN COLLAPSED: rudder-voice emits `recording` (true/false); the Studio's corner button
  turns red with "● " while it listens, so closing the panel never hides that the mic is on.
- DEV BACKENDS SURVIVE VITE RESTARTS: Vite restarts itself when vite.config.js or anything it imports
  changes. The backend was stopped on every restart and a new one started at once; the old process
  still held the port, the new one died "address already in use", and Rudder showed "engine offline"
  until `bun run dev` was restarted by hand (measured twice). Backends now live in a process-wide
  registry: reused across restarts, stopped only when the dev process exits, restarted if they crash.
  The "engine not running, quietly" answers (89ff2238) are unchanged and read the same registry.
2026-09-27 20:09:03 +00:00
Doxa Maps
652a7b4f7d Merge branch 'main' of https://git.nuxtbase.app/doxa-life/doxa-maps into bundler-3/work
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
2026-09-27 20:04:56 +00:00
Doxa Maps
dd7dc0f39a Use the words that already existed in eleven locales
rega: the Scripture scope stayed English under ar, because gospel.res.newTestament and
gospel.res.fullBible exist in NO locale — while gospel.charts.newTestament and
gospel.charts.fullBible have existed, translated, in all eleven all along. Every locale was
falling back to my English defaults, and even en read my lowercase "full Bible" against the
catalogue's "Full Bible".

I asked studio for three new keys without checking whether the words were already owned. Two of
them were. The chip now reads the existing pair — verified in the built bundle: the Arabic
"العهد الجديد" and "الكتاب المقدس كاملاً" are both in it — and only the part count still needs a
key of its own, gospel.res.nParts with {n}, which I have narrowed studio's request to.

Two keys for one word is exactly the drift I have spent this flight fixing in other people's
code. The namespace reads oddly for a map chip, and that is the smaller problem.
2026-09-27 20:03:13 +00:00
Doxa Maps
f3e671949b README: vibe coders first in 'Who it's for', and an Acknowledgements line
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
Vibe coders get their own subsection at the top: one repo with many plugins (own src/, one
shared library), the Plugin Studio live with bun run dev, Rudder as the offline voice-to-text
corner widget in the Studio (Linux today), one plugin to embed or mobile with Rudder as the
desktop-target example (packaging next, as its own README says), and 'Run it in the cloud'. Only
what is on main. Acknowledgements thank the open-source projects it stands on (Vue, Vite, MapLibre,
Pinia, Vue I18n, Capacitor, Tauri, oauth2-proxy, NeMo-Speech.cpp + Nemotron, OpenStreetMap via
OpenFreeMap); no personal names. public-hygiene clean.
2026-09-27 19:52:44 +00:00
Doxa Maps
d8c73c69fd Merge branch 'main' of https://git.nuxtbase.app/doxa-life/doxa-maps into bundler-3/work
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
2026-09-27 19:50:24 +00:00
Doxa Maps
918bc3a28e The scope is a number in the data and a word in the surface
dx-shepherd caught what I had just shipped: "full Bible", "New Testament" and "N parts" were
being generated in the BUILDER, so English was baked into data that no locale can translate and
no catalogue owns. The same mistake I have been fixing in other people's surfaces all day, made
one commit earlier by me.

The builder now ships FCBH's part count and nothing else — 27 on 400 codes, 66 on 41, another
count on 82, none on 367 — and the leaf names it through tOr(), so it localises the moment
studio adds three keys: gospel.res.newTestament, gospel.res.fullBible and gospel.res.nParts
with {n}. English inline until then, as always.

A count that is neither 27 nor 66 is still reported as itself and never rounded up to a
Testament, and no count still names only the source.
2026-09-27 19:50:08 +00:00
Doxa Maps
f163cd6d79 Say which books, not just that a Bible exists
The Scripture chip named its source ("Faith Comes By Hearing") and stopped there, for 887
codes. FCBH publishes its own verse scope in the same record — au.vsc, "N parts, FIRST to
LAST" — and 567 of those 766 carry one: 400 New Testaments, 41 full Bibles, the rest partial.
A catalyst standing with a group needs to know whether that link is a whole Bible or two
books, and the data said so all along.

The chip now reads "Scripture · checked (New Testament — Faith Comes By Hearing)". 27 and 66
are named as Testament and Bible; anything else reports the part count FCBH claims and is never
rounded up. 367 sx codes still carry no scope — Scripture Earth's 104 and Door43's 17 publish
none in this record, and 47 FCBH rows omit it — and those say only the source, which is the
honest thing to say when the scope is unknown.

Found because go-int asked whether the FCBH text is a New Testament. It is a fair question to
ask of a map that had the answer in a field it never rendered. Their tree now reads the same
field and their green count went 128 to 195 across the roster.

Still FCBH's claim, cited, not counted book by book here — the same standard as the rest of
this corpus, and it is on the chip rather than buried in a builder.
2026-09-27 19:44:24 +00:00
Doxa Maps
570f521910 Gospel x Internet: a shared tree link restores its rows, and FCBH's verse scope counts
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
A ?tree= link applied its node as soon as the tree file loaded; if that was
before the rows, the node's on-board languages were the empty set and the
grid restored to 0 (rega F1). The node now applies once both have loaded.

The New Testament rule also reads FCBH's own verse scope (people-group-pins
codes[iso].au.vsc, 27 or 66 parts), gospel-plugin's pointer: green 128 ->
195. Kyrgyz (33 parts) and three languages with no scope stay yellow.
2026-09-27 19:42:03 +00:00
Doxa Maps
c65e1a5f9c Gospel x Internet shares a tree family by its id alone
A family click wrote ?tree=<id> AND its whole language list (hundreds of
codes for a big family), a link that breaks in chat apps and SMS. The
board's writer now runs after the kit's and removes 'language' while a tree
node is active; ?tree= alone restores the node and its languages.
2026-09-27 19:37:09 +00:00
Doxa Maps
cc5563d9f9 Gospel x Internet: re-join after gospel-plugin's tier and access fix
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
The access sub-ladder follows the corrected pools (read and watch 869 ->
1,129, watch or hear cannot read 806 -> 518, read 57 -> 85). Nothing found
(369), own/bridge/zero and the band headline are unchanged.
2026-09-27 19:32:21 +00:00
Doxa Maps
e6eb2155b4 Merge main into go-int/work 2026-09-27 19:29:50 +00:00
Doxa Maps
2044081798 Rebuild the served tree after merging main
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
2026-09-27 19:26:55 +00:00
Doxa Maps
37aaf69c24 rega's four notes on the card, all four mine
1 THE CHIPS SAID "unchecked" ON VERIFIED LINKS. Card mode never fetches the verification table,
so every chip understated the evidence behind it — caught on central-sama, whose Scripture and
film are both verified. Each shard now carries the states for its OWN urls, keyed by url exactly
as linkVerify is, so vchip() and vtitle() work unchanged. Shards grew 8.0 KB to 14.0 KB mean,
29 KB worst; against 6,051 KB for the map that is a price worth paying for not lying about
evidence.

2 MY GATE'S FALSE NEGATIVE, which cost rega a round: it asserted
text.includes(slug.split('-')[0]) — "abai" against a rendered "Abai Sungai". A slug fragment is
not a name. It compares the roster's name, case-folded, anywhere in the card.

3 THE EMPTY GREY BAND. The sheet is a bottom panel capped at 62% of the map; in card mode there
is no map under it, so a phone showed 285px of grey above it. Full height in card mode, and the
border radius goes with it.

4 THE CLOSE BUTTON with nothing behind it — hidden in card mode, both instances of it.

gates:pre 11/11, LINK-COVERAGE 12,292 unchanged, SFC-PARSE PASS. rega spot-checks after landing
per dx-shepherd; the render claim is still not mine to make.
2026-09-27 19:26:29 +00:00
Doxa Maps
3db3efdbbd Gospel x Internet share links through the kit: ready
The WIP adoption of useShareableView (9296aa9c) is complete now that the
kit reads ',' or '|' (studio landing 26): an old multi-value link
(band=yes|partial) restores as two values, and the model check that pinned
the break passes unchanged.
2026-09-27 19:21:14 +00:00
Doxa Maps
283c0f5b5d Merge main into go-int/work 2026-09-27 19:18:42 +00:00
Doxa Maps
1b397dc327 Rebuild the consumers main left stale (build owner, README rule 5)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
check:composite-freshness found stale on main: dashboard-plus-grid
research-dashboard. Rebuilt, tree + SRI
regenerated; the landing precondition (fresh, one folder, SRI) passed in main-capture scan.
2026-09-27 19:14:09 +00:00
Doxa Maps
8c99bbe611 One normalizer for the card and the map, not two that agree by hand
Third report of a blank card, and the root cause was never a missing field — it was two code
paths producing "the same" object. build-field-cards.mjs copied groupAt()'s 39 fields by hand
and missed door43, which exists only in that normalizer, so the sheet's
`!selectedGroup.door43.length` threw on undefined. I fixed a value, then a timing, then would
have added door43 and waited for the fourth.

The shard now ships the RAW INPUTS the map itself holds — the pin row, the whole code record,
the country name and the two bridge records — and the leaf's groupFrom() normalizes both
paths. groupAt(i) is a three-line wrapper over it. A field added to the sheet reaches the card
with no second edit, and forgetting one is no longer possible. The code record is passed WHOLE
rather than picked over, because picking fields is exactly the mistake above. Shards got
smaller doing it: mean 8.0 KB against 9.1.

Two sheet-level sources the card fetches nothing for are seeded from the shard: the prayer page
(prayIndex) and the SUN block. Both matter most to this persona — a catalyst with a Deaf group,
or one handing someone a prayer page — and both were silently absent while the card "worked".

Verified statically, since I cannot render: every one of the 28 fields the sheet reads off
selectedGroup is produced by groupFrom, so the two paths cannot disagree about any of them.
rega has the render.
2026-09-27 19:11:42 +00:00
Doxa Maps
e79d6dc8f4 A shared link reads a list separated by , or |, so partner links already published keep working
Links on partner pages write band=yes|partial, and the reader split on ',' only,
so such a link read back as one value and matched no row. Reading now accepts
either separator; writing stays ','. A literal '|' in a value is percent-encoded
before any join, so every separator left in a URL is a real one.
2026-09-27 19:10:08 +00:00
Doxa Maps
b6e3e005a3 Rebuild the consumers main left stale (build owner, README rule 5)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
check:composite-freshness found stale on main: none; also rebuilt: research-dashboard dashboard-plus-grid. Rebuilt, tree + SRI
regenerated; the landing precondition (fresh, one folder, SRI) passed in main-capture scan.
2026-09-27 19:04:56 +00:00
Doxa Maps
34573a27c9 A CSV export honours the typed search, so the file matches the table on screen
With no facet filter and no selection, a table narrowed by typing exported every
row in the source. The export now takes an optional search transform, and the
data table passes the matcher it already uses for its visible rows. An explicit
selection still outranks the search, and a caller that passes nothing is
unchanged.
2026-09-27 19:01:10 +00:00
Doxa Maps
3cf20a237c The Scripture chip stops saying "none found" to people who have a Bible
The sheet tested scripture_url alone, so for every code whose readable text is NOT at c.s it
rendered "Scripture · none found". 887 codes keep theirs elsewhere — on the Faith Comes By
Hearing record, on Scripture Earth, or in a Door43 translation — and 332 field cards carry
one. A catalyst reading that chip was told there is nothing to read while the link existed.

The chip now links `sx` and NAMES its source, because a reader deserves to know they are
being sent to an audio site to read: "Scripture · checked (Faith Comes By Hearing)". The
verification state and title come from the same record as any other link, so nothing here is
claimed that the link record does not already support. The card carries sx for the same
reason — the tier that promises Scripture and the panel that shows it must agree.

Two placement mistakes of mine, both caught by checking the DATA rather than the diff: the
first edit matched `credit: c.cr || null` in the bridge helper instead of the card object, and
a str.replace with no match is a silent no-op that reports success. The card had no sx and
said so when I looked for it, which is why the second attempt asserted its anchor.
2026-09-27 19:01:05 +00:00
Doxa Maps
6e41ef9fda check:gospel-internet derives the sub-ladder counts from the table
The OR-within-key assertion compared with typed numbers (57 + 806), which
break whenever the gospel pools are corrected (one is: 806 -> 518). It now
checks the rule against the table's own coverage report.
2026-09-27 18:57:56 +00:00
Doxa Maps
9296aa9cc6 WIP Gospel x Internet adopts the kit's useShareableView for its share links
Query mode, the published names as an alias map (links already shared
keep restoring), write only on our own leaves. The board's own writer now
keeps only view/group/panel/tree. NOT READY: an old multi-value link
(band=yes|partial) reads back as one value until the kit reads '|' on
parse; the model check pins that case and fails until it does.
2026-09-27 18:57:26 +00:00
Doxa Maps
f68cb24e78 2,001 groups had readable Scripture and were told they did not
go-int cross-checked 20 roster languages with "no New Testament found in the pools" against
open-data signals. Thirteen of the twenty had readable text all along — on a record the tier
could not see — and chasing that found one rule written four times and wrong in two of them.

THE BUG. tierOfCode tested `!!c.s`, one field, while this build's own hasReadableScripture
tested four sources. Tier 2 means "Scripture AND film", so a language whose text is on the
Faith Comes By Hearing record (au.m names the media it holds), on Scripture Earth, or in a
Door43 translation was scored 1 — "some resource found" — with its own text and the JESUS
Film both in hand. Measured: 602 codes and 2,001 of 12,379 groups move 1 -> 2. Tier 0 does
not move at all, 1,592 before and after, so nothing about who has NOTHING changes: the gap
lists, the 369 zero-access groups and the bridge-reach table are untouched.

THE SAME BUG DOWNSTREAM, and this is the one a catalyst would have felt: resourceRows typed
an FCBH record "audio, text, video" as Audio Scripture only, so the access table's
byType.Scripture never saw it. 288 people groups were published as "watch or hear, cannot
read" while their own readable Scripture sat behind that link. Access now reads 1,129 "read
and watch" (was 869), 518 "cannot read" (was 806), 85 "read" (was 57), 369 nothing found and
6 stories only — unchanged where it should be, and 2,107 in total either way. Typing the row
by its text would have dropped "can hear", so the access builder now counts a Scripture row
whose scope names audio as hearable too.

ONE OWNER NOW. hasReadableScripture is exported from gospel-resource-rows.js and imported by
the pin builder and by check-gospel-coverage-consistent, whose arm F had its own narrow copy
and therefore reported 2,001 disagreements against the corrected tier — a gate defending the
bug it exists to catch. A rule with four copies has no owner; this one has.

`sx` ships alongside: the readable text with its source named, for the 887 codes whose text is
not at c.s, so a surface can LINK what the tier now counts instead of claiming Scripture and
showing a film. Wiring it into the sheet and the field card is the next commit; this one is
data and rules only, and public/ is deliberately NOT rebuilt because rega is rendering this
worktree.
2026-09-27 18:53:52 +00:00
Doxa Maps
9d7d630fd6 Rebuild gospel-internet on main 105f98b6 (landing 24)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
2026-09-27 18:50:15 +00:00
Doxa Maps
fa6a830cf9 Merge main into go-int/work
# Conflicts:
#	public/dx-maps/doxa-maps-spa/manifest.json
#	public/dx-maps/gospel-internet/board/board/index.html
#	public/dx-maps/gospel-internet/board/index.html
#	public/dx-maps/gospel-internet/board/india-china/index.html
#	public/dx-maps/gospel-internet/board/language-tree/index.html
#	public/dx-maps/gospel-internet/board/platforms/index.html
#	public/dx-maps/gospel-internet/board/project-700/index.html
#	public/dx-maps/gospel-internet/board/zero/index.html
#	public/dx-maps/gospel-internet/gospel-internet.js
#	public/dx-maps/manifest.json
2026-09-27 18:49:51 +00:00
Doxa Maps
105f98b60b Rebuild the consumers main left stale (build owner, README rule 5)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
check:composite-freshness found stale on main: none; also rebuilt: research-dashboard dashboard-plus-grid. Rebuilt, tree + SRI
regenerated; the landing precondition (fresh, one folder, SRI) passed in main-capture scan.
2026-09-27 18:44:28 +00:00
Doxa Maps
d4df92cfb8 Translation readiness ranks only the languages without a New Testament
A language with one scored 5 (its Bible counted as Scripture) and sorted
to the top of the 'Open data' column, the opposite of the translation
question (rega, pre-landing T1). The column is now blank for languages
with a New Testament found, so it sorts them last; the drawer still shows
every signal.
2026-09-27 18:42:02 +00:00
Doxa Maps
e2cebd9130 Shared links keep partner param names, and a CSV export matches multi-value filters
A shared table link can now be written as one query param per facet, and a
param name may map to a different bus key, so links already published on
partner pages keep working. The CSV export matched no rows once a reader picked
a second value in a filter; the default row match now reads a multi-value filter
as OR, and the gate no longer exempts that line.
2026-09-27 18:40:47 +00:00
Doxa Maps
19a3b7a006 Rebuild the consumers main left stale (build owner, README rule 5)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
check:composite-freshness found stale on main: all-people-groups
cities-internet
country-posters
dashboard-plus-grid
demo-map
doxa-research-map
doxa-simple-map
gospel-internet
gospel-resources
key-cities
my-upg-100-list
pplr-data-maps
regions-dashboard
research-dashboard
template-bundle
upg-neighbor
wall-of-people-groups. Rebuilt, tree + SRI
regenerated; the landing precondition (fresh, one folder, SRI) passed in main-capture scan.
2026-09-27 18:34:00 +00:00
Doxa Maps
c9e8a3c604 The card waits for its data before it renders
Second failure on the same feature, and the cause was timing rather than values: the sheet
mounted on cardMode ALONE, so it read selected.country before the shard fetch had set it.
My previous fix put the right value in the right place and left it arriving too late.

The sheet now appears when there is DATA — v-else-if="selected || showGapList", with cardMode
removed from that condition entirely, because a card that has arrived sets both. A wait box
stands in until then and shows the error if the shard 404s, so a loading card looks like one
and a failed card says so instead of showing nothing.

And the card now carries the BRIDGE's own links. In card mode the pin index is never fetched,
so bridgeResources() found nothing and a tier-0 card would have named a way in with no way to
follow it — the single most important thing on that group's card. Derived in the builder
exactly as the leaf derives it, FCBH text fallback included, because a group's readable
Scripture is sometimes only on the audio record. Verified in the data: abai-sungai's card
carries Indonesian with its Scripture, film and Zume links.

NOT LANDING THIS until rega has rendered it on the branch. I have now shipped this feature
blank twice on checks that passed, and the missing check was always the same one: that it
renders. I cannot run a browser, so the claim is not mine to make.
2026-09-27 18:30:51 +00:00
Doxa Maps
489a1b02c0 Rebuild gospel-internet on main 7fe18446 (landing 22) 2026-09-27 18:25:41 +00:00