docs+comments: say what changed instead of tagging the tracker item

The prose added by this branch named the tracker item in seventeen
places, which check-issue-refs.sh rejects: a `#N` tag is dead weight for
anyone reading the public mirror, where no issue data exists. Each one
now states the fact it was pointing at — the parent field is gone — so
the sentence stands on its own.

Two of those lines also carried a rustdoc break: `[`write`]` in
topology.rs is ambiguous between the module's own `write` fn and the
`write!` macro, which `-D rustdoc::broken-intra-doc-links` fails. Spelled
`[`write()`]`, per rustdoc's own suggestion.

The host_config.rs rewrite is two lines rather than three so the doc
block stays under check-comment-blocks.sh's 30-line ceiling.
This commit is contained in:
atlas 2026-09-21 22:20:21 +02:00
commit 336ed5a010
10 changed files with 28 additions and 28 deletions

View file

@ -2,8 +2,8 @@
<!-- vale write-good.Passive = NO --> <!-- vale write-good.Passive = NO -->
Agents are a **flat set**, with no parent/child tree: #4472 removed the Agents are a **flat set**, with no parent/child tree: the `parent` field
`parent` field `topology.json` used to carry, and every mechanism that `topology.json` used to carry is gone, along with every mechanism that
read it. The capability store scopes which agents can manage which read it. The capability store scopes which agents can manage which
others; a tree position no longer scopes anything. others; a tree position no longer scopes anything.
@ -33,7 +33,7 @@ agent's `state` read-write and `config` read-only; never `harness`). An
agent holding no capability sees its own dirs and nothing else. See agent holding no capability sees its own dirs and nothing else. See
[`persistence.md`](persistence.md)'s _Cross-agent access to state._ [`persistence.md`](persistence.md)'s _Cross-agent access to state._
### Reading the pre-#4472 format ### Reading the legacy format
`topology.json` used to be a map of `name → parent | null`. The reader `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 still accepts that shape and keeps its keys, so a hive upgrading across

View file

@ -344,8 +344,8 @@ The RW on `state` is deliberate, not an oversight: the holder recovers
other agents, which includes writing into their state (for example other agents, which includes writing into their state (for example
seeding notes, clearing a stuck sentinel) as well as reading it. seeding notes, clearing a stuck sentinel) as well as reading it.
This is the **only** cross-agent mount. #4472 removed the topology This is the **only** cross-agent mount. Dropping the topology parent
parent field, and with it the unconditional grant every agent used to field took with it the unconditional grant every agent used to
get over its own direct children — an agent holding no capability now get over its own direct children — an agent holding no capability now
sees its own dirs and nothing else. sees its own dirs and nothing else.
@ -395,8 +395,8 @@ Contents:
- `topology.json` — the agent roster (`["alice", "bob", "ruth"]`). - `topology.json` — the agent roster (`["alice", "bob", "ruth"]`).
Written by `topology::reconcile` on every meta sync; read by Written by `topology::reconcile` on every meta sync; read by
`topology::all_agents`, which is the set the `ManageRootAgent` `topology::all_agents`, which is the set the `ManageRootAgent`
capability grants mounts over. Carried a `parent` per agent until capability grants mounts over. Carried a `parent` per agent in the
#4472; the reader still accepts that shape and keeps its keys. legacy format; the reader still accepts that shape and keeps its keys.
- `tool-groups.json` — per-agent MCP tool group grants - `tool-groups.json` — per-agent MCP tool group grants
(`{ "alice": ["messaging", "inbox", "execution"] }`). Written by (`{ "alice": ["messaging", "inbox", "execution"] }`). Written by
`tool_groups::set_groups`; injected as `HIVE_TOOL_GROUPS` env `tool_groups::set_groups`; injected as `HIVE_TOOL_GROUPS` env

View file

@ -89,8 +89,8 @@ angle-bracket and asterisk shapes below are structurally safe.
inbox view; no agent ever `recv`'s them. inbox view; no agent ever `recv`'s them.
`<parent>` and `<children>` were two more, resolved against a `<parent>` and `<children>` were two more, resolved against a
`topology.json` parent field. #4472 removed that field and both `topology.json` parent field. That field and both sentinels no longer
sentinels with it: address `operator` where you would have said exist: address `operator` where you would have said
`<parent>`, and name the recipients (or broadcast to `*`) where you `<parent>`, and name the recipients (or broadcast to `*`) where you
would have said `<children>`. Nothing rewrites a recipient at send time would have said `<children>`. Nothing rewrites a recipient at send time
any more — what an agent passes is what the broker stores. any more — what an agent passes is what the broker stores.

View file

@ -59,8 +59,8 @@ surfaces, not tab panes.
**C0NTAINERS** — live containers rendered as a flat, **C0NTAINERS** — live containers rendered as a flat,
alphabetically-sorted list. The renderer still walks alphabetically-sorted list. The renderer still walks
`ContainerView.parent` for a depth-first tree with ASCII glyphs `ContainerView.parent` for a depth-first tree with ASCII glyphs
(`├─`, `└─`, `│ ` continuation columns), but #4472 removed that field, (`├─`, `└─`, `│ ` continuation columns), but that field no longer
so every row sits at depth 0 and the renderer paints no glyph. The tree exists, so every row sits at depth 0 and the renderer paints no glyph. The tree
sorts alphabetically; sorts alphabetically;
roots likewise. The tree tolerates cycles in the parent graph — roots likewise. The tree tolerates cycles in the parent graph —
it appends orphaned containers (not reachable from any root) it appends orphaned containers (not reachable from any root)
@ -981,7 +981,7 @@ identically.)
### Topology tree ### Topology tree
⚠️ **Dormant since #4472,** which removed `ContainerView.parent`: ⚠️ **Dormant now that `ContainerView.parent` no longer exists:**
`buildAgentTree` now puts every container at depth 0 and the rules below are `buildAgentTree` now puts every container at depth 0 and the rules below are
all no-ops — the list renders flat. The walk and the prefix painting are all no-ops — the list renders flat. The walk and the prefix painting are
still in `swarm.js`; retiring them falls to the frontend owner rather still in `swarm.js`; retiring them falls to the frontend owner rather
@ -1032,8 +1032,8 @@ frosted-mauve bar slides up from the bottom of the viewport
- `DESTR0Y` / `PURG3` — always available - `DESTR0Y` / `PURG3` — always available
<!-- vale write-good.Passive = YES --> <!-- vale write-good.Passive = YES -->
#4472 removed the `M0V3` picker that used to sit here — an agent has The `M0V3` picker that used to sit here no longer exists — an agent
no parent to move it to any more. has no parent to move it to any more.
- **`✕ clear`** button + `Esc` key clear the entire selection. - **`✕ clear`** button + `Esc` key clear the entire selection.
Every render prunes stale selections (agents destroyed while Every render prunes stale selections (agents destroyed while

View file

@ -25,7 +25,7 @@ pub fn check_send_allowed(to: &str) -> Result<(), String> {
// //
// This bypass used to be spelled `<parent>`, which the broker // This bypass used to be spelled `<parent>`, which the broker
// resolved per `topology.json` and which fell back to `operator` // resolved per `topology.json` and which fell back to `operator`
// for a root agent. #4472 removed the parent field, so every // for a root agent. The parent field is gone now, so every
// agent is what that fallback called a root — the exemption is // agent is what that fallback called a root — the exemption is
// now written as the name it always resolved to. Same reachable // now written as the name it always resolved to. Same reachable
// set, one fewer indirection. // set, one fewer indirection.

View file

@ -282,7 +282,7 @@ trait Surface {
/// of a container: this is where a turn failure or a plugin-install /// of a container: this is where a turn failure or a plugin-install
/// failure surfaces when nothing inside the harness can act on it. /// failure surfaces when nothing inside the harness can act on it.
/// ///
/// Was `<parent>` before #4472, a sentinel the broker resolved per /// Was `<parent>` while the hierarchy existed, a sentinel the broker resolved per
/// `topology.json` and which already fell through to `operator` for a /// `topology.json` and which already fell through to `operator` for a
/// root agent. With the parent field gone every agent takes that /// root agent. With the parent field gone every agent takes that
/// branch, so the recipient is written out rather than resolved. /// branch, so the recipient is written out rather than resolved.

View file

@ -6,7 +6,7 @@
//! **There is no hierarchy here any more.** The file used to be a map of //! **There is no hierarchy here any more.** The file used to be a map of
//! `name → parent | null` and this module owned the parent/child tree that //! `name → parent | null` and this module owned the parent/child tree that
//! fed `<parent>` / `<children>` routing, the reparenting API and the //! fed `<parent>` / `<children>` routing, the reparenting API and the
//! dashboard's tree view. All of that is gone (#4472); what the file is //! dashboard's tree view. All of that is gone; what the file is
//! *for* now is the one thing that survived the removal — naming every //! *for* now is the one thing that survived the removal — naming every
//! agent, which is the set a //! agent, which is the set a
//! [`hive_sh4re::permissions::Capability::ManageRootAgent`] holder gets //! [`hive_sh4re::permissions::Capability::ManageRootAgent`] holder gets
@ -28,8 +28,8 @@ pub fn topology_path() -> PathBuf {
crate::paths::meta_root().join(TOPOLOGY_FILE) crate::paths::meta_root().join(TOPOLOGY_FILE)
} }
/// On-disk shapes [`read`] accepts. The array is what [`write`] emits; the /// On-disk shapes [`read`] accepts. The array is what [`write()`] emits; the
/// map is the pre-#4472 `name → parent | null` format, kept readable so a /// map is the legacy `name → parent | null` format, kept readable so a
/// hive that upgrades across this change keeps its roster instead of /// hive that upgrades across this change keeps its roster instead of
/// blanking it until the next `reconcile` pass — and a blank roster is not /// blanking it until the next `reconcile` pass — and a blank roster is not
/// a cosmetic gap, it is every `ManageRootAgent` holder losing its mounts /// a cosmetic gap, it is every `ManageRootAgent` holder losing its mounts
@ -204,7 +204,7 @@ mod tests {
} }
/// The upgrade path. A hive whose `topology.json` still carries the /// The upgrade path. A hive whose `topology.json` still carries the
/// pre-#4472 `name → parent` map must read as the same roster, parent /// legacy `name → parent` map must read as the same roster, parent
/// values discarded — otherwise the first read after the upgrade hands /// values discarded — otherwise the first read after the upgrade hands
/// `ManageRootAgent` holders an empty mount set. /// `ManageRootAgent` holders an empty mount set.
#[test] #[test]

View file

@ -862,8 +862,8 @@ async fn run_deploy_tail(
/// flake affects — the fan-out set for `MetaUpdate` DAGs. Empty /// flake affects — the fan-out set for `MetaUpdate` DAGs. Empty
/// `inputs` or any input under `hyperhive` → every container; /// `inputs` or any input under `hyperhive` → every container;
/// otherwise just the agents named by `agent-<name>` inputs. /// otherwise just the agents named by `agent-<name>` inputs.
/// Sorted by name — #4472 removed the parent field the old depth sort /// Sorted by name — the parent field the old depth sort keyed on is
/// keyed on, and with every agent a root that sort already reduced to /// gone, and with every agent a root that sort already reduced to
/// this. /// this.
/// ///
/// `inputs` is the caller-supplied flake-input-name list (the dashboard's /// `inputs` is the caller-supplied flake-input-name list (the dashboard's

View file

@ -92,8 +92,8 @@ fn config_bind_source(name: &str) -> PathBuf {
/// directories so nspawn doesn't refuse to start; missing dirs are /// directories so nspawn doesn't refuse to start; missing dirs are
/// non-fatal. /// non-fatal.
/// ///
/// The only caller left is the `ManageRootAgent` grant — #4472 removed the /// The only caller left is the `ManageRootAgent` grant; the parent/child
/// parent/child tree that used to hand every agent its own children here. /// tree that handed every agent its own children here is gone.
/// ///
/// **Three dirs, three different answers** — the uniformity of the /// **Three dirs, three different answers** — the uniformity of the
/// original loop is what hid that: /// original loop is what hid that:
@ -335,8 +335,8 @@ async fn set_nspawn_flags(
// now says so out loud instead of deriving it from a field that no // now says so out loud instead of deriving it from a field that no
// longer discriminates. // longer discriminates.
// //
// This is the *only* cross-agent mount left. #4472 dropped the // This is the *only* cross-agent mount left. Dropping the topology
// topology parent field, and with it the unconditional grant every // parent field took with it the unconditional grant every
// agent used to get over its own direct children — so an agent with // agent used to get over its own direct children — so an agent with
// no capability now sees its own dirs and nothing else. // no capability now sees its own dirs and nothing else.
if crate::capabilities::has_cap(agent_name, Capability::ManageRootAgent) { if crate::capabilities::has_cap(agent_name, Capability::ManageRootAgent) {

View file

@ -267,8 +267,8 @@ pub async fn run(coord: Arc<Coordinator>) -> Result<()> {
let current_rev = current_flake_rev(&coord.hyperhive_flake); let current_rev = current_flake_rev(&coord.hyperhive_flake);
// Resolve container names to logical agent names, then sort. #4472 // Resolve container names to logical agent names, then sort. The
// removed the parent field this used to depth-sort by; with no // parent field this used to depth-sort by is gone; with no
// hierarchy left to respect, alphabetical is the whole order — and it // hierarchy left to respect, alphabetical is the whole order — and it
// is exactly what the depth sort already produced once every agent // is exactly what the depth sort already produced once every agent
// was a root. // was a root.