Say we looked, when we looked: 2,608 rows understated their own evidence

The performance worry that started this tick was unfounded and measured as such: the new
gaps table reaches first rows in 1,021ms, second-fastest of the four large tabs and ahead
of Gaps & Opportunities at 1,910ms. 901KB raw but 106KB gzipped, and smaller than the
1.8MB tables already shipping. Nothing to fix.

Reading that table found something that did need fixing. 2,608 of its 3,457 rows — 75% —
carried an EMPTY "pools checked" and listed eBible, Arclight and Door43 as NOT checked.
That is backwards. This build scans all three catalogues in full; a code reaching the
naming pass is absent from every one of them, verified — 0 of the 2,248 such codes appear
in any catalogue. "Not checked" reads as "we do not know". The truth is the stronger and
far more useful "we searched three catalogues and it is not there", which is exactly the
distinction a mobiliser needs when deciding where to work.

A FURTHER 849 ROWS had the same understatement in milder form, claiming only "ebible,
arclight" because their records predate the Door43 pass — though Door43 had in fact been
searched for them too. Provenance is now stamped once, uniformly, over every code: the
three catalogues this build actually scans are named as checked, and the four that
genuinely were not — GRN, api.bible, DBL, Progress Bible, all credential-gated — are the
only things the unchecked list ever names. 3,456 of 3,457 rows now state it correctly.

THE ONE REMAINING ROW IS HONESTLY EMPTY and now says why. "Arab, Gazan", 2,330,000 people,
has no ISO 639-3 code in the source at all, so nothing could be looked up — there was
nothing to look up WITH. Two blank cells read as an oversight; the row now reads "no
language code in the source — no lookup possible".

This moves the map's claims in the direction of knowing MORE, not less, which is the rarer
correction here — the previous eleven went the other way.

Verified: 0 rows left with blank provenance, the coverage gate and map gate pass, the gaps
tab still renders with both export buttons, and the country filter still isolates Chad at
94 and Nepal at 54.
This commit is contained in:
doxa-maps-88655c70 2026-09-24 08:16:54 +00:00
parent 29e4b153a4
commit f35063b0ca
8 changed files with 38 additions and 9 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -70,8 +70,11 @@ for (const [name, lat, lng, iso3, code, pop, tier] of pins) {
iso639_3: code || '',
population: pop || 0,
sign_language: c.sg === 1 ? 'yes' : '',
checked_pools: c.ck || '',
unchecked_pools: c.un || '',
// A group with NO ISO 639-3 code cannot be looked up in any pool at all — nothing was
// searched because there was nothing to search WITH. Two blank cells would read as an
// oversight; this says why. One row is in this state: Arab, Gazan, 2.33M people.
checked_pools: c.ck || (code ? '' : 'no language code in the source — no lookup possible'),
unchecked_pools: c.un || (code ? '' : 'no language code in the source — no lookup possible'),
lat,
lng,
})

View file

@ -234,7 +234,15 @@ for (const p of slim) {
const n = (p.LanguageName || '').trim()
if (!c || c.length !== 3 || !n) continue
if (!codes[c]) {
codes[c] = { l: n, ck: '', un: 'ebible, arclight, door43, grn, api_bible, dbl, progress_bible' }
// ★ THESE POOLS WERE CHECKED, and saying otherwise understates what we know.
// A code reaching this pass is absent from the eBible, Arclight and Door43 catalogues
// — all three were scanned in full, and this code is in none of them. Labelling that
// "not checked" reads as "we do not know", when the truth is the stronger and more
// useful "we searched three catalogues and it is not there". MEASURED: 2,608 of the
// 3,457 gap rows, 75%, carried the weaker claim.
// GRN, api.bible, DBL and Progress Bible genuinely were NOT searched — they need
// credentials this build does not have — so they stay in the unchecked list.
codes[c] = { l: n, ck: 'ebible, arclight, door43', un: 'grn, api_bible, dbl, progress_bible' }
namedOnly++
} else if (!codes[c].l) {
codes[c].l = n
@ -253,6 +261,24 @@ for (const [c, v] of Object.entries(codes)) {
if (n) { v.l = n; catNamed++ }
}
// ★ ONE PROVENANCE PASS, APPLIED TO EVERY CODE. This build scans the eBible, Arclight and
// Door43 catalogues IN FULL, so for any code, absence from them is a searched-and-absent
// result rather than an unknown. The original records predate the Door43 pass and claim
// only "ebible, arclight"; 849 gap rows carried that weaker statement even though Door43
// had in fact been searched for them.
// The four that genuinely were NOT searched — GRN, api.bible, DBL, Progress Bible — need
// credentials this build does not have, and they are the ONLY things the unchecked list
// should ever name. A reader deciding where to work needs "we looked and it is not there"
// to be distinguishable from "nobody looked".
const SCANNED = 'ebible, arclight, door43'
const NOT_SCANNED = 'grn, api_bible, dbl, progress_bible'
for (const v of Object.values(codes)) {
const had = String(v.ck || '').split(',').map((x) => x.trim()).filter(Boolean)
const all = new Set([...had, 'ebible', 'arclight', 'door43'])
v.ck = [...all].join(', ')
v.un = NOT_SCANNED
}
const num = (v) => { const n = Number(v); return Number.isFinite(n) ? n : null }
const pins = []
let joined = 0, withUrl = 0, noCoord = 0, liftedByD43 = 0

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long