This is the contributor-facing release runbook. The implementation-level source of truth for WORK-M4-B lives in docs/plan/m4-full-polish/release-readiness-runbook.md.
| Platform | Channel | Policy |
|---|---|---|
| macOS | Primary | External releases should be signed and notarized before public distribution. |
| Windows | Preview | CI builds unsigned MSI / NSIS installers. Code signing is optional future hardening, not a release blocker. |
| Linux | Preview | CI builds packages when host tooling is present; checksums are part of the release contract, signatures are not yet universal. |
Validated now: Google Chrome; Microsoft Edge / Edge Dev; Firefox history-only baseline; ChatGPT Atlas on macOS; Perplexity Comet on macOS; Safari baseline on macOS after Full Disk Access is granted.Implemented, not yet publicly promised: Chromium, Brave, Vivaldi, Arc, Opera, Opera GX, LibreWolf, Floorp, Waterfox.- Promotion into README / onboarding / release claims requires the gate in docs/architecture/browser-support-and-adapter-playbook.md.
| Artifact | Produced By | Audience | Notes |
|---|---|---|---|
| Browser bundle | bun run build |
CI / local validation | Confirms the frontend bundle still builds. |
| Debug desktop binary | bun run desktop:build:debug |
Maintainers | Used for pre-release smoke and packaging rehearsal. |
macOS .app / .dmg |
GitHub Release workflow |
Users | Signed / notarized only when Apple secrets are configured. |
| Windows installers | GitHub Release workflow |
Users | Unsigned MSI / NSIS outputs stay small and run the WebView2 download bootstrapper only when the runtime is missing; Unknown Publisher and SmartScreen prompts are expected. |
| Windows test binary / installers | GitHub Windows Test Binary workflow |
Maintainers / QA | Manual workflow artifact only; builds unsigned Windows release binary plus MSI / NSIS installers without updating GitHub Release assets. |
Linux .AppImage / .deb / .rpm |
GitHub Release workflow |
Users | Requires Linux packaging dependencies on the runner. |
SHA256SUMS.txt |
GitHub Release workflow |
Users / operators | Attached to every release. |
RELEASE-MANIFEST.json |
GitHub Release workflow |
Operators / support | Lists released files, sizes, and checksums for traceability. |
Keep these three files aligned before tagging or dispatching a release:
package.jsonsrc-tauri/Cargo.tomlsrc-tauri/tauri.conf.json
The GitHub Release workflow now fails fast if those versions drift or if the requested release tag does not match them.
To bump them together locally, run:
bun run release:bump -- 0.2.0The canonical desktop namespace is now com.yi-ting.pathkeep.
This is a clean break: if you still need data from an older dev.codex.pathkeep install, move it manually before release validation.
Run:
bun run verifybun run verify runs the strict per-commit checker first, including coverage, browser build, browser-preview e2e, desktop-bridge truth, and desktop-contract JS mutation, then adds the debug desktop build rehearsal.
For long-running mutation investigation before a high-risk release candidate, use:
bun run check:deep
bun run mutation:js:full
bun run mutation:rust:fullThen perform the platform and traceability review from:
Entry points:
- Push a tag such as
v0.2.0 - Run the
Releaseworkflow manually from GitHub Actions
Manual workflow inputs:
draftprereleaserelease_tag(optional explicit tag; defaults tov<package.json version>)platforms(all,linux-windows,linux,windows, ormacos)unsigned_preview(defaulttrue; required for the unsigned Windows release path)
Workflow behavior:
- bump versions locally first with
bun run release:bump -- <semver> - verify the repo with
bun run verify - generate the local size attribution bundle with
bun run release:size-audit - resolves the tag and version up front
- verifies version sync across the repo
- builds release bundles on the selected platform matrix
- when
unsigned_preview=true, builds unsigned bundles with--no-sign, disables updater artifacts, and skipslatest.json - when
unsigned_preview=false, builds updater artifacts and publisheslatest.json - Windows installers use Tauri's
downloadBootstrapperWebView2 mode so the common Windows 11 / current Windows 10 path stays small while missing-runtime machines can still install with internet access - uploads assets to the GitHub Release
- downloads the assets again
- publishes
SHA256SUMS.txt - publishes
RELEASE-MANIFEST.json
GITHUB_TOKEN
APPLE_CERTIFICATEAPPLE_CERTIFICATE_PASSWORDAPPLE_IDAPPLE_PASSWORDAPPLE_TEAM_ID
TAURI_SIGNING_PRIVATE_KEYTAURI_SIGNING_PRIVATE_KEY_PASSWORD
The current Tauri config has bundle.createUpdaterArtifacts=true, so the Release workflow fails fast when unsigned_preview=false and TAURI_SIGNING_PRIVATE_KEY is not configured. Unsigned Windows installer builds use unsigned_preview=true; they do not need updater signing secrets and do not publish updater artifacts.
Set the updater private key as a repository Actions secret only before dispatching an updater-enabled release:
gh secret set TAURI_SIGNING_PRIVATE_KEY --repo t41372/PathKeep
gh secret set TAURI_SIGNING_PRIVATE_KEY_PASSWORD --repo t41372/PathKeepPathKeep's Windows release path is unsigned. The installer is expected to show Unknown Publisher, and SmartScreen may require the user to choose More info -> Run anyway until the project has publisher reputation.
The CI release config must keep Windows buildable without Windows code-signing secrets. If maintainers later want signed Windows releases, wire that as an optional hardening path without making unsigned Windows installers fail:
- certificate thumbprint in Tauri config
- custom
signCommand - Azure Trusted Signing / Azure Key Vault
Do not gate Windows preview support on any of those providers.
For ad-hoc Windows QA without touching public release assets, run the Windows Test Binary workflow manually from GitHub Actions. It builds on windows-latest, uses the same unsigned Tauri override as the release preview path, and uploads a 14-day workflow artifact containing:
pathkeep-desktop.exe- generated Windows installer bundles such as MSI / NSIS setup outputs
SHA256SUMS.txtWINDOWS-TEST-MANIFEST.json
This workflow is for test-machine handoff only. Promote a build through the Release workflow after versioning, release notes, and the full release checklist are complete.
Every release rehearsal should cover:
- fresh install
- first-run onboarding
- first local backup on Google Chrome, Microsoft Edge, and Firefox
- Browser Direct preview / execute / re-import / revert / restore on Chrome, Edge, and Firefox, with Edge metadata preserved and Firefox kept history-only
- Safari visible-but-unreadable guidance before Full Disk Access
- Safari baseline backup after Full Disk Access is granted
- schedule preview / install / verify / remove
- Windows Task Scheduler apply / status / mismatch or not-installed / remove on a real Windows host or VM
- Windows unsigned installer download,
Unknown Publisher/ SmartScreen prompt path, WebView2 already-present path, missing-WebView2 bootstrapper path, first launch, and reinstall / upgrade over an existing install - encrypted archive unlock and re-open
- remote backup preview / execute / verify
- upgrade or reinstall over existing data
- uninstall expectations
Use the per-platform checklist in docs/plan/m4-full-polish/release-readiness-runbook.md.
For release closeout, also generate the size attribution bundle:
bun run release:size-auditIf a release is bad:
- bad migration or archive compatibility issue: stop distribution, mark the release draft or prerelease as withdrawn, and keep users on the previous build until a fixed binary is available
- bad scheduler artifact: publish a patched build and direct users to remove the generated scheduler artifact via the in-app Schedule page or the documented manual removal path
- AI or derived-state regression: disable the provider or derived-state toggle in Settings, then rebuild or clear derived state; do not ask users to delete canonical archive data
- remote backup regression: stop telling users to rely on new bundles, keep existing local archive data as the source of truth, and use bundle verification results plus checksums to scope impact
- Safari access on macOS still depends on Full Disk Access outside the app.
- Firefox support is a history-only baseline in this release; Firefox favicons, downloads, keyword-search sidecars, and richer
moz_*evidence remain future work. - ChatGPT Atlas / Perplexity Comet support remains scoped to the validated macOS browser-history profile layouts; Windows / Linux locations are not public release promises.
- Windows installers are unsigned in the preview channel. SmartScreen reputation is not proof that the binary failed to build.
- Windows installers require internet access only on the minority of machines missing Microsoft Edge WebView2 Runtime.
- Linux keyring behavior varies by desktop environment; encrypted mode remains supported, but unattended unlock can degrade.
- App Lock remains a session-only boundary; only macOS currently ships a real Touch ID unlock path.