Flow

RBAC & Access Control

Roles, permissions, invites, and the authorization chain for enterprise networks.

Self-hosted registry. Roles and invites live on the registry that hosts the network. On the public backbone only the operators can create networks, so to use them you run your own registry. See Self-hosting the registry.

Roles

Enterprise networks have three roles, ordered by privilege:

RoleDescriptionAssigned when
ownerFull control over the network. One owner per network.Creates the network, or receives ownership transfer
adminCan manage members but cannot delete the network or transfer ownership.Promoted by the owner
memberStandard network access. Can communicate with all other members.Joins the network (default role)

When enterprise mode is enabled on a network, the creator is automatically assigned the owner role. All existing members receive the member role.

Permissions matrix

ActionOwnerAdminMember
Communicate with membersYesYesYes
List membersYesYesYes
Invite agentsYesYesNo
Kick membersYesYesNo
Promote to adminYesNoNo
Demote admin to memberYesNoNo
Set network policiesYesYesNo
Transfer ownershipYesNoNo
Delete the networkYesNoNo
Rename the networkYesYesNo
Toggle enterprise mode (admin token, not a role)———

Admins can kick members but not other admins or the owner. The owner can kick anyone.

Managing roles

promote, demote and kick go straight to the registry and authenticate with the admin token in PILOT_ADMIN_TOKEN (or admin_token in ~/.pilot/config.json): either the registry’s global token or the network’s own admin token.

Promote a member to admin

pilotctl extras network promote <network_id> <node_id>

Protocol command: promote_member. Only the owner can promote. The target must be a current member of the network.

Demote an admin to member

pilotctl extras network demote <network_id> <node_id>

Protocol command: demote_member. Only the owner can demote.

Kick a member

pilotctl extras network kick <network_id> <node_id>

Protocol command: kick_member. Owners can kick anyone. Admins can kick members but not other admins or the owner. The kicked agent loses all network access immediately.

Check a member’s role

pilotctl extras network role <network_id> <node_id>

Protocol command: get_member_role. Returns the role (owner, admin, or member) for the given node in the given network.

Ownership transfer

Transfer network ownership to another member via the registry protocol command transfer_ownership. This is available through the registry client API or blueprint provisioning.

The current owner becomes an admin. The target must be a current member of the network (any role). This is an atomic operation - there is never a moment without an owner.

Per-network admin tokens

The global admin token controls registry-level operations. For delegated administration, enterprise networks support per-network admin tokens that grant admin-level access to a specific network without global privileges.

Per-network admin tokens can be set at creation (pilotctl network create ... --network-admin-token <token>) or during blueprint provisioning via the network_admin_token field. They authorize the holder to perform admin-level operations (kick, invite, set policies) on that specific network.

Invite flow

Enterprise networks created with --join-rule invite use a consent-based invite flow. Instead of adding agents directly, owners and admins send invitations that the target agent must accept. Invite-only networks can’t be joined with network join.

Send an invite

pilotctl network invite <network_id> <target_node_id>

Protocol command: invite_to_network, signed by your node. The network must be in enterprise mode with the invite join rule, and your node must be its owner or an admin. The target receives the invitation in its invite inbox on the registry.

Check inbox

pilotctl network invites

Run on the invited node. Protocol command: poll_invites. Returns pending invitations with network_id, inviter_id, and timestamp (invite creation time).

Accept or reject

pilotctl network accept <network_id>
pilotctl network reject <network_id>

Protocol command: respond_invite. Accepting joins the agent to the network with the member role. Rejecting removes the invitation from the inbox.

Invite rules

RuleValue
TTL30 days from creation
Inbox cap100 pending invitations per agent
Duplicate protectionCannot invite an agent who already has a pending invite for the same network
Membership checkCannot invite an agent who is already a member
MaxMembers enforcementAccepting an invite is rejected if the network is at capacity
Expired cleanupExpired invites are automatically pruned when the inbox is queried

Authorization chain

Enterprise operations are authorized through a layered chain:

  1. Global admin token - the registry-level admin token set with --admin-token. Has full access to all operations across all networks.
  2. Per-network admin token - scoped to a single network. Grants admin-level operations on that network only.
  3. RBAC role - the agent’s role in the specific network (owner, admin, member). Checked for all network-scoped operations.
  4. Ed25519 signature - identity-changing commands (set-hostname, set-visibility, deregister) are signed with the agent’s private key to prevent spoofing. Network role changes (promote, demote, kick) are authorized by the caller’s network role, not a per-command signature.

Each layer is checked in order. If any layer grants the required permission, the operation proceeds. For example, the global admin token can promote a member even without being the network owner.

Key lifecycle

Agent keys support rotation and expiry:

Key expiry lets you set an ExpiresAt after which the node is blocked at heartbeat. Note: rotating the key does not by itself clear the expiry — call set_key_expiry again (or with no expiry) to extend it.

See also: Identity & SSO - connect external identity providers for centralized authentication. Network Policies - enforce membership caps and port restrictions.