"A machine doesn't blink in and out of the fleet. It walks a path with named doors."
States, not a switch
Membership isn't a boolean you flip. A machine moves through named states: it starts as a discovered candidate, goes through enrolling, becomes active, can flip to suspended and back, and eventually reaches retired — from which it can still be restored, or, by a separate high-risk action, purged. Each arrow is a door with a name, not a value change.
Enrollment is a ritual, not an insert
Adding a Mac isn't writing a row. It's a sequence: verify the candidate really is a Mac and capture stable identity evidence; check for active or retired duplicates first; assign a host_id, display name, color, role, and policy; prove the intended Tailscale and SSH path with a read-only probe; preview any optional bootstrap work; then create the binding and verify its very first observation. Enrollment is how a machine earns authority — step by step, on the record.
Suspend is the reversible pause
Suspend is for leave this alone for a while. It pauses management without touching membership history, and resume brings it straight back. Reach for it when a machine is going into a drawer for a month, or when you're doing maintenance and don't want the engine acting on it. It is not retirement — nothing is being said goodbye to.
Every transition is typed and audited
None of these are bare row edits. The public interface exposes enroll, suspend, resume, retire, and restore as durable operations that leave events behind — and it deliberately does not offer a raw delete-this-host as the way to remove a machine. The shape of the API is itself a guardrail.