Skip to content
Whalenet
Skip navigation
Whalenet
View as Markdown

Approval and Holds

Decide whether a new member reaches its siblings, admit it deliberately, or unbind one that is already live.

Published Last updated

On this page (5)

Approval and Holds Documentation

A fleet admits new members either automatically or by hand. Switching to by-hand makes minting a node and letting it talk to its siblings two separate decisions, each with a name against it. All four steps below are control-plane calls to POST https://graph.whisper.online/api/query with an X-API-Key header.

1. Require admission by hand

whisper-call
CALL whisper.agents({
  op: 'policy',
  args: { whale: { approval: 'manual' } } })

The setting is sticky: it stays until you change it. auto, automatic and open all mean admit on mint; manual, approve and approval all mean wait for a person. Because a whale argument is present, this call takes the dns:whale:write scope, which is never granted automatically. See keys and scopes.

A node minted while this is set still holds its /128, resolves, publishes its name and reaches the internet. Only reachability to its siblings waits.

2. See which nodes are waiting

whisper-call
CALL whisper.agents({
  op: 'list',
  args: { kind: 'whale' } })

Each row carries agent, address, tags, reusable, ephemeral, approved, east_west, connects, approved_by, approved_at and created_at. Read east_west: it says admitted or pending_approval. approved_by and approved_at are the audit trail, which is the reason to admit through this path rather than by flipping the fleet to automatic for a minute.

3. Admit one node

whisper-call
CALL whisper.agents({
  op: 'firewall',
  args: { agent: 'ae3b051ff3bf7f478',
    whale: { op: 'approve', reason: 'change 4821' } } })

Name the node with either agent or address. admit and allow are accepted spellings of approve. The reason is trimmed and stored with the admission, so keep it short and make it something you will recognise later: a change number, a ticket, a person.

The reply row carries the same fields as the list above, so the east_west value in the response is your confirmation. To mint a node that is admitted from the start, without a second call, pass preapproved in the whale map at register.

4. Put a live node on hold

whisper-call
CALL whisper.agents({
  op: 'firewall',
  args: { address: '2a04:2a01:b69a:6717:e3b0:51ff:3bf7:f478',
    whale: { op: 'deny', reason: 'triage' } } })

deny unbinds a node that is live. revoke, hold and unapprove are accepted spellings of the same thing, and a deny wins over anything that would otherwise admit the node. Use this when you want a member off its siblings while you look at it, and to put it back, call approve again with a fresh reason.

To read one node's state without changing it, send whale: { op: 'status' } with the same agent or address.

Which containment to reach for

A hold is not the same act as ending an identity.

You wantUseEffect
This member off its siblings, reversiblyop:firewall with whale: { op: 'deny' }The node keeps its identity and its route out; it stops reaching the rest of your fleet.
Every flow not explicitly allowed stopped at the edgeop:firewall with default-denyThe network-layer hold described in firewall and response.
The identity itself goneop:revokePermanent. DNS stops resolving and the records are withdrawn: revoke an identity.

Narrowing which of your members may reach which, as a standing rule rather than a decision about one node, is the access document instead.