From d17aa254dd9110cbd04d711e191a9da83182e9f4 Mon Sep 17 00:00:00 2001 From: atlas Date: Sun, 30 Aug 2026 03:59:53 +0200 Subject: [PATCH 1/3] nix, hive-sh4re: name modules that exist in the stale harness-base refs harness-base.nix has never existed in this tree. Four comments named it, or a `harness-base` module, as the place to look: - weston-vnc.nix: the agent user is declared and home-chowned by nix/agent-modules/user.nix - hive-ci.nix: the sandbox-fallback reasoning lives in nix/agent-modules/default.nix -- which the very next comment block in the same file already cites correctly - packages/default.nix: the per-bin consumer is nix/agent-modules/packages.nix - hive-sh4re/src/assets.rs: HIVE_ASSETS_DIR is set by hive-c0re/environment.nix and agent-modules/default.nix + agent-service.nix, and the package is built by nix/packages/assets.nix -- not the equally nonexistent nix/assets.nix assets.rs was twice declared out of scope on the sibling PR because it names a module rather than a file. That distinction was real and irrelevant: neither the module nor the nix/assets.nix path it points at exists. Reading the wording is not checking the reference. Every replacement path was verified to exist, with a deliberately bogus path as a control. --- hive-sh4re/src/assets.rs | 8 +++++--- nix/agent-modules/weston-vnc.nix | 2 +- nix/host-modules/hive-ci.nix | 2 +- nix/packages/default.nix | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/hive-sh4re/src/assets.rs b/hive-sh4re/src/assets.rs index 9802a2de..fe160f08 100644 --- a/hive-sh4re/src/assets.rs +++ b/hive-sh4re/src/assets.rs @@ -3,9 +3,11 @@ //! (`hive-c0re`) and the in-container harness binaries so they agree //! on the lookup contract. //! -//! At runtime, the path is read from `$HIVE_ASSETS_DIR`. In nix -//! builds that env var is set by the `hive-c0re` / `harness-base` modules -//! to `${pkgs.hyperhive-assets}/share/hyperhive` (see `nix/assets.nix`). +//! At runtime, the path is read from `$HIVE_ASSETS_DIR`. In nix builds +//! that env var is set to `${pkgs.hyperhive-assets}/share/hyperhive` by +//! `nix/host-modules/hive-c0re/environment.nix` (host daemon) and +//! `nix/agent-modules/default.nix` + `agent-service.nix` (containers); +//! the package itself is built by `nix/packages/assets.nix`. //! For `cargo run` outside nix, set it yourself: //! //! ```sh diff --git a/nix/agent-modules/weston-vnc.nix b/nix/agent-modules/weston-vnc.nix index 2795976b..6599f92f 100644 --- a/nix/agent-modules/weston-vnc.nix +++ b/nix/agent-modules/weston-vnc.nix @@ -6,7 +6,7 @@ }: let # GUI processes run as the agent's own non-root user — the same user - # hive-agent runs as (declared + home-chowned by harness-base.nix) — so + # hive-agent runs as (declared + home-chowned by ./user.nix) — so # weston, the wayland client, and the agent share one user session. # `hyperhive.user.name` is set per-agent by the meta-flake renderer. userName = config.hyperhive.user.name; diff --git a/nix/host-modules/hive-ci.nix b/nix/host-modules/hive-ci.nix index b33fb22d..d9a51204 100644 --- a/nix/host-modules/hive-ci.nix +++ b/nix/host-modules/hive-ci.nix @@ -280,7 +280,7 @@ in # sandboxing always fails. Fall back to unsandboxed builds. # Moot once every nix invocation in the container routes # through the host daemon (the daemon governs sandboxing). - # See docs/gotchas.md and harness-base.nix. + # See docs/gotchas.md and nix/agent-modules/default.nix. nix.settings.sandbox-fallback = lib.mkForce true; # Degrade to a local build when a remote builder is unreachable # rather than failing the check. `fallback` is a client-side diff --git a/nix/packages/default.nix b/nix/packages/default.nix index 00954079..4b3b6668 100644 --- a/nix/packages/default.nix +++ b/nix/packages/default.nix @@ -119,8 +119,8 @@ let ''; # Per-bin split packages. Agent containers depend on the individual - # bins they actually exec/PATH-need (see harness-base.nix) instead - # of the `default` bundle — that keeps `hivectl` (dials the *host* + # bins they actually exec/PATH-need (see nix/agent-modules/packages.nix) + # instead of the `default` bundle — that keeps `hivectl` (dials the *host* # admin socket, unreachable from inside a container, drags in # `wireguard-tools`) and redundant binaries out of every agent's # closure. From 1e011bcd93a832865ad76258184d90f5afda0e8f Mon Sep 17 00:00:00 2001 From: atlas Date: Sun, 30 Aug 2026 04:07:56 +0200 Subject: [PATCH 2/3] hive-sh4re: state the env-var contract, not who sets it Per review: the rust code should not explain nix stuff. The original doc comment named nix modules as the setters of HIVE_ASSETS_DIR, and the previous commit here made that worse -- it replaced two stale nix paths with four accurate ones, entrenching a cross-layer explanation instead of removing it. What this crate actually depends on is the env var and the layout it points at. Who sets it belongs to the layer that sets it. --- hive-sh4re/src/assets.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/hive-sh4re/src/assets.rs b/hive-sh4re/src/assets.rs index fe160f08..ab261118 100644 --- a/hive-sh4re/src/assets.rs +++ b/hive-sh4re/src/assets.rs @@ -3,11 +3,9 @@ //! (`hive-c0re`) and the in-container harness binaries so they agree //! on the lookup contract. //! -//! At runtime, the path is read from `$HIVE_ASSETS_DIR`. In nix builds -//! that env var is set to `${pkgs.hyperhive-assets}/share/hyperhive` by -//! `nix/host-modules/hive-c0re/environment.nix` (host daemon) and -//! `nix/agent-modules/default.nix` + `agent-service.nix` (containers); -//! the package itself is built by `nix/packages/assets.nix`. +//! At runtime, the path is read from `$HIVE_ASSETS_DIR`. Setting it is +//! the deployment's job; this crate's contract is only that it names a +//! directory laid out like the packaged assets. //! For `cargo run` outside nix, set it yourself: //! //! ```sh From 9a019062753cacebf8ad73df04de6fc9e9233995 Mon Sep 17 00:00:00 2001 From: atlas Date: Sun, 30 Aug 2026 04:08:44 +0200 Subject: [PATCH 3/3] hive-sh4re: drop the nix explanation from the panic message too Same layering rule as the previous commit, one construct over. The remediation text explained how nix wires the var and pointed at `nix/assets.nix` -- a path that does not exist either, so it carried both defects this branch is about. What a developer hitting this panic needs is the layout to point at, which is a fact about this crate. --- hive-sh4re/src/assets.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/hive-sh4re/src/assets.rs b/hive-sh4re/src/assets.rs index ab261118..7f3734b7 100644 --- a/hive-sh4re/src/assets.rs +++ b/hive-sh4re/src/assets.rs @@ -34,12 +34,10 @@ fn dir() -> PathBuf { match std::env::var("HIVE_ASSETS_DIR") { Ok(v) if !v.is_empty() => PathBuf::from(v), _ => panic!( - "HIVE_ASSETS_DIR is not set. Inside the nix-built systemd \ - units this is wired automatically from \ - `pkgs.hyperhive-assets`; for `cargo run` outside nix, \ - set it to a directory laid out like \ - `nix/assets.nix`'s output (branding/ + prompts/ \ - subdirs). See hive-sh4re/src/assets.rs for the contract.", + "HIVE_ASSETS_DIR is not set. A deployment sets it; when \ + running a binary outside one, point it at a directory \ + with `branding/` and `prompts/` subdirs. See \ + hive-sh4re/src/assets.rs for the contract.", ), } }