Skip to content

fix #92465: split OpenAI 431 embedding batches#92650

Merged
vincentkoc merged 1 commit into
openclaw:mainfrom
mushuiyu886:feat/issue-92465
Jun 13, 2026
Merged

fix #92465: split OpenAI 431 embedding batches#92650
vincentkoc merged 1 commit into
openclaw:mainfrom
mushuiyu886:feat/issue-92465

Conversation

@mushuiyu886

@mushuiyu886 mushuiyu886 commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Problem: bulk memory imports using OpenAI-compatible embeddings can fail on 431 request_headers_too_large before producing usable search results.
  • Solution: classify OpenAI 431 oversized embedding failures as batch split signals for the existing memory-core split path.
  • What changed: isSplittableMemoryEmbeddingTransportError now recognizes 431, request_headers_too_large, and Request Header Fields Too Large; the regression proves the existing splitter bisects and preserves result order.
  • What did NOT change: no API, config, schema, default model, retry limit, embedding payload shape, cache format, vector schema, or provider request body changed; changing import UX, provider defaults, and endpoint-level outage handling is out of scope.
  • Why it matters / User impact: tenant onboarding and large history imports should not require operators to manually split generated memory corpora into 100-entry chunks just to avoid upstream provider request-size failures.
  • Fixes Bulk memory import can hit OpenAI 431; chunked indexing avoids it #92465

Real behavior proof

  • Behavior or issue addressed: Bulk memory indexing with OpenAI-compatible embeddings can encounter a 431 oversized request failure; this patch routes that exact error shape into the production memory embedding batch splitter instead of aborting the import.
  • Real environment tested: Local Linux source checkout at /media/vdc/code/ai/aispace/openclaw-worktrees/issue-92465, isolated OPENCLAW_STATE_DIR / OPENCLAW_CONFIG_PATH, the real openclaw memory index --agent main --force --verbose CLI path via node --import tsx src/entry.ts, and a local OpenAI-compatible HTTP /v1/embeddings server. The proof corpus contained 1,000 generated memory entries across MEMORY.md and memory/2026-06-13-bulk-import.md; remote.batch.enabled was false so indexing used the synchronous provider /embeddings path, not the OpenAI Batch API path.
  • Exact steps or command run after this patch:
# Start local OpenAI-compatible /v1/embeddings server that returns 431 when input_count > 4.
PROOF_431_THRESHOLD=4 node /media/vdc/code/ai/aispace/openclaw-issue-92465-evidence/openai-compatible-431-server.mjs

# Run the real memory index CLI against an isolated config and generated 1,000-entry corpus.
cd /media/vdc/code/ai/aispace/openclaw-worktrees/issue-92465
OPENCLAW_STATE_DIR=/media/vdc/code/ai/aispace/openclaw-issue-92465-evidence/real-openai-compatible-proof/state \
OPENCLAW_CONFIG_PATH=/media/vdc/code/ai/aispace/openclaw-issue-92465-evidence/real-openai-compatible-proof/openclaw.json \
OPENCLAW_HOME=/media/vdc/code/ai/aispace/openclaw-issue-92465-evidence/real-openai-compatible-proof/home \
node --import tsx src/entry.ts memory index --agent main --force --verbose

pnpm vitest run extensions/memory-core/src/memory/manager-embedding-policy.test.ts
git diff --check
  • Evidence after fix:

Real CLI output from /media/vdc/code/ai/aispace/openclaw-issue-92465-evidence/openai-compatible-memory-index-proof.log:

Memory Index (main)
Provider: openai-compatible (requested: openai-compatible)
Model: proof-embedding-model
Sources: memory (MEMORY.md + /media/vdc/code/ai/aispace/openclaw-issue-92465-evidence/real-openai-compatible-proof/workspace/memory/*.md)
[memory] sync: indexing memory files
[memory] embeddings: batch start
[memory] embeddings transport failed after retries; splitting batch of 5 into 3 + 2
[memory] embeddings: batch start
[memory] embeddings: batch start
...
Memory index updated (main).
CLI exit status: 0

Local OpenAI-compatible provider log from /media/vdc/code/ai/aispace/openclaw-issue-92465-evidence/openai-compatible-431-server.log:

ready url=http://127.0.0.1:39013/v1 threshold=4
request=1 path=/v1/embeddings input_count=5 body_bytes=7935 model=proof-embedding-model
request=1 result=431 reason=request_headers_too_large threshold=4
request=2 path=/v1/embeddings input_count=3 body_bytes=4793 model=proof-embedding-model
request=2 result=200 embeddings=3
request=3 path=/v1/embeddings input_count=2 body_bytes=3185 model=proof-embedding-model
request=3 result=200 embeddings=2
...
server_requests 200
server_431 66
server_200 134
cli_split_lines 66
cli_updated True
cli_exit_zero True

Regression output remained green:

RUN  v4.1.7 /media/vdc/code/ai/aispace/openclaw-worktrees/issue-92465

Test Files  1 passed (1)
     Tests  14 passed (14)
  Start at  17:31:44
  Duration  828ms (transform 337ms, setup 404ms, import 22ms, tests 152ms, environment 0ms)

The regression also covered the pre-fix failure. Before the classifier change, the new test failed with the unsplit 431 error:

FAIL  |extension-memory| ../../extensions/memory-core/src/memory/manager-embedding-policy.test.ts > memory embedding policy > splits OpenAI 431 oversized embedding batches without retrying the same request
Error: openai embeddings failed: 431 request_headers_too_large: Request Header Fields Too Large
  • Observed result after fix: The real OpenAI-compatible memory index run hit 66 synthetic 431 responses on oversized five-input /v1/embeddings requests, split each failed batch through the production memory-core splitter into successful three-input and two-input requests, and completed with Memory index updated (main) plus CLI exit status 0. The regression also returns vectors in original input order after splitting ["a", "b", "c", "d"], and records provider batch sizes [4, 2, 1, 1, 2, 1, 1], proving the original oversized batch is split rather than retried unchanged.
  • What was not tested: I did not run a paid live OpenAI API import or a Docker daemon-backed 10,000-entry run. The local Docker daemon socket was not accessible in this environment, so the real-behavior proof is local-only proof using a local OpenAI-compatible HTTP endpoint with a dummy local API key and no external credentials or paid calls; it still exercises the real OpenClaw CLI, memory index manager, synchronous provider HTTP /embeddings request path, 431 response handling, recursive split, and successful index completion.

Review findings addressed

  • RF-001: Fixed by adding redacted real OpenAI-compatible bulk memory index proof from the CLI and provider logs above. The provider log shows /v1/embeddings request 1 returning 431 for five inputs, followed by successful three-input and two-input split requests.
  • RF-002: Fixed by replacing unit-only proof with the real openclaw memory index --agent main --force --verbose run above against a 1,000-entry memory corpus and synchronous OpenAI-compatible provider path.
  • RF-003: Fixed by adding provider-path logs that show 66 oversized 431 responses, 66 CLI split lines, 134 successful 200 responses, and Memory index updated (main) with CLI exit status 0.
  • RF-004: Fixed from contributor side: no code repair was needed after the review; the remaining action was proof, and this body now includes the requested real behavior proof plus the local-only limitation for the unavailable Docker daemon and paid live OpenAI run.

Regression Test Plan

  • Target test file: extensions/memory-core/src/memory/manager-embedding-policy.test.ts
  • Scenario locked in: A four-item embedding batch throws openai embeddings failed: 431 request_headers_too_large: Request Header Fields Too Large whenever more than one item is sent; the test expects the batch splitter to call sizes [4, 2, 1, 1, 2, 1, 1] and return ordered vectors.
  • Why this is the smallest reliable guardrail: The root behavior lives in the shared memory-core classifier and split helper used by embedBatchWithRetry, so this test covers the production decision point without requiring a live OpenAI key or large paid import run.

Merge risk

  • Risk labels considered: availability, session-state
  • Risk explanation: Availability risk is limited to handling one additional oversized-provider error string; session-state risk is limited because the change affects embedding retry/split policy and does not alter memory files, sessions, database schema, cache identity, or search ranking.
  • Why acceptable: The diff is two files and one source-line classifier change with a focused regression; 431 is not added to the generic retryable regex, so the code does not loop on the same oversized request and existing endpoint-outage behavior stays unchanged.

Root Cause

  • Root cause: The memory indexer already owned the correct root behavior in runMemoryEmbeddingBatchRetryWithSplit, but the source-of-truth classifier for splittable embedding transport failures did not include OpenAI's 431 oversized-request wording. As a result, large bulk imports failed at the first 431 instead of entering the existing bisection path that manual chunked imports effectively approximated.
  • Why this is root-cause fix: This fixes the root-cause invariant at the source-of-truth classifier: an oversized embedding batch error must be classified as splittable before the manager decides whether to abort, retry, or bisect. Because the decision now happens at the shared memory embedding policy boundary, every caller using the existing batch splitter handles OpenAI 431 consistently; it is not a downstream special case and does not mask the symptom with a generic retry.
  • Fix classification: Root cause fix
  • Maintainer-ready confidence: High: the changed behavior is isolated to splittable embedding batch classification, has a red/green regression, and preserves existing retry boundaries for non-splittable endpoint failures.
  • Patch quality notes: Related open PR scan from daily-fix did not find an open competing PR or same-contract/canonical PR for Bulk memory import can hit OpenAI 431; chunked indexing avoids it #92465; patch-quality risk is acceptable because the public contract surface is unchanged, compatibility/default behavior is unchanged, and the change only maps a provider error string to an already-existing internal split mechanism.
  • Architecture / source-of-truth check: The source of truth is extensions/memory-core/src/memory/manager-embedding-policy.ts, which owns retryable versus splittable embedding failure classification for memory indexing. This patch changes that owner module before downstream embedBatchWithRetry fallback behavior, not a CLI string check, provider-specific workaround, schema migration, or persisted record projection.

@openclaw-barnacle openclaw-barnacle Bot added extensions: memory-core Extension: memory-core size: XS proof: supplied External PR includes structured after-fix real behavior proof. labels Jun 13, 2026
@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 13, 2026, 6:38 AM ET / 10:38 UTC.

Summary
The PR classifies OpenAI and OpenAI-compatible 431 embedding failures as splittable memory embedding transport errors and adds a regression for ordered recursive batch splitting.

PR surface: Source 0, Tests +26. Total +26 across 2 files.

Reproducibility: yes. Current main and v2026.6.6 omit the reported 431 signal from the splittable classifier while the memory indexing callers use that classifier; the linked issue and PR body provide a concrete bulk-import failure shape and after-fix CLI/provider logs.

Review metrics: none identified.

Stored data model
Persistent data-model change detected: vector/embedding metadata: extensions/memory-core/src/memory/manager-embedding-policy.test.ts. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

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

Risk before merge

  • [P1] No paid live OpenAI import or Docker-backed 10,000-entry run was provided; the supplied local OpenAI-compatible proof still exercises the real CLI, provider HTTP path, 431 handling, recursive split, and successful index completion for this narrow classifier change.

Maintainer options:

  1. Decide the mitigation before merge
    Land the narrow classifier and regression through normal maintainer review and CI, then let the linked issue at Bulk memory import can hit OpenAI 431; chunked indexing avoids it #92465 close when the PR merges.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Next step before merge

  • No ClawSweeper repair job is needed; the remaining action is normal maintainer review and merge-gate handling.

Security
Cleared: The diff only changes a memory-core classifier regex and a colocated test, with no dependency, lockfile, workflow, secrets, publishing, or executable supply-chain surface touched.

Review details

Best possible solution:

Land the narrow classifier and regression through normal maintainer review and CI, then let the linked issue at #92465 close when the PR merges.

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

Yes. Current main and v2026.6.6 omit the reported 431 signal from the splittable classifier while the memory indexing callers use that classifier; the linked issue and PR body provide a concrete bulk-import failure shape and after-fix CLI/provider logs.

Is this the best way to solve the issue?

Yes. The shared memory-core split classifier is the narrowest maintainable fix boundary; provider-specific chunking, CLI manual chunking guidance, or config changes would duplicate the existing split mechanism instead of repairing the decision point.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 64f9f3c278db.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The updated PR body includes after-fix real CLI output and provider logs showing the memory index path splitting synthetic 431 oversized embedding batches and completing successfully.
  • add rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (logs): The updated PR body includes after-fix real CLI output and provider logs showing the memory index path splitting synthetic 431 oversized embedding batches and completing successfully.
  • remove rating: 🦪 silver shellfish: Current PR rating is rating: 🦞 diamond lobster, so this older rating label is no longer current.
  • remove status: 📣 needs proof: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P2: This fixes a real bulk memory indexing failure with limited memory-core surface area and no emergency data-loss, security, or core-runtime outage signal.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (logs): The updated PR body includes after-fix real CLI output and provider logs showing the memory index path splitting synthetic 431 oversized embedding batches and completing successfully.
  • proof: sufficient: Contributor real behavior proof is sufficient. The updated PR body includes after-fix real CLI output and provider logs showing the memory index path splitting synthetic 431 oversized embedding batches and completing successfully.
Evidence reviewed

PR surface:

Source 0, Tests +26. Total +26 across 2 files.

View PR surface stats
Area Files Added Removed Net
Source 1 1 1 0
Tests 1 26 0 +26
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 2 27 1 +26

What I checked:

  • Repository policy read: Read the full root AGENTS.md and the scoped extensions/AGENTS.md; no memory-core-specific AGENTS.md or matching maintainer note was present, so the extension boundary and ClawSweeper proof/review rules were applied. (AGENTS.md:1, 64f9f3c278db)
  • Current main still lacks the requested classifier: Current main's splittable transport-error regex covers socket/connection failures but not 431, request_headers_too_large, or Request Header Fields Too Large. (extensions/memory-core/src/memory/manager-embedding-policy.ts:90, 64f9f3c278db)
  • PR diff adds only the 431 split signal: The PR adds 431, request_headers_too_large, and request header fields too large to the splittable classifier, without adding 431 to the retryable classifier. (extensions/memory-core/src/memory/manager-embedding-policy.ts:90, 1787f9d39660)
  • Shared splitter is the right owner boundary: runMemoryEmbeddingBatchRetryWithSplit retries through the supplied retry predicate, then recursively splits only when the supplied splittable predicate accepts the final error and preserves left/right result order. (extensions/memory-core/src/memory/manager-embedding-policy.ts:153, 64f9f3c278db)
  • Reported indexing path uses the shared classifier: Both plain text and structured memory embedding batch paths pass isSplittableMemoryEmbeddingTransportError into runMemoryEmbeddingBatchRetryWithSplit, so the classifier change reaches memory indexing instead of adding a CLI or provider-specific workaround. (extensions/memory-core/src/memory/manager-embedding-ops.ts:394, 64f9f3c278db)
  • Provider error shape reaches memory-core: OpenAI embeddings use fetchRemoteEmbeddingVectors with the openai embeddings failed prefix, and the shared postJson helper throws non-OK responses as ': '; the generic OpenAI-compatible provider similarly throws HTTP 431 response text from its /embeddings call. (packages/memory-host-sdk/src/host/post-json.ts:32, 64f9f3c278db)

Likely related people:

  • steipete: Commit history shows steipete added the memory embedding retry/split policy in 899dc5f and has repeated adjacent OpenAI/memory embedding provider work in the same surface. (role: feature owner and recent area contributor; confidence: high; commits: 899dc5f2486b, 9e2bd8b2f7eb, 77e6e4cf87f7; files: extensions/memory-core/src/memory/manager-embedding-policy.ts, extensions/memory-core/src/memory/manager-embedding-ops.ts, extensions/openai/embedding-provider.ts)
  • dreamhunter2333: Recent GitHub commit history shows dreamhunter2333 touched the memory embedding retry and cancellation path in 8d72cb9, including the same policy and ops files. (role: recent adjacent contributor; confidence: medium; commits: 8d72cb9401e5; files: extensions/memory-core/src/memory/manager-embedding-policy.ts, extensions/memory-core/src/memory/manager-embedding-ops.ts)
  • mushuiyu886: Beyond authoring this PR, mushuiyu886 has prior merged history on large memory embedding batching in a36e050, which is adjacent to the bulk-import behavior being fixed. (role: recent adjacent contributor; confidence: medium; commits: a36e05050a9d, 1787f9d39660; files: extensions/memory-core/src/memory/manager-embedding-ops.ts, extensions/memory-core/src/memory/manager-embedding-policy.ts, extensions/memory-core/src/memory/manager-embedding-policy.test.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: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. labels Jun 13, 2026
@mushuiyu886

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Added real behavior proof to the PR body: a real openclaw memory index --agent main --force --verbose run against a local OpenAI-compatible /v1/embeddings endpoint, with 66 synthetic 431 responses, production splitter log lines, 134 successful split requests, and Memory index updated (main) with exit status 0.

@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 13, 2026
@vincentkoc vincentkoc self-assigned this Jun 13, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 13, 2026

@vincentkoc vincentkoc left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maintainer review passed. I tightened the classifier before merge so only explicit OpenAI/header-too-large wording is splittable; a bare standalone 431 no longer fans out unrelated provider errors.

Verification:

  • Local: node scripts/run-vitest.mjs extensions/memory-core/src/memory/manager-embedding-policy.test.ts --maxWorkers=1
  • Local: node_modules/.bin/oxfmt --check --threads=1 extensions/memory-core/src/memory/manager-embedding-policy.ts extensions/memory-core/src/memory/manager-embedding-policy.test.ts
  • Local: git diff --check
  • Autoreview: clean after tightening the false-positive path.
  • Crabbox AWS: cbx_2ebd31b02123 / amber-hermit, run run_ab6ede5d054c; focused memory policy test plus OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 CI=1 corepack pnpm check:changed passed.
  • GitHub exact-head CI: c9d571e7b15248cd3947ff38dfec05d9002b55fc passed with 126 successful and 25 skipped checks.

Proof gap: I did not run a paid live OpenAI import because no OpenAI API key is present in this environment. For this narrow classifier fix, the OpenAI SDK request shape plus the real OpenAI-compatible CLI proof in the PR body cover the production path sufficiently.

@vincentkoc
vincentkoc merged commit 47112fc into openclaw:main Jun 13, 2026
155 of 156 checks passed
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jun 16, 2026
…26.6.8) (#1144)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.6.6` → `2026.6.8` |

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.6.8`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202668)

[Compare Source](openclaw/openclaw@v2026.6.6...v2026.6.8)

##### Highlights

- Telegram and WhatsApp channel delivery are richer and less brittle: Telegram can send structured rich text with tables, lists, expandable blockquotes, prompt-preserving CLI backend delivery, retired native draft migration, and safer rich-media boundaries, while WhatsApp now honors configured ACP bindings. ([#&#8203;92679](openclaw/openclaw#92679), [#&#8203;84082](openclaw/openclaw#84082), [#&#8203;89421](openclaw/openclaw#89421), [#&#8203;92513](openclaw/openclaw#92513)) Thanks [@&#8203;obviyus](https://github.com/obviyus), [@&#8203;jzakirov](https://github.com/jzakirov), [@&#8203;spacegeologist](https://github.com/spacegeologist), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Agent and Gateway recovery is sharper across account-scoped DM sends, generated media completions, restart shutdown aborts, yielded subagent pauses, yielded cron media, heartbeat dedupe, session identity prompts, and unknown OpenAI agent selector rejection. ([#&#8203;92788](openclaw/openclaw#92788), [#&#8203;91246](openclaw/openclaw#91246), [#&#8203;91357](openclaw/openclaw#91357), [#&#8203;92631](openclaw/openclaw#92631), [#&#8203;92146](openclaw/openclaw#92146), [#&#8203;91287](openclaw/openclaw#91287), [#&#8203;92468](openclaw/openclaw#92468), [#&#8203;92510](openclaw/openclaw#92510)) Thanks [@&#8203;yetval](https://github.com/yetval), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;ooiuuii](https://github.com/ooiuuii), [@&#8203;openperf](https://github.com/openperf), [@&#8203;IWhatsskill](https://github.com/IWhatsskill), [@&#8203;ZengWen-DT](https://github.com/ZengWen-DT), and [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Provider/model handling expands and tightens with GLM-5.2, Claude Haiku 4.5 catalog rows, OpenRouter and Google Vertex provider-prefix normalization, managed SecretRef auth, bounded model browse discovery, storeless OpenAI Responses replay gating, and Claude 4.5 Copilot tool-streaming safety. ([#&#8203;92796](openclaw/openclaw#92796), [#&#8203;90116](openclaw/openclaw#90116), [#&#8203;92627](openclaw/openclaw#92627), [#&#8203;91218](openclaw/openclaw#91218), [#&#8203;90686](openclaw/openclaw#90686), [#&#8203;92247](openclaw/openclaw#92247), [#&#8203;90706](openclaw/openclaw#90706), [#&#8203;75393](openclaw/openclaw#75393)) Thanks [@&#8203;arkyu2077](https://github.com/arkyu2077), [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;bymle](https://github.com/bymle), [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi), [@&#8203;samson910022](https://github.com/samson910022), [@&#8203;snowzlm](https://github.com/snowzlm), and [@&#8203;Kailigithub](https://github.com/Kailigithub).
- `/usage` and reply payload hooks now have a native full footer renderer, default template, fixed-decimal formatting, credential-aware limits, better partial-count handling, and warnings for broken templates instead of silent bad output. ([#&#8203;92657](openclaw/openclaw#92657), [#&#8203;89835](openclaw/openclaw#89835), [#&#8203;89629](openclaw/openclaw#89629)) Thanks [@&#8203;Marvinthebored](https://github.com/Marvinthebored).
- UI and mobile flows are steadier: workspace files can collapse and start collapsed, WebChat backscroll survives streaming, the sidebar session picker remains interactive above the desktop workbench, reset soft args survive UI dispatch, stale dashboard session parent lineage is preserved, and iOS reconnects stale foreground gateways. ([#&#8203;92779](openclaw/openclaw#92779), [#&#8203;92622](openclaw/openclaw#92622), [#&#8203;92705](openclaw/openclaw#92705), [#&#8203;91353](openclaw/openclaw#91353), [#&#8203;90658](openclaw/openclaw#90658), [#&#8203;92552](openclaw/openclaw#92552)) Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;NianJiuZst](https://github.com/NianJiuZst), [@&#8203;zhouhe-xydt](https://github.com/zhouhe-xydt), [@&#8203;luoyanglang](https://github.com/luoyanglang), and [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin).
- Memory, state, and diagnostics recover cleaner: oversized OpenAI embedding batches split before 431s, QMD memory search stays available in transient mode, SQLite avoids WAL on NFS state volumes, stuck-session recovery scheduling no longer resets warning backoff, and Infinity chunk limits stay genuinely unbounded. ([#&#8203;92650](openclaw/openclaw#92650), [#&#8203;92618](openclaw/openclaw#92618), [#&#8203;92639](openclaw/openclaw#92639), [#&#8203;91247](openclaw/openclaw#91247), [#&#8203;92752](openclaw/openclaw#92752), [#&#8203;92735](openclaw/openclaw#92735)) Thanks [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;849261680](https://github.com/849261680), [@&#8203;gnanam1990](https://github.com/gnanam1990), and [@&#8203;yhterrance](https://github.com/yhterrance).

##### Changes

- Providers/models: add GLM-5.2 support and Claude Haiku 4.5 catalog entries while keeping provider-qualified model IDs normalized across OpenRouter and Google Vertex paths. ([#&#8203;92796](openclaw/openclaw#92796), [#&#8203;90116](openclaw/openclaw#90116), [#&#8203;92627](openclaw/openclaw#92627), [#&#8203;91218](openclaw/openclaw#91218)) Thanks [@&#8203;arkyu2077](https://github.com/arkyu2077), [@&#8203;liuhao1024](https://github.com/liuhao1024), and [@&#8203;bymle](https://github.com/bymle).
- Channel plugins: ship Telegram rich-message delivery and WhatsApp ACP binding support, including rich prompt handoff to CLI backends and transport fixtures for richer drafts. ([#&#8203;92679](openclaw/openclaw#92679), [#&#8203;92513](openclaw/openclaw#92513)) Thanks [@&#8203;obviyus](https://github.com/obviyus) and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Agent commands: support `/btw` in CLI-backed sessions and keep CLI usage-error exits classified as usage failures instead of successful runs. ([#&#8203;92669](openclaw/openclaw#92669), [#&#8203;92162](openclaw/openclaw#92162)) Thanks [@&#8203;joshavant](https://github.com/joshavant) and [@&#8203;Pandah97](https://github.com/Pandah97).
- Usage hooks: add built-in full footer rendering, default footer templates, per-turn usage state, credential-aware limits, and fixed-decimal formatting for usage-bar templates. ([#&#8203;92657](openclaw/openclaw#92657), [#&#8203;89835](openclaw/openclaw#89835), [#&#8203;89629](openclaw/openclaw#89629)) Thanks [@&#8203;Marvinthebored](https://github.com/Marvinthebored).
- Docs and operator guidance: document node config examples, clarify before-install hook scope, correct agent default concurrency comments, refresh ZAI provider docs, and update channel/group docs for current Telegram and WhatsApp behavior. ([#&#8203;92677](openclaw/openclaw#92677), [#&#8203;92766](openclaw/openclaw#92766), [#&#8203;92695](openclaw/openclaw#92695)) Thanks [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;sallyom](https://github.com/sallyom), and [@&#8203;ArielSmoliar](https://github.com/ArielSmoliar).

##### Fixes

- Onboarding/skills: show the Homebrew install recommendation only on macOS and Linux, so FreeBSD and other unsupported platforms no longer get a misleading brew prompt. Fixes [#&#8203;68893](openclaw/openclaw#68893); carries forward [#&#8203;68894](openclaw/openclaw#68894), [#&#8203;68910](openclaw/openclaw#68910), [#&#8203;68941](openclaw/openclaw#68941), [#&#8203;68943](openclaw/openclaw#68943), [#&#8203;69002](openclaw/openclaw#69002), and [#&#8203;69545](openclaw/openclaw#69545). Thanks [@&#8203;yurivict](https://github.com/yurivict), [@&#8203;Sanjays2402](https://github.com/Sanjays2402), [@&#8203;Eruditi](https://github.com/Eruditi), [@&#8203;JustInCache](https://github.com/JustInCache), [@&#8203;nnish16](https://github.com/nnish16), and [@&#8203;Mlightsnow](https://github.com/Mlightsnow).
- Channels and delivery: preserve account-scoped DM channel send policy, rich Telegram final replies, rich Telegram tables and lists, Telegram thread-create CLI remapping, Slack outbound `message_sent` hooks, contributed message-tool schema optionality, same-channel generated media completions, and channel chunking around surrogate pairs and Infinity limits. ([#&#8203;92788](openclaw/openclaw#92788), [#&#8203;92679](openclaw/openclaw#92679), [#&#8203;89421](openclaw/openclaw#89421), [#&#8203;89943](openclaw/openclaw#89943), [#&#8203;91137](openclaw/openclaw#91137), [#&#8203;91246](openclaw/openclaw#91246), [#&#8203;92735](openclaw/openclaw#92735)) Thanks [@&#8203;yetval](https://github.com/yetval), [@&#8203;obviyus](https://github.com/obviyus), [@&#8203;spacegeologist](https://github.com/spacegeologist), [@&#8203;rishitamrakar](https://github.com/rishitamrakar), [@&#8203;lundog](https://github.com/lundog), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), and [@&#8203;yhterrance](https://github.com/yhterrance).
- Auto-reply/groups: keep ordinary group text replies on automatic final-reply delivery while allowing `message(action=send)` for files, images, and other attachments to the same group or topic. Carries forward [#&#8203;43276](openclaw/openclaw#43276); refs [#&#8203;48004](openclaw/openclaw#48004). Thanks [@&#8203;NayukiChiba](https://github.com/NayukiChiba) and [@&#8203;ShakaRover](https://github.com/ShakaRover).
- Auto-reply/skills: preserve multiline payloads for `/skill` and direct skill slash commands while keeping command-head normalization for aliases, colon syntax, and bot mentions. Fixes [#&#8203;79155](openclaw/openclaw#79155); carries forward [#&#8203;81305](openclaw/openclaw#81305). Thanks [@&#8203;web3blind](https://github.com/web3blind).
- iMessage: normalize leading NUL sent-message echo prefixes while preserving interior NUL bytes and the leading attributedBody marker handling from [#&#8203;73942](openclaw/openclaw#73942). Carries forward [#&#8203;63581](openclaw/openclaw#63581). Thanks [@&#8203;drvoss](https://github.com/drvoss).
- Discord: give generated auto-thread titles a 60-second timeout and 4,096-token reasoning-model output budget, clamped to the selected model output cap. ([#&#8203;64734](openclaw/openclaw#64734)) Thanks [@&#8203;hanamizuki](https://github.com/hanamizuki).
- Agent, cron, and Gateway runtime: mark active main sessions before restart shutdown aborts, pause yielded subagent runs whose terminal also signals abort, preserve yielded media completions, de-duplicate main-session heartbeat events, expose session identity in runtime prompts, reject unknown OpenAI agent selectors, keep generated media completions and slash-command block replies in WebChat, preserve fresh post-compaction usage while clearing stale usage snapshots, and require admin privileges for HTTP session/model override surfaces. ([#&#8203;91357](openclaw/openclaw#91357), [#&#8203;92631](openclaw/openclaw#92631), [#&#8203;92146](openclaw/openclaw#92146), [#&#8203;91287](openclaw/openclaw#91287), [#&#8203;92468](openclaw/openclaw#92468), [#&#8203;92510](openclaw/openclaw#92510), [#&#8203;91246](openclaw/openclaw#91246), [#&#8203;50795](openclaw/openclaw#50795), [#&#8203;50845](openclaw/openclaw#50845), [#&#8203;82874](openclaw/openclaw#82874), [#&#8203;92651](openclaw/openclaw#92651), [#&#8203;92646](openclaw/openclaw#92646)) Thanks [@&#8203;ooiuuii](https://github.com/ooiuuii), [@&#8203;openperf](https://github.com/openperf), [@&#8203;IWhatsskill](https://github.com/IWhatsskill), [@&#8203;ZengWen-DT](https://github.com/ZengWen-DT), [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt), [@&#8203;Hollychou924](https://github.com/Hollychou924), [@&#8203;leno23](https://github.com/leno23), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Agents/exec: default empty-success background completion notices on only for real chat channels, preserving explicit opt-outs and keeping generic providers silent while carrying forward the narrow UX intent from [#&#8203;39726](openclaw/openclaw#39726) and [#&#8203;46926](openclaw/openclaw#46926). Thanks [@&#8203;Sapientropic](https://github.com/Sapientropic) and [@&#8203;wenkang-xie](https://github.com/wenkang-xie).
- Providers and model replay: preserve storeless OpenAI Responses replay compatibility, avoid eager tool streaming for Claude 4.5 in Copilot, honor profile auth for SecretRef model entries, bound model browsing, strip provider prefixes where runtimes need bare IDs, and surface nested embedding fetch failures. ([#&#8203;90706](openclaw/openclaw#90706), [#&#8203;75393](openclaw/openclaw#75393), [#&#8203;90686](openclaw/openclaw#90686), [#&#8203;92247](openclaw/openclaw#92247), [#&#8203;92627](openclaw/openclaw#92627), [#&#8203;91218](openclaw/openclaw#91218), [#&#8203;92628](openclaw/openclaw#92628)) Thanks [@&#8203;snowzlm](https://github.com/snowzlm), [@&#8203;Kailigithub](https://github.com/Kailigithub), [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi), [@&#8203;samson910022](https://github.com/samson910022), [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;bymle](https://github.com/bymle), and [@&#8203;mushuiyu886](https://github.com/mushuiyu886).
- Memory, state, diagnostics, and config: split header-too-large embedding batches, keep QMD memory search enabled in transient mode, avoid SQLite WAL on NFS volumes, preserve recovery scheduling outside stuck-session warning backoff, and keep shell environment fallbacks contained in config write tests. ([#&#8203;92650](openclaw/openclaw#92650), [#&#8203;92618](openclaw/openclaw#92618), [#&#8203;92639](openclaw/openclaw#92639), [#&#8203;91247](openclaw/openclaw#91247), [#&#8203;92752](openclaw/openclaw#92752)) Thanks [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;849261680](https://github.com/849261680), and [@&#8203;gnanam1990](https://github.com/gnanam1990).
- Workspace setup state: store setup completion outside the workspace dot directory using an OpenClaw-named root file, migrate valid legacy state forward, and avoid clobbering generic root `workspace-state.json` files for TigerFS-style dot-path compatibility. This Clownfish replacement carries forward the focused [#&#8203;53326](openclaw/openclaw#53326) fix idea because the original branch was closed and uneditable. ([#&#8203;53326](openclaw/openclaw#53326), [#&#8203;44783](openclaw/openclaw#44783), [#&#8203;39446](openclaw/openclaw#39446)) Thanks [@&#8203;1qh](https://github.com/1qh).
- UI/mobile/TUI: preserve dashboard session parent lineage, WebChat backscroll, reset soft command args, sidebar session picker interactivity, collapsed workspace files, resolved `/model` confirmation refs, and stale foreground iOS Gateway reconnects. ([#&#8203;90658](openclaw/openclaw#90658), [#&#8203;92622](openclaw/openclaw#92622), [#&#8203;91353](openclaw/openclaw#91353), [#&#8203;92705](openclaw/openclaw#92705), [#&#8203;92779](openclaw/openclaw#92779), [#&#8203;92773](openclaw/openclaw#92773), [#&#8203;92552](openclaw/openclaw#92552)) Thanks [@&#8203;luoyanglang](https://github.com/luoyanglang), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;zhouhe-xydt](https://github.com/zhouhe-xydt), [@&#8203;NianJiuZst](https://github.com/NianJiuZst), [@&#8203;shakkernerd](https://github.com/shakkernerd), [@&#8203;NarahariRaghava](https://github.com/NarahariRaghava), and [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin).
- TUI: reload the active session after external `/new` or `/reset` session-change events so stale transcript and stream state clear promptly. Fixes [#&#8203;38966](openclaw/openclaw#38966); carries forward [#&#8203;40472](openclaw/openclaw#40472). Thanks [@&#8203;yizhanzjz](https://github.com/yizhanzjz) and [@&#8203;wsyjh8](https://github.com/wsyjh8).
- Control UI: preserve Gateway Access tokens during same-normalized WebSocket URL edits and reload gateway-scoped tokens when switching endpoints. Fixes [#&#8203;41545](openclaw/openclaw#41545); repairs [#&#8203;42001](openclaw/openclaw#42001) with additional source PRs [#&#8203;41546](openclaw/openclaw#41546), [#&#8203;41552](openclaw/openclaw#41552), and [#&#8203;41718](openclaw/openclaw#41718). Thanks [@&#8203;wsyjh8](https://github.com/wsyjh8), [@&#8203;llagy0020](https://github.com/llagy0020), [@&#8203;llagy007](https://github.com/llagy007), [@&#8203;pingfanfan](https://github.com/pingfanfan), and [@&#8203;zheliu2](https://github.com/zheliu2).
- Gateway CLI: tolerate a single transient clean WebSocket close before `hello-ok` so one-shot RPC calls reconnect instead of failing noisily, while repeated clean pre-hello closes still surface. Carries forward source PRs [#&#8203;54475](openclaw/openclaw#54475) and [#&#8203;54774](openclaw/openclaw#54774); [#&#8203;85253](openclaw/openclaw#85253) covered adjacent connect assembly diagnostics. Thanks [@&#8203;ruanrrn](https://github.com/ruanrrn).
- Gateway/Linux: keep root-owned systemd user service lifecycle commands on root's user manager when a stale `SUDO_USER` remains in a root shell with root's user bus environment. Fixes [#&#8203;81410](openclaw/openclaw#81410). Thanks [@&#8203;Ericksza](https://github.com/Ericksza) and [@&#8203;ChuckClose-tech](https://github.com/ChuckClose-tech).
- Release and test reliability: extend slow Gateway/full-suite watchdogs, split local full-suite shards when throttled, stabilize plugin auth marker fixtures, avoid brittle provider-ref error text, and keep QA Lab bootstrap selection assertions aligned with flow-only scenarios. ([#&#8203;92652](openclaw/openclaw#92652))
- macOS Peekaboo bridge: update the embedded Peekaboo package to 3.5.2 and route bundled-skill CLI commands through the OpenClaw app bridge so they inherit its Screen Recording and Accessibility grants.
- Agent routing: route subagent RPC callbacks addressed to an agent-shaped `--to` target to the correct session key instead of falling back to the main session, so WeChat (and other channel) session-key callbacks reach the intended subagent session. ([#&#8203;90231](openclaw/openclaw#90231)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Cron: preserve model, fallback, thinking, timeout, light-context, unsafe-content, and tool allow-list overrides on implicit text payloads by promoting them to agent turns, while explicit system events still prune those fields. Fixes [#&#8203;28905](openclaw/openclaw#28905); carries forward [#&#8203;64060](openclaw/openclaw#64060) and [#&#8203;73946](openclaw/openclaw#73946). Thanks [@&#8203;liaoandi](https://github.com/liaoandi).
- QQBot delivery: keep markdown table chunks self-contained across message boundaries by preserving table state across block deliveries, flushing unfinished table-row fragments as plain text, and detecting short pipe-terminated rows by column count so split rows are not sent as malformed markdown. ([#&#8203;92428](openclaw/openclaw#92428)) Thanks [@&#8203;sliverp](https://github.com/sliverp).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/1144
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

extensions: memory-core Extension: memory-core P2 Normal backlog priority with limited blast radius. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: XS status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bulk memory import can hit OpenAI 431; chunked indexing avoids it

2 participants