Enrollment happens on the first anchor, not before
You write no enrollment step. The first time your agent callsanchor, the
SDK proves possession of its signing key to the control plane, and the agent
appears on the console’s Agents page under that key. One organization API
key, carrying agent:enroll, covers every agent in your fleet.
Re-enrolling the same key on a later boot is a no-op, which is what makes it
safe to run every time your service starts. See
API keys and scopes for the scope, and
Anchor from your agent for the call itself.
One key, one agent name, one organization
A signing public key belongs to one agent name in your organization. Two rules follow from that, and both SDK enrollment and the console’s re-key enforce them:- A key already enrolled under another name is refused. Registering it
again under a different name would let one key sign for two identities.
This is
SIGNING_KEY_ALREADY_ENROLLED(409), whether the key is active, retired or revoked under that other name. - A revoked key is refused everywhere, permanently. Revocation repudiates
the key itself, not only the name that held it, so no name in your
organization may register it again. This is
SIGNING_KEY_PREVIOUSLY_REVOKED(409) from the SDK lane.
Nothing in the console enrolls a key
Settings, Signing keys lists every key enrolled to sign an agent’s envelopes, but it has no Create action. A key’s row exists because an agent anchored with it, not because someone added it.Revoke an active key
An owner or admin opens Settings, Signing keys, finds the active key, and selects Revoke. Revocation is scoped to your organization: it stops that key from anchoring anything further under your roster, and it cannot be undone by re-enrolling the same key, including by whoever holds it. Records the key signed before revocation are untouched and still verify.Re-key a revoked name
A revoked name does not disappear and cannot enroll through the SDK again, so recovering it is a console action, not a runtime one. Generate a new key pair where the agent runs, using the same tool you used the first time (openssl rand -hex 32 produces a seed; derive the public half
from it). In Settings, Signing keys, select Re-key on the revoked
name and enter that public key. Restart the agent with the new seed, and it
anchors under the same name its next time.
The public half is all the console ever needs. Sanning never sees the seed
that produced it, before or after a re-key. Re-key refuses a name that is not
revoked (SIGNING_KEY_NOT_REVOKED, 409): a live key rotates through the SDK
instead, with the outgoing key’s counter-signature. See
Errors for both codes.
What to read next
API keys and scopes
The scope enrollment needs, and what a missing one looks like.
Anchor from your agent
Where the signing key is built and the first anchor call is made.