Watch
0
0
Fork
You've already forked hyperhive
0

docs(agents): drop nonexistent-thing mentions, state current behaviour

This commit is contained in:
atlas 2026-10-02 09:20:57 +02:00 • committed by mara
commit 78aacf13ce
3 changed files with 39 additions and 45 deletions

View file

@ -2,16 +2,15 @@
<!-- vale write-good.Passive = NO -->
Agents are a **flat set**, with no parent/child tree: the `parent` field
`topology.json` used to carry is gone, along with every mechanism that
read it. The capability store scopes which agents can manage which
others; a tree position no longer scopes anything.
Agents are a **flat set**, with no parent/child tree: `topology.json`
carries no `parent` field, and the capability store — not tree
position — scopes which agents can manage which others.
<!-- vale write-good.Passive = YES -->
This doc covers what the roster file is now, what the removal took with
it, and where the manager still gets special-cased, as a tracked
cleanup.
This doc covers what the roster file holds today, the map-shaped
alternative `topology::all_agents` still accepts, and where the manager
still gets special-cased, as a tracked cleanup.
## Where the roster lives
@ -49,11 +48,11 @@ agent's `state` read-write and `config` read-only; never `harness`). An
agent holding no capability sees its own dirs and nothing else. See
[`persistence.md`](persistence.md)'s _Cross-agent access to state._
### Reading the legacy format
### Reading the map-shaped format
`topology.json` used to be a map of `name → parent | null`. The reader
still accepts that shape and keeps its keys, so a hive upgrading across
the change reads the same roster rather than an empty one. An empty
`topology.json` may also be a map of `name → parent | null`; the reader
accepts that shape too and keeps its keys, so a hive with a file in that
shape still reads the same roster rather than an empty one. An empty
roster costs more than a cosmetic gap: every capability holder loses its
mounts until the next reconcile pass writes the array form.
@ -79,7 +78,7 @@ from which agents exist, so the next pass overwrites a hand edit.
See `hive-c0re/src/agent_config/topology.rs` and `hive-c0re/src/meta.rs`'s
module docs for the exact call chain.
## What the parent field used to do
## What replaced the parent field
Recorded so a reader who finds one of these in an old branch, an issue
thread or a stale comment knows each one went away rather than moved:
@ -98,10 +97,10 @@ thread or a stale comment knows each one went away rather than moved:
<!-- vale write-good.Passive = NO -->
The last row is the one with teeth: an agent that used to reach a child's
state dir by virtue of being its parent no longer reaches it at all
unless it holds `ManageRootAgent`. That narrowing is the intended
consequence of removing the field, not a side effect of it.
The last row is the one with teeth: reaching a child's state dir
requires holding `ManageRootAgent`; parentage grants nothing. That
narrowing is the intended consequence of removing the field, not a
side effect of it.
<!-- vale write-good.Passive = YES -->
@ -141,12 +140,11 @@ everything below applies only when it doesn't:
manage any agent's state dir — config isn't authored there, since a
real config change is a PR from a clone), plus RO mounts for
`/applied` (diff against what's deployed) and `/meta` (system-wide
deploy log). That grant is the `ManageRootAgent` capability now, and
ruth holds it; no name check remains. hive-c0re will
deploy log). That grant is the `ManageRootAgent` capability, which
ruth holds; nothing checks the agent's name. hive-c0re will
gate RO `/meta` access on a "meta read" capability; no agent-facing
path writes `flake.lock` any more — `request_update_meta_inputs` was
removed, leaving the operator dashboard's `POST
/api/meta-update` as the only entry point.
path writes `flake.lock` — the operator dashboard's `POST
/api/meta-update` is the only entry point.
- **Prompt** — treated identically: `prompt::render` always filters for `agent`. `prompts/system.md`
still carries `<!-- role:agent -->` / `<!-- role:manager -->` marker
blocks, but `prompt::render` filters for `"agent"` unconditionally for