From dc536156861120ee6e766c133d68159c9ecd0349 Mon Sep 17 00:00:00 2001 From: damocles Date: Sat, 16 May 2026 17:21:23 +0200 Subject: [PATCH 1/2] fix stale /state refs in agent and manager prompts --- hive-ag3nt/prompts/agent.md | 2 +- hive-ag3nt/prompts/manager.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hive-ag3nt/prompts/agent.md b/hive-ag3nt/prompts/agent.md index 46a1eddc..1f3d0330 100644 --- a/hive-ag3nt/prompts/agent.md +++ b/hive-ag3nt/prompts/agent.md @@ -15,6 +15,6 @@ Claude session (OAuth credentials) lives at `/root/.claude/` and persists across **Shared space**: `/shared` is accessible to all agents (read/write). Only put things here you're willing to lose — other agents may delete them. Use for explicit cross-agent communication or shared artifacts when appropriate. -Keep messages short — a few sentences each. For anything big (file listings, long diffs, transcripts, analysis): write the payload to `/agents/{label}/state/` and `send` a short pointer ("dropped the cluster audit in /state/cluster-audit-2026-05.md, headline: 3 nodes over 80% mem"). The manager + operator can read your state from the host as `/agents/{label}/state/`. Sub-agent peers can't read each other's `/state/` directly — go through the manager if a payload needs to reach another sub-agent. +Keep messages short — a few sentences each. For anything big (file listings, long diffs, transcripts, analysis): write the payload to `/agents/{label}/state/` and `send` a short pointer ("dropped the cluster audit in /agents/{label}/state/cluster-audit-2026-05.md, headline: 3 nodes over 80% mem"). The manager + operator can read your state from the host as `/agents/{label}/state/`. Sub-agent peers can't read each other's state directly — go through the manager if a payload needs to reach another sub-agent. When your inbox has a message, handle it and stop. Don't narrate intent — act. diff --git a/hive-ag3nt/prompts/manager.md b/hive-ag3nt/prompts/manager.md index c08f5b8a..f65e106f 100644 --- a/hive-ag3nt/prompts/manager.md +++ b/hive-ag3nt/prompts/manager.md @@ -79,7 +79,7 @@ Durable knowledge: Keep messages short — a few sentences each. For anything big (digests, agent rosters, plans, transcripts) write the payload to a file and `send` a short pointer: -- To a sub-agent X: write to `/agents/X/state/` and tell them "see /state/". +- To a sub-agent X: write to `/agents/X/state/` and tell them "see /agents/X/state/". - To the operator: write to your own `/state/` (host path `/var/lib/hyperhive/agents/hm1nd/state/`) and tell them where to look. - For shared artifacts (coordination, common reference data): write to `/shared/`. Only put things here you're willing to lose — other agents may delete them. From f3739d2b8e96da70a868dd2af4be3eb15138e3ba Mon Sep 17 00:00:00 2001 From: damocles Date: Sat, 16 May 2026 18:49:11 +0200 Subject: [PATCH 2/2] update plugin marketplaces before install at harness boot --- hive-ag3nt/src/plugins.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/hive-ag3nt/src/plugins.rs b/hive-ag3nt/src/plugins.rs index f1302d00..00254f9f 100644 --- a/hive-ag3nt/src/plugins.rs +++ b/hive-ag3nt/src/plugins.rs @@ -6,6 +6,10 @@ //! is expected to be idempotent so reinstalling on each container //! recreate is fine. Failures log a warning but do not abort boot — //! we'd rather start without a plugin than refuse to serve. +//! +//! Before installing, all configured marketplaces are updated so that +//! plugin specs resolve against current index data. Marketplace update +//! failures are non-fatal — stale index is better than no install attempt. use std::path::Path; @@ -15,6 +19,30 @@ use crate::client; const PLUGINS_PATH: &str = "/etc/hyperhive/claude-plugins.json"; +/// Update all configured plugin marketplaces. Non-fatal — logs a warning +/// on failure but does not abort the install sequence. +async fn update_marketplaces() { + match Command::new("claude") + .args(["plugin", "marketplace", "update"]) + .output() + .await + { + Ok(out) if out.status.success() => { + tracing::info!("claude plugin marketplace update ok"); + } + Ok(out) => { + tracing::warn!( + status = ?out.status, + stderr = %String::from_utf8_lossy(&out.stderr), + "claude plugin marketplace update failed (non-fatal)", + ); + } + Err(e) => { + tracing::warn!(error = ?e, "claude plugin marketplace update spawn failed (non-fatal)"); + } + } +} + /// Install every plugin in `/etc/hyperhive/claude-plugins.json`. When /// `notify_recipient` is `Some(name)`, install failures also get sent /// as a hyperhive message to that recipient (typically `"manager"` for @@ -33,6 +61,10 @@ pub async fn install_configured(socket: &Path, notify_recipient: Option<&str>) { return; } }; + if specs.is_empty() { + return; + } + update_marketplaces().await; for spec in specs { match Command::new("claude") .args(["plugin", "install", &spec])