diff --git a/hive-c0re/src/dashboard.rs b/hive-c0re/src/dashboard.rs
index 14428a37..06e47f92 100644
--- a/hive-c0re/src/dashboard.rs
+++ b/hive-c0re/src/dashboard.rs
@@ -225,9 +225,11 @@ fn render_containers(
let port = lifecycle::agent_web_port(name);
let claude_dir = Coordinator::agent_claude_dir(name);
let login_badge = if claude_has_session(&claude_dir) {
- ""
+ String::new()
} else {
- " needs login"
+ format!(
+ " needs login →",
+ )
};
let _ = writeln!(
out,
diff --git a/nix/templates/agent-base.nix b/nix/templates/agent-base.nix
index c633925a..17262a7c 100644
--- a/nix/templates/agent-base.nix
+++ b/nix/templates/agent-base.nix
@@ -15,6 +15,10 @@
description = "hive-ag3nt harness";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
+ # The harness shells out to `claude` (turn loop + login flow). systemd
+ # units get a minimal PATH by default, so we have to put claude-code on
+ # it explicitly even though it's in environment.systemPackages above.
+ path = [ pkgs.claude-code ];
serviceConfig = {
ExecStart = "${pkgs.hyperhive}/bin/hive-ag3nt serve";
Restart = "on-failure";
diff --git a/nix/templates/manager.nix b/nix/templates/manager.nix
index 7920ec46..13ad1919 100644
--- a/nix/templates/manager.nix
+++ b/nix/templates/manager.nix
@@ -27,6 +27,9 @@
HIVE_PORT = "8000";
HIVE_LABEL = "hm1nd";
};
+ # See note in agent-base.nix — `claude` has to be on the service PATH
+ # explicitly for the harness to shell out to it.
+ path = [ pkgs.claude-code ];
serviceConfig = {
ExecStart = "${pkgs.hyperhive}/bin/hive-m1nd serve";
Restart = "on-failure";