01 / Verification by change type
Match checks to the affected component
The verification table covers desktop, web, API, CLI, mobile, databases, billing, and a separate enterprise workspace. It warns that workflow path filters can miss consumers of shared packages.
Source excerpt starting at line 31.31Treat `.github/workflows/` and their composite actions as the source of truth for commands, setup, features, targets, and exclusions. Re-read them when changing this guide or CI. Run locally reproducible checks before committing; include affected consumers of shared packages even when workflow path filters miss them. A skipped workflow/job is not passing coverage.
02 / Verification by change type
Verify the job and the candidate
Native desktop and mobile coverage is not implied by a green PR result. Release verification requires the relevant job on the recorded candidate SHA.
Source excerpt starting at line 70.70- Desktop native CI (macOS, Windows, Linux x86_64/ARM64, and Swift) runs only on the daily schedule and `workflow_dispatch`, including release-candidate verification. PRs and pushes to `main` run desktop JS and i18n checks. Mobile iOS, Android, and watchOS native jobs also skip PRs. Check each required job and SHA, not only the aggregate green result.
03 / Generated file guards
Name generated outputs and their owners
OpenAPI, native bindings, permissions, and translations each have an owning generation command. Stable regeneration is required; hand-editing output would leave the source of truth unchanged.
Source excerpt starting at line 61.61- Regenerate native bindings and permissions using their owning Rust build/generator; do not hand-edit generated output. The macOS desktop job checks `plugins/db/js/bindings.gen.ts`, `plugins/db/permissions/autogenerated`, and `plugins/db/permissions/schemas/schema.json` for drift. Mobile bridge generation belongs to `cargo xtask mobile-bridge`.
04 / Architecture as narrative
Design migrations for the installed older build
Nightly and stable share a database. The file requires additive migrations by default and an explicit marker when older versions must refuse to open a newer schema.
Source excerpt starting at line 82.82- New SQLite migrations must be downgrade-safe (older builds tolerate newer schemas): additive only, new columns nullable or with a DEFAULT. If a migration can't be downgrade-safe, add a `-- breaking` line to the leading comment block of its `.sql` file so older builds refuse the database with an update prompt. Nightly and stable desktop builds share one database, so a breaking migration published in Nightly locks stable out until stable ships it.
05 / Behavioral framing
Scale command architecture to its state
The reducer/effect/runtime split is conditional on actual orchestration or state complexity. Simple browse and select flows are directed to a smaller structure.
Source excerpt starting at line 97.97Use the full reducer/effect/runtime split only when the command has async orchestration, a multi-step workflow, or substantial state transitions that benefit from reducer-style tests.