Watch
0
0
Fork
You've already forked hyperhive
0

hive-c0re: drop the remaining "mirror" wording for the removed push

The reseed bail text, the `ensure_all` doc, the forge module doc and a
rebuild comment still described hive-c0re mirroring the applied config to
`agent-configs/<name>`. State what the code does now; scope the
config-changes doc to swarm-created agents and say what a legacy agent
whose repo has no `main` gets.

Refs #4851
This commit is contained in:
atlas 2026-10-07 20:04:07 +02:00
commit c8472966e9
4 changed files with 26 additions and 20 deletions

View file

@ -29,7 +29,7 @@ No MCP tool exists for config changes: opening the PR IS the request.
(it's currently mounted read-write, which is a defect tracked (it's currently mounted read-write, which is a defect tracked
separately, not an authoring path.) separately, not an authoring path.)
Branch protection (the agent isn't on the `main` push allowlist; Branch protection (the agent isn't on the `main` push allowlist;
merge and approvals allowlist = `operators` team; see "Forge mirror" merge and approvals allowlist = `operators` team; see "Forge config repos"
below) makes the agent a write collaborator that **can't merge its own below) makes the agent a write collaborator that **can't merge its own
config PR**. config PR**.
2. An operator reviews the PR **on the forge** (native diff, threaded 2. An operator reviews the PR **on the forge** (native diff, threaded
@ -204,16 +204,22 @@ forge and meta's lock commits record it. A config PR nobody merges
carries no extra state on the forge side: the PR stays open, and carries no extra state on the forge side: the PR stays open, and
the submitter pushes again (or closes it) to retry. the submitter pushes again (or closes it) to retry.
### Forge mirror ### Forge config repos
The bundled `hive-forge` container runs on the swarm's forge host The bundled `hive-forge` container runs on the swarm's forge host
(`deploy.forgejo.enable`, see [`../swarm/services.md`](../swarm/services.md)). (`deploy.forgejo.enable`, see [`../swarm/services.md`](../swarm/services.md)).
Every agent has a repo in the private `agent-configs` Forgejo org, created Every agent created through the swarm has a repo in the private
and seeded by swarm-controller. hive-c0re pushes nothing to it: the `agent-configs` Forgejo org, created and seeded by swarm-controller.
applied repo's tags (`deployed/0`) exist only locally, and forge `main` hive-c0re pushes nothing to it: the applied repo's tags (`deployed/0`)
advances only by an operator's merge. hive-c0re exist only locally, and forge `main` advances only by an operator's merge.
reads from it — reseeding a purged `applied`, catching `applied` up, and hive-c0re reads from it — reseeding a purged `applied`
seeding `proposed` at first spawn. (`forge::fetch_config_main_into_applied`), catching `applied` up, and
seeding `proposed` at first spawn (`forge::clone_config_into_proposed`).
A legacy agent spawned by the hive alone has no swarm-seeded repo; if its
`agent-configs/<name>` has no `main`, a first spawn falls back to the local
template, and reseeding a purged `applied` fails with a `destroy --purge`
and re-spawn instruction.
Each agent is a **write collaborator on its own** `agent-configs/<name>` Each agent is a **write collaborator on its own** `agent-configs/<name>`
repo — so it can push a branch and open a config PR — but not a member repo — so it can push a branch and open a config PR — but not a member

View file

@ -1,4 +1,4 @@
//! Optional Forgejo wiring — config-repo mirroring, meta read-access //! Optional Forgejo wiring — the `core/meta` repo, meta read-access
//! grants, and each agent's read-only grant on `internal/docs` (the //! grants, and each agent's read-only grant on `internal/docs` (the
//! swarm-controller creates that repo, with the other swarm-wide orgs, //! swarm-controller creates that repo, with the other swarm-wide orgs,
//! teams and repos). //! teams and repos).
@ -360,12 +360,12 @@ async fn wait_until_ready() -> bool {
} }
} }
/// Sweep every existing container (manager + sub-agents) and ensure /// Sweep the forge at startup: seed the `core` admin user (hive-c0re's own
/// each has a forgejo user + token, plus an `agent-configs/<name>` /// identity for pushing the meta repo + driving the API) and its token, the
/// repo mirroring its applied config. Also seeds the `core` admin /// `core/meta` repo and the local knowledge clone, then run [`sync_agent`]
/// user (hive-c0re's own identity for pushing the meta repo + driving /// over every existing container (manager + sub-agents). Agent accounts,
/// the API) and the `core/meta` repo. The `agent-configs` org itself is /// tokens and `agent-configs/<name>` repos are the swarm-controller's, as is
/// the swarm-controller's to ensure. /// the `agent-configs` org; this sweep pushes nothing to them.
/// Called once at hive-c0re startup. Per-step failures are logged /// Called once at hive-c0re startup. Per-step failures are logged
/// but don't abort the sweep. /// but don't abort the sweep.
pub async fn ensure_all() { pub async fn ensure_all() {

View file

@ -469,9 +469,9 @@ async fn run_rebuild_bookkeeping(coord: &Arc<Coordinator>, name: &str) -> Result
// `EmitRebuilt` tail — emitting ok here and letting a failed tail `Reconcile` // `EmitRebuilt` tail — emitting ok here and letting a failed tail `Reconcile`
// add a contradictory !ok would double-report the same rebuild. // add a contradictory !ok would double-report the same rebuild.
// Full forge sync on every successful rebuild so the rebuild path is // Full forge sync on every successful rebuild so the rebuild path is
// equivalent to the startup sweep: tokens, config-repo mirror, meta // equivalent to the startup sweep: meta access, the `meta` remote and the
// access all recover without a hive-c0re restart. (No matrix step: the // `internal/docs` grant all recover without a hive-c0re restart. (No
// swarm mints an agent's matrix account, not this hive.) // matrix step: the swarm mints an agent's matrix account, not this hive.)
crate::forge::sync_agent(name, crate::forge::core_token().as_deref()).await; crate::forge::sync_agent(name, crate::forge::core_token().as_deref()).await;
// No `kick_agent` here any more — reporting from `hive-agent`'s own // No `kick_agent` here any more — reporting from `hive-agent`'s own
// boot instead avoids the duplicate-restart-message problem this used // boot instead avoids the duplicate-restart-message problem this used

View file

@ -295,8 +295,8 @@ pub async fn prepare_rebuild_dirs(name: &str, paths: &AgentPaths) -> Result<()>
{ {
bail!( bail!(
"applied repo at {} is missing its .git directory and could not be reseeded from \ "applied repo at {} is missing its .git directory and could not be reseeded from \
the forge (agent-configs/{name} unreachable, not yet mirrored, or absent); \ the forge (agent-configs/{name} unreachable, has no `main` — never merged or \
destroy --purge and re-spawn this agent.", never seeded — or absent); destroy --purge and re-spawn this agent.",
paths.applied.display() paths.applied.display()
); );
} }