openclaw - ✅(Solved) Fix memory status --deep reports QMD embeddings unavailable when searchMode=search intentionally disables vectors [2 pull requests, 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#77645Fetched 2026-05-06 06:23:31
View on GitHub
Comments
1
Participants
2
Timeline
8
Reactions
3
Author
Timeline (top)
referenced ×3cross-referenced ×2commented ×1mentioned ×1

openclaw memory status --deep reports QMD embeddings as unavailable even when QMD is intentionally configured for BM25-only mode via memory.qmd.searchMode = "search".

This is confusing because searchMode: "search" is documented as the mode that skips semantic vector readiness probes and embedding maintenance. In that configuration, vectors are disabled by design, not failing.

Error Message

Provider: qmd (requested: qmd) Embeddings: unavailable Embeddings error: QMD semantic vectors are unavailable Vector: disabled

Root Cause

This is confusing because searchMode: "search" is documented as the mode that skips semantic vector readiness probes and embedding maintenance. In that configuration, vectors are disabled by design, not failing.

Fix Action

Fixed

PR fix notes

PR #77664: fix(memory): skip embeddings unavailable error when searchMode=search

Description (problem / solution / changelog)

Summary

  • probeEmbeddingAvailability() in qmd-manager.ts reported a misleading "QMD semantic vectors are unavailable" error when searchMode=search (BM25-only) intentionally disables vector search. The embeddings probe should return { ok: false, error: undefined } in this case since the absence of vectors is by design, not a failure condition.

Verification

  • Ran pnpm test extensions/memory-core/src/memory/qmd-manager.test.ts — all 102 tests pass.
  • Updated the corresponding test assertion to expect error: undefined when searchMode=search.

Real behavior proof

Behavior or issue addressed: Issue #77645: memory status --deep reports a misleading "QMD semantic vectors are unavailable" error when searchMode=search is configured. The probeEmbeddingAvailability() method unconditionally returns an error string when vectors are not available, even though searchMode=search intentionally skips vector support and only uses BM25 text search.

Real environment tested: Local dev environment, Node 22, running against main branch with the fix applied. Verified the fix by running openclaw memory status --deep equivalent code paths and reading the changed source.

Exact steps or command run after the patch: Applied the change and ran node -e to confirm qmdUsesVectors("search") returns false and probeEmbeddingAvailability() returns { ok: false, error: undefined } instead of the old error string. Ran the focused QMD manager regression suite confirming the assertion expects error: undefined.

Evidence after fix: Ran node -e "require('./extensions/memory-core/dist/...')" to confirm the probe returns { ok: false, error: undefined } when searchMode=search. Console output shows the method no longer reports a misleading error. The source change is a two-line early return in probeEmbeddingAvailability(): if (!qmdUsesVectors(this.qmd.searchMode)) { return { ok: false, error: undefined }; } which skips the vector probe entirely for BM25-only configurations. The regression assertion was updated from error: "QMD semantic vectors are unavailable" to error: undefined.

Observed result after fix: No misleading "vectors unavailable" diagnostic for BM25-only configurations. The probe returns { ok: false, error: undefined } signaling that embeddings are intentionally not used, without reporting it as a failure.

What was not tested: Live gateway with openclaw memory status --deep and a real QMD backend. Verified through source inspection and the existing unit test covering probeEmbeddingAvailability().

Closes #77645

Changed files

  • CHANGELOG.md (modified, +1/-0)
  • extensions/memory-core/src/memory/qmd-manager.test.ts (modified, +1/-1)
  • extensions/memory-core/src/memory/qmd-manager.ts (modified, +3/-0)

PR #77678: fix(memory): don't report QMD embeddings as unavailable when searchMode=search

Description (problem / solution / changelog)

Summary

When QMD is intentionally configured for BM25-only mode via memory.qmd.searchMode = "search", vectors are disabled by design. openclaw memory status --deep previously reported this configuration as an embeddings failure with the misleading line Embeddings error: QMD semantic vectors are unavailable, even though nothing was actually broken. Status now distinguishes "intentionally skipped" from "unavailable" and shows Embeddings: skipped (searchMode=search) with no error line.

Changes

  • MemoryEmbeddingProbeResult (in packages/memory-host-sdk and the re-exported plugin-sdk type): added optional skipped?: boolean and skippedReason?: string fields. Backwards compatible — existing consumers that only read ok/error are unaffected.
  • QmdMemoryManager.probeEmbeddingAvailability (extensions/memory-core/src/memory/qmd-manager.ts): when qmdUsesVectors(searchMode) is false (i.e. searchMode === "search"), short-circuit and return { ok: false, skipped: true, skippedReason: "searchMode=search" } instead of running the vector probe and emitting the generic "QMD semantic vectors are unavailable" error.
  • runMemoryStatus renderer (extensions/memory-core/src/cli.runtime.ts): renders Embeddings: skipped (<reason>) in the muted theme color when the probe reports skipped, and suppresses the Embeddings error line in that case. ok: true and ok: false/non-skipped paths are unchanged.

Testing

  • Updated the existing qmd-manager.test.ts case "skips qmd status vector probes for lexical search mode" to assert the new { ok: false, skipped: true, skippedReason: "searchMode=search" } shape (no more bogus error string).
  • Added cli.test.ts case "renders embeddings as skipped when QMD probe reports skipped (issue #77645)" covering the renderer: confirms Embeddings: skipped (searchMode=search) is printed and that neither Embeddings: unavailable nor Embeddings error appear.
  • Ran scoped vitest suites locally: extensions/memory-core/src/memory/qmd-manager.test.ts (102 tests), extensions/memory-core/src/cli.test.ts (52 tests, including the new one), and extensions/memory-core/src/memory/search-manager.test.ts (30 tests). All pass.

Fixes openclaw/openclaw#77645

Changed files

  • CHANGELOG.md (modified, +1/-0)
  • extensions/memory-core/src/cli.runtime.ts (modified, +15/-3)
  • extensions/memory-core/src/cli.test.ts (modified, +38/-0)
  • extensions/memory-core/src/memory/qmd-manager.test.ts (modified, +4/-1)
  • extensions/memory-core/src/memory/qmd-manager.ts (modified, +12/-0)
  • packages/memory-host-sdk/src/host/types.ts (modified, +8/-0)
  • src/plugin-sdk/memory-core-host-engine-storage.ts (modified, +8/-0)

Code Example

{
  "memory": {
    "backend": "qmd",
    "qmd": {
      "searchMode": "search",
      "update": {
        "startup": "idle",
        "embedTimeoutMs": 300000
      }
    }
  }
}

---

Provider: qmd (requested: qmd)
Embeddings: unavailable
Embeddings error: QMD semantic vectors are unavailable
Vector: disabled

---

Embeddings: skipped (searchMode=search)
Vector: disabled

---

{
  "provider": "qmd",
  "model": "qmd",
  "mode": "search",
  "debug": {
    "backend": "qmd",
    "configuredMode": "search",
    "effectiveMode": "search"
  }
}
RAW_BUFFERClick to expand / collapse

Summary

openclaw memory status --deep reports QMD embeddings as unavailable even when QMD is intentionally configured for BM25-only mode via memory.qmd.searchMode = "search".

This is confusing because searchMode: "search" is documented as the mode that skips semantic vector readiness probes and embedding maintenance. In that configuration, vectors are disabled by design, not failing.

Environment

  • OpenClaw: 2026.5.4-beta.1 (9cc3ae1)
  • OS: Linux x64
  • QMD: @tobilu/qmd installed globally
  • Backend: memory.backend = "qmd"

Config

{
  "memory": {
    "backend": "qmd",
    "qmd": {
      "searchMode": "search",
      "update": {
        "startup": "idle",
        "embedTimeoutMs": 300000
      }
    }
  }
}

Actual behavior

openclaw memory status --deep prints, for each agent:

Provider: qmd (requested: qmd)
Embeddings: unavailable
Embeddings error: QMD semantic vectors are unavailable
Vector: disabled

Expected behavior

When memory.qmd.searchMode = "search", status should not report this as an embeddings error. It should either omit the embeddings error or show something like:

Embeddings: skipped (searchMode=search)
Vector: disabled

The current output makes the documented BM25-only configuration look broken.

Evidence that search mode is working

A memory_search call reports QMD search mode correctly:

{
  "provider": "qmd",
  "model": "qmd",
  "mode": "search",
  "debug": {
    "backend": "qmd",
    "configuredMode": "search",
    "effectiveMode": "search"
  }
}

So operational search is using QMD BM25/search mode as intended; the problem appears to be the status/probe output.

Suspected source path

From inspecting the built distribution:

  • cli.runtime-*.js calls manager.probeEmbeddingAvailability() during openclaw memory status --deep for QMD managers.
  • qmd-manager-*.js::probeEmbeddingAvailability() calls probeVectorAvailability() and maps a false return to the default error string QMD semantic vectors are unavailable.
  • probeVectorAvailability() intentionally returns false early when searchMode === "search" because vectors are disabled by configuration.

So the status path appears to conflate:

  1. vectors intentionally disabled by searchMode: "search", and
  2. vectors unavailable due to an error or missing embeddings.

Related context

This is adjacent to, but narrower than, QMD embed/update interruption issues. This report is specifically about the status output for the documented BM25-only mode.

extent analysis

TL;DR

The issue can be fixed by modifying the probeEmbeddingAvailability() function to handle the searchMode === "search" case differently, avoiding the false error report.

Guidance

  • Review the qmd-manager-*.js file and update the probeEmbeddingAvailability() function to check for searchMode === "search" before calling probeVectorAvailability().
  • Consider adding a new status message for the searchMode === "search" case, such as "Embeddings: skipped (searchMode=search)".
  • Verify the fix by running openclaw memory status --deep and checking the output for the corrected status message.
  • Test the memory_search call to ensure it still reports the correct QMD search mode.

Example

// In qmd-manager-*.js
probeEmbeddingAvailability() {
  if (searchMode === "search") {
    return "skipped (searchMode=search)";
  }
  // existing code
}

Notes

This fix assumes that the searchMode === "search" case should not report an error, but rather indicate that embeddings are intentionally skipped.

Recommendation

Apply workaround: update the probeEmbeddingAvailability() function to handle the searchMode === "search" case correctly, as this will resolve the issue without requiring a version upgrade.

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…

FAQ

Expected behavior

When memory.qmd.searchMode = "search", status should not report this as an embeddings error. It should either omit the embeddings error or show something like:

Embeddings: skipped (searchMode=search)
Vector: disabled

The current output makes the documented BM25-only configuration look broken.

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 - ✅(Solved) Fix memory status --deep reports QMD embeddings unavailable when searchMode=search intentionally disables vectors [2 pull requests, 1 comments, 2 participants]