docs: remove hyphens from auto-X compounds per Microsoft.Auto style

Fixed 72 hyphenated 'auto-X' compounds across the docs by deleting
the hyphen to match Microsoft style guide (autogenerated, autoregistration,
autodiscovery, etc). Preserved original capitalization throughout.

Covered 26 documentation files in docs/, including README.md, agent-lifecycle,
integrations, scheduler, networking, process, tools, trust-boundary,
turn-loop, and web-ui sections.
This commit is contained in:
iris 2026-09-07 14:38:33 +02:00 committed by mara
commit 05cf8e8276
26 changed files with 70 additions and 70 deletions

View file

@ -3,7 +3,7 @@
Depth reference for hyperhive — the substrate, not the pitch (that's the Depth reference for hyperhive — the substrate, not the pitch (that's the
[top-level README](../README.md) / [website](https://hyperhive.darkest.space)). [top-level README](../README.md) / [website](https://hyperhive.darkest.space)).
Every page here stands alone; pick the one matching your task rather than Every page here stands alone; pick the one matching your task rather than
reading top to bottom. For the auto-generated NixOS options reference reading top to bottom. For the autogenerated NixOS options reference
(every `services.hyperhive.*` / `hyperhive.*` option, host and agent), see (every `services.hyperhive.*` / `hyperhive.*` option, host and agent), see
[the options site](https://hyperhive.darkest.space/options/) instead — [the options site](https://hyperhive.darkest.space/options/) instead —
this tree is prose, that one's generated straight from the module this tree is prose, that one's generated straight from the module
@ -63,7 +63,7 @@ declarations.
- **What does `hivectl` do? Provisioning, gateway users, container - **What does `hivectl` do? Provisioning, gateway users, container
shells?** → [`tools/hivectl.md`](tools/hivectl.md) (the curated guide); shells?** → [`tools/hivectl.md`](tools/hivectl.md) (the curated guide);
[`tools/hivectl-cli.md`](tools/hivectl-cli.md) for the exhaustive, [`tools/hivectl-cli.md`](tools/hivectl-cli.md) for the exhaustive,
auto-generated flag reference. autogenerated flag reference.
## Networking & swarms ## Networking & swarms
@ -83,7 +83,7 @@ declarations.
[`scheduler/jobq.md`](scheduler/jobq.md) — operator-facing, no implementation detail. [`scheduler/jobq.md`](scheduler/jobq.md) — operator-facing, no implementation detail.
- **How does the rebuild queue work? What are the concrete step kinds, - **How does the rebuild queue work? What are the concrete step kinds,
queue sources, scheduler internals?** → [`scheduler/coordinator.md`](scheduler/coordinator.md). queue sources, scheduler internals?** → [`scheduler/coordinator.md`](scheduler/coordinator.md).
- **How does the CI runner work? What's the auto-registration flow?** - **How does the CI runner work? What's the autoregistration flow?**
[`scheduler/ci.md`](scheduler/ci.md). [`scheduler/ci.md`](scheduler/ci.md).
- **How do I export Claude Code metrics (tokens, cost, tool calls) to - **How do I export Claude Code metrics (tokens, cost, tool calls) to
Prometheus/Grafana?** → [`scheduler/observability.md`](scheduler/observability.md). Prometheus/Grafana?** → [`scheduler/observability.md`](scheduler/observability.md).

View file

@ -150,7 +150,7 @@ Manager}` switch picks the MCP tool allow-list claude sees. Both are
manager-only overrides exist across `hive-c0re` today: loose-ends manager-only overrides exist across `hive-c0re` today: loose-ends
visibility (manager sees hive-wide, sub-agents only their own), visibility (manager sees hive-wide, sub-agents only their own),
`destroy` refusing to act on the manager, and crash-watch skipping `destroy` refusing to act on the manager, and crash-watch skipping
the manager (it auto-restarts via systemd instead of going through the manager (it autorestarts via systemd instead of going through
the crash-watch loop). Each is planned to become an the crash-watch loop). Each is planned to become an
ancestor/descendant check instead of a manager-name check — see the ancestor/descendant check instead of a manager-name check — see the
module docs for `loose_ends.rs`, `stores/broker.rs`, `actions.rs`, module docs for `loose_ends.rs`, `stores/broker.rs`, `actions.rs`,
@ -225,7 +225,7 @@ uid 0 and have the setuid bit set."
- `Restart = on-failure`, `RestartSec = 2` — keeps the harness - `Restart = on-failure`, `RestartSec = 2` — keeps the harness
resilient across transient crashes without thundering retries. resilient across transient crashes without thundering retries.
- `RuntimeDirectory = "hive-config"``/run/hive-config/` owned by - `RuntimeDirectory = "hive-config"``/run/hive-config/` owned by
`User=`, auto-cleared on stop. The harness writes regenerated `User=`, autocleared on stop. The harness writes regenerated
`claude-{mcp-config,settings,system-prompt}` files there `claude-{mcp-config,settings,system-prompt}` files there
(`paths::config_dir`). Deliberately separate from `/run/hive`, which (`paths::config_dir`). Deliberately separate from `/run/hive`, which
the host bind-mounts in root-owned and which holds hive-c0re's the host bind-mounts in root-owned and which holds hive-c0re's

View file

@ -340,7 +340,7 @@ Single-phase variants exist for paths without
rollback semantics: `meta::lock_update_for_rebuild(name)` for rollback semantics: `meta::lock_update_for_rebuild(name)` for
the manual `↻ R3BU1LD` button (commits if the lock changed) the manual `↻ R3BU1LD` button (commits if the lock changed)
and `meta::lock_update_hyperhive()` for the and `meta::lock_update_hyperhive()` for the
auto-update flake-rev bump (one shot before per-agent autoupdate flake-rev bump (one shot before per-agent
rebuilds, commits if the lock changed). rebuilds, commits if the lock changed).
`meta::sync_agents(hive: &HiveEnv, agents: &[AgentSpec])``hive` `meta::sync_agents(hive: &HiveEnv, agents: &[AgentSpec])``hive`
@ -644,7 +644,7 @@ hive-c0re-vouched commit sha. Optional `tag` carries the deploy
bookkeeping tag — `deployed/<id>` on a successful build or bookkeeping tag — `deployed/<id>` on a successful build or
`failed/<id>` on a failed one, planted by the `MergeConfigPr` deploy. `failed/<id>` on a failed one, planted by the `MergeConfigPr` deploy.
Both fields are `Option`: `None` on the paths that don't deploy a new Both fields are `Option`: `None` on the paths that don't deploy a new
commit (spawn / init_config / meta-update / deny, and the auto-update commit (spawn / init_config / meta-update / deny, and the autoupdate
sweep's `job_queue::templates::rebuild` reapplying the existing main, sweep's `job_queue::templates::rebuild` reapplying the existing main,
or the dashboard `↻ R3BU1LD` button when the lock didn't move). When set, or the dashboard `↻ R3BU1LD` button when the lock didn't move). When set,
`git show <sha>` against `/applied/<n>/.git` inside the `git show <sha>` against `/applied/<n>/.git` inside the
@ -657,7 +657,7 @@ message-event list. If it's "FYI, check when convenient," call
`push_todo`/`push_todo_submitter` directly instead — no new wire type `push_todo`/`push_todo_submitter` directly instead — no new wire type
needed. needed.
## Auto-update on startup ## Autoupdate on startup
`hive-c0re serve` runs `auto_update::run` in a background task right `hive-c0re serve` runs `auto_update::run` in a background task right
after opening the coordinator. It enumerates managed containers and after opening the coordinator. It enumerates managed containers and
@ -668,7 +668,7 @@ one — sub-agents and the root agent go through the same
"Rev" = canonical filesystem path of `cfg.hyperhiveFlake`. Marker "Rev" = canonical filesystem path of `cfg.hyperhiveFlake`. Marker
file: `/var/lib/hyperhive/applied/.<name>.hyperhive-rev`. If the file: `/var/lib/hyperhive/applied/.<name>.hyperhive-rev`. If the
flake input has no canonical path (for example a `github:` URL), flake input has no canonical path (for example a `github:` URL),
auto-update is a no-op — rebuild manually. autoupdate is a no-op — rebuild manually.
The dashboard surfaces pending updates per agent: a clickable The dashboard surfaces pending updates per agent: a clickable
"needs update ↻" badge appears whenever the marker differs from "needs update ↻" badge appears whenever the marker differs from

View file

@ -439,7 +439,7 @@ On a btrfs host, a brand-new agent's state root is created as a
**btrfs subvolume** instead of a plain directory (progressive **btrfs subvolume** instead of a plain directory (progressive
enhancement — see the #1762 lane). This is a no-op fallback on enhancement — see the #1762 lane). This is a no-op fallback on
non-btrfs hosts and for any agent whose root already exists, so non-btrfs hosts and for any agent whose root already exists, so
nothing is auto-migrated: existing agents keep their plain dirs nothing is automigrated: existing agents keep their plain dirs
until an explicit opt-in upgrade. until an explicit opt-in upgrade.
- **Creation:** `lifecycle::ensure_agent_state_subvolume` runs before - **Creation:** `lifecycle::ensure_agent_state_subvolume` runs before
@ -548,7 +548,7 @@ streamable-http (`hyperhive.mcp.matrixHttpPort`, no stdio bridge —
same shape as `hive-bash-daemon`), emits hyperhive wake signals same shape as `hive-bash-daemon`), emits hyperhive wake signals
on incoming room events via `/run/hive/mcp.sock`. Conditional on on incoming room events via `/run/hive/mcp.sock`. Conditional on
`hyperhive.matrix.enable` (which both the daemon AND the `hyperhive.matrix.enable` (which both the daemon AND the
auto-injected `extraMcpServers.matrix` entry read). autoinjected `extraMcpServers.matrix` entry read).
**First-boot ordering**: hive-c0re provisions the matrix token AFTER **First-boot ordering**: hive-c0re provisions the matrix token AFTER
agent containers come up. Without the path-trigger sibling agent containers come up. Without the path-trigger sibling

View file

@ -331,7 +331,7 @@ subsequent comment.
### Subscription management ### Subscription management
The poller does **not** auto-unsubscribe from repo watches — it The poller does **not** autounsubscribe from repo watches — it
delivers every unread notification it's handed. Bounding the delivers every unread notification it's handed. Bounding the
firehose (dropping broad repo watches an agent doesn't need) is done firehose (dropping broad repo watches an agent doesn't need) is done
explicitly via a hive-forge CLI subscription verb, not by the poller explicitly via a hive-forge CLI subscription verb, not by the poller

View file

@ -26,9 +26,9 @@ the local clone updates automatically (see
Canonical forge location: `internal/knowledge` (org `internal`, Canonical forge location: `internal/knowledge` (org `internal`,
repo `knowledge`). The repo is public, so every agent's forge account repo `knowledge`). The repo is public, so every agent's forge account
has read access without an explicit per-agent collaborator grant; has read access without an explicit per-agent collaborator grant;
only the `core` account has push access, for auto-seeding. only the `core` account has push access, for autoseeding.
The repo is auto-created at hive-c0re startup if it doesn't exist, The repo is autocreated at hive-c0re startup if it doesn't exist,
seeded with a `README.md` containing a contribution guide and a seeded with a `README.md` containing a contribution guide and a
blank table of contents. Add an entry to that ToC each time you blank table of contents. Add an entry to that ToC each time you
create a new document. create a new document.

View file

@ -33,7 +33,7 @@ Two distinct hostnames:
*irrevocably* in every `@user:<server_name>` and `!room:<server_name>` *irrevocably* in every `@user:<server_name>` and `!room:<server_name>`
identifier minted on this homeserver. can't be changed later identifier minted on this homeserver. can't be changed later
without abandoning every account and chat history. Defaults to the without abandoning every account and chat history. Defaults to the
bare `services.hyperhive.swarm.domain`; clients auto-discover the bare `services.hyperhive.swarm.domain`; clients autodiscover the
actual API endpoint via the `.well-known/matrix/{client,server}` actual API endpoint via the `.well-known/matrix/{client,server}`
routes the gateway serves at that domain. routes the gateway serves at that domain.
- **`gatewayHost`** — the API listener hostname, where the gateway's - **`gatewayHost`** — the API listener hostname, where the gateway's
@ -167,7 +167,7 @@ Matrix client that groups all agent-to-agent + operator rooms in one
place. place.
The sweep also provisions a default **`hive-chat` room** as an The sweep also provisions a default **`hive-chat` room** as an
`m.space.child` of the Space. Joining a Space doesn't auto-join `m.space.child` of the Space. Joining a Space doesn't autojoin
child rooms — the explicit room entry ensures the operator and every child rooms — the explicit room entry ensures the operator and every
agent can find a common chat room without manual setup. Room join is agent can find a common chat room without manual setup. Room join is
restricted (any Space member including the operator can join; agents restricted (any Space member including the operator can join; agents
@ -256,7 +256,7 @@ Both fixed in `nix/host-modules/hive-matrix.nix` via two derivations:
`native_imaging` C source via `pkgs.emscripten`. Source comes `native_imaging` C source via `pkgs.emscripten`. Source comes
from `pkgs.fluffychat-web.passthru.pubspecLock.dependencySources.native_imaging` from `pkgs.fluffychat-web.passthru.pubspecLock.dependencySources.native_imaging`
— already in the build closure of the flutter app, so no parallel — already in the build closure of the flutter app, so no parallel
hash pin and version auto-syncs with nixpkgs bumps. Build closure hash pin and version autosyncs with nixpkgs bumps. Build closure
is ~3.6 GiB (emscripten LLVM); runtime closure is just the two is ~3.6 GiB (emscripten LLVM); runtime closure is just the two
output files. `dontConfigure = true` because cmake runs inside output files. `dontConfigure = true` because cmake runs inside
`js/Makefile` via `emcmake cmake`, not at the package root. The `js/Makefile` via `emcmake cmake`, not at the package root. The

View file

@ -194,7 +194,7 @@ services.hyperhive.gateway = {
}; };
``` ```
nginx obtains and auto-renews certs via the ACME HTTP-01 challenge on `port` (default 80). Certs land in `/var/lib/acme/` on the host, managed by nixpkgs's `security.acme` in the ordinary way. nginx obtains and autorenews certs via the ACME HTTP-01 challenge on `port` (default 80). Certs land in `/var/lib/acme/` on the host, managed by nixpkgs's `security.acme` in the ordinary way.
**Requirements**: `services.hyperhive.domain` must be publicly DNS-resolvable to this host, and `openFirewall = true` so Let's Encrypt can reach `/.well-known/acme-challenge/`. Each active vhost (main domain, `forge.<swarm-domain>`, `chat.<swarm-domain>`) gets its own cert via separate ACME challenges — the swarm services default to names under `services.hyperhive.swarm.domain`, so **every one of those names must resolve to this host too**, not just the hive's own. **Requirements**: `services.hyperhive.domain` must be publicly DNS-resolvable to this host, and `openFirewall = true` so Let's Encrypt can reach `/.well-known/acme-challenge/`. Each active vhost (main domain, `forge.<swarm-domain>`, `chat.<swarm-domain>`) gets its own cert via separate ACME challenges — the swarm services default to names under `services.hyperhive.swarm.domain`, so **every one of those names must resolve to this host too**, not just the hive's own.
@ -370,10 +370,10 @@ services.hyperhive.swarm.forge.rootUrl = "https://forge.example.com/";
``` ```
`rootUrl` (default **null**) overrides the Forgejo `ROOT_URL` that's `rootUrl` (default **null**) overrides the Forgejo `ROOT_URL` that's
auto-derived from `forge.domain` + gateway state. The auto-derivation autoderived from `forge.domain` + gateway state. The autoderivation
covers most cases: covers most cases:
| Shape | Auto-derived `ROOT_URL` | | Shape | Autoderived `ROOT_URL` |
|---|---| |---|---|
| `deploy.forgejo.behindGateway = true` | `https://<forge.domain>/` (port suffix omitted when `gateway.httpsPort == 443`) | | `deploy.forgejo.behindGateway = true` | `https://<forge.domain>/` (port suffix omitted when `gateway.httpsPort == 443`) |
| `deploy.forgejo.behindGateway = false` | `http://<forge.domain>:<httpPort>/` | | `deploy.forgejo.behindGateway = false` | `http://<forge.domain>:<httpPort>/` |

View file

@ -26,7 +26,7 @@ looks like a natural extension point and does nothing. Use
Not `boot.isContainer = true`. Renamed in nixos-25.11+. Not `boot.isContainer = true`. Renamed in nixos-25.11+.
### `nixos-container create` auto-assigns `HOST_ADDRESS` / `LOCAL_ADDRESS` ### `nixos-container create` autoassigns `HOST_ADDRESS` / `LOCAL_ADDRESS`
…in the `.conf`. The start script's `if HOST_ADDRESS set → …in the `.conf`. The start script's `if HOST_ADDRESS set →
--network-veth` branch then forces a private netns — silently fatal --network-veth` branch then forces a private netns — silently fatal

View file

@ -1,7 +1,7 @@
# The PR review gate # The PR review gate
What a review verdict means, why a reviewer shouldn't wait on CI to What a review verdict means, why a reviewer shouldn't wait on CI to
submit one, and what "armed to auto-merge" actually signals about the submit one, and what "armed to automerge" actually signals about the
human review that already happened. human review that already happened.
## The gate has (up to) three parts, and they're per-repo settings ## The gate has (up to) three parts, and they're per-repo settings
@ -17,7 +17,7 @@ hive or every repo. The pieces a repo _can_ require:
(Forgejo's "dismiss stale approvals" branch-protection option), not (Forgejo's "dismiss stale approvals" branch-protection option), not
universal behavior. universal behavior.
- **Someone with write access has armed the PR to merge** — a manual - **Someone with write access has armed the PR to merge** — a manual
merge once the required conditions hold, or Forgejo's auto-merge merge once the required conditions hold, or Forgejo's automerge
(merges automatically the moment the other required conditions are (merges automatically the moment the other required conditions are
met). met).
@ -36,9 +36,9 @@ still running"), but don't gate the formal verdict on it: CI isn't a
signal a reviewer waits on, it's a separate condition that resolves signal a reviewer waits on, it's a separate condition that resolves
independently. independently.
## What arming auto-merge actually means ## What arming automerge actually means
Auto-merge isn't "no human ever looked at this." Whoever arms it has Automerge isn't "no human ever looked at this." Whoever arms it has
already judged the PR sound at a coarse level — the signal it sends is already judged the PR sound at a coarse level — the signal it sends is
roughly _"apart from maybe minor tweaks a reviewer can still catch, roughly _"apart from maybe minor tweaks a reviewer can still catch,
I think this is fine."_ That's the human-in-the-loop step, and it I think this is fine."_ That's the human-in-the-loop step, and it
@ -46,7 +46,7 @@ already happened. No large changes are expected to surface after
that point — a reviewer's job past that point is to flag it if one that point — a reviewer's job past that point is to flag it if one
does, not to assume none ever will. does, not to assume none ever will.
The practical consequence for a reviewer: on a repo where auto-merge The practical consequence for a reviewer: on a repo where automerge
may already be armed before your review lands, a plain `APPROVED` can may already be armed before your review lands, a plain `APPROVED` can
be the last step before the merge actually happens, with no further be the last step before the merge actually happens, with no further
review pass after yours. That's a reason to actually finish checking review pass after yours. That's a reason to actually finish checking

View file

@ -26,7 +26,7 @@ Two things worth knowing before you rely on it:
host's NixOS config (not optional if you plan to actually use this). host's NixOS config (not optional if you plan to actually use this).
Everything below this point is implementation detail: exact Everything below this point is implementation detail: exact
auto-registration internals, container design, and the full security autoregistration internals, container design, and the full security
writeup. writeup.
## CI checks ## CI checks
@ -105,7 +105,7 @@ build can't hold the runner's single slot indefinitely).
- **Sandbox fallback**: nspawn containers can't create user-namespaces, so nix's sandboxing would always fail. Module sets `nix.settings.sandbox-fallback = true` in the container — nix builds run unsandboxed (safe because the container is already isolated). See `docs/process/gotchas.md`. - **Sandbox fallback**: nspawn containers can't create user-namespaces, so nix's sandboxing would always fail. Module sets `nix.settings.sandbox-fallback = true` in the container — nix builds run unsandboxed (safe because the container is already isolated). See `docs/process/gotchas.md`.
- **Credential isolation**: the forge admin token (`forge-core-token`) never enters the container. hive-c0re holds it and performs all forge API calls (runner validation + registration-token mint, in `forge/ci_runner.rs`); via hive-priv it writes only the runner registration token to the host env-file `/run/hive-ci/runner-token`, which the container bind-mounts read-only. - **Credential isolation**: the forge admin token (`forge-core-token`) never enters the container. hive-c0re holds it and performs all forge API calls (runner validation + registration-token mint, in `forge/ci_runner.rs`); via hive-priv it writes only the runner registration token to the host env-file `/run/hive-ci/runner-token`, which the container bind-mounts read-only.
## Auto-registration flow ## Autoregistration flow
Registration is **off the container's boot-critical path** — hive-c0re owns Registration is **off the container's boot-critical path** — hive-c0re owns
it and runs it out of band, so a slow forge or core-token never delays the it and runs it out of band, so a slow forge or core-token never delays the
@ -135,7 +135,7 @@ Gated on `HYPERHIVE_FORGE_CI_ENABLED` (the nix module sets it on `hive-c0re.serv
## Actions checkout mirror ## Actions checkout mirror
When `deploy.forgejo.ci.enable` is set, hive-c0re auto-seeds an When `deploy.forgejo.ci.enable` is set, hive-c0re autoseeds an
`actions/checkout` pull-mirror on the local forge and sets Forgejo's `actions/checkout` pull-mirror on the local forge and sets Forgejo's
`DEFAULT_ACTIONS_URL` to point at the local instance. This means CI `DEFAULT_ACTIONS_URL` to point at the local instance. This means CI
`uses: actions/checkout@vN` steps resolve entirely on loopback — no `uses: actions/checkout@vN` steps resolve entirely on loopback — no
@ -163,7 +163,7 @@ Each entry is created as a real Forgejo pull-mirror — not a one-off
clone. Forgejo re-syncs the mirror on every pull (`git-upload-pack` clone. Forgejo re-syncs the mirror on every pull (`git-upload-pack`
request), so a DNS blip during that sync will propagate back to the request), so a DNS blip during that sync will propagate back to the
runner as a hard `git clone` failure. The runner as a hard `git clone` failure. The
`<owner>` org in `dest` is auto-created. Keep mirror dests out of the `<owner>` org in `dest` is autocreated. Keep mirror dests out of the
hive-c0re-managed namespaces (`config/`, `shared/`, `agents/`, `core/`) hive-c0re-managed namespaces (`config/`, `shared/`, `agents/`, `core/`)
to avoid provisioning collisions. to avoid provisioning collisions.
@ -248,6 +248,6 @@ builder — disk-pressure collection at least runs while nothing is mid-copy.
## References ## References
- `nix/host-modules/hive-ci.nix`: runner configuration, auto-registration script, container setup. - `nix/host-modules/hive-ci.nix`: runner configuration, autoregistration script, container setup.
- `.forgejo/workflows/ci.yml`: workflow definition. - `.forgejo/workflows/ci.yml`: workflow definition.
- `docs/process/gotchas.md`: nix sandboxing limitations in containers. - `docs/process/gotchas.md`: nix sandboxing limitations in containers.

View file

@ -158,7 +158,7 @@ reparent(moves): Reparent(moves) (no rebuild — topology.json is read live)
Notable collapses: Notable collapses:
- **`rebuild` is one uniform shape** — no `was_running` branch. - **`rebuild` is one uniform shape** — no `was_running` branch.
`StopForUpdate` noops when already down; the tail `Reconcile` auto-noops the `StopForUpdate` noops when already down; the tail `Reconcile` autanoops the
start when `wanted = Offline` (a rebuild of a deliberately-stopped agent start when `wanted = Offline` (a rebuild of a deliberately-stopped agent
leaves it stopped). leaves it stopped).
- **The swap-failure recovery-start is structural**: `Reconcile` deps on - **The swap-failure recovery-start is structural**: `Reconcile` deps on
@ -479,7 +479,7 @@ flags → `systemctl daemon-reload` → `start`.
### Prebuild attr path ### Prebuild attr path
`nix build` doesn't auto-resolve `meta#<name>` against `nixosConfigurations` the `nix build` doesn't autoresolve `meta#<name>` against `nixosConfigurations` the
way `nixos-container` does internally. The explicit attr path way `nixos-container` does internally. The explicit attr path
`<flake-root>#nixosConfigurations.<name>.config.system.build.toplevel` is required; `<flake-root>#nixosConfigurations.<name>.config.system.build.toplevel` is required;
using the bare `meta#<name>` ref would make nix look in `packages`, `legacyPackages`, using the bare `meta#<name>` ref would make nix look in `packages`, `legacyPackages`,

View file

@ -396,10 +396,10 @@ refused delivery logs `webhook: refused delivery` with the reason.
- `docs/networking/snapshot-store.md` — the swarm's `btrfs receive` endpoint, and - `docs/networking/snapshot-store.md` — the swarm's `btrfs receive` endpoint, and
the `swarm.snapshotStore` option that points a hive at it the `swarm.snapshotStore` option that points a hive at it
- `docs/process/conventions.md` § Hive identity — env vars, qualified labels - `docs/process/conventions.md` § Hive identity — env vars, qualified labels
- `docs/integrations/matrix.md` — matrix federation, TLS cert auto-generation, - `docs/integrations/matrix.md` — matrix federation, TLS cert autogeneration,
firewall posture firewall posture
- `docs/swarm/ui.md` — the swarm-wide hive roster, now the operator - `docs/swarm/ui.md` — the swarm-wide hive roster, now the operator
surface for "what hives exist" (superseded the per-hive dashboard's surface for "what hives exist" (superseded the per-hive dashboard's
old "peer hives" display) old "peer hives" display)
- `docs/networking/gateway.md` — nginx vhosts and the `.well-known/matrix/` - `docs/networking/gateway.md` — nginx vhosts and the `.well-known/matrix/`
auto-discovery scheme autodiscovery scheme

View file

@ -12,12 +12,12 @@ debug agent behavior.
- **[hivectl](hivectl.md)** — the curated guide: provisioning forge - **[hivectl](hivectl.md)** — the curated guide: provisioning forge
and matrix accounts, gateway htpasswd management, container and matrix accounts, gateway htpasswd management, container
lifecycle shortcuts, interactive agent shell access. lifecycle shortcuts, interactive agent shell access.
- **[hivectl-cli](hivectl-cli.md)** — the exhaustive, auto-generated - **[hivectl-cli](hivectl-cli.md)** — the exhaustive, autogenerated
flag-by-flag reference, kept in lockstep with the binary by CI. flag-by-flag reference, kept in lockstep with the binary by CI.
## For the swarm operator ## For the swarm operator
- **[swarmctl-cli](swarmctl-cli.md)** — the exhaustive, auto-generated - **[swarmctl-cli](swarmctl-cli.md)** — the exhaustive, autogenerated
flag-by-flag reference for `swarmctl`, kept in lockstep with the flag-by-flag reference for `swarmctl`, kept in lockstep with the
binary by CI the same way `hivectl-cli.md` is. `swarmctl` itself binary by CI the same way `hivectl-cli.md` is. `swarmctl` itself
runs as root on the swarm-controller host, not through `hivectl` runs as root on the swarm-controller host, not through `hivectl`
@ -31,7 +31,7 @@ debug agent behavior.
- **[forge](forge.md)** — the `hive-forge` Forgejo CLI every agent has - **[forge](forge.md)** — the `hive-forge` Forgejo CLI every agent has
for issues, PRs, and comments. Not an MCP tool — a binary agents for issues, PRs, and comments. Not an MCP tool — a binary agents
shell out to instead of ad-hoc curl. shell out to instead of ad-hoc curl.
- **[forge-cli](forge-cli.md)** — the exhaustive, auto-generated - **[forge-cli](forge-cli.md)** — the exhaustive, autogenerated
flag-by-flag reference for `hive-forge`, kept in lockstep with the flag-by-flag reference for `hive-forge`, kept in lockstep with the
binary by CI the same way `hivectl-cli.md` is. binary by CI the same way `hivectl-cli.md` is.
- **[lifecycle](lifecycle.md)** — kill/start/restart/update for an - **[lifecycle](lifecycle.md)** — kill/start/restart/update for an

View file

@ -29,12 +29,12 @@ delivered the terminal result inline, in which case no todo is created
response is returned. **Defaults to 3** — pass `wait_seconds: 0` response is returned. **Defaults to 3** — pass `wait_seconds: 0`
to disable inline waiting and always get the immediate response. to disable inline waiting and always get the immediate response.
- `name` — optional caller-chosen task id. When set it replaces the - `name` — optional caller-chosen task id. When set it replaces the
auto-generated hex id, so it surfaces in `status(<name>)` lookups and autogenerated hex id, so it surfaces in `status(<name>)` lookups and
the loose-ends list — a memorable label instead of an opaque id. A name the loose-ends list — a memorable label instead of an opaque id. A name
is **reusable once its previous task has finished**; submitting a is **reusable once its previous task has finished**; submitting a
name whose task is still `pending`/`running` is rejected. Allowed name whose task is still `pending`/`running` is rejected. Allowed
characters: `[a-z0-9-]` (a valid identifier — lowercase, digits, characters: `[a-z0-9-]` (a valid identifier — lowercase, digits,
hyphen; max 63). Omit for the auto-generated id. hyphen; max 63). Omit for the autogenerated id.
Exposed as `mcp__bash__run`. Exposed as `mcp__bash__run`.

View file

@ -98,7 +98,7 @@ Forgejo CLI wrapper for hyperhive
* `pr` — PR-scoped commands: `pr <show|status|create|merge|reviews|assign-reviewer|commits|diff|view|edit|comment|comments|close|reopen|labels|assign-committer|dependency|reaction|timeline> …` * `pr` — PR-scoped commands: `pr <show|status|create|merge|reviews|assign-reviewer|commits|diff|view|edit|comment|comments|close|reopen|labels|assign-committer|dependency|reaction|timeline> …`
* `comment-show` — Print the body (or full JSON) of a single comment by id * `comment-show` — Print the body (or full JSON) of a single comment by id
* `comment-edit` — Edit an existing comment by id * `comment-edit` — Edit an existing comment by id
* `clone` — Clone a forge repo (default `-r`/`HIVE_FORGE_REPO`) with credentials auto-injected. Pairs with `pr-create --agit` * `clone` — Clone a forge repo (default `-r`/`HIVE_FORGE_REPO`) with credentials autoinjected. Pairs with `pr-create --agit`
* `repo-create` — Create a forge repo under the current user (or `--org`). Prints the repo URL * `repo-create` — Create a forge repo under the current user (or `--org`). Prints the repo URL
* `repo-add-collaborator` — Add a collaborator to the active repo (`-r`/`HIVE_FORGE_REPO`) with a permission level. Companion to `repo-create` * `repo-add-collaborator` — Add a collaborator to the active repo (`-r`/`HIVE_FORGE_REPO`) with a permission level. Companion to `repo-create`
* `repo-labels` — List every label defined on the repo (name + description), optionally filtered by a name substring * `repo-labels` — List every label defined on the repo (name + description), optionally filtered by a name substring
@ -956,7 +956,7 @@ Edit an existing comment by id
## `hive-forge clone` ## `hive-forge clone`
Clone a forge repo (default `-r`/`HIVE_FORGE_REPO`) with credentials auto-injected. Pairs with `pr-create --agit` Clone a forge repo (default `-r`/`HIVE_FORGE_REPO`) with credentials autoinjected. Pairs with `pr-create --agit`
**Usage:** `hive-forge clone [OPTIONS] [DEST]` **Usage:** `hive-forge clone [OPTIONS] [DEST]`

View file

@ -5,7 +5,7 @@ container (installed via `nix/agent-modules/forge.nix`, on `PATH` as a
proper Rust binary). Use it instead of ad-hoc curl pipelines. proper Rust binary). Use it instead of ad-hoc curl pipelines.
This page is the curated guide. For the exhaustive flag-by-flag reference This page is the curated guide. For the exhaustive flag-by-flag reference
auto-generated from the binary's own command tree, see autogenerated from the binary's own command tree, see
[`forge-cli.md`](forge-cli.md) — emitted by the hidden `hive-forge [`forge-cli.md`](forge-cli.md) — emitted by the hidden `hive-forge
markdown-docs` subcommand and kept in lockstep with the code by the markdown-docs` subcommand and kept in lockstep with the code by the
`hive-forge-docs` flake check (CI fails if the committed copy drifts). `hive-forge-docs` flake check (CI fails if the committed copy drifts).
@ -139,7 +139,7 @@ distinct output shape — pick by what you need:
| Need | Verb | Shape | | Need | Verb | Shape |
| ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| The full human view of one item — title, body, **and** every comment in order | `view <n>` | prose dump; **marks the thread read** (clears the read-before-comment guard). Top-level `view` auto-detects issue-or-PR by number; scoped `issue view <n>` / `pr view <n>` do the same when you already know the kind | | The full human view of one item — title, body, **and** every comment in order | `view <n>` | prose dump; **marks the thread read** (clears the read-before-comment guard). Top-level `view` autodetects issue-or-PR by number; scoped `issue view <n>` / `pr view <n>` do the same when you already know the kind |
| Just the structured metadata of one item (state, labels, assignees, head sha…) | `issue <n>` / `pr <n>` | JSON object | | Just the structured metadata of one item (state, labels, assignees, head sha…) | `issue <n>` / `pr <n>` | JSON object |
| Only the comments (skip the body), for example to catch up a long thread; for PRs, review bodies (approve/request-changes/comment summaries) are merged in too | `comments <n>` [`--tail N`] | comment + review-body list; **marks read** | | Only the comments (skip the body), for example to catch up a long thread; for PRs, review bodies (approve/request-changes/comment summaries) are merged in too | `comments <n>` [`--tail N`] | comment + review-body list; **marks read** |
| One specific comment by its id | `comment-show <id>` | single comment | | One specific comment by its id | `comment-show <id>` | single comment |

View file

@ -15,7 +15,7 @@ forge + matrix accounts, gateway htpasswd management, container
lifecycle shortcuts, and interactive agent shell access. lifecycle shortcuts, and interactive agent shell access.
This page is the curated guide. For the exhaustive flag-by-flag This page is the curated guide. For the exhaustive flag-by-flag
reference auto-generated from the binary's own command tree, see reference autogenerated from the binary's own command tree, see
[`hivectl-cli.md`](hivectl-cli.md) — emitted by the hidden `hivectl [`hivectl-cli.md`](hivectl-cli.md) — emitted by the hidden `hivectl
markdown-docs` subcommand and kept in lockstep with the code by the markdown-docs` subcommand and kept in lockstep with the code by the
`hivectl-docs` flake check (CI fails if the committed copy drifts). `hivectl-docs` flake check (CI fails if the committed copy drifts).
@ -50,7 +50,7 @@ hivectl forge reconcile-config iris --verbose # include the full diff, not
- `reconcile-config <agent>` shows the divergence between the agent's local - `reconcile-config <agent>` shows the divergence between the agent's local
applied config checkout and its forge `agent-configs/<agent>` `main`, then applied config checkout and its forge `agent-configs/<agent>` `main`, then
reconciles. `--from forge` resets the local checkout to forge `main` (takes reconciles. `--from forge` resets the local checkout to forge `main` (takes
effect on the next deploy — it doesn't auto-rebuild). `--from local` isn't effect on the next deploy — it doesn't autorebuild). `--from local` isn't
supported yet (forge `main` is core-only branch-protected; resolve via a supported yet (forge `main` is core-only branch-protected; resolve via a
config PR). With no `--from` it prompts for the direction after the diff. config PR). With no `--from` it prompts for the direction after the diff.

View file

@ -3,7 +3,7 @@
## Built-in matrix MCP (`mcp__matrix__*`) ## Built-in matrix MCP (`mcp__matrix__*`)
When `hyperhive.matrix.enable = true` and the host-level matrix When `hyperhive.matrix.enable = true` and the host-level matrix
tuwunel is configured, the harness auto-injects `hive-matrix-daemon`'s tuwunel is configured, the harness autoinjects `hive-matrix-daemon`'s
streamable-http endpoint as a second MCP server (no stdio bridge — streamable-http endpoint as a second MCP server (no stdio bridge —
see Architecture below). Tools land as `mcp__matrix__<name>`: see Architecture below). Tools land as `mcp__matrix__<name>`:
@ -120,7 +120,7 @@ a one-shot signal that raced a socket-down window was dropped with no
retry, leaving the agent deaf until manually prompted) and upserts a retry, leaving the agent deaf until manually prompted) and upserts a
todo (keyed `invite:<room>`) for each pending invite on the harness's todo (keyed `invite:<room>`) for each pending invite on the harness's
in-agent socket, which drives a turn. The daemon does **not** in-agent socket, which drives a turn. The daemon does **not**
auto-join — the agent calls `list_invites` to see pending invites and autojoin — the agent calls `list_invites` to see pending invites and
`resolve_invite` to accept or reject them. `resolve_invite` to accept or reject them.
**Pending invites as loose ends**: pending invites are upserted as **Pending invites as loose ends**: pending invites are upserted as
@ -152,5 +152,5 @@ in by adding them to `inputs.*` and referenced as
sha lands in the agent's own `flake.lock` and rolls up to meta's. sha lands in the agent's own `flake.lock` and rolls up to meta's.
`allowedTools` defaults to `["*"]`, which expands to `allowedTools` defaults to `["*"]`, which expands to
`mcp__<key>__*` (every tool from that server auto-approved). Restrict `mcp__<key>__*` (every tool from that server autoapproved). Restrict
to specific tool names when you want finer control. to specific tool names when you want finer control.

View file

@ -37,7 +37,7 @@ rows (terminal state).
Cancel a schedule. Omit `targets` / pass empty to cancel the whole Cancel a schedule. Omit `targets` / pass empty to cancel the whole
schedule; pass a list to cancel just those recipients (the schedule schedule; pass a list to cancel just those recipients (the schedule
auto-cancels when every target is removed). autocancels when every target is removed).
### `fire_schedule_now(id)` ### `fire_schedule_now(id)`

View file

@ -86,7 +86,7 @@ the answer is _don't grant the capability_ — not "grant it and hope the
sandbox holds", because there is no sandbox between an agent and the tools you sandbox holds", because there is no sandbox between an agent and the tools you
handed it. handed it.
### No auto-sandboxing of external tokens ### No autosandboxing of external tokens
hyperhive provisions and scopes its **own** per-agent forge + matrix tokens. hyperhive provisions and scopes its **own** per-agent forge + matrix tokens.
It does **not** automatically sandbox or scope **external** credentials It does **not** automatically sandbox or scope **external** credentials

View file

@ -17,7 +17,7 @@ Attach, CompactionPolicy, PercentPolicy, Telemetry, Sink, SessionStore}`;
see `hive-claude/README.md`). `hive-agent`'s `turn` module is the see `hive-claude/README.md`). `hive-agent`'s `turn` module is the
hyperhive **policy layer** on top: it builds the per-turn config from hyperhive **policy layer** on top: it builds the per-turn config from
the bus, bridges the output stream onto the event bus (`BusSink`), and the bus, bridges the output stream onto the event bus (`BusSink`), and
owns the compaction / auto-reset / retry decisions in `drive_turn`. The owns the compaction / autoreset / retry decisions in `drive_turn`. The
lib returns everything it parsed from a turn (usage, cost, context lib returns everything it parsed from a turn (usage, cost, context
window, resolved model) as `Telemetry`, which the policy layer applies window, resolved model) as `Telemetry`, which the policy layer applies
to the bus. to the bus.
@ -86,11 +86,11 @@ context (it won't carry our title). claude stores sessions in
`--name` writes the title into the file as a `custom-title` event, which `--name` writes the title into the file as a `custom-title` event, which
is what `--resume <title>` resolves against. We never pass bare is what `--resume <title>` resolves against. We never pass bare
`--continue` (it resumes the _latest_ session in the cwd — the hijack `--continue` (it resumes the _latest_ session in the cwd — the hijack
vector). Auto-memory and dynamic workflows (the `/workflows` feature) are vector). Automemory and dynamic workflows (the `/workflows` feature) are
disabled via the managed settings at `/etc/claude-code/managed-settings.json`: disabled via the managed settings at `/etc/claude-code/managed-settings.json`:
`disableWorkflows` keeps the `/workflows` machinery from spawning sub-runs `disableWorkflows` keeps the `/workflows` machinery from spawning sub-runs
that burn usage on the harness's autonomous turns. Claude's own native that burn usage on the harness's autonomous turns. Claude's own native
auto-compact is **on**, at the widest window claude-code allows — see autocompact is **on**, at the widest window claude-code allows — see
[Compaction](#compaction) below for why (it's a safety net, not the [Compaction](#compaction) below for why (it's a safety net, not the
primary mechanism; hyperhive still owns that). primary mechanism; hyperhive still owns that).
@ -191,14 +191,14 @@ still applies.
fresh. Unlike proactive compaction the session is dropped entirely, not fresh. Unlike proactive compaction the session is dropped entirely, not
compacted — and _no_ preceding checkpoint turn runs, because any turn compacted — and _no_ preceding checkpoint turn runs, because any turn
before the reset would just re-warm the cache and defeat the purpose. before the reset would just re-warm the cache and defeat the purpose.
Set `HIVE_AUTO_RESET_WATERMARK_TOKENS=0` to disable. Auto-reset and the Set `HIVE_AUTO_RESET_WATERMARK_TOKENS=0` to disable. Autoreset and the
operator reset are mutually exclusive per turn (both archive → fresh operator reset are mutually exclusive per turn (both archive → fresh
turn), so an explicit operator reset short-circuits the heuristic. turn), so an explicit operator reset short-circuits the heuristic.
The child runs with `cwd = /state` (when the bind exists; falls The child runs with `cwd = /state` (when the bind exists; falls
back to the parent's cwd in dev), so any relative path in a tool back to the parent's cwd in dev), so any relative path in a tool
call (`Read foo.md`, `Bash ls`, `Write notes.md`) lands in the call (`Read foo.md`, `Bash ls`, `Write notes.md`) lands in the
agent's durable bind-mounted dir. CLAUDE.md auto-load walks agent's durable bind-mounted dir. CLAUDE.md autoload walks
upward from `/state` — drop a per-agent CLAUDE.md there if you upward from `/state` — drop a per-agent CLAUDE.md there if you
want long-term hints that survive destroy/recreate. want long-term hints that survive destroy/recreate.
@ -268,7 +268,7 @@ the renderer also treats `Some("")`from a caller as`None` so
same way. same way.
The per-turn plumbing described on this page — on-boot files, session The per-turn plumbing described on this page — on-boot files, session
identity, the reset/auto-reset/retry state machine, and the identity, the reset/autoreset/retry state machine, and the
telemetry-to-bus bridge — lives in `hive-agent`'s `turn` module; see its telemetry-to-bus bridge — lives in `hive-agent`'s `turn` module; see its
`//!` doc comment (`hive-agent/src/turn.rs`) for the exact call shape. `//!` doc comment (`hive-agent/src/turn.rs`) for the exact call shape.
The actual claude spawn, stream classification, and the The actual claude spawn, stream classification, and the

View file

@ -123,7 +123,7 @@ and scrolls behind the fixed header + footer.
silently ignore `autocomplete="off"` on `type="password"`, but silently ignore `autocomplete="off"` on `type="password"`, but
`one-time-code` is honoured and suppresses the "save password `one-time-code` is honoured and suppresses the "save password
for this site?" prompt that would otherwise fire on submit. for this site?" prompt that would otherwise fire on submit.
- Terminal-wrap: live event tail (sticky-bottom auto-scroll + - Terminal-wrap: live event tail (sticky-bottom autoscroll +
`↓ N new` pill when not at bottom). The pill is **anchored in `↓ N new` pill when not at bottom). The pill is **anchored in
`.agent-main`**, not in `log.parentElement = .terminal-wrap`: `.agent-main`**, not in `log.parentElement = .terminal-wrap`:
`.terminal-wrap` applies `backdrop-filter: blur` for the frost `.terminal-wrap` applies `backdrop-filter: blur` for the frost
@ -195,7 +195,7 @@ SSE frame and the replayed history rows. The web UI:
- terminal-themed: phosphor mauve glow, Crust bg, - terminal-themed: phosphor mauve glow, Crust bg,
backdrop-filter blur, row fade-in slide-up. backdrop-filter blur, row fade-in slide-up.
The backfill/live-tail dedupe, sticky-bottom auto-scroll, and "↓ N The backfill/live-tail dedupe, sticky-bottom autoscroll, and "↓ N
new" pill are the shared terminal-pane mechanics described in new" pill are the shared terminal-pane mechanics described in
[Shape](shape.md#shared-terminal-pane) — this page's log is one [Shape](shape.md#shared-terminal-pane) — this page's log is one
instance of that same factory. instance of that same factory.

View file

@ -153,7 +153,7 @@ snapshot-storage rework where the problem changes shape.
tool-group JSON entries but no live container — typically renamed or tool-group JSON entries but no live container — typically renamed or
deleted agents whose entries persisted in `capabilities.json` / deleted agents whose entries persisted in `capabilities.json` /
`tool-groups.json`. Lazy-loaded on first K3PT ST4T3 tab activation; `tool-groups.json`. Lazy-loaded on first K3PT ST4T3 tab activation;
auto-refreshes on `capabilities_changed` + `tool_groups_changed` SSE autorefreshes on `capabilities_changed` + `tool_groups_changed` SSE
events. Each ghost agent gets a `✕ clear perms` button events. Each ghost agent gets a `✕ clear perms` button
(`DELETE /api/permissions/{name}`). (`DELETE /api/permissions/{name}`).
@ -285,7 +285,7 @@ update button is disabled (snapshot field `meta_update_running`,
live event `meta_update_running`). live event `meta_update_running`).
**BUILD L0GS** — all-agents build log history (moved from `/logs.html`). **BUILD L0GS** — all-agents build log history (moved from `/logs.html`).
Lazy-loaded on first tab activation; auto-refreshes when Lazy-loaded on first tab activation; autorefreshes when
`rebuild_queue_changed` fires. Fetches `GET /api/build-logs?limit=30`. `rebuild_queue_changed` fires. Fetches `GET /api/build-logs?limit=30`.
Renders a scrollable list of build entries; each row is a collapsible Renders a scrollable list of build entries; each row is a collapsible
button showing status badge (`live` / `ok` / `fail`), agent name, button showing status badge (`live` / `ok` / `fail`), agent name,
@ -293,7 +293,7 @@ elapsed duration, build kind, age, and the invocation command line.
Expanding a row fetches the full stdout+stderr via Expanding a row fetches the full stdout+stderr via
`GET /api/build-logs/id/{id}`. A live in-progress build shows a `live` `GET /api/build-logs/id/{id}`. A live in-progress build shows a `live`
badge with a ticking elapsed-time chip; expanding streams output via badge with a ticking elapsed-time chip; expanding streams output via
`GET /api/build-logs/id/{id}/stream` with sticky-bottom auto-scroll `GET /api/build-logs/id/{id}/stream` with sticky-bottom autoscroll
(suspends on manual scroll-up). Deep-link: `?id=N#buildlogs` opens the (suspends on manual scroll-up). Deep-link: `?id=N#buildlogs` opens the
entry with that id pre-expanded. entry with that id pre-expanded.
@ -640,7 +640,7 @@ the matrix module exposes).
The unified nginx-front re-root to The unified nginx-front re-root to
`https://chat.${hyperhive.swarm.domain}` + `.well-known/matrix/client` `https://chat.${hyperhive.swarm.domain}` + `.well-known/matrix/client`
auto-discovery lives in `docs/networking/gateway.md` (atlas's lane). autodiscovery lives in `docs/networking/gateway.md` (atlas's lane).
## FL0W page (`/flow.html`) ## FL0W page (`/flow.html`)
@ -675,9 +675,9 @@ The row is a `flex-wrap: wrap` container holding ts / arrow / from / sep
chips (`flex: 1 1 100%`) so long timestamps and agent names never push the chips (`flex: 1 1 100%`) so long timestamps and agent names never push the
body into a narrow trailing column. `min-width: 0` keeps body into a narrow trailing column. `min-width: 0` keeps
`word-break: break-word` effective so the body doesn't force the row wider `word-break: break-word` effective so the body doesn't force the row wider
than its container. Sticky-bottom auto-scroll + "↓ N new" pill. Below the than its container. Sticky-bottom autoscroll + "↓ N new" pill. Below the
stream sits a terminal-style compose box: `@name` picks the recipient stream sits a terminal-style compose box: `@name` picks the recipient
(sticky via localStorage; auto-complete from the live container list, (sticky via localStorage; autocomplete from the live container list,
Tab/Enter to confirm; `@*` broadcasts). `POST /api/op-send` drops Tab/Enter to confirm; `@*` broadcasts). `POST /api/op-send` drops
`{from:"operator", to, body}` into the broker; the resulting SSE frame `{from:"operator", to, body}` into the broker; the resulting SSE frame
re-renders the terminal row. The root agent is addressed as `@root`. re-renders the terminal row. The root agent is addressed as `@root`.
@ -948,7 +948,7 @@ OS. Three primitives, all built on the `openDialog` core:
- `themedToast(message, { type, ... })` — a non-blocking toast (top-right, - `themedToast(message, { type, ... })` — a non-blocking toast (top-right,
`info` / `error` / `ok`) for transient validation + action `info` / `error` / `ok`) for transient validation + action
failures, so an error doesn't trap the operator behind a modal. failures, so an error doesn't trap the operator behind a modal.
Single-action errors auto-dismiss; bulk / partial-failure Single-action errors autodismiss; bulk / partial-failure
summaries are sticky (click to dismiss) so they aren't missed. summaries are sticky (click to dismiss) so they aren't missed.
Every destructive run-state action (`ST0P`, `R3ST4RT`, `R3BU1LD`, Every destructive run-state action (`ST0P`, `R3ST4RT`, `R3BU1LD`,
@ -1272,7 +1272,7 @@ below — some endpoints aren't in it yet.
and the target starts fresh (operator intent on re-add = and the target starts fresh (operator intent on re-add =
"this target is active again"). `targets_remove` delegates "this target is active again"). `targets_remove` delegates
to the same path as `cancel_targets` — tombstones preserve to the same path as `cancel_targets` — tombstones preserve
audit, parent schedule auto-cancels when no active targets audit, parent schedule autocancels when no active targets
remain. Refuses cancelled rows; returns the updated remain. Refuses cancelled rows; returns the updated
`WireSchedule` on success. `WireSchedule` on success.
- `POST /api/schedules/{id}/cancel` — cancel a schedule. Body - `POST /api/schedules/{id}/cancel` — cancel a schedule. Body

View file

@ -39,7 +39,7 @@ home.js`, is the reference example — currently in the dashboard
the thing that shows the current model. the thing that shows the current model.
- Loosely influenced by Material Design's current (Material You) - Loosely influenced by Material Design's current (Material You)
generation, mainly for shape/elevation ideas. Colour is dynamic too — generation, mainly for shape/elevation ideas. Colour is dynamic too —
auto-derived shades (mixing, lighter/darker) are fair game, same as autoderived shades (mixing, lighter/darker) are fair game, same as
Material's own approach — but every derived colour still traces back Material's own approach — but every derived colour still traces back
to the base16/stylix contract below, never an independent source. to the base16/stylix contract below, never an independent source.

View file

@ -28,7 +28,7 @@
members; a back-compat shim in the IIFE bodies still exposes members; a back-compat shim in the IIFE bodies still exposes
a `window.HiveTerminal` global for callers that need it. The dashboard's a `window.HiveTerminal` global for callers that need it. The dashboard's
`#msgflow` and the per-agent `#live` log are both backed by `#msgflow` and the per-agent `#live` log are both backed by
this terminal — sticky-bottom auto-scroll, "↓ N new" pill, this terminal — sticky-bottom autoscroll, "↓ N new" pill,
history backfill, SSE plumbing all live there. Each page history backfill, SSE plumbing all live there. Each page
registers a kind→renderer map; unknown kinds fall through to registers a kind→renderer map; unknown kinds fall through to
a JSON-dump note row. Bare `http(s)://` URLs in row text are a JSON-dump note row. Bare `http(s)://` URLs in row text are
@ -91,7 +91,7 @@
Both surfaces' scrollable log streams (`#msgflow` on the dashboard, Both surfaces' scrollable log streams (`#msgflow` on the dashboard,
`#live` on the per-agent page) are backed by the shared terminal `#live` on the per-agent page) are backed by the shared terminal
factory in `@hive/shared/terminal.js`. The factory wires up factory in `@hive/shared/terminal.js`. The factory wires up
sticky-bottom auto-scroll, a "↓ N new" pill, history backfill, and sticky-bottom autoscroll, a "↓ N new" pill, history backfill, and
SSE replay. Pages register a `kind → renderer` map; unknown kinds SSE replay. Pages register a `kind → renderer` map; unknown kinds
fall through to a JSON-dump note row. The factory ships three row fall through to a JSON-dump note row. The factory ships three row
shapes the renderers call: shapes the renderers call: