- validate-data now scans cu/services/prayers (349 files; 331 -> 680 total).
- marker types (TROPARION/KONTAKION/THEOTOKION/LITANY/COMMUNION) factored
into PRAYER_NODE_TYPES with a keep-in-sync comment.
- COMMUNION marker (cu COMMUNION/SUN.json) added per the same convention.
Both node types are bare classification markers with no payload
(content lives in TEXT/HEADER nodes, matching the TROPARION/KONTAKION
convention already in the allowlist). Clears the 13 pre-existing
validate errors; no data or rendering change.
- loadManifest() goes through DataCache.fetchWithFallback: the file list is
written to IDB and survives SW-cache eviction; a run with the reduced
fallback set is flagged and shown as degraded (new i18n en/ru/cu).
- 404 answers are counted as 'missing' (deployment drift) with a
preload-missing diag entry, instead of silently reporting Done.
- preload() is re-entrancy safe: concurrent calls join the in-flight run.
- versions.json is loaded once per session (was fetched per translation).
- Write-through failures in fetchWithFallback()/fetch() log idb-write-fail.
- preload-manifest.json SW route is NetworkFirst (fresh coverage online).
- Manifest now also covers the shared/lives + shared/commands fallbacks.
Root cause of 'pre-cache done but offline data missing':
1. Preload manifest never listed the services/{prayers,texts,headers,var}
subtrees the Service view dereferences (CommonPrayers->prayers, etc.),
plus only 13 hardcoded commands. Generator now enumerates all of them
(en 1500->1740, ru->1333, cu 1500->2108 files).
2. DataCache.set silently resolved on IDB write failure (quota exceeded),
so preload counted un-stored files as success and reported 100% done.
set() now returns boolean; preload treats failed writes as failures
that feed the existing circuit breaker (visible abort + diag entry).
3. No persistence request: added best-effort navigator.storage.persist()
before preload, diag-logged.
4. Dropped dead manifest weight (menaion-common/add, horologionadd) -
never referenced by any view.