Watch
0
0
Fork
You've already forked hyperhive
0
Commit graph hyperhive/docs/2-handbook/swarm
Author SHA1 Message Date
iris
0547081138 swarm ui: the agent's status message shows how long ago it was set
The card and its detail showed the message alone, so a message from an hour
ago read like the current one. Both now add the age, (5m ago), which ticks
like the other relative times. An agent with no message still shows a dash.
2026-11-11 01:25:15 +01:00
damocles
1cc1cb804d hive-matrix: prefill the chat client with the server name, not the hive domain 2026-11-11 00:31:20 +01:00
atlas
250118d558 semi-spread example: name the store's CA on the machines without the store 2026-11-11 00:14:24 +01:00
atlas
86c5dac89d swarm-archive: external s3 backend (options, prune path, docs, module-eval cases, vm fake s3)
- swarm-archive.nix, lib/archive-server.nix: deploy.archive.backend and
  deploy.archive.s3.* options; the s3 server and the prune read the key from the
  store into rclone's environment; the prune lists and addresses repositories
  through rclone instead of a local directory
- swarm-bao.nix: the archive reads swarm/services/archive/s3/*
- docs: archive.md "External S3" section, two credentials-reference rows
- module-eval: builder.nix cases for local and s3, the missing-setting
  assertion; bao-grants.nix gains the s3 read grant
- vm test: second node with a fake rclone serve s3 whose key is generated at
  test time
2026-11-11 00:13:19 +01:00
iris
ebbf4fa37b docs: the knowledge page points at the moved forge webhooks section 2026-11-11 00:12:06 +01:00
iris
f7cdd194f7 docs: the swarm and services pages become overviews
The controller's status, queue, AGENTS.md and forge-webhook details move to
4-implementation/swarm/controller.md. The metrics, logs and OTEL detail moves to
4-implementation/swarm/telemetry.md. Each leaves a short operator blurb with the
options to touch, and links into the moved text are updated.
2026-11-11 00:12:06 +01:00
iris
7df6672c87 docs: external forge and matrix accounts get pages in external-accounts
The directory covered GitHub and GitLab only; the forge and matrix account
kinds an operator can link were described under the swarm UI page. Two new
pages (forgejo.md, matrix.md) cover linking, what the agent gets and
deleting in operator terms, the directory README lists them, and the UI page
keeps a pointer for each kind.
2026-11-11 00:10:47 +01:00
iris
99ca130552 swarm ui: the freshness badge moves from the agent card onto the status panel
The card header carried a fresh/stale badge with the report's age. It now
sits in the status row of the opened card, which already showed it, and the
card header keeps the name, the message and the controls.
2026-11-10 21:38:32 +01:00
iris
016caaa3d2 docs: the services page describes the ci runner board and its runner filter
The board gained a Runner filter and one series per runner; the CI runner
section now says what the board shows and how it differs from the forge's CI
runs tab.
2026-11-10 19:12:01 +01:00
atlas
7800f92425 semi-spread example: serve internal vhosts on the VPN addresses only, over IPv4 and IPv6 2026-11-10 17:33:58 +01:00
atlas
538da5a13a add a semi-spread example deploy and a check that evaluates it 2026-11-10 17:33:58 +01:00
atlas
793d987a88 swarm-archive: forget future-dated snapshots before each prune; fix the grants case
A client chooses a snapshot's time, so snapshots dated ahead could fill
--keep-last and push the real ones out of a prune. The prune now forgets
snapshots dated more than an hour after now first, and logs their ids. The
VM test forges one and checks the real snapshot stays. The bao-grants case
that read a + path as a glob now names the literal path, and two cases that
pinned 'nothing else' list the archive grants. The ciRunner stanza is back
at its original indent.
2026-11-10 08:32:54 +01:00
atlas
91f36f39d2 swarm-archive: grant only once an archive is up; keep logins across a gap in placements
The archive host creates a ready marker in the store and swarm-controller
writes no credentials before it exists, so a swarm without an archive, and a
mixed-version swarm, leave every hive backup a logged no-op. A hive with no
declaration no longer counts as placing nothing: its copies and its agents'
user lines stay. The restic password is pinned by tests across a revoke, a
re-placement and a move.
2026-11-10 08:18:45 +01:00
atlas
306aae0378 swarm-archive: back up every agent's state to an append-only restic repository per agent
swarm-archive serves restic repositories with rclone, append-only, one login
and one repository per agent. swarm-controller writes each placed agent's
login and restic password to the store, replaces them on a move and removes
them when the agent is destroyed. Every hive backs its agents up hourly under
its own store identity. The archive host prunes by retention.
2026-11-10 07:49:49 +01:00
atlas
409e7ee5a0 docs: handbook states what the code does (fact sweep fixes) 2026-11-10 06:50:19 +01:00
atlas
e5c55257f8 a hive-side pause holds against the swarm's declared state until an operator resumes
the harness writes the reason into the pause marker when it pauses itself and reports it as paused_by_hive in its turn-state header. swarm-controller declares such an agent paused (only if declared up) and shows the reason on the agents status row and the swarm ui card.
2026-11-10 06:49:16 +01:00
atlas
20d286f06a remove the old snapshot store; tombstone its options 2026-11-10 06:48:54 +01:00
iris
4b1012056c hive-agent: order a stored login by when the store wrote it, not by its number
A delete removes the leaf's metadata, so the KV number restarts at 1. A login
made right after a delete, before the next poll, was version 1 again and
looked no newer than the recorded 1, so it never installed. The version file
now records the store's write time next to the number and a later write
installs whatever its number. A record from before the time was kept falls
back to the number and gets its time when the same number is read again.
2026-11-09 23:03:08 +01:00
iris
5f5933fde9 docs, swarm ui: a deleted login now logs the agent out, and the dialog and docs say so
With the harness poll, an agent that holds a session logs out within 5
minutes of its stored login being deleted. The confirmation and the
claude-login page said the agent keeps its session.
2026-11-09 23:03:08 +01:00
iris
a2c9e9a8d4 hive-agent: a logged-in agent polls the swarm login, and logs out when it is deleted
wait_for_login read the store leaf only while the agent waited for a login.
A logged-in agent now reads it every 5 minutes, and a paused one once before
it resumes, so a login made or deleted in the swarm UI reaches an agent that
never failed. A newer version is installed; a store that answers nothing
stored after a version was installed means the stored login was deleted, and
the agent is logged out as /api/logout does it, with the recorded version
forgotten so the next login installs. A read that fails changes nothing.
2026-11-09 23:03:08 +01:00
iris
71a4d1d255 swarm ui: the PR report's approvals column filters on whether the rule is met
The report had an approvals column (1/2) and a separate approved column.
They are one fact, so approvals now carries the filter, complete or missing,
and the approved column is gone.
2026-11-09 22:44:10 +01:00
iris
7dd147adb4 swarm ui: show when an agent's claude login was stored, and delete it
The agent's settings get a claude login row: when the swarm stored the
login, read by the minter from the leaf's metadata, or that none is, with a
delete that removes every version after a confirmation. New minter steps
(status, delete), controller routes (GET claude-login, DELETE
claude-login/stored) and a read and delete grant on the leaf's metadata,
pinned in the module-eval check.
2026-11-09 22:22:29 +01:00
atlas
fbbdf26a19 gateway: per-vhost public flag, private listen addresses, and IPv6 listeners 2026-11-09 21:40:36 +01:00
iris
c85233efd4 docs: say which services singleHostSwarm leaves off, and format the table
The services intro claimed singleHostSwarm runs every service with no further
setting. The CI runner is never derived, and the builder and cache need their
store identities on the host. The overview table is also formatted the way
treefmt wants it.
2026-11-09 21:27:43 +01:00
iris
c9bdad0170 docs: add an overview table of the swarm services
A short blurb per service with its enable option and a link to its section
or page, so an operator on a single host can see what each one is and which
two (builder, CI runner) are worth a look before switching on.
2026-11-09 21:27:43 +01:00
iris
97671e28d5 docs: move implementation sections out of the handbook pages
Three handbook pages carried sections an operator never reads, named after
source paths and build internals. They move to pages under 4-implementation,
and each handbook page keeps a short pointer.

- forge.md: the notification poller (what it polls, how it formats,
  de-duplicates and marks notifications read) is now
  agent-tools/forge-notify.md. The forge page keeps a short Notifications
  section.
- matrix.md: the retired hive-side matrix code, the evaluation assertions and
  the fluffychat-web build fixes are now networking/matrix-homeserver.md.
- github.md: the Implementation section (how `gh` and `git push`
  authenticate, and the GitHub poller) is now agent-tools/github.md.

docs/README.md and the agent-tools README list the new pages, and AGENTS.md's
note on mixed operator and implementation docs now says to move the detail
and leave a pointer.
2026-11-09 21:27:43 +01:00
iris
da071e3fa9 docs: use neutral placeholder agent names in examples
The setup page's first-agent example named the agent iris, and a user
copied it verbatim. Use <name> there, with a line saying the name is free
to choose, and agent1/agent2 in the hivectl, schedule and label examples.
2026-11-09 21:09:18 +01:00
iris
73f875eab8 swarm ui: a stored claude login closes the dialog and shows a toast
The login dialog stayed open with a success line after the code was
accepted, though nothing is left to do in it. It now closes and a toast
says the login is stored. The toast is a new swarm-ui primitive: a short
note raised with showToast, rendered by a ToastHost at the app root, gone
after a few seconds or on click.
2026-11-09 20:50:32 +01:00
atlas
892675628d nats and bao can listen on a routable address, opt-in 2026-11-09 17:42:20 +01:00
atlas
a6b5bafa83 seed a hyperhive/hyperhive mirror so update_meta finds it on a fresh swarm 2026-11-09 12:19:46 +01:00
atlas
d55cf9ed80 swarmctl setup status shows progress at a glance 2026-11-09 11:55:32 +01:00
atlas
9d62ef44b5 nix trusts the swarm's root through its own CA bundle, so root's nix clients reach the cache 2026-11-08 18:37:34 +01:00
atlas
44caa72c19 swarmctl: interactive setup walks the first-run ceremony
swarmctl setup with no subcommand checks the setup status first, then takes the open steps one at a time: prompts for input, shows a running action as one live line, prints the store keys, root token and new password under a warning until the operator confirms, and names the deploy option for a step this host cannot do. It calls the code of bao init, bao grant-bootstrap, user add, forge make-admin, agent create, agent permissions set and agent set-state. Refuses without root or a terminal.
2026-11-08 18:11:39 +01:00
atlas
70e7885a28 docs: egress dashboard data transferred by domain panel 2026-11-08 11:20:10 +01:00
atlas
ef68baa00f pull swarm closures through the nix daemon: substituters in the fragment, merged root-only netrc 2026-11-08 11:06:28 +01:00
atlas
530137a7bb hive-c0re: queue another knowledge pull soon after a failed one, backing off to 5 minutes 2026-11-08 09:19:48 +01:00
atlas
a20596fa59 swarmctl: add bao init and bao grant-bootstrap
init prints the store's keys and root token once and keeps none; with
--and-grant it goes on to the granter bootstrap in the same process.
grant-bootstrap does that step alone, reading the root token from a
hidden prompt or stdin. The token reaches bao only as BAO_TOKEN in the
child's environment.
2026-11-08 09:09:13 +01:00
atlas
e9321297c0 swarm-grafana: a host dashboard for the collector's system metrics
Adds host.json (hive and host filters over the hostmetrics series),
registers it in the provisioned dashboard list, lists it in the swarm
services handbook, and adds a module-eval case that it ships and every
query filters on both variables.
2026-11-08 09:01:21 +01:00
atlas
dab7768869 scope the cache access to hive-core: client-side nix copy, daemon trusts only the key 2026-11-08 01:56:55 +01:00
atlas
ecd4445680 hive-c0re pulls closures through the nix daemon; hive-priv verifies the swarm signature before applying 2026-11-08 01:56:55 +01:00
atlas
61a334c847 swarmctl setup status shows where the setup ceremony stands 2026-11-07 17:20:21 +01:00
atlas
78b0451ed1 hive-priv: overlay the knowledge .git only when the clone has one, so agents start before the first clone 2026-11-07 15:13:35 +01:00
atlas
79c1b6d81d swarm: a deploy goes out only once its closure is cached and the hive has its cache facts 2026-11-07 12:28:44 +01:00
iris
0e84fe8bc4 docs: the handbook follows the three layers: swarm, hives, agents
The handbook's sections were agent-lifecycle, integrations, swarm, tools,
trust-boundary and web-ui, which do not follow how the system is built, so a
reader could not tell which layer a page is about. Its pages now sit in
swarm/, hives/ and agents/, with the accounts an agent can hold outside the
system in external-accounts/.

- swarm/: forge, matrix and the knowledge repo join the swarm pages, and so
  does the swarmctl reference.
- hives/: the dashboard, hivectl and its reference, and the operator/agent
  boundary, with a README that takes over the old web-ui and tools pages.
- agents/: the roster, persistence, config changes, the agent's own web page
  (was web-ui/agent) and the security model, with a README.
- external-accounts/: GitHub and GitLab.

Pages are moved whole; none is split yet. Every reference follows: relative
links in the docs, `docs/2-handbook/...` paths in code comments, the nix
checks that regenerate the CLI references and the ignore list, and docs/README.md,
whose handbook section is now by layer.
2026-11-07 12:19:36 +01:00
atlas
263b21021a swarm-controller: ask the builder for the archetypes again soon after a failed pass 2026-11-07 11:54:23 +01:00
iris
560afef2b6 swarm ui: the issue report card is named "issues"
The reports tab holds cards, so a card named "issue report" repeats the word.
The card is now "issues", beside "pull requests", and the handbook says the
same.
2026-11-07 11:46:05 +01:00
iris
944fd5b726 swarm ui: a diff column on the pull requests card, and "approved" as its header
The pull requests card gets a diff column, the lines a PR adds and removes
(`+120 −8`), sortable on the total. The controller takes the counts from the
forge's pull request list, so no call is added. The column that said "has all
approvals" is now headed "approved".
2026-11-07 11:46:05 +01:00
iris
f633963b77 swarm ui: a pull requests card on the reports tab
The reports tab gets a "pull requests" card under the issue report. It lists
the open PRs of every repo, or of one picked in a repo select, with the
columns a reviewer or merger filters on: author, labels, requested
reviewers, base branch, WIP (the forge's draft flag), approvals against the
base branch's protection rule, has all approvals, conflicts, protected base
and CI. Every column sorts, the small-set columns filter by picking values,
and the browser keeps the filters and the repo. No filter applies at first.

swarm-controller resolves each row so the page makes no calls of its own:
GET /api/pr-report and GET /api/repos/{org}/{repo}/pr-report. The required
approvals come from the first matching branch protection rule (an
unprotected base asks for none); an approval counts when it is the
reviewer's latest decision, on the current head, neither stale nor
dismissed and official.

A free-text table cell gets a minimum width, so a table with many columns
scrolls sideways instead of wrapping a title to a word a line.
2026-11-07 11:46:05 +01:00
iris
cffe8895df review classifier: the most classifications a run carries is a setting
The limit was a constant of ten in swarm-wire, so a repo with eleven rules
could not be reviewed and nothing short of a rebuild changed it. It is now
`max_classifications` in the classifier settings, beside
`max_concurrent_reviews`: 1 to 1000, ten until set, and a document stored
before the field decodes with the default. The classifier settings form in
the swarm UI gets a "rules per review" field, and the try-out's add button
stops at the saved limit instead of a hard-coded ten.

The controller checks a try-out, and a requested review's rules file, against
the setting where the run starts. The rules file itself may hold up to the
1000 the setting allows, so raising the limit needs no change to a repo.
A review whose rules exceed the limit posts a no-verdict comment saying so.

A run's reply deadline was a constant that covered ten classifications, a
minute plus three each. It is now computed from the run's own size, so a
bigger run waits as long as it needs and a default-sized one still waits 31
minutes. The classifier's answer window in the queue permissions covers the
biggest run the setting allows.
2026-11-07 11:32:04 +01:00
atlas
b8b55ba23e credentials-reference: a hand-edited public-key on the in-swarm cache is overwritten 2026-11-07 10:40:07 +01:00