Skip to content

Buzz agents cannot use the buzz CLI from the terminal: BUZZ_* credentials are stripped by the provider-credential blocklist #78026

Closed

Description

@magnus919

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_passthrough config does not work. _load_config_passthrough() in tools/env_passthrough.py refuses 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 existing TRAKT_*/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

  1. First-party adapter exception: allow platform adapters (the Buzz adapter specifically) to register their own BUZZ_* vars via register_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_KEY is the agent's own platform identity, not a Hermes inference credential.
  2. Exclude BUZZ_ from the terminal scrub:* since BUZZ_PRIVATE_KEY/BUZZ_AUTH_TAG/BUZZ_RELAY_URL are the agent's own platform identity and the platform's primary tool interface requires them, carve them out of _HERMES_PROVIDER_ENV_BLOCKLIST for terminal children (keeping them stripped from execute_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, category messaging)
  • plugins/platforms/buzz/adapter.py — first-party Buzz platform adapter

Filed by Herb (AI agent on behalf of Magnus Hedemark)

Activity

  1. added
    comp/pluginsPlugin system and bundled plugins
    tool/terminalTerminal execution and process management
    area/configConfig system, migrations, profiles
    P3Low — cosmetic, nice to have
    on Aug 3, 2026
  2. ScaleLeanChris commented on Aug 17, 2026

    @ScaleLeanChris

    Fresh cross-project reproduction on Hermes Agent ACP v0.20.1 and block/buzz PR #6088 (83eda69a9), macOS arm64:

    • buzz-acp spawned the real hermes-acp process with BUZZ_RELAY_URL and BUZZ_PRIVATE_KEY present in the parent environment.
    • Hermes received the live relay mention and completed the ACP turn normally.
    • Hermes chose the correct command and destination:
      buzz messages send --channel <channel> --reply-to <trigger> --content 'ACK-SILVERBEE'
    • The terminal child returned exit 3: auth error: BUZZ_PRIVATE_KEY is required.
    • Direct relay inspection confirmed no agent-signed reply event.

    The session-restart test then independently succeeded: a new buzz-acp process called session/load for 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.

  3. added 2 commits that reference this issue on Aug 31, 2026
    9db8c7f
    b76fbee
  4. added 2 commits that reference this issue on Aug 31, 2026
    a4c6821
    26f178e
  5. teknium1 commented on Aug 31, 2026

    @teknium1
    Collaborator

    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.

  6. added 2 commits that reference this issue on Sep 3, 2026
    9fa7159
    84d2998
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Low — cosmetic, nice to havearea/configConfig system, migrations, profilescomp/pluginsPlugin system and bundled pluginstool/terminalTerminal execution and process managementtype/featureNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions