clone

a deno framework for local-first web apps that open instantly, work offline and sync when users choose

feat/prf-provision-custody
lofi / docs / spikes / opfs-device / evidence / 2026-07-15.md
2026-07-15.md 3.5K rendered
1# OPFS desktop preflight and device evidence — 2026-07-1523Issue: [#4](https://github.com/FelineStateMachine/lofi/issues/4)\4Exact stack: Jazz 2.0.0-alpha.53, Astro 7.0.9, Preact 10.29.7, Deno 2.9.0\5Desktop preflight: macOS 26.5.1, Headless Chrome 150.0.0.067## Enforced behavior89The graduated runtime requests only Jazz's persistent driver and rejects boot before creating an10identity/database when secure context, OPFS, SharedWorker, Web Locks, or MessageChannel is missing.11There is no memory configuration or automatic fallback. UI separately reports:1213- capability eligibility;14- `persistent-driver-open` only after `createDb()` resolves;15- per-write local durability only after `WriteHandle.wait({ tier: "local" })`;16- `navigator.storage.persisted()` state and the result of an explicit persistence request.1718## Desktop preflight1920- capability report: secure context, OPFS available, SharedWorker available, Web Locks available;21- initial eviction-persistence state: not granted;22- a write updated both islands, survived reload, and survived explicit/concurrent client recreation;23- two same-origin pages and the exact Jazz control exercised the SharedWorker baseline in #7;24- production service worker reached `ready`, controlled the page, and installed a revisioned cache;25- with browser networking forced offline, a cold page reload rendered the prerendered shell;26- while still offline, a new local write appeared in both islands, reached local durability, and27 survived another offline reload plus a subsequent online reload;28- recursive build scan found no server-secret name or value in the client artifact.2930Returning online is recorded only as retained local behavior. The pinned Jazz API exposes no public31connection-state or convergence signal, so this evidence makes no transport-reconnection claim.3233This is preflight only. It does not replace the required physical iPhone and Android evidence.3435## Physical matrix status3637| Surface | Status |38| ----------------------- | -------------- |39| iPhone Safari tab | deferred to M3 |40| iPhone Home Screen app | deferred to M3 |41| Android Chrome 148+ tab | deferred to M3 |42| Android installed app | deferred to M3 |4344## M1 approval4546The product owner approved the M1 OPFS/PWA feasibility decision on 2026-07-15 from the stable HTTPS47artifact at <https://n.zip/2c6d/>. The live page hydrated both islands, reported a secure context,48OPFS, SharedWorker, Web Locks, and `persistent-driver-open`, retained a write across reload, and49preserved the 1 / 2 / 1 / 1 runtime cardinality.5051The host exposed one integration defect: its explicit `index.html` canonical redirect used HTTP,52which made a service-worker precache transaction redundant. Lofi now caches and falls back to the53canonical scope root (`./`) and reports a redundant worker as `failed`; an nzip host patch is being54prepared upstream. This does not change the durability decision.5556After republishing that workaround as artifact sequence 3, the live worker activated with scope57`https://n.zip/2c6d/`, installed the revisioned cache, controlled the next load, and rendered the58hydrated persistent-driver UI after a forced offline reload. The only offline console failure was59nzip's Cloudflare browser-analytics request; no application resource or hydration failed.6061This approval validates the M1 capability gate; it is not a claim that the physical matrix above62ran. The full checklist remains required for M3 production PWA hardening. The shared nzip origin is63also accepted only for OPFS/PWA feasibility, not as passkey or identity-isolation evidence.