Last tick established that ?languageId= is ignored by the site — a real id and a bogus id render the same generic library — so 2,087 groups had a film link that did not take them to the film. Arclight publishes the missing piece: media-components/1_jf-0-0/languages/<id> returns a shareUrl, and that IS a deep link — jesusfilm.org/watch/jesus/<language-slug>. 2,082 of 2,087 languages now carry one; 304 existing links were upgraded in place and the rest were written as deep links from the start. The 5 with no shareUrl keep the old URL and their tooltip says so, rather than every group getting the same hedge. FETCHED, NOT DERIVED, and that was the judgement call. The slug looks derivable — "Pashto, Southern" -> pashto-southern, and 8 of 8 sampled names transformed correctly. Eight is not 2,087, and a wrong slug is not a broken link but a link to SOMEONE ELSE'S language, which is the worst failure available here. So the API was asked 2,087 times, rate-limited at 250ms, cached and resumable so it is asked once. 5 missing, 0 wrong. ★ AND THIS CHECK CAN FAIL, which none of the previous jesusfilm checks could. A real slug returns a page carrying the media component id `1_jf-0-0`; a bogus slug returns 0 of them. Sampled 8 deep links: 8 real, 0 bad, and the bogus control returns 0 hits. In a browser the Bhilali link renders "FEATURE FILM JESUS · Watch now · 128 min FHD" while the bogus slug renders "404 PAGE NOT FOUND". That is the first time a jesusfilm URL has been verified rather than assumed in either direction. THE TOOLTIP PROBE FAILED ON THIS COMMIT, correctly: it asserted the old caveat wording, so fixing the links broke the test that described the defect. It now asserts the CONTRACT — a deep link must NOT carry the caveat and a legacy link MUST — which survives the next change to the words. SOURCES-CHECKED-AND-REJECTED.md records the shareUrl endpoint and the `1_jf-0-0` discriminator, so the next agent inherits the answer instead of the dead end. Verified: coverage gate, pins, table and deep-link probes all pass; the film chip on German renders the real deep link with the accurate tooltip. |
||
|---|---|---|
| .. | ||
| external-bundles | ||
| people-groups | ||
| posters | ||
| tables | ||
| vendor | ||
| README.md | ||
data/ — the bundler's source-of-truth data
The law: data lives here; public/ is generated. Every folder in data/ is copied into the
served web-root by the build (internal/generate-tree.mjs), exactly like the per-profile data in
plugin-designs/*/data/. You should be able to rm -rf public/ and get it all back with bun run build.
| Folder | Served at | What it is |
|---|---|---|
people-groups/ |
/assets/people-groups/ |
People-group datasets (CSV/JSON) the maps read at runtime |
vendor/ |
/assets/vendor/ |
Third-party runtime assets (e.g. table libraries) |
posters/ |
/assets/posters/ |
Rendered poster webp set (heavy pipeline output; poster walls fetch these) |
tables/ |
/assets/tables/ |
The MERGED served table set (its index.json is the merge; per-profile plugin-designs/*/data/tables are build-time sources) |
external-bundles/ |
not served | Prebuilt map IIFEs vendored from sibling projects (not built here); only the optional layouts/ shell mounted them, so the build no longer copies them into public/ |
Don't edit anything under public/ by hand — change it here (or in plugin-designs/*/data/,
layouts/*/assets/) and rebuild.