Repository navigation
Plan thread F: coverage, upgrades, maintenance and cutover - #4050
Merged
Merged
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the
|
…move the enforcement switch Seven slices. F1 gives every catalog route an authorization class a test checks, and refuses Cloud's Leave and Forget under enforcement (#4049). F2 admits upgrades only along a channel the customer signed. F3 keeps ingress and Private Access running under enforcement. F4 signs the dashboard deploys B5 left. F5 puts teardowns under approval. F6 turns enforcement on once per Cluster with the 0.4 upgrade. F7 removes the switch, so a fresh daemon refuses a join no one approved.
… the live matrix from F1's cases The operator accepted the standing channel, the narrow 0.4 exception and pinned CLI joins. F6 now takes the starting set's keys from each Machine's own peer snapshot and, on the CLI, from pins Cloud doesn't write, with a test that substitutes both identity and answer. The live lanes run F1's per-branch cases, so Bound rows are expected to succeed.
…the Sealing Key The trusted snapshot holds only Members and keys backed by evidence the Machine checked while it enforced. Legacy Members need a person's pin on the CLI path, delivered over the local socket, and the dashboard offers activation only when nothing is legacy. Activation rotates the Sealing Key to the approved set. Adds the planted-before-F6 cases for both paths.
Activation now removes every Device slot and trusted passkey outside the trusted snapshot in the same save that records the activated set, closes their live connections, and makes later Device checks read the snapshot. The CLI lists what it retires and how to add a key back. The unit test and lane 5c call Exec, WrapSealingKey and SetDevice with the planted key after activation.
A key that holds both a Device slot and Cloud's Operator slot kept its open Exec stream after activation retired the Device slot, because revocation fired only once no slot admitted the key. The plan now has the watcher compare scope, adds the duplicate-slot case to the unit test and lane 5c, and extends thread A's gap 7.
…on close Activation's save could be outrun by Exec input, by a mutation queued while its key was Full, and by a Build Grant minted before it. The plan now has writes that narrow authority hold an authority gate across save and publish, every scope-authorized effect recheck under it before acting, and activation end every grant. The watcher is cleanup only.
Each review round found another effect that outlived the activation write. Activation now writes a pending record and restarts the daemon. The new process stops the Volume plugin, re-verifies join approvals and upgrade attempts, and commits the activated record before it serves anything. No connection, grant, worker or want from before the commit survives it.
restart-approvals.json caches join replies and accepted builds that admit work, and machine.db holds the specs boot restores. The commit now re-verifies cached joins against the snapshot, drops every AcceptedBuild, and restores doors and the Private Access router only to their stored state on pinned images. The inventory test covers files, cache keys and machine.db tables.
The tailscale state directory is the durable word that a Machine wants a router, and restore reads it. It restores the same node on the same tailnet with the pinned image, and the inventory test now walks the data directory recursively.
nick-potts
force-pushed
the
t3/sec04-f-plan
branch
from
November 10, 2026 13:07
e694865 to
9d2ed1f
Compare
nick-potts
marked this pull request as ready for review
November 10, 2026 13:08
nick-potts
enabled auto-merge
November 10, 2026 13:08
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.
Why
Whoever takes over Ployz Cloud must still be unable to read secrets, run code of their choosing on a Server, take data off a Server, or add a Server or Device. Threads A to E close those routes one at a time behind a per-Cluster enforcement switch. Thread F makes the result whole and ends the switch:
This PR is the plan only. It adds no product code.
What's in it
docs/agents/plans/security-0.4/f-plan.mdhas seven slices. Each one names its outcome, the attack path it closes, its files, and its unit, live (verify-server and attacker-harness) and perf checks.docs/agents/plans/security-0.4/f-inventory.mdlists every catalog route with its class and what an Operator gets today under enforcement. It also lists every automatic effect, every Cloud path still sent unsigned, and every place the switch lives.LeaveandForget(#4049).Rulestatement.--off.DESIGN.mdgets the 0.4 exception.Operator decisions (one recommendation each)
Handoffs owned here
RemoveVolume): handed to E6 (gap 5).DESIGN.mdtext.Design bets
Residual
Named once. Cloud picks when and in what order upgrades and approved teardowns run, and can mislabel through the
Boundroutes the inventory lists.