clone

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

feat/141-effect-library
lofi / docs / spikes / opfs-device / device-checklist.md
device-checklist.md 5.0K rendered
1# OPFS device checklist23> Framework QA checklist. This is retained with the spike evidence and is not part of the normal4> generated-app onboarding path. Adapt labels and selectors to the current starter before running5> it.67Issue: [#4](https://github.com/FelineStateMachine/lofi/issues/4)\8Build: fill from the site's `lofi-build.json`\9Jazz: 2.0.0-alpha.531011Never record environment values, identity secrets, or task contents that are sensitive. Use unique12throwaway task labels such as `ios-tab-A-1`.1314## Record before testing1516| Field | Value |17| ------------------------------- | ----------------------------------------------------- |18| Device model | |19| OS and exact version | |20| Browser and exact version | |21| Surface | browser tab / iOS Home Screen / Android installed app |22| Canonical HTTPS URL | |23| Display mode shown by site | |24| Secure context | pass / fail |25| OPFS | pass / fail |26| SharedWorker | pass / fail |27| Web Locks | pass / fail |28| `navigator.storage.persisted()` | granted / not granted / unavailable / error |29| After request | granted / not granted / unavailable / error |30| Runtime storage state | `persistent-driver-open` / failed |3132If the site says `Durable driver blocked`, stop. Record the missing capability. Never continue under33a memory fallback.3435## Durability3637Use a new throwaway label for each row. Confirm it appears in the task list and that the status line38reports local durability.3940| Test | Action | Required result | Result |41| ------------------- | ------------------------------------------------------------ | --------------------------------------- | ------ |42| Reload | Add task, reload page | Task returns | |43| Browser termination | Add task, terminate browser from app switcher, reopen URL | Task returns | |44| App termination | Installed surface: add task, terminate installed app, reopen | Task returns | |45| Device restart | Add task, restart device, reopen same surface | Task returns | |46| Background | Add task, background 5+ minutes, foreground | Task remains; app becomes reactive | |47| Offline foreground | Load once, airplane mode, reopen installed surface, add task | Shell and local write work | |48| Reconnect | Disable airplane mode | Local task remains; no false sync claim | |4950## Multi-tab / multi-window51521. Open the exact canonical URL in tab/window A and B.532. Confirm both show `persistent-driver-open`.543. Add `A-<timestamp>` in A; confirm B updates without reload.554. Add `B-<timestamp>` in B; confirm A updates without reload.565. Submit once from both surfaces as closely together as possible; confirm both distinct tasks57 appear in both surfaces.586. Close A; write in B; reopen A and confirm the write.597. Confirm every live page shows one active client and one underlying subscription locally. Counts60 are per page; the Jazz SharedWorker owns cross-tab leader/follower coordination.6162## Installation6364### iPhone65661. Run the browser-tab matrix in Safari.672. Use Share → Add to Home Screen.683. Open from the icon and verify the site reports `standalone`.694. Repeat app termination, device restart, offline cold start, and background tests.7071### Android72731. Confirm Chrome is version 148 or newer.742. Run the browser-tab matrix.753. Install from Chrome's install action.764. Open from the icon and verify `standalone`.775. Repeat app termination, device restart, offline cold start, and background tests.7879## Decision8081- **Graduate current floor:** every required surface passes and reports the persistent driver.82- **Raise platform floor:** failures map to an older browser/OS with a known working newer floor.83- **Degrade safely:** only if lofi adds an explicit user-selected ephemeral mode with a destructive84 warning; never automatic.85- **Evaluate Classic Jazz:** only if its IndexedDB path passes the same matrix and the alpha OPFS86 path does not.87- **Change data layer:** any required current target silently falls back, corrupts, or loses data88 and no honest persistent adapter passes.