Fetch preload files with 6 workers in flight instead of one-at-a-time,
preserving retry/404/circuit-breaker/IDB-write-failure semantics. Browsers
already cap ~6 connections per origin, so this is safe and cuts a full
3431-file preload to roughly 1/5 the wall-clock time.
Remove the StaleWhileRevalidate routes for /data/*.json and /data/*.text.
IndexedDB is the canonical offline store (every data read falls back to it),
so the SW data caches only thrashed (200 entries over 3431 files) and added a
caches.match/cache.put to every request. Keep NetworkFirst for the manifest
and CacheFirst for fonts.
- 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.
- registerType 'prompt' + skipWaiting/clientsClaim false: new SW waits
instead of silently hijacking running sessions
- main.ts registers via virtual:pwa-register; onNeedRefresh shows
dismissible toast (i18n en/ru/cu) with Update button -> updateSW(true)
- No polling — update check only on navigation, zero extra traffic
- Settings About shows __BUILD_DATE__ build stamp for remote debugging
- Button hidden by default; async isPwaInstalled() check (standalone mode,
ponomar-installed flag, getInstalledRelatedApps) unhides only if installable
- Click hint 'already installed' branch uses same multi-signal detection
- manifest id '/' for getInstalledRelatedApps matching on desktop Chrome