Test Local-First Quality Gates
Use this as a release gate for local-first apps.
Gate Table
| Area | Test |
|---|---|
| migrations | every supported old version migrates to current and preserves rows |
| backup | backup validates before success message |
| restore | clean install can restore and run offline |
| WAL/copy | live SQLite backup does not copy only .db while WAL has data |
| export | CSV/JSON export handles thousands of rows and special characters |
| import | unsupported versions fail safely |
| encryption | backup cannot be opened without key/password |
| key recovery | forgotten password/key loss behavior is documented |
| offline queue | actions persist through app restart and retry once online |
| idempotency | repeated push does not duplicate server state |
| conflicts | stale update and delete-vs-edit have deterministic outcomes |
| browser quota | quota exceeded shows recovery UX |
| multi-tab | IndexedDB version upgrade handles blocked tabs |
| performance | low-end device handles realistic data volume |
| observability | sync/backup failures leave inspectable error state |
Small App Minimum
For a v1 privacy-first app, do not skip these:
- migration test
- export test
- clean restore/import test
- offline launch test
- app lock or private-data access review
- storage pressure/error message test
Example Acceptance Criteria
Given a version 1 database with 5,000 transactions
When the user upgrades to version 3
Then all transactions remain queryable
And PRAGMA integrity_check returns ok
And CSV export contains the same transaction count