docs(security): updater signing-key plan + tighten P013#30
Merged
Conversation
Adds .security/updater-signing-plan.md — the playbook for handling the Tauri updater private key, written ahead of any key existing on disk so the security posture is decided before the rollout begins. Covers: threat model, storage matrix (private key in GitHub Actions secrets only; public key embedded in tauri.conf.json), one-time key generation procedure, three-phase rollout (plan → wired with active:false → activate), bridge-release rotation procedure, incident response with hard-fork escape hatch, and a hard-gates checklist. Rotation cadence is annual + on-leak — a documented exception to global rule R007's 90-day default, justified by Tauri's offline-verification model (every installed app embeds the pubkey, so rotation requires a two-release bridge ceremony that does not scale to 90-day cycles for a solo project). P013 in .claude/project_rules_decisions.md is tightened to point at the plan and to spell out the rotation cadence exception. No code, no key material, no secrets installed. The Tauri auto-updater remains dormant: `@tauri-apps/plugin-updater` is in package.json but the Rust dep is absent, tauri.conf.json plugins block is empty, and the release workflow does not see TAURI_SIGNING_* secrets. This commit only prepares the playbook to follow when each of those flips on. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds
.security/updater-signing-plan.md— the playbook for handling the Tauri updater private key, written ahead of any key existing on disk so the security posture is decided before the rollout begins. Tightens P013 to point at the plan and document an explicit rotation-cadence exception.Closes the P013 follow-up flagged in the 2026-04-28 → 2026-04-29 security-hardening session handoff: "bake the plan in BEFORE flipping the updater on."
What this commit does
.security/(mirrors SuperCharge's convention; will also holdkey-rotation-timeline.mdonce the first key is generated).claude/project_rules_decisions.md— adds a pointer to the plan and spells out the rotation cadenceWhat this commit does NOT do
tauri-plugin-updaterdeptauri.conf.jsonchangerelease.ymlchangeThis is pure preparation. The doc enumerates the exact code/config diffs required at each rollout phase, but applying them is intentionally a separate PR.
Why annual rotation, not 90 days
R007 sets the global secret-rotation floor at 90 days. The plan deviates to annual + on-leak for the Tauri updater key only, with reasoning:
Tauri uses offline minisign verification — every installed app embeds the
pubkeyfrom the build it was made from. A rotation cannot be a single-PR action; it requires a bridge release signed with the OLD key whose embeddedtauri.conf.jsoncarries the NEW pubkey, followed by a release signed with the NEW key (verified by clients now carrying the new pubkey). Two release cycles per rotation. The marginal security gain over annual is small for a solo project where one person controls both the dev machine and the GitHub secrets; the friction cost of doing this every 90 days is high.The exception is scoped to this key only. R007 still applies to every other secret class.
Out of scope
Security notes (R015)
This is a docs-only change; it adds no code, no secret material, no secret-bearing config. Net security posture strictly improves:
Risks introduced: none. Risks the plan commits us to mitigating when implementation begins:
"active": falserollout phase is a footgun if forgotten — mitigation: explicit phase gates in §5Test plan
markdownlint .security/updater-signing-plan.md(if configured) — passes.security/is not in.gitignore(verified — it isn't)🤖 Generated with Claude Code