openclaw - 💡(How to fix) Fix 2026.5.18 — hook-only plugins (e.g. tool_result_persist interceptors) load via CLI but are silently skipped by the live gateway [1 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#84119Fetched 2026-05-20 03:43:54
View on GitHub
Comments
1
Participants
2
Timeline
6
Reactions
1
Timeline (top)
labeled ×3closed ×1commented ×1unlabeled ×1

Hook-only plugins (registered via api.on("tool_result_persist", ...) etc., no defineToolPlugin capability registration) install and load cleanly under every CLI command but are silently skipped by the live gateway at runtime.

openclaw plugins doctor even hints at the divergence:

[memory-reranker] registered
- memory-reranker is hook-only. This remains a supported compatibility path,
  but it has not migrated to explicit capability registration yet. [info]

…but no documented mechanism (that I could find) makes the gateway actually invoke that "supported compatibility path" at startup.

Root Cause

Hook-only plugins (registered via api.on("tool_result_persist", ...) etc., no defineToolPlugin capability registration) install and load cleanly under every CLI command but are silently skipped by the live gateway at runtime.

openclaw plugins doctor even hints at the divergence:

[memory-reranker] registered
- memory-reranker is hook-only. This remains a supported compatibility path,
  but it has not migrated to explicit capability registration yet. [info]

…but no documented mechanism (that I could find) makes the gateway actually invoke that "supported compatibility path" at startup.

Fix Action

Fix / Workaround

  1. openclaw plugins install --dangerously-force-unsafe-install --link <path> → success
  2. openclaw plugins enable memory-reranker → success
  3. openclaw config patch setting:
    • plugins.entries.memory-reranker.enabled: true
    • plugins.allow: ["memory-reranker", "whatsapp", "brave"]
    • plugins.load.paths: ["/home/ali/clawd/memory-reranker"]
  4. Symlinked /home/ali/.openclaw/extensions/memory-reranker -> <path> (mirrors whatsapp's location)
  5. Created dist/index.js -> ../index.js symlink (mirrors brave/whatsapp convention)
  6. Mirrored brave-plugin's full package.json openclaw block

Code Example

[memory-reranker] registered
- memory-reranker is hook-only. This remains a supported compatibility path,
  but it has not migrated to explicit capability registration yet. [info]

---

export default {
  id: "memory-reranker",
  name: "Memory Reranker",
  description: "Reranks memory_search results",
  register(api) {
    api.on("tool_result_persist", (event, ctx) => {
      if (event.toolName !== "memory_search") return;
      // ... rerank logic
    });
    console.log("[memory-reranker] registered");
  },
};

---

{
  "name": "memory-reranker",
  "version": "2.0.0",
  "type": "module",
  "openclaw": {
    "extensions": ["./index.js"],
    "install": { "minHostVersion": ">=2026.5.0" },
    "compat": { "pluginApi": ">=2026.5.18" }
  }
}
RAW_BUFFERClick to expand / collapse

Summary

Hook-only plugins (registered via api.on("tool_result_persist", ...) etc., no defineToolPlugin capability registration) install and load cleanly under every CLI command but are silently skipped by the live gateway at runtime.

openclaw plugins doctor even hints at the divergence:

[memory-reranker] registered
- memory-reranker is hook-only. This remains a supported compatibility path,
  but it has not migrated to explicit capability registration yet. [info]

…but no documented mechanism (that I could find) makes the gateway actually invoke that "supported compatibility path" at startup.

Repro

~/clawd/memory-reranker/index.js:

export default {
  id: "memory-reranker",
  name: "Memory Reranker",
  description: "Reranks memory_search results",
  register(api) {
    api.on("tool_result_persist", (event, ctx) => {
      if (event.toolName !== "memory_search") return;
      // ... rerank logic
    });
    console.log("[memory-reranker] registered");
  },
};

~/clawd/memory-reranker/package.json (matched against @openclaw/brave-plugin shape):

{
  "name": "memory-reranker",
  "version": "2.0.0",
  "type": "module",
  "openclaw": {
    "extensions": ["./index.js"],
    "install": { "minHostVersion": ">=2026.5.0" },
    "compat": { "pluginApi": ">=2026.5.18" }
  }
}

Plus openclaw.plugin.json with id, name, description, configSchema.

What I tried (all set, none worked)

  1. openclaw plugins install --dangerously-force-unsafe-install --link <path> → success
  2. openclaw plugins enable memory-reranker → success
  3. openclaw config patch setting:
    • plugins.entries.memory-reranker.enabled: true
    • plugins.allow: ["memory-reranker", "whatsapp", "brave"]
    • plugins.load.paths: ["/home/ali/clawd/memory-reranker"]
  4. Symlinked /home/ali/.openclaw/extensions/memory-reranker -> <path> (mirrors whatsapp's location)
  5. Created dist/index.js -> ../index.js symlink (mirrors brave/whatsapp convention)
  6. Mirrored brave-plugin's full package.json openclaw block

Observations

  • openclaw plugins doctor[memory-reranker] registered
  • openclaw plugins inspect memory-rerankerStatus: loaded, Origin: config
  • ~/.openclaw/plugins/installs.json has a full record for it (installRecords.memory-reranker + plugins[].pluginId = "memory-reranker")
  • Live gateway boot log: [gateway] http server listening (10 plugins: brave, browser, canvas, device-pair, file-transfer, memory-core, openai, phone-control, talk-voice, whatsapp; 2.4s)no memory-reranker
  • After triggering a real memory_search via openclaw agent --agent main -m "...", journal has zero memory-reranker log lines — the register() was never invoked, so the hook was never bound

Question

What's the correct way to make a hook-only plugin (e.g., one that needs to intercept tool_result_persist for a built-in tool like memory_search) actually load in the live gateway in 2026.5.18?

Either:

  • (a) A config/install path I missed → docs/example would help, OR
  • (b) Hook-only plugins genuinely need migration to capability registration → if so, what's the recommended pattern for "intercept an existing built-in tool's result" without adding a new tool?

Environment

  • OpenClaw: 2026.5.18 (50a2481) (fresh upgrade from 2026.4.23)
  • OS: Linux 6.18.22 (Ubuntu)
  • Node: v22.22.2
  • Install: global npm (/usr/lib/node_modules/openclaw)

Happy to provide more logs / additional probes.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix 2026.5.18 — hook-only plugins (e.g. tool_result_persist interceptors) load via CLI but are silently skipped by the live gateway [1 comments, 2 participants]