diff --git a/docs/web-ui/dashboard.md b/docs/web-ui/dashboard.md
index f1032305..88266119 100644
--- a/docs/web-ui/dashboard.md
+++ b/docs/web-ui/dashboard.md
@@ -16,7 +16,7 @@ from the dashboard tab strip.
- **← home back-link**: top-left of the chrome, links to the H0M3 hub
at `/`. Every surface links back to the hub rather than to each other.
- **Tab strip**: `◆ SW4RM ◆`, `◆ Y3R C4LL ◆`, `◆ P3RM1SS10NS ◆`,
- `◆ SCH3DUL3S ◆`. In-page tabs only — the SYST3M panels moved to the
+ `◆ SCH3DUL3S ◆`. In-page tabs only — the SYST3M panels live on the
standalone **C0R3** page (`/core.html`), and FL0W / L0GS / ST4TS /
M4TR1X live on their own pages too, all reachable from the
H0M3 hub (not the tab strip). Count pills on SW4RM
@@ -92,9 +92,8 @@ in_reply_to, file_refs).
browser's `localStorage` — preferences **don't** sync between devices and
**don't** survive a profile wipe. One section today (browser
notifications); future preferences land here as sibling `
` blocks
-in `dashboard.html`. Was its own S3TT1NGS page/tile (`/settings.html`)
-until mara moved it in here — a standalone page for one toggle didn't
-earn its own tile.
+in `dashboard.html` — a standalone page for one toggle wouldn't earn
+its own tile.
**◇ browser notifications** — `🔔 enable notifications` button when
permission ungranted; `🔕 mute / 🔔 unmute` toggle once granted
@@ -111,15 +110,15 @@ instead — it's agent-terminal-only, unrelated to this section.
## C0R3 page (`/core.html`)
-Passive / rare-interaction state. No longer a dashboard tab — it's a
-standalone page reached from the **Core** tile on the H0M3 hub (served at
+Passive / rare-interaction state, reached from the **Core** tile on the
+H0M3 hub (served at
`/core.html`), with the same minimal chrome as `/logs.html`: a `← home`
back-link + a `createTabStrip` sub-tab nav (**K3PT ST4T3** default,
then **C0NT41N3R L04D**). The page is its own esbuild bundle (`core.js`)
that cold-loads `/api/state` and subscribes to `/api/dashboard/stream` for
`tombstones_changed`, `capabilities_changed`, and `tool_groups_changed`
(the latter two re-render the stale-perms sub-section when permission
-data changes). (Rebuild queue and meta inputs have moved to the BU1LDS
+data changes). (Rebuild queue and meta inputs live on the BU1LDS
page — see below.)
**K3PT ST4T3** — two sub-sections on one pane:
@@ -199,9 +198,8 @@ pipeline) with an `onUpdate` callback to drive the two things below it
that the generic view doesn't show. The component owns fetching, cold
and live: `GET /api/jobq/graph` on mount, and a refetch via the mount
handle's `.refresh()` on every `rebuild_queue_changed` SSE tick (that
-event is a bare `{ seq }` trigger — it carried a typed queue snapshot
-until every consumer had moved to the generic endpoint, and now carries
-none; both dashboard pages treat the tick as a pure refetch trigger).
+event is a bare `{ seq }` trigger carrying no queue payload; both
+dashboard pages treat the tick as a pure refetch trigger).
Each row is one root graph node (`parent: null`); a multi-step op's
per-agent subgraphs and sub-steps render as nodes within that one
@@ -222,7 +220,7 @@ own domain concept (the component knows nothing about that endpoint).
**Rows carry no source chip, kind label, timing, or build-log
deep-link** — the generic graph wire doesn't carry those fields, and
rows deliberately present exactly what the endpoint provides rather
-than reconstructing chrome hive-c0re no longer sends. Settled entries
+than reconstructing chrome hive-c0re doesn't send. Settled entries
render their **full step tree**, not just a bare summary — the wire
doesn't filter `Done` nodes out.
@@ -274,8 +272,8 @@ the panel shows a pulsing "⏳ meta-update running" banner and disables
the update button (snapshot field `meta_update_running`,
live event `meta_update_running`).
-**BUILD L0GS** — all-agents build log history (moved from `/logs.html`).
-Lazy-loaded on first tab activation; autorefreshes when
+**BUILD L0GS** — all-agents build log history. Lazy-loaded on first tab
+activation; autorefreshes when
`rebuild_queue_changed` fires. Fetches `GET /api/build-logs?limit=30`.
Renders a scrollable list of build entries; each row is a collapsible
button showing status badge (`live` / `ok` / `fail`), agent name,
@@ -550,10 +548,9 @@ nginx container at `/matrix/` when
`HIVE_MATRIX_GUI_ENABLED` env var → `state.matrix_gui_enabled` in
`/api/state`; the gateway does the actual static serving.
-There's no tile for it on the H0M3 hub (removed along with Forge's —
-see the H0M3 section above). The operator reaches it from the swarm-ui
-LinksMenu instead (see `docs/swarm/ui.md::Quick links`), and logs in
-once with the in-host tuwunel homeserver URL (`http://localhost:8008` or whatever
+The operator reaches it from the swarm-ui LinksMenu, not a H0M3 hub
+tile (see `docs/swarm/ui.md::Quick links`), and logs in once with the
+in-host tuwunel homeserver URL (`http://localhost:8008` or whatever
the matrix module exposes).
The unified nginx-front re-root to
@@ -620,7 +617,7 @@ A dedicated log-viewer page (not a tab pane — a separate HTML page),
reachable from the Logs tile on the H0M3 hub. Minimal chrome:
a `← home` back link and a three-item sub-tab strip. Tab
routing is hash-based (`#agent`, `#infra`, `#system`); default is
-`#agent`. (Build log history has moved to the BU1LDS page — see above.)
+`#agent`. (Build log history lives on the BU1LDS page — see above.)
**AGENT sub-tab** — per-container journald viewer. Two selects: agent
name (populated from `GET /api/state`) and unit filter
@@ -774,7 +771,7 @@ life). Two consequences for anything rendering it:
(`NodeKind`'s `&str` conversion, the same strings the graph wire's node
labels carry), not a fixed set. Treat it as an opaque display
string; don't switch on specific values. `restarting` in
- particular no longer exists, because no node kind is unique to a
+ particular doesn't exist, because no node kind is unique to a
restart.
- It's **not** exclusively operator-initiated, and **not** limited
to rebuild-shaped work — `running_transients()` in hive-c0re is
@@ -1226,8 +1223,7 @@ payload):
every queue mutation (enqueue, state transition, dedup collapse,
terminal-history trim). Unlike the snapshot events below it ships
no state at all: the client re-fetches `GET /api/jobq/graph`, which
- is where it reads the queue from cold too. No
- `/api/state.rebuild_queue` exists — it went with the typed projection.
+ is where it reads the queue from cold too.
- `schedules_changed` (seq, schedules: `Vec`) —
full snapshot of all scheduled prompts. Emitted after every
operator mutation via the `/api/schedules` surface (new /
@@ -1276,7 +1272,7 @@ shaped yet). Every other section — approvals,
transients, containers, operator inbox, message flow —
derives from `/api/dashboard/stream` after the initial snapshot,
maintaining its own client-side store and applying events on
-top. The 5s periodic poll is gone.
+top.
Generalised form helpers: `form[data-confirm="…"]` pops