Skip to content

active-memory + memory-core dont compose: lightweight sub-agent bootstrap excludes memory-kind plugin tools, allowlist resolves to empty, placeholder turn lands in transcript #74572

Description

@LaFleurAdvertising

Environment

  • openclaw 2026.4.26
  • Plugins enabled: active-memory, memory-core, hindsight-openclaw
  • Provider tested: deepseek/deepseek-chat (provider-independent — fails before reaching the model)

Repro

  1. Enable both active-memory and memory-core in plugins.entries. No further config beyond enabled: true; defaults for both.
  2. Restart gateway. Confirm memory-core loads (openclaw memory --help works; the plugin registers memory_search and memory_get per extensions/memory-core/index.js:789-805).
  3. Send any user turn that triggers active-memory's pre-summarizer.

Expected

Active-memory's embedded sub-agent runs against the configured provider with tools memory_search + memory_get available.

Actual

Sub-agent fails with:

[agent/embedded] [tools] No callable tools remain after resolving explicit tool allowlist (runtime toolsAllow: memory_search, memory_get); no registered tools matched. Fix the allowlist or enable the plugin that registers the requested tool.

Followed by:

[agent/embedded] embedded run failover decision: ... stage=prompt decision=surface_error reason=none ... rawError=No callable tools remain after resolving explicit tool allowlist (runtime toolsAllow: memory_search, memory_get); no registered tools matched.

The user-visible chat then shows [assistant turn failed before producing content] (from STREAM_ERROR_FALLBACK_TEXT in compaction-successor-transcript) as a placeholder turn, polluting the saved transcript permanently. Hindsight's auto-recall later quotes that placeholder back as "Prior context" on every subsequent turn.

Apparent root cause

extensions/active-memory/index.js:933 configures the embedded sub-agent with both:

toolsAllow: ["memory_search", "memory_get"],
bootstrapContextMode: "lightweight",

bootstrapContextMode: "lightweight" appears to exclude tools registered by sibling plugins (memory-core in this case), so the runtime tool allowlist filters from an empty set → the error above. Both plugins ship in the bundled extensions directory and are documented to compose, but they don't out of the box.

Suggested fixes (any one would resolve)

  • active-memory uses a bootstrap mode that includes memory-kind plugin tools when its allowlist references them.
  • memory-core opts into lightweight bootstrap visibility.
  • active-memory pre-checks tool availability and skips/logs-warning instead of emitting a placeholder turn that lands in the persisted transcript.

Workaround

Disabling active-memory (plugins.entries.active-memory.enabled: false) stops the placeholder. hindsight-openclaw's autoRecall continues to inject context, so the loss is the bounded summarizer pre-step only. Not a fix — just a way to stop the visible noise.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions