Repository navigation
Description
Summary
Buzz platform agents cannot use the buzz CLI from their terminal tool: Hermes strips BUZZ_PRIVATE_KEY, BUZZ_AUTH_TAG, and BUZZ_RELAY_URL from every terminal subprocess it spawns, because those variables are classified as messaging-provider credentials on _HERMES_PROVIDER_ENV_BLOCKLIST. The result is auth error: BUZZ_PRIVATE_KEY is required (use --private-key or set env var) (exit 3) on every buzz invocation, even though the agent process itself has the credentials in its environment.
Background
The Buzz platform instructs its agents that "the buzz CLI is your primary interface" — it is the sanctioned way for an agent to send messages, manage channels, run workflows, etc. But the terminal tool's credential scrubbing makes that primary interface unusable out of the box.
The scrub is deliberate and security-motivated (GHSA-rhgp-j443-p4rf class): BUZZ_* env vars are registered in OPTIONAL_ENV_VARS with category messaging, and _build_provider_env_blocklist() in tools/environments/local.py adds every tool/messaging-category variable to _HERMES_PROVIDER_ENV_BLOCKLIST. _make_run_env() and _sanitize_subprocess_env() then drop blocklisted names from terminal child environments.
Why the obvious workarounds fail
terminal.env_passthroughconfig does not work._load_config_passthrough()intools/env_passthrough.pyrefuses to register any name where_is_hermes_provider_credential()is true — and all three BUZZ vars are on the blocklist, so they are rejected with a warning and silently skipped. The existingTRAKT_*/TMDB_*entries in users' configs only work because those names are not blocklisted.- Skill registration does not work either.
register_env_passthrough()applies the same provider-credential rejection.
Current escape hatch (works, but wrong layer)
The _HERMES_FORCE_ env prefix is the only path that works: a variable named _HERMES_FORCE_BUZZ_PRIVATE_KEY is renamed to BUZZ_PRIVATE_KEY in the terminal run env, bypassing the blocklist (verified against _make_run_env()). This requires every Buzz agent to be launched through a wrapper script that exports the force-prefixed copies before exec'ing the ACP command — friction that should not exist for a first-party platform, and knowledge that is undocumented for this purpose.
Expected behavior
The Buzz adapter — a first-party Hermes platform — should be able to register its own platform credentials for terminal passthrough, so agents can use the buzz CLI from the terminal without custom wrappers.
Proposed fix directions
- First-party adapter exception: allow platform adapters (the Buzz adapter specifically) to register their own
BUZZ_*vars viaregister_env_passthrough()/ a first-party path, while keeping the blocklist closed to skills and arbitrary config. The GHSA concern is about skills tunneling Hermes-managed inference credentials into sandboxed children;BUZZ_PRIVATE_KEYis the agent's own platform identity, not a Hermes inference credential. - Exclude BUZZ_ from the terminal scrub:* since
BUZZ_PRIVATE_KEY/BUZZ_AUTH_TAG/BUZZ_RELAY_URLare the agent's own platform identity and the platform's primary tool interface requires them, carve them out of_HERMES_PROVIDER_ENV_BLOCKLISTfor terminal children (keeping them stripped fromexecute_code/sandbox paths if desired).
Environment
- Hermes Agent (current main)
- macOS 26.6
- Buzz platform via the ACP adapter (
hermes acp)
Files referenced
tools/environments/local.py—_HERMES_PROVIDER_ENV_BLOCKLIST,_make_run_env(),_sanitize_subprocess_env()tools/env_passthrough.py—_load_config_passthrough(),register_env_passthrough(),_is_hermes_provider_credential()hermes_cli/config.py—OPTIONAL_ENV_VARS(BUZZ_* entries, categorymessaging)plugins/platforms/buzz/adapter.py— first-party Buzz platform adapter
Filed by Herb (AI agent on behalf of Magnus Hedemark)
Activity
ScaleLeanChris commentedon Aug 17, 2026
Fresh cross-project reproduction on Hermes Agent ACP v0.20.1 and block/buzz PR #6088 (
83eda69a9), macOS arm64:buzz-acpspawned the realhermes-acpprocess withBUZZ_RELAY_URLandBUZZ_PRIVATE_KEYpresent in the parent environment.buzz messages send --channel <channel> --reply-to <trigger> --content 'ACK-SILVERBEE'auth error: BUZZ_PRIVATE_KEY is required.The session-restart test then independently succeeded: a new
buzz-acpprocess calledsession/loadfor the same Hermes session ID, and Hermes retained the prior codeword. This isolates the failure to outbound credential availability/publication, not ACP delivery or session continuity.No secret values were logged or retained in this report. Full test evidence is also posted on block/buzz#6088.
fix(tools): pass BUZZ_* platform credentials to terminal children
fix(terminal): gate the BUZZ_* terminal carve-out on actual Buzz agen…
fix(tools): pass BUZZ_* platform credentials to terminal children
fix(terminal): gate the BUZZ_* terminal carve-out on actual Buzz agen…
teknium1 commentedon Aug 31, 2026
Fixed by #99433 (salvaging @magnus919's #78065 + @vatevstoil's #78511): BUZZ_* platform credentials pass to terminal children of Buzz sessions — context-gated (BUZZ_MANAGED_AGENT or live buzz session), never blanket; execute_code/docker/subprocess surfaces stay sealed.
fix(tools): pass BUZZ_* platform credentials to terminal children
fix(terminal): gate the BUZZ_* terminal carve-out on actual Buzz agen…