hyperhive/swarm-controller/src
Repository files (latest commit first)
Filename Latest commit message Latest commit date
atlas 676c45bc93 swarm: mint, publish and login-verify an agent's store identity at create
`swarm/agents/<agent>/bao-mtls` did not exist, and neither did any
per-agent identity at the secret store: `policy::agent_object_name`,
`render_agent` and `render_agent_with_queue` had been written and never
called outside their own tests. An agent's only "per-agent" secret today
is read under the HIVE's certificate, through a wide grant on
`swarm/agents/*` — so "per-agent" was presentational.

The swarm now mints the certificate, so no hive ever needs the capability
to mint one. `swarm-controller` is the service that does it: it already
logs in to the store, and its existing grant already covers exactly the
three objects written here (`create/update` on
`secret/data/swarm/agents/*`, `sys/policies/acl/hive-*` and
`auth/cert/certs/hive-*`). No new bao grant, and nothing co-located — a
cert-auth role pins its authority by value, per role, so the controller
issues from its own CA on its own host and pins that CA in the role it
writes. No existing role changes.

The mint node does not report success on a write. After publishing it
connects again, with the leaf it just issued and under the role it just
wrote, and reads the path back — so the policy, the role, the common name
and the leaf are exercised in production on every agent creation. A
certificate this code mints that the role this code writes will not accept
turns the job node red at creation time instead of surfacing later as an
agent container that cannot start.

`TriggerDeploy` gains an `after_any` edge on the mint, not `after_ok`: a
hive cannot pass down a certificate the swarm has not published, but a
host with no authority configured must still create agents exactly as it
does today.

The private key is generated in memory and never written to disk on the
controller — `SecretStore::connect_with_identity` takes the PEM the minter
is already holding, so nothing is written out purely to be logged in with.

Refs #4137
2026-09-18 15:05:24 +02:00
..
agent_identity.rs swarm: mint, publish and login-verify an agent's store identity at create 2026-09-18 15:05:24 +02:00
agent_state_stream.rs swarm: publish each agent's turn-state header on its own subject 2026-09-14 15:12:23 +02:00
agent_status.rs swarm-ui: add agent start/stop, backed by the wanted-state route 2026-09-02 19:57:04 +02:00
auth.rs swarm-queue-client: request the bearer-authz scope when minting an agent token 2026-09-17 09:51:44 +02:00
config_pr.rs swarm-controller: fix stale route reference in snapshot's doc comment 2026-08-19 22:27:12 +02:00
forge.rs swarm-controller+swarm-ui: merge config-PR into GET /api/agents/status 2026-09-02 14:18:02 +02:00
issue_report.rs swarm-controller: fix broken intra-doc link in issue_report.rs 2026-08-31 18:50:38 +02:00
main.rs swarm: mint, publish and login-verify an agent's store identity at create 2026-09-18 15:05:24 +02:00
matrix_account.rs matrix: make the hive-internal main account an ordinary matrixAccounts entry 2026-09-18 09:34:44 +02:00
otel_http_client.rs swarm-queue-client: request the bearer-authz scope when minting an agent token 2026-09-17 09:51:44 +02:00
read_policy.rs swarm: say the read policy names the hive it is written for 2026-09-12 11:41:01 +02:00
status.rs swarm-controller: make status::render/row pub(crate) so agent_status.rs's doc links resolve 2026-09-02 10:20:29 +02:00
store.rs swarm-controller: keep a hive's read grant in step with its declaration 2026-09-09 18:40:41 +02:00
term_stream.rs term_stream: drop hive from the URL, resolve it from agent_status 2026-09-13 18:08:33 +02:00
vcs_metrics.rs docs: restructure into topic subdirectories, collapse duplicated index 2026-09-02 01:55:37 +02:00
wanted.rs swarm: add a declared "paused" agent wanted state 2026-09-11 01:35:40 +02:00
webhook.rs remove the two remaining as_str-style wrappers (DeliveryKind::parse, Wanted::parse) 2026-09-12 00:06:31 +02:00