Watch
0
0
Fork
You've already forked hyperhive
0
Commit graph hyperhive/swarm-controller/src
Author SHA1 Message Date
atlas
11eb7dac9c an agent gets one todo when its pr starts conflicting with the target branch 2026-11-11 09:12:05 +01:00
damocles
8ef3138863 templates: one Jinja language (hive-template) for the notify router's flows, flows document version 2
A todo node's key and text were hand-expanded `{field}` strings. They are now Jinja templates rendered through the new hive-template crate (minijinja, an unknown variable is an error), and the controller's save check reads the variables the template uses. The flows document is version 2; a version 1 document reads as version 2 with each `{field}` converted to `{{ field }}`, and the next save writes it.
2026-11-11 03:40:22 +01:00
atlas
a5470d82ae an archetype's prompt prefills the new agent's agents.md in the create form 2026-11-11 02:16:22 +01:00
iris
ead667da42 docs: the credentials page keeps the approach and moves the mechanics out
credentials.md drops the target-shape framing and keeps the rules, where a
secret lives, the swarm- and hive-level secrets and how to add one. The queue
responder's keys, per-principal identities, how a reader reaches the store, the
store UI's login and where the root lives move to
4-implementation/swarm/credentials.md. The per-secret reference moves to
4-implementation/swarm/credentials-reference.md. Links and comments follow.
2026-11-11 01:50:55 +01:00
argus
c6b24359cd review classifier: operator docs name no code units
A negative rule for docs/1-getting-started and docs/2-handbook: text that
names a source path, function, type, table, queue subject or wire field, or
describes how the code works inside, belongs in docs/4-implementation. The
rules-file test lists the new name.
2026-11-11 01:44:55 +01:00
iris
cf5746188a review classifier: a setting makes the PR review list only the failed rules
failures_only (off by default, also for a stored document without it) makes the
review the classifier posts on a PR list just the rows that failed their rule,
or say that no check failed on an approval. A review with no clean verdict and
a try-out keep every row. The classifier settings form gets a checkbox for it.
2026-11-11 01:39:05 +01:00
atlas
2de07c4575 bridge waits out a slow authelia; controller retries a bridge 503 2026-11-11 00:31:16 +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
1042bf65db pause_hold: pin the undeclared-agent case and fix the test comment 2026-11-10 06:49:16 +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
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
damocles
15964a06f8 swarm-controller: put a failed jobq node's error in the log message 2026-11-09 17:02:59 +01:00
atlas
52cdfe84a0 keep the mirror hint off forge errors, forward the hyperhive mirror from any controller host 2026-11-09 13:07:41 +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
2e23f3debf swarm-controller: count default-branch merges and lines per repo 2026-11-08 18:11:27 +01:00
atlas
f86d90a91d swarm-controller: read placements only once the queue client has connected 2026-11-07 21:56:55 +01:00
atlas
3b007b1ccb swarm-controller: update_meta waits up to 60s for the queue client to connect
The boot run of the UpdateMeta node read hive placements before the queue client had connected, failed on the Pending client, and was not declared again until the next 10 minute timer tick. It now waits for the connection, bounded to 60s, and fails with a message naming the wait when the queue never connects. agent_renewal's wait_for_queue takes the bound as a parameter so both callers share it.
2026-11-07 21:56:55 +01:00
atlas
1b6d7f3c99 swarm: a failed facts copy counts in the held-deploys gauge 2026-11-07 12:59:50 +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
5633107b32 swarm ui: sort every pull requests column, and read a protection rule as the forge does
The labels and reviewers columns had no sort, so "every column sorts" was
false; both now sort on their joined text.

A branch protection rule's name is a glob the forge compiles with `/` as its
separator, which also takes `?`, `[a-z]`, `[!a-z]`, `{a,b}` and a backslash
escape. The report read only `*` and `**`, so a rule such as `{main,release}`
matched nothing and its PRs showed as protected by no rule, needing no
approvals. It now reads all of them.
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
7479d7fca7 review classifier: pin that a try-out's expiry follows its own size
The expiry test only built entries sized for ten classifications, so a run
whose deadline was ignored or fixed at the default would pass. It now checks
that a run of a hundred is still held when ten would have expired, and drops
at its own deadline.
2026-11-07 11:32:04 +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
64dfe0d205 cache-miss pass pushes a record the builder did not push
A meta build whose attic push failed (attic or its token not up yet) is
recorded with cached false and the deploy goes ahead. Nothing sent that
build again until internal/meta moved, so the create for that agent
failed on every hive and a rebuild was silently never pending.

The controller's cache-miss pass now also takes a record from the head
with cached false: it sends the same build without asking the cache, with
the pass's existing backoff (30 min doubling to 12 h), and rewrites the
record with cached true once the push lands, under the same
compare-and-set guard as a path change. The push.rs module doc no longer
claims the next build pushes again.

Mixed versions: controller-only, same wire type and builder request. An
old controller leaves an uncached record as before; a builder needs no
change.

Closes #6173
2026-11-07 09:05:45 +01:00
damocles
c8eaa93268 swarm: the notification router tells a PR's author when CI on it fails or is cancelled 2026-11-06 22:01:22 +01:00
iris
6739bb903d docs: sort the top-level directories into five sections by what the reader wants
Every docs directory moves under 1-getting-started, 2-handbook,
4-implementation or 5-project; the options reference (section 3) comes from
the website and has no directory here. trust-boundary stays whole under the
handbook for now. web-ui, swarm and tools split between handbook and
implementation, and the command-line references move to
2-handbook/reference. Links, path references in code and nix, and the docs
index follow the moves; no page content changes.
2026-11-06 18:46:57 +01:00
atlas
5d2b0c9a54 swarm-builder: an agent option whose eval failed is left out of the reply, not read as its default 2026-11-06 11:36:32 +01:00
atlas
aed7c8451a read the running rev and the hyperhive flake from /etc files, not the unit 2026-11-06 11:35:48 +01:00
atlas
68b38a9d44 swarm-controller: keep retrying the forge webhook secret and registration after a startup outage
The webhook secret slot is filled in the background, on the forge token's
capped unbounded backoff, when the store can't answer at start. The hook
registration waits for the secret and retries on the same backoff instead
of giving up after five tries.

Closes #6101
2026-11-06 09:21:59 +01:00
atlas
2158302159 retry a refused shared policy write at controller startup
A refused write of the shared hive policy or the shared agent policy
returned Ok from the startup pass, so only a controller restart tried
again. Both now come back as Unreachable, which the existing 30 s retry
already covers. Per-hive role failures stay warn-and-skip.

The retry rewrites the same policy text; nothing new is minted. No wire
or option change; internal to swarm-controller.

Closes #6087
2026-11-06 09:19:07 +01:00
atlas
5485151ba6 add a per-agent nix builds mode, host or none, carried like privateUsers 2026-11-06 09:18:42 +01:00
atlas
dd5fde848f squid blocks a runtime deny list from the controller in every egress mode, ahead of the allow list 2026-11-04 22:16:35 +01:00
atlas
4d8d43d677 review-classifier: a requested review runs even on a draft pr 2026-11-02 18:45:36 +01:00
atlas
49ef93a19e review-classifier: skip draft prs, classify once when they leave draft 2026-11-02 18:21:50 +01:00
atlas
b7d8c0dfc0 queue the build of a config head that moved without a webhook build 2026-11-02 17:56:35 +01:00
atlas
d6e983995d add external gitlab accounts: stored in bao, linked per agent, allowed in squid, usable with glab 2026-11-02 16:44:56 +01:00
atlas
4356f3840c pin the declared closure once per rebuild and seed the marker from the running closure 2026-11-02 07:55:10 +01:00
atlas
47c2acb640 deploy the closure the swarm declares, read no forge head, drop the update badge 2026-11-02 07:55:10 +01:00
atlas
0737798d78 controller: turn an archetype agent into a custom one 2026-11-01 22:44:28 +01:00
atlas
90272ec3c0 move links, adminSync.ignoreUsers and scrapeTargets under their service's deploy namespace 2026-11-01 20:47:23 +01:00
atlas
ee591b0546 skip empty agent-config repos in the config-pr scan 2026-11-01 19:17:53 +01:00
atlas
329d556ab9 order grant mirror writes by direction, re-mirror every five minutes, gate on the agent's own harness 2026-11-01 18:40:36 +01:00
atlas
e7e3281098 controller gates logs and metrics on the hive capability and mirrors the grant 2026-11-01 18:40:35 +01:00
damocles
862495530c drop the applied repo: the hive keeps no copy of an agent's config, only the deploy markers. Refs #5913 2026-11-01 17:49:10 +01:00
atlas
3ca660e558 record whether an agent's config sets privateUsers in its closure record 2026-11-01 17:06:18 +01:00
damocles
25295fd33f drop the proposed config repo: applied seeds from forge main, and the dead pending-init topology list goes with it 2026-11-01 15:30:33 +01:00