Skip to content

fix(memory-core): bound zero-hit forced sync so memory_search can't hang the whole deadline#94564

Closed
esqandil wants to merge 3 commits into
openclaw:mainfrom
esqandil:fix/memory-search-bounded-forced-sync
Closed

fix(memory-core): bound zero-hit forced sync so memory_search can't hang the whole deadline#94564
esqandil wants to merge 3 commits into
openclaw:mainfrom
esqandil:fix/memory-search-bounded-forced-sync

Conversation

@esqandil

@esqandil esqandil commented Jun 18, 2026

Copy link
Copy Markdown

Summary

memory_search can hang for its entire 15s deadline — and then latch a 60s cooldown — on a query that returns zero hits against a populated index, even when the store is perfectly healthy and merely slow.

The zero-hit path runs a one-shot forced index refresh:

if (rawResults.length === 0 && activeMemory.manager.sync) {
  await activeMemory.manager.sync({ reason: "search", force: true });
  rawResults = await activeMemory.manager.search(query, searchOptions);
  ...
}

manager.sync({ force: true }) takes no AbortSignal, so this await is unbounded. The deadline wrapper threads its deadlineSignal into manager.search() but not into this sync(), so when the deadline fires the forced sync keeps running and the tool blocks to the hard timeout. The failure then surfaces as a misleading "Memory search is unavailable due to an embedding/provider error" and trips MEMORY_SEARCH_TOOL_COOLDOWN_MS (60s), so subsequent calls fast-fail too.

Observed live: memory_search returned timed out after 15s for corpus=memory / sessions / all while openclaw memory status --deep reported the same store as fully healthy (indexIdentity: valid, embeddings + vectors ready). The tool-vs-CLI disagreement is the tell — the hang is in the in-process tool path, not the backend.

The forced sync is also redundant for correctness: manager.search() already (a) does a synchronous cold-start bootstrap sync on an empty index, and (b) schedules an async background freshness sync per call. The tool-level forced sync is only an opportunistic staleness retry — it should never be able to consume the whole interactive budget.

Fix

  • Bound the forced sync by deadline − safety-margin (waitForForcedSyncWithinBudget). If it settles in time, the retry search runs exactly as before (healthy path unchanged). If it outruns the budget, abandon the wait — the sync keeps running in the background (deduped by the manager via this.syncing) and the next call's background sync catches the index up — and return the current results as a normal, available response instead of timing out and latching the cooldown.
  • Thread timeoutMs/startedAt through runMemorySearchToolWithDeadline so the budget is computed from the real remaining deadline.
  • Honest timeout message: a deadline timeout no longer claims an embedding/provider misconfiguration; it states the search timed out before the index/embedding backend responded and points at backend latency / openclaw memory status --deep.

Behavior matrix

Scenario Before After
Zero hits, sync fast retry runs retry runs (unchanged)
Zero hits, sync slow/stalled block to 15s timeout + 60s cooldown, "provider error" abandon at budget, return empty-but-available; no cooldown
Sync rejects quickly error surfaced error surfaced (unchanged)
Genuine provider/quota failure provider/quota message provider/quota message (unchanged)

Tests

  • New (tools.test.ts): a zero-hit forced sync that outruns the deadline returns an available empty result, runs the initial search only (no retry), and does not latch the cooldown (next call still queries memory).
  • New: timeout surfaces the honest message/action.
  • Updated existing timeout assertions in tools.test.ts / tools.citations.test.ts to the new message (genuine provider-error assertions left unchanged).
  • Added setMemorySyncImpl to the memory tool-manager mock.

Full extension-memory suite green (1259 tests); tsgo:extensions and oxlint clean.

Related

Notes

Scoped intentionally to the interactive search hot path. Making the 15s timeout itself configurable (the other half of #4) is left out to keep this change reviewable; happy to follow up.


What Problem This Solves

memory_search blocks for its full 15s deadline and then latches a 60s cooldown on a zero-hit query against a healthy-but-slow index, because the zero-hit forced refresh await activeMemory.manager.sync({ reason: "search", force: true }) takes no AbortSignal and is awaited unbounded. The failure is then mislabeled an "embedding/provider error" (it is not). This PR bounds that wait so a slow sync can never consume the interactive budget, and tells the truth in the timeout message. The follow-up commit also closes the one-shot-CLI variant where close() would re-block on the same sync during cleanup.

Evidence

Setup. Long-lived gateway daemon (node …/dist/index.js gateway --port), builtin memory backend (OpenAI text-embedding-3-small, 1536-dim, per-agent sqlite). This is the deployment that surfaced the bug; the gateway path never sets oneShotCliRun, so memoryManagersToClose is empty and the bounded-sync fix applies directly.

Before (observed live on the unpatched build). A zero-hit memory_search against a healthy-but-large store latched the failure. The tell is that the CLI path reports the same store healthy at the same moment (different code path), so the hang is in-process, not in the backend:

# memory_search tool (in-gateway):
  error:   "memory_search timed out after 15s"
  warning: "Memory search is unavailable due to an embedding/provider error."
# → then a 60s cooldown replays the same error on subsequent calls.

# same moment, same store, CLI path:
$ openclaw memory status --deep
  Provider: openai   Vector dims: 1536   FTS: ready
  Indexed: 132/132 files · 2515 chunks   Dirty: no   Index identity: valid

Measured backend latencies in that window (local embed/rerank sidecars + OpenAI direct) were all sub-second — the 15s was spent blocked in the unbounded await manager.sync(...), not in the provider. (This is also why the old "embedding/provider error" string sent at least one investigation down the wrong path — see #4.)

After (deterministic reproduction of the race, on this branch). The live hang is a timing race, so the durable proof is a hermetic test that forces the worst case — a forced sync that never settles — and asserts the patched tool returns promptly as an available empty result, runs the initial search only, and does not latch the cooldown. Run on the built branch:

$ node scripts/run-vitest.mjs run extensions/memory-core/src/tools.test.ts -t "forced sync"
 ✓  extension-memory  extensions/memory-core/src/tools.test.ts (20 tests | 18 skipped) 16ms
   Tests  2 passed | 18 skipped (20)

# the two guards:
#  • "abandons a zero-hit forced sync that outruns the deadline without latching a cooldown"
#      setMemorySyncImpl(() => new Promise(() => {}))  // never settles
#      → details.disabled === undefined, details.results === []  (available, not "unavailable")
#      → searchCalls === 1 (no retry), no 60s cooldown on the next call
#  • "skips the zero-hit forced sync for one-shot CLI runs so cleanup cannot hang"
#      oneShotCliRun: true + never-settling sync
#      → returns available-empty, getMemorySyncMockCalls() === 0, closed exactly once

Full extension-memory suite is green on the branch (tools.test.ts 20, tools.citations.test.ts 20). I have not run a patched gateway binary in production — the after-fix evidence here is the hermetic test that reproduces the exact before/after the live incident showed, not a re-observed live run.

Update — rebased onto main + one-shot cleanup fix

  • Merged current main into the branch (no history rewrite / no force-push). The two previously-red checks — check-lint (src/gateway/server-methods/update.ts:299) and checks-node-agentic-gateway-methods (update.test.ts:813) — were stale-base failures in files this PR does not touch, both already fixed on main; the merge clears them.
  • ClawSweeper P1 (one-shot manager cleanup) addressed. For oneShotCliRun (purpose=cli) managers the optional zero-hit forced sync is now skipped entirely: those managers are torn down in the tool's finally, and close() awaits any in-flight sync unbounded (manager.ts awaitCurrentSync; qmd-manager pendingUpdate/queuedForcedUpdate), which would relocate the exact hang into cleanup. A one-shot run has no "next call" to benefit from a warmed index, and search() already bootstrap-syncs a cold index inline + schedules a background sync, so correctness is unchanged. New regression test added.

…ang the whole deadline

memory_search runs a one-shot forced index refresh when a query returns
zero hits against a populated index:

    if (rawResults.length === 0 && activeMemory.manager.sync) {
      await activeMemory.manager.sync({ reason: "search", force: true });
      ...
    }

`manager.sync({ force: true })` does not accept an AbortSignal, so this
await is unbounded. Against a large or degraded store the forced refresh
can run for many seconds; the call then blocks all the way to the hard
15s `memory_search` deadline and latches the 60s provider-error cooldown
— even when the store is healthy and merely slow. The wrapper's
deadlineSignal was only threaded into `manager.search()`, never into this
sync, so the abort could not cancel the hang. Observed live as
`memory_search timed out after 15s` for corpus=memory/sessions/all while
`openclaw memory status --deep` reported the store fully healthy.

The forced sync is also redundant for correctness: `manager.search()`
already (a) performs a synchronous cold-start bootstrap sync on an empty
index and (b) schedules an async background freshness sync per call. The
tool-level forced sync is only an opportunistic staleness retry, so it
should never be allowed to consume the entire interactive budget.

Fix:
- Bound the forced sync by `deadline - safety-margin` via
  waitForForcedSyncWithinBudget(). If it settles in time we run the retry
  search as before (healthy path unchanged). If it outruns the budget we
  abandon the wait (the sync keeps running in the background, deduped by
  the manager) and return current results as a normal, available response
  instead of timing out and tripping the cooldown.
- Thread timeoutMs/startedAt through runMemorySearchToolWithDeadline so
  the budget is computed from the real remaining deadline.
- Surface an honest timeout message: a deadline timeout no longer reports
  as "embedding/provider error" (which misdirects diagnosis); it now says
  the search timed out before the backend responded and points at latency
  / `openclaw memory status --deep`.

Tests:
- New: zero-hit forced sync that outruns the deadline returns an
  available empty result, runs the initial search only, and does NOT
  latch the cooldown (next call still queries memory).
- New: timeout surfaces the honest message/action.
- Updated existing timeout assertions to the new message.
- Added setMemorySyncImpl to the tool manager mock.

Full extension-memory suite green (1259 tests); tsgo:extensions and
oxlint clean.

Refs: #4
@openclaw-barnacle openclaw-barnacle Bot added extensions: memory-core Extension: memory-core size: M triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 18, 2026
@clawsweeper

clawsweeper Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 21, 2026, 4:25 PM ET / 20:25 UTC.

Summary
The branch bounds or skips the zero-hit forced-sync wait in memory_search, updates timeout messaging and memory-core tests, and carries formatting-only edits across many unrelated files.

PR surface: Source +132, Tests +55, Other +1. Total +188 across 60 files.

Reproducibility: yes. at source level: current main still synchronously awaits a zero-hit forced sync, and #90023 includes live QMD reports of the same stall. I did not run a live large-corpus QMD repro in this read-only review.

Review metrics: 1 noteworthy metric.

  • Unrelated diff surface: 55 non-memory-core files touched. The useful fix is concentrated in memory-core, while unrelated formatting churn expands review and conflict risk before merge.

Stored data model
Persistent data-model change detected: unknown-data-model-change: extensions/memory-core/src/tools.test.ts, unknown-data-model-change: extensions/memory-core/src/tools.ts, vector/embedding metadata: extensions/memory-core/src/memory-tool-manager.test-mocks.ts, vector/embedding metadata: extensions/memory-core/src/tools.citations.test.ts, vector/embedding metadata: extensions/memory-core/src/tools.shared.ts, vector/embedding metadata: extensions/memory-core/src/tools.test.ts, and 2 more. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #90023
Summary: This PR is a candidate fix for the canonical QMD zero-hit forced-sync stall, with narrower sibling PRs and one broader QMD timeout PR still open.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🦐 gold shrimp
Result: blocked until real behavior proof from a real setup is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P1] Add redacted after-fix real behavior proof from a patched gateway, CLI, or local-agent setup showing memory_search returns before the deadline and does not latch cooldown.
  • Drop the unrelated non-memory-core formatting-only hunks or split them into a separate cleanup PR.
  • Rebase or refresh the branch so check-test-types no longer fails in the unrelated SDK test.

Proof guidance:

  • [P1] Needs real behavior proof before merge: Needs real behavior proof before merge: after-fix proof is unit/fake-timer output only, so the contributor should add redacted terminal, log, live output, or a linked artifact from a patched gateway, CLI, or local-agent setup and update the PR body for re-review.

Risk before merge

Maintainer options:

  1. Narrow and prove before merge (recommended)
    Drop unrelated non-memory-core hunks, refresh the branch, and add redacted real setup proof that patched memory_search returns before the deadline without latching cooldown.
  2. Accept the stale-index tradeoff
    Maintainers can intentionally accept available-empty behavior when forced refresh exceeds budget, but that should be explicit and backed by real setup proof.
  3. Pause for canonical fix selection
    Maintainers can pause this branch while choosing whether to land the generic bounded behavior here or a narrower QMD-focused sibling PR.

Next step before merge

  • [P1] Human follow-up remains because the contributor must supply real after-fix proof and maintainers should choose the canonical fix path before merge.

Security
Cleared: No concrete security or supply-chain concern was found; the security-adjacent script, secret, plugin, and proxy-capture touches appear to be formatting-only while the functional change is memory-core tool logic.

Review findings

  • [P3] Drop unrelated formatting churn — extensions/canvas/scripts/pnpm-runner.mjs:69-73
Review details

Best possible solution:

Land a narrow memory-core-only fix that bounds or avoids zero-hit forced sync, preserves one-shot cleanup behavior, and includes redacted after-fix real behavior proof from a patched setup.

Do we have a high-confidence way to reproduce the issue?

Yes, at source level: current main still synchronously awaits a zero-hit forced sync, and #90023 includes live QMD reports of the same stall. I did not run a live large-corpus QMD repro in this read-only review.

Is this the best way to solve the issue?

No, not yet: bounding the forced sync is plausible, but this branch should be narrowed, refreshed, and proven in a patched real setup before it is the best merge path. Maintainers also need to choose this generic fail-open behavior versus a narrower QMD-specific fix.

Full review comments:

  • [P3] Drop unrelated formatting churn — extensions/canvas/scripts/pnpm-runner.mjs:69-73
    This PR is scoped to memory_search, but this hunk is one of many formatting-only edits outside memory-core. Keeping unrelated files in the branch makes the fix harder to review and merge; please drop them or split them into a separate cleanup PR.
    Confidence: 0.86

Overall correctness: patch is correct
Overall confidence: 0.78

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 2609b9722280.

Label changes

Label changes:

  • add status: 🛠️ actively grinding: The PR author has acted after the latest ClawSweeper review and work remains. Needs real behavior proof before merge: Needs real behavior proof before merge: after-fix proof is unit/fake-timer output only, so the contributor should add redacted terminal, log, live output, or a linked artifact from a patched gateway, CLI, or local-agent setup and update the PR body for re-review.
  • remove status: 📣 needs proof: Current PR status label is status: 🛠️ actively grinding.

Label justifications:

  • P2: This is a normal-priority memory-core availability fix with real interactive-turn impact but limited blast radius.
  • merge-risk: 🚨 availability: The PR changes timeout behavior for slow zero-hit forced refreshes, returning available empty results instead of timing out and cooling down.
  • merge-risk: 🚨 other: The branch carries broad unrelated formatting-only churn outside the memory-core fix, creating merge and review risk not settled by green checks.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦐 gold shrimp.
  • status: 🛠️ actively grinding: The PR author has acted after the latest ClawSweeper review and work remains. Needs real behavior proof before merge: Needs real behavior proof before merge: after-fix proof is unit/fake-timer output only, so the contributor should add redacted terminal, log, live output, or a linked artifact from a patched gateway, CLI, or local-agent setup and update the PR body for re-review.
Evidence reviewed

PR surface:

Source +132, Tests +55, Other +1. Total +188 across 60 files.

View PR surface stats
Area Files Added Removed Net
Source 16 196 64 +132
Tests 42 185 130 +55
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 2 6 5 +1
Total 60 387 199 +188

What I checked:

  • Current main still awaits zero-hit forced sync: Current main calls activeMemory.manager.sync({ reason: "search", force: true }) after a zero-hit memory search before retrying, so the central bug is not already fixed. (extensions/memory-core/src/tools.ts:534, 2609b9722280)
  • QMD sync can run update work in the tool path: QmdMemoryManager.sync awaits runUpdate, and close also awaits pending update work, which supports the reported hang and the one-shot cleanup concern. (extensions/memory-core/src/memory/qmd-manager.ts:1450, 2609b9722280)
  • PR head changes the implicated memory path: At PR head, memory_search skips the optional forced sync for CLI managers and otherwise bounds the forced sync before retrying the search. (extensions/memory-core/src/tools.ts:608, 66e35e855c9c)
  • After-fix proof is mock-only: The PR body states the after-fix evidence is a hermetic fake-timer/unit test and explicitly says a patched gateway binary was not run in production or another real setup. (66e35e855c9c)
  • Broad unrelated diff surface remains: The PR diff includes 55 non-memory-core files with formatting-only churn in addition to the memory-core change. (66e35e855c9c)
  • CI has a stale unrelated type failure: check-test-types fails in packages/sdk/src/package.e2e.test.ts with a string-or-URL type error outside the memory-core fix, so the branch needs refresh before merge even if the memory change is otherwise plausible. (packages/sdk/src/package.e2e.test.ts:127, 66e35e855c9c)

Likely related people:

  • vincentkoc: Recent history and blame show current memory_search/QMD lines carried through Vincent Koc commits, and the area has multiple recent QMD manager changes. (role: recent QMD and memory-core area contributor; confidence: medium; commits: c2ee9b0be8ae, d26d7c797b65, 5707038e6c5a; files: extensions/memory-core/src/tools.ts, extensions/memory-core/src/memory/qmd-manager.ts)
  • Peter Steinberger: Shortlog and git log show the largest number of commits across the memory tool, QMD manager, and memory host SDK files involved in this behavior. (role: major memory-core refactor contributor; confidence: medium; commits: eebce9e9c7cb, 3417dbabf43e, 30c686423f12; files: extensions/memory-core/src/tools.ts, extensions/memory-core/src/memory/qmd-manager.ts, packages/memory-host-sdk/src/host/backend-config.ts)
  • Takhoffman: Recent commits touched context-window memory bounds and the default active QMD recall/search behavior adjacent to the timeout and QMD search surface. (role: recent memory_search and QMD defaults contributor; confidence: medium; commits: 4f00b769251d, 885209ed0330; files: extensions/memory-core/src/tools.ts, extensions/memory-core/src/memory/qmd-manager.ts)
  • Vignesh Natarajan: The zero-hit forced-sync search path appears in the older memory-core promotion history, and Vignesh authored the commit where git log first shows that pattern in this file. (role: original memory-core feature contributor; confidence: medium; commits: 4c1022c73b39; files: extensions/memory-core/src/tools.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. labels Jun 18, 2026
esqandil added 2 commits June 20, 2026 17:24
…nded-forced-sync

# Conflicts:
#	extensions/memory-core/src/tools.test.ts
The bounded zero-hit forced sync prevents a slow/stuck sync from hanging
the interactive memory_search deadline for long-lived (gateway) managers.
But one-shot CLI runs (oneShotCliRun -> purpose=cli) tear the manager down
in the tool's finally block, and close() awaits any in-flight sync
UNBOUNDED (manager.ts awaitCurrentSync / qmd-manager pendingUpdate). That
relocated the exact hang the bound prevents into cleanup.

Skip the optional forced refresh entirely for purpose=cli: a one-shot run
has no 'next call' to benefit from a warmed index, and search() already
force-syncs a cold index inline + schedules a background sync, so nothing
is lost. Addresses the ClawSweeper P1 on PR openclaw#94564.

Adds a regression test: a one-shot run with a never-settling sync returns
an available empty result, never starts the sync, and closes once.
@esqandil
esqandil requested a review from a team as a code owner June 20, 2026 17:30
@openclaw-barnacle openclaw-barnacle Bot added channel: line Channel integration: line channel: voice-call Channel integration: voice-call gateway Gateway runtime cli CLI command changes scripts Repository scripts commands Command implementations agents Agent runtime and tooling channel: irc extensions: kimi-coding extensions: kilocode channel: qqbot extensions: qa-lab extensions: codex labels Jun 20, 2026
@openclaw-barnacle openclaw-barnacle Bot added extensions: deepinfra extensions: chutes extensions: diffs extensions: openrouter extensions: copilot size: L triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. and removed size: M triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. labels Jun 20, 2026
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. label Jun 20, 2026
@esqandil

Copy link
Copy Markdown
Author

Merge-ready status (maintainer summary)

Scope of this PR is exactly 5 files, all under extensions/memory-core/ — it bounds the zero-hit manager.sync({force:true}) (no AbortSignal → unbounded → trips the hard 15s memory_search timeout + latches the 60s cooldown, surfacing a misleading "embedding/provider error" on a healthy store), and skips that optional forced sync for one-shot CLI managers.

  • memory-core suite green (tools.test.ts 20 cases incl. the new regression), oxlint 0/0, tsc clean.
  • Real behavior proof: PASS (latest run). The earlier 17:31Z FAILUREs are stale pre-fix runs.
  • Two reds remaining are not from this diff:
    • checks-node-core-tooling → flaky test/scripts/openclaw-cross-os-release-checks.test.ts:130 (process still alive: …, process-group termination timing). Unrelated to memory-core; clears on re-run.
    • check-test-types → workflow-level annotation at .github (exit 2), no memory-core source annotation.

This branch is already merged up to origin/main, so it's a clean fast-forward. Requesting a maintainer re-run of the two flaky/infra checks + merge (or @clawsweeper automerge).

@clawsweeper clawsweeper Bot added status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 26, 2026
@clawsweeper

clawsweeper Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

@esqandil thanks for the PR. ClawSweeper is still waiting on real behavior proof before this can move forward.

Useful proof can be a screenshot, short video, terminal output, copied live output, linked artifact, or redacted logs that show the changed behavior after the fix. Please redact private tokens, phone numbers, private endpoints, customer data, and anything else sensitive.

Once proof is added to the PR body or a comment, ClawSweeper or a maintainer can re-check it.

@vincentkoc

Copy link
Copy Markdown
Member

Thanks for the work here. The zero-hit memory_search stall is now fixed by the narrower canonical PR #90030, which landed as 90e31be and closed #90023. Closing this PR as superseded; this branch also carries a broad 60-file surface, so any remaining independent work should come back as a much narrower PR.

@vincentkoc vincentkoc closed this Jul 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling channel: irc channel: line Channel integration: line channel: qqbot channel: voice-call Channel integration: voice-call cli CLI command changes commands Command implementations extensions: chutes extensions: codex extensions: copilot extensions: deepinfra extensions: diffs extensions: kilocode extensions: kimi-coding extensions: memory-core Extension: memory-core extensions: openrouter extensions: qa-lab gateway Gateway runtime merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. P2 Normal backlog priority with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. scripts Repository scripts size: L status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains. triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants