Skip to content

feat(delegation): add persistent ACP background subagents - #4950

Closed
malaiwah wants to merge 5 commits into
NousResearch:mainfrom
malaiwah:codex/persistent-acp-subagents
Closed

feat(delegation): add persistent ACP background subagents#4950
malaiwah wants to merge 5 commits into
NousResearch:mainfrom
malaiwah:codex/persistent-acp-subagents

Conversation

@malaiwah

@malaiwah malaiwah commented Apr 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Add persistent ACP background subagents inside Hermes-managed Docker sandboxes.

This keeps delegate_task unchanged and adds an explicit background workflow for subagents that should stay alive across turns.

Closes #4949.

What changed

  • added a persistent ACP background-subagent runtime and manager
  • added background tools:
    • spawn_background_subagent
    • list_background_subagents
    • send_background_subagent
    • poll_background_subagent
    • get_background_subagent_status
    • stop_background_subagent
  • extended the Docker backend with long-lived interactive exec sessions
  • injected an ephemeral per-turn roster of open background subagents
  • added one-shot hidden nudges for completion / timeout / stop / channel loss
  • added config defaults for delegation.background_subagents.*
  • kept the runtime ACP-first and left an inbound dispatch path open for future child-to-parent requests

Validation

Focused slices:

  • python -m pytest tests/agent/test_background_subagents.py tests/tools/test_docker_environment.py tests/test_model_tools.py tests/test_run_agent.py -q
  • 251 passed
  • python -m pytest tests/tools/test_delegate.py tests/tools/test_delegate_toolset_scope.py tests/hermes_cli/test_set_config_value.py tests/hermes_cli/test_tools_config.py -q
  • 109 passed
  • python -m pytest tests/acp/test_tools.py tests/gateway/test_api_server_toolset.py -q
  • 41 passed
  • python -m pytest tests/test_model_tools_async_bridge.py tests/test_agent_guardrails.py -q
  • 39 passed

Full suite in this checkout:

  • 7894 passed, 172 skipped, 1 xfailed, 7 failed
  • the 7 failures are outside this PR's touched files and match the current local baseline in this repo:
    • tests/test_api_key_providers.py::TestHasAnyProviderConfigured::test_claude_code_creds_ignored_on_fresh_install
    • tests/test_api_key_providers.py::TestHasAnyProviderConfigured::test_config_dict_no_provider_no_creds_still_false
    • tests/hermes_cli/test_update_gateway_restart.py::TestCmdUpdateLaunchdRestart::test_update_with_systemd_still_restarts_via_systemd
    • tests/test_codex_execution_paths.py::test_gateway_run_agent_codex_path_handles_internal_401_refresh
    • tests/tools/test_file_read_guards.py::TestCharacterCountGuard::test_content_under_limit_passes
    • tests/tools/test_file_read_guards.py::TestCharacterCountGuard::test_oversized_read_rejected
    • tests/tools/test_file_read_guards.py::TestConfigOverride::test_custom_config_raises_limit

Notes

This first slice targets opencode acp and the Docker terminal backend.

@alt-glitch alt-glitch added type/feature New feature or request comp/agent Core agent runtime: loop, agent_init, prompt builder, context-compression, responses endpoint comp/acp Agent Communication Protocol adapter tool/delegate Subagent delegation backend/docker Docker container execution P2 Medium — degraded but workaround exists labels May 1, 2026
teknium1 added a commit that referenced this pull request May 5, 2026
#20226)

* docs(AGENTS.md): add curator/cron/delegation/toolsets, fix plugin tree, frontmatter, auto-discovery caveat

Closes #19101 and #19107 (@pty819).

Verified 16 claims from those two issues against current main. 12 were
real gaps; 2 were generated/hallucinated (#10 unverified --now flag is
actually real and already cited in AGENTS.md; #11 stale PR refs #5587
and #4950 do not appear in AGENTS.md at all); 2 were low-prio nits
(memory provider hierarchy, --now scope enumeration) deferred.

Changes:
- Project tree: add yuanbao to platforms comment; expand plugins/
  subtree with real directory names (kanban, hermes-achievements,
  observability, image_gen) instead of vague '<others>'.
- Test-count blurb: 15k/700 Apr → 17k/900 May (verified: 17,375 test
  defs, 915 files).
- Adding New Tools: clarify that auto-discovery wires up schemas but
  the tool only reaches an agent if its name is added to a toolset in
  toolsets.py. _HERMES_CORE_TOOLS is not dead code.
- Adding Configuration: enumerate top-level config.yaml sections
  including auxiliary and curator; note auxiliary is per-task
  overrides for side-LLM work.
- SKILL.md frontmatter: add author, license, related_skills. Note
  top-level tags/category are mirrored from metadata.hermes.*.
- New section 'Toolsets' — enumerates the 30 current TOOLSETS keys
  (including yuanbao, kanban, moa, spotify, safe, debugging).
- New section 'Delegation (delegate_task)' — sync semantics, batch
  mode, leaf vs orchestrator roles, config knobs, durability caveat.
- New section 'Curator (skill lifecycle)' — core files, 11 CLI verbs,
  telemetry sidecar, invariants (pin/delete split after PR #20220,
  bundled/hub off-limits), curator.* config section.
- New section 'Cron (scheduled jobs)' — 4 schedule formats, 7 CLI
  verbs, per-job fields, 3-min hard interrupt, catchup/grace windows,
  tick.lock, cron→session isolation.

Skipped (invalid claims):
- #19107 item 10: --now is real (hermes_cli/skills_hub.py:624/966/1013/1470)
- #19107 item 11: no '#5587' or '#4950' or 'async_delegation' in AGENTS.md

* docs(AGENTS.md): add Kanban section

Adds a Kanban entry alongside Curator / Cron / Delegation so the major
durable background systems are all represented. Covers the CLI verbs,
the HERMES_KANBAN_TASK-gated worker toolset, the in-gateway dispatcher,
plugin assets, and the board/tenant isolation model. Points at the full
742-line user docs for detail.
nickdlkk pushed a commit to nickdlkk/hermes-agent that referenced this pull request May 11, 2026
NousResearch#20226)

* docs(AGENTS.md): add curator/cron/delegation/toolsets, fix plugin tree, frontmatter, auto-discovery caveat

Closes NousResearch#19101 and NousResearch#19107 (@pty819).

Verified 16 claims from those two issues against current main. 12 were
real gaps; 2 were generated/hallucinated (NousResearch#10 unverified --now flag is
actually real and already cited in AGENTS.md; NousResearch#11 stale PR refs NousResearch#5587
and NousResearch#4950 do not appear in AGENTS.md at all); 2 were low-prio nits
(memory provider hierarchy, --now scope enumeration) deferred.

Changes:
- Project tree: add yuanbao to platforms comment; expand plugins/
  subtree with real directory names (kanban, hermes-achievements,
  observability, image_gen) instead of vague '<others>'.
- Test-count blurb: 15k/700 Apr → 17k/900 May (verified: 17,375 test
  defs, 915 files).
- Adding New Tools: clarify that auto-discovery wires up schemas but
  the tool only reaches an agent if its name is added to a toolset in
  toolsets.py. _HERMES_CORE_TOOLS is not dead code.
- Adding Configuration: enumerate top-level config.yaml sections
  including auxiliary and curator; note auxiliary is per-task
  overrides for side-LLM work.
- SKILL.md frontmatter: add author, license, related_skills. Note
  top-level tags/category are mirrored from metadata.hermes.*.
- New section 'Toolsets' — enumerates the 30 current TOOLSETS keys
  (including yuanbao, kanban, moa, spotify, safe, debugging).
- New section 'Delegation (delegate_task)' — sync semantics, batch
  mode, leaf vs orchestrator roles, config knobs, durability caveat.
- New section 'Curator (skill lifecycle)' — core files, 11 CLI verbs,
  telemetry sidecar, invariants (pin/delete split after PR NousResearch#20220,
  bundled/hub off-limits), curator.* config section.
- New section 'Cron (scheduled jobs)' — 4 schedule formats, 7 CLI
  verbs, per-job fields, 3-min hard interrupt, catchup/grace windows,
  tick.lock, cron→session isolation.

Skipped (invalid claims):
- NousResearch#19107 item 10: --now is real (hermes_cli/skills_hub.py:624/966/1013/1470)
- NousResearch#19107 item 11: no 'NousResearch#5587' or 'NousResearch#4950' or 'async_delegation' in AGENTS.md

* docs(AGENTS.md): add Kanban section

Adds a Kanban entry alongside Curator / Cron / Delegation so the major
durable background systems are all represented. Covers the CLI verbs,
the HERMES_KANBAN_TASK-gated worker toolset, the in-gateway dispatcher,
plugin assets, and the board/tenant isolation model. Points at the full
742-line user docs for detail.
JinyuID pushed a commit to JinyuID/hermes-agent that referenced this pull request May 11, 2026
NousResearch#20226)

* docs(AGENTS.md): add curator/cron/delegation/toolsets, fix plugin tree, frontmatter, auto-discovery caveat

Closes NousResearch#19101 and NousResearch#19107 (@pty819).

Verified 16 claims from those two issues against current main. 12 were
real gaps; 2 were generated/hallucinated (NousResearch#10 unverified --now flag is
actually real and already cited in AGENTS.md; NousResearch#11 stale PR refs NousResearch#5587
and NousResearch#4950 do not appear in AGENTS.md at all); 2 were low-prio nits
(memory provider hierarchy, --now scope enumeration) deferred.

Changes:
- Project tree: add yuanbao to platforms comment; expand plugins/
  subtree with real directory names (kanban, hermes-achievements,
  observability, image_gen) instead of vague '<others>'.
- Test-count blurb: 15k/700 Apr → 17k/900 May (verified: 17,375 test
  defs, 915 files).
- Adding New Tools: clarify that auto-discovery wires up schemas but
  the tool only reaches an agent if its name is added to a toolset in
  toolsets.py. _HERMES_CORE_TOOLS is not dead code.
- Adding Configuration: enumerate top-level config.yaml sections
  including auxiliary and curator; note auxiliary is per-task
  overrides for side-LLM work.
- SKILL.md frontmatter: add author, license, related_skills. Note
  top-level tags/category are mirrored from metadata.hermes.*.
- New section 'Toolsets' — enumerates the 30 current TOOLSETS keys
  (including yuanbao, kanban, moa, spotify, safe, debugging).
- New section 'Delegation (delegate_task)' — sync semantics, batch
  mode, leaf vs orchestrator roles, config knobs, durability caveat.
- New section 'Curator (skill lifecycle)' — core files, 11 CLI verbs,
  telemetry sidecar, invariants (pin/delete split after PR NousResearch#20220,
  bundled/hub off-limits), curator.* config section.
- New section 'Cron (scheduled jobs)' — 4 schedule formats, 7 CLI
  verbs, per-job fields, 3-min hard interrupt, catchup/grace windows,
  tick.lock, cron→session isolation.

Skipped (invalid claims):
- NousResearch#19107 item 10: --now is real (hermes_cli/skills_hub.py:624/966/1013/1470)
- NousResearch#19107 item 11: no 'NousResearch#5587' or 'NousResearch#4950' or 'async_delegation' in AGENTS.md

* docs(AGENTS.md): add Kanban section

Adds a Kanban entry alongside Curator / Cron / Delegation so the major
durable background systems are all represented. Covers the CLI verbs,
the HERMES_KANBAN_TASK-gated worker toolset, the in-gateway dispatcher,
plugin assets, and the board/tenant isolation model. Points at the full
742-line user docs for detail.
jsboige pushed a commit to jsboige/hermes-agent that referenced this pull request May 14, 2026
NousResearch#20226)

* docs(AGENTS.md): add curator/cron/delegation/toolsets, fix plugin tree, frontmatter, auto-discovery caveat

Closes NousResearch#19101 and NousResearch#19107 (@pty819).

Verified 16 claims from those two issues against current main. 12 were
real gaps; 2 were generated/hallucinated (NousResearch#10 unverified --now flag is
actually real and already cited in AGENTS.md; NousResearch#11 stale PR refs NousResearch#5587
and NousResearch#4950 do not appear in AGENTS.md at all); 2 were low-prio nits
(memory provider hierarchy, --now scope enumeration) deferred.

Changes:
- Project tree: add yuanbao to platforms comment; expand plugins/
  subtree with real directory names (kanban, hermes-achievements,
  observability, image_gen) instead of vague '<others>'.
- Test-count blurb: 15k/700 Apr → 17k/900 May (verified: 17,375 test
  defs, 915 files).
- Adding New Tools: clarify that auto-discovery wires up schemas but
  the tool only reaches an agent if its name is added to a toolset in
  toolsets.py. _HERMES_CORE_TOOLS is not dead code.
- Adding Configuration: enumerate top-level config.yaml sections
  including auxiliary and curator; note auxiliary is per-task
  overrides for side-LLM work.
- SKILL.md frontmatter: add author, license, related_skills. Note
  top-level tags/category are mirrored from metadata.hermes.*.
- New section 'Toolsets' — enumerates the 30 current TOOLSETS keys
  (including yuanbao, kanban, moa, spotify, safe, debugging).
- New section 'Delegation (delegate_task)' — sync semantics, batch
  mode, leaf vs orchestrator roles, config knobs, durability caveat.
- New section 'Curator (skill lifecycle)' — core files, 11 CLI verbs,
  telemetry sidecar, invariants (pin/delete split after PR NousResearch#20220,
  bundled/hub off-limits), curator.* config section.
- New section 'Cron (scheduled jobs)' — 4 schedule formats, 7 CLI
  verbs, per-job fields, 3-min hard interrupt, catchup/grace windows,
  tick.lock, cron→session isolation.

Skipped (invalid claims):
- NousResearch#19107 item 10: --now is real (hermes_cli/skills_hub.py:624/966/1013/1470)
- NousResearch#19107 item 11: no 'NousResearch#5587' or 'NousResearch#4950' or 'async_delegation' in AGENTS.md

* docs(AGENTS.md): add Kanban section

Adds a Kanban entry alongside Curator / Cron / Delegation so the major
durable background systems are all represented. Covers the CLI verbs,
the HERMES_KANBAN_TASK-gated worker toolset, the in-gateway dispatcher,
plugin assets, and the board/tenant isolation model. Points at the full
742-line user docs for detail.
gweeteve pushed a commit to gweeteve/hermes-agent that referenced this pull request Jun 2, 2026
NousResearch#20226)

* docs(AGENTS.md): add curator/cron/delegation/toolsets, fix plugin tree, frontmatter, auto-discovery caveat

Closes NousResearch#19101 and NousResearch#19107 (@pty819).

Verified 16 claims from those two issues against current main. 12 were
real gaps; 2 were generated/hallucinated (NousResearch#10 unverified --now flag is
actually real and already cited in AGENTS.md; NousResearch#11 stale PR refs NousResearch#5587
and NousResearch#4950 do not appear in AGENTS.md at all); 2 were low-prio nits
(memory provider hierarchy, --now scope enumeration) deferred.

Changes:
- Project tree: add yuanbao to platforms comment; expand plugins/
  subtree with real directory names (kanban, hermes-achievements,
  observability, image_gen) instead of vague '<others>'.
- Test-count blurb: 15k/700 Apr → 17k/900 May (verified: 17,375 test
  defs, 915 files).
- Adding New Tools: clarify that auto-discovery wires up schemas but
  the tool only reaches an agent if its name is added to a toolset in
  toolsets.py. _HERMES_CORE_TOOLS is not dead code.
- Adding Configuration: enumerate top-level config.yaml sections
  including auxiliary and curator; note auxiliary is per-task
  overrides for side-LLM work.
- SKILL.md frontmatter: add author, license, related_skills. Note
  top-level tags/category are mirrored from metadata.hermes.*.
- New section 'Toolsets' — enumerates the 30 current TOOLSETS keys
  (including yuanbao, kanban, moa, spotify, safe, debugging).
- New section 'Delegation (delegate_task)' — sync semantics, batch
  mode, leaf vs orchestrator roles, config knobs, durability caveat.
- New section 'Curator (skill lifecycle)' — core files, 11 CLI verbs,
  telemetry sidecar, invariants (pin/delete split after PR NousResearch#20220,
  bundled/hub off-limits), curator.* config section.
- New section 'Cron (scheduled jobs)' — 4 schedule formats, 7 CLI
  verbs, per-job fields, 3-min hard interrupt, catchup/grace windows,
  tick.lock, cron→session isolation.

Skipped (invalid claims):
- NousResearch#19107 item 10: --now is real (hermes_cli/skills_hub.py:624/966/1013/1470)
- NousResearch#19107 item 11: no 'NousResearch#5587' or 'NousResearch#4950' or 'async_delegation' in AGENTS.md

* docs(AGENTS.md): add Kanban section

Adds a Kanban entry alongside Curator / Cron / Delegation so the major
durable background systems are all represented. Covers the CLI verbs,
the HERMES_KANBAN_TASK-gated worker toolset, the in-gateway dispatcher,
plugin assets, and the board/tenant isolation model. Points at the full
742-line user docs for detail.
Seven74AI pushed a commit to Seven74AI/hermes-agent that referenced this pull request Jun 13, 2026
NousResearch#20226)

* docs(AGENTS.md): add curator/cron/delegation/toolsets, fix plugin tree, frontmatter, auto-discovery caveat

Closes NousResearch#19101 and NousResearch#19107 (@pty819).

Verified 16 claims from those two issues against current main. 12 were
real gaps; 2 were generated/hallucinated (NousResearch#10 unverified --now flag is
actually real and already cited in AGENTS.md; NousResearch#11 stale PR refs NousResearch#5587
and NousResearch#4950 do not appear in AGENTS.md at all); 2 were low-prio nits
(memory provider hierarchy, --now scope enumeration) deferred.

Changes:
- Project tree: add yuanbao to platforms comment; expand plugins/
  subtree with real directory names (kanban, hermes-achievements,
  observability, image_gen) instead of vague '<others>'.
- Test-count blurb: 15k/700 Apr → 17k/900 May (verified: 17,375 test
  defs, 915 files).
- Adding New Tools: clarify that auto-discovery wires up schemas but
  the tool only reaches an agent if its name is added to a toolset in
  toolsets.py. _HERMES_CORE_TOOLS is not dead code.
- Adding Configuration: enumerate top-level config.yaml sections
  including auxiliary and curator; note auxiliary is per-task
  overrides for side-LLM work.
- SKILL.md frontmatter: add author, license, related_skills. Note
  top-level tags/category are mirrored from metadata.hermes.*.
- New section 'Toolsets' — enumerates the 30 current TOOLSETS keys
  (including yuanbao, kanban, moa, spotify, safe, debugging).
- New section 'Delegation (delegate_task)' — sync semantics, batch
  mode, leaf vs orchestrator roles, config knobs, durability caveat.
- New section 'Curator (skill lifecycle)' — core files, 11 CLI verbs,
  telemetry sidecar, invariants (pin/delete split after PR NousResearch#20220,
  bundled/hub off-limits), curator.* config section.
- New section 'Cron (scheduled jobs)' — 4 schedule formats, 7 CLI
  verbs, per-job fields, 3-min hard interrupt, catchup/grace windows,
  tick.lock, cron→session isolation.

Skipped (invalid claims):
- NousResearch#19107 item 10: --now is real (hermes_cli/skills_hub.py:624/966/1013/1470)
- NousResearch#19107 item 11: no 'NousResearch#5587' or 'NousResearch#4950' or 'async_delegation' in AGENTS.md

* docs(AGENTS.md): add Kanban section

Adds a Kanban entry alongside Curator / Cron / Delegation so the major
durable background systems are all represented. Covers the CLI verbs,
the HERMES_KANBAN_TASK-gated worker toolset, the in-gateway dispatcher,
plugin assets, and the board/tenant isolation model. Points at the full
742-line user docs for detail.
waefrebeorn pushed a commit to waefrebeorn/slermes that referenced this pull request Jul 2, 2026
NousResearch#20226)

* docs(AGENTS.md): add curator/cron/delegation/toolsets, fix plugin tree, frontmatter, auto-discovery caveat

Closes NousResearch#19101 and NousResearch#19107 (@pty819).

Verified 16 claims from those two issues against current main. 12 were
real gaps; 2 were generated/hallucinated (NousResearch#10 unverified --now flag is
actually real and already cited in AGENTS.md; NousResearch#11 stale PR refs NousResearch#5587
and NousResearch#4950 do not appear in AGENTS.md at all); 2 were low-prio nits
(memory provider hierarchy, --now scope enumeration) deferred.

Changes:
- Project tree: add yuanbao to platforms comment; expand plugins/
  subtree with real directory names (kanban, hermes-achievements,
  observability, image_gen) instead of vague '<others>'.
- Test-count blurb: 15k/700 Apr → 17k/900 May (verified: 17,375 test
  defs, 915 files).
- Adding New Tools: clarify that auto-discovery wires up schemas but
  the tool only reaches an agent if its name is added to a toolset in
  toolsets.py. _HERMES_CORE_TOOLS is not dead code.
- Adding Configuration: enumerate top-level config.yaml sections
  including auxiliary and curator; note auxiliary is per-task
  overrides for side-LLM work.
- SKILL.md frontmatter: add author, license, related_skills. Note
  top-level tags/category are mirrored from metadata.hermes.*.
- New section 'Toolsets' — enumerates the 30 current TOOLSETS keys
  (including yuanbao, kanban, moa, spotify, safe, debugging).
- New section 'Delegation (delegate_task)' — sync semantics, batch
  mode, leaf vs orchestrator roles, config knobs, durability caveat.
- New section 'Curator (skill lifecycle)' — core files, 11 CLI verbs,
  telemetry sidecar, invariants (pin/delete split after PR NousResearch#20220,
  bundled/hub off-limits), curator.* config section.
- New section 'Cron (scheduled jobs)' — 4 schedule formats, 7 CLI
  verbs, per-job fields, 3-min hard interrupt, catchup/grace windows,
  tick.lock, cron→session isolation.

Skipped (invalid claims):
- NousResearch#19107 item 10: --now is real (hermes_cli/skills_hub.py:624/966/1013/1470)
- NousResearch#19107 item 11: no 'NousResearch#5587' or 'NousResearch#4950' or 'async_delegation' in AGENTS.md

* docs(AGENTS.md): add Kanban section

Adds a Kanban entry alongside Curator / Cron / Delegation so the major
durable background systems are all represented. Covers the CLI verbs,
the HERMES_KANBAN_TASK-gated worker toolset, the in-gateway dispatcher,
plugin assets, and the board/tenant isolation model. Points at the full
742-line user docs for detail.

@teknium1 teknium1 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the persistent ACP prototype. I found blockers that need redesign before this can be salvaged onto current main.

Problems

  • run_agent.py:6376 and run_agent.py:6891 append mutable subagent roster/nudge data to effective_system on every API call. That breaks the repository's stable system-prompt/prompt-cache invariant. Current async delegation deliberately re-enters completions as fresh turns (tools/async_delegation.py:9-22; gateway/run.py:15374-15419).
  • tools/background_subagent_tool.py:11-12 only checks an enabled-by-default config flag, while toolsets.py:56 adds six ACP/Docker-only tools to the global core list. Docker or the configured ACP executable is not verified before these schemas reach every model request.
  • agent/background_subagents.py:467-474 responds to every ACP session/request_permission with allow_once; permission requests need the normal Hermes approval boundary rather than unconditional approval.

Suggested changes

  • Route mutable status/completion through the existing async completion/new-turn rail, not the system prompt.
  • Gate any ACP runtime on verified Docker and configured executable availability, and minimize its model-schema footprint.
  • Bridge ACP permission requests to Hermes approval handling or fail closed.

This is an automated hermes-sweeper review.

Comment thread run_agent.py
effective_system = self._cached_system_prompt or ""
if self.ephemeral_system_prompt:
effective_system = (effective_system + "\n\n" + self.ephemeral_system_prompt).strip()
background_context = self._build_background_subagent_context()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes effective_system depend on live subagent state for every API call, invalidating the conversation's cached system prefix. Please deliver roster/completion updates through the existing async-delegation completion/new-turn path instead of appending them to the system prompt.



def check_background_subagent_requirements() -> bool:
return get_background_subagent_manager().check_requirements()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This gate is true by default and does not verify Docker or the configured ACP executable, yet these schemas are added to the core tool list. Gate discovery on the actual runtime prerequisites so unsupported ACP tools are not exposed to every model request.

if method == "session/request_permission":
return {
"outcome": {
"outcome": "allow_once",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning allow_once here auto-approves every ACP permission request from the spawned agent. Route this through Hermes's approval policy/callback, or deny it when no approval bridge is available.

@teknium1 teknium1 added sweeper:risk-caching Sweeper risk: may break/degrade prompt caching or cache-key stability (invariant) sweeper:risk-security-boundary Sweeper risk: may affect sandboxing, auth, credentials, or sensitive data sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades sweeper:risk-session-state Sweeper risk: may lose/corrupt/mis-associate session or context state sweeper:blast-massive Sweeper blast radius: massive — everyone, every turn (invariant surface) labels Jul 12, 2026
Gravezzz pushed a commit to Gravezzz/hermes-agent that referenced this pull request Jul 21, 2026
NousResearch#20226)

* docs(AGENTS.md): add curator/cron/delegation/toolsets, fix plugin tree, frontmatter, auto-discovery caveat

Closes NousResearch#19101 and NousResearch#19107 (@pty819).

Verified 16 claims from those two issues against current main. 12 were
real gaps; 2 were generated/hallucinated (NousResearch#10 unverified --now flag is
actually real and already cited in AGENTS.md; NousResearch#11 stale PR refs NousResearch#5587
and NousResearch#4950 do not appear in AGENTS.md at all); 2 were low-prio nits
(memory provider hierarchy, --now scope enumeration) deferred.

Changes:
- Project tree: add yuanbao to platforms comment; expand plugins/
  subtree with real directory names (kanban, hermes-achievements,
  observability, image_gen) instead of vague '<others>'.
- Test-count blurb: 15k/700 Apr → 17k/900 May (verified: 17,375 test
  defs, 915 files).
- Adding New Tools: clarify that auto-discovery wires up schemas but
  the tool only reaches an agent if its name is added to a toolset in
  toolsets.py. _HERMES_CORE_TOOLS is not dead code.
- Adding Configuration: enumerate top-level config.yaml sections
  including auxiliary and curator; note auxiliary is per-task
  overrides for side-LLM work.
- SKILL.md frontmatter: add author, license, related_skills. Note
  top-level tags/category are mirrored from metadata.hermes.*.
- New section 'Toolsets' — enumerates the 30 current TOOLSETS keys
  (including yuanbao, kanban, moa, spotify, safe, debugging).
- New section 'Delegation (delegate_task)' — sync semantics, batch
  mode, leaf vs orchestrator roles, config knobs, durability caveat.
- New section 'Curator (skill lifecycle)' — core files, 11 CLI verbs,
  telemetry sidecar, invariants (pin/delete split after PR NousResearch#20220,
  bundled/hub off-limits), curator.* config section.
- New section 'Cron (scheduled jobs)' — 4 schedule formats, 7 CLI
  verbs, per-job fields, 3-min hard interrupt, catchup/grace windows,
  tick.lock, cron→session isolation.

Skipped (invalid claims):
- NousResearch#19107 item 10: --now is real (hermes_cli/skills_hub.py:624/966/1013/1470)
- NousResearch#19107 item 11: no 'NousResearch#5587' or 'NousResearch#4950' or 'async_delegation' in AGENTS.md

* docs(AGENTS.md): add Kanban section

Adds a Kanban entry alongside Curator / Cron / Delegation so the major
durable background systems are all represented. Covers the CLI verbs,
the HERMES_KANBAN_TASK-gated worker toolset, the in-gateway dispatcher,
plugin assets, and the board/tenant isolation model. Points at the full
742-line user docs for detail.
@malaiwah

malaiwah commented Aug 8, 2026

Copy link
Copy Markdown
Contributor Author

Closing this PR. After re-reviewing the full comment history and the current state of main, the implementation is architecturally incompatible with the direction the codebase has taken. A salvage would amount to a ground-up rewrite, not a rework.

Why close

1. Prompt-cache invariant violation (teknium1's first blocker stands).
run_agent.py:6376 and :6891 append mutable subagent roster/nudge data to effective_system on every API call. Main's tools/async_delegation.py:16-19 now codifies the hard invariant: completions must surface as a NEW turn, "never spliced between a tool result and an assistant message... prompt cache intact (never mutate past context)." This PR's delivery mechanism is fundamentally wrong.

2. Redundant with main.
Main now has a 1,516-line tools/async_delegation.py that does what this PR's agent/async_delegate_tasks.py (461 lines) was trying to do — but correctly: completions push onto process_registry.completion_queue as type="async_delegation" events, CLI and gateway drain that queue and forge fresh turns when idle, with durable persistence, crash-recovery, and de-dup. delegate_task(background=True) already works for single tasks and batches. The PR is a parallel, inferior implementation.

3. Ungated tool schemas (second blocker stands).
toolsets.py:56 adds 6 ACP/Docker-only tools to the global core list, gated only by an enabled-by-default config flag. No verification that Docker or the ACP executable exists. Every model request gets these schemas even when the runtime can't use them.

4. Auto-approve security hole (third blocker stands).
agent/background_subagents.py:471 returns allow_once for every ACP session/request_permission request, unconditionally approving whatever the spawned agent asks for. Needs to route through Hermes's approval boundary.

5. Scope creep.
Bundles subagent capability profiles (issue #4928, separate PR #4929), broad tools/delegate_tool.py changes (+324/−18), and infrastructure changes to tools/terminal_tool.py (+99/−57), tools/environments/docker.py (+122/−0), tools/file_tools.py (+11/−49). GottZ's triage noted the patch broadens beyond #4949's core cause.

What a correct implementation would look like

A new PR for issue #4949 should:

  1. Route completions through async_delegation.py's queue, not the system prompt.
  2. Gate tools on Docker/ACP availability (probe at startup, not a config flag).
  3. Bridge ACP permissions to Hermes's existing approval boundary.
  4. Drop the profile/infrastructure scope creep — profiles belong in feat(delegation): add named subagent capability profiles #4929.
  5. Consider @easyvibecoding's warm-pool reuse keyed on {profile, workspace, model} and @lee-b's point that sandboxing is orthogonal to persistent agency.

Issue #4949 stays open as a valid feature request. Happy to re-open this work as a focused PR built on top of main's async delegation rail when time allows.

Thanks to @teknium1 for the detailed review and to @GottZ, @easyvibecoding, and @lee-b for the design discussion.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend/docker Docker container execution comp/acp Agent Communication Protocol adapter comp/agent Core agent runtime: loop, agent_init, prompt builder, context-compression, responses endpoint P2 Medium — degraded but workaround exists sweeper:blast-massive Sweeper blast radius: massive — everyone, every turn (invariant surface) sweeper:risk-caching Sweeper risk: may break/degrade prompt caching or cache-key stability (invariant) sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades sweeper:risk-security-boundary Sweeper risk: may affect sandboxing, auth, credentials, or sensitive data sweeper:risk-session-state Sweeper risk: may lose/corrupt/mis-associate session or context state tool/delegate Subagent delegation type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Persistent ACP background subagents

3 participants