Seat web.dev on the design council; record PWA backfill

This commit is contained in:
2026-06-07 20:39:56 +03:00
parent d94480f56d
commit dcb7037a71
3 changed files with 46 additions and 22 deletions
+5 -3
View File
@@ -437,11 +437,13 @@ entries).
`DONATE_URL` pending the real link).
- **Offline/installable:** verify the SW + manifest give a working offline + installed app.
**⏳ Remaining** — needs manual verification in a running/installed app.
- **Council** — seat **web.dev** for the PWA/offline/storage surfaces none of the seated
- **Council** — ~~seat **web.dev** for the PWA/offline/storage surfaces none of the seated
members cover: the service-worker **update-available** prompt (`registerType: 'prompt'`),
storage **persistence** (`navigator.storage.persist()`), and the quota **estimate**
(`StorageManager.estimate()`). **⏳ Remaining** (storage monitor is its consumer; seating
triggers a one-off backfill — see [`/council`](../.claude/skills/council/SKILL.md)).
(`StorageManager.estimate()`)~~ ✅ seated + backfilled (update-prompt toast + `persist()`
request; estimate already wired). **⏳ Remaining gap:** manifest ships no icons → not yet
installable (design-asset task). See [`/council`](../.claude/skills/council/SKILL.md) and
[arch 10](architecture/10-interaction-and-feedback.md).
**Manual checks:** keyboard-only run-through; reload restores view from URL;
offline reload works; install as standalone; reduced-motion honored. **⏳ Still owed**
@@ -320,6 +320,20 @@ Datasets (⌘/Ctrl+K), or check the dataset name in your spec."_ — instead of
must match the actual cause (NN/g #9, GOV.UK error-message). The thrown
`DatasetNotFoundError` carries `datasetName` so the surface can name it.
**Resolved — service-worker update prompt & persistent storage (web.dev seat).** The build
uses `registerType: 'prompt'`, so a new service worker waits and never takes over a running
session on its own — the app **must** tell the user, or "ask before updating" silently means
"never update." `orchestration/pwa.ts` consumes `virtual:pwa-register` and surfaces
`onNeedRefresh` as a **durable** (non-auto-dismissing) info toast with a **Reload** action
that calls `updateSW()`; `onOfflineReady` is a transient success toast. Separately, browser
storage is best-effort and evictable under pressure, which for a local-first workspace is data
loss — so we request `navigator.storage.persist()` once at startup
(`infrastructure/storage-persist`), feature-detected and silent on denial (Chromium decides
automatically; nothing for the user to act on). _(Consulted via /council → web.dev, with the
exact API from vite-plugin-pwa/Workbox; see `reference/principles/web-dev.md`. This bullet is
the contract; cite it, not the source.) **Known gap:** the manifest ships no icons, so the app
is not yet installable — a design-asset task, logged not passed._
## 6. Motion & accessibility as default
Not features to add later — the baseline every surface is built on.