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
- Enable both
active-memory and memory-core in plugins.entries. No further config beyond enabled: true; defaults for both.
- 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).
- 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.
Environment
2026.4.26active-memory,memory-core,hindsight-openclawdeepseek/deepseek-chat(provider-independent — fails before reaching the model)Repro
active-memoryandmemory-coreinplugins.entries. No further config beyondenabled: true; defaults for both.memory-coreloads (openclaw memory --helpworks; the plugin registersmemory_searchandmemory_getperextensions/memory-core/index.js:789-805).Expected
Active-memory's embedded sub-agent runs against the configured provider with tools
memory_search+memory_getavailable.Actual
Sub-agent fails with:
Followed by:
The user-visible chat then shows
[assistant turn failed before producing content](fromSTREAM_ERROR_FALLBACK_TEXTincompaction-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:933configures the embedded sub-agent with both: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)
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.