Skip to content

fix: guard MCP HTTP redirects [AI]#89732

Merged
pgondhi987 merged 2 commits into
openclaw:mainfrom
pgondhi987:fix/fix-715
Jun 4, 2026
Merged

fix: guard MCP HTTP redirects [AI]#89732
pgondhi987 merged 2 commits into
openclaw:mainfrom
pgondhi987:fix/fix-715

Conversation

@pgondhi987

Copy link
Copy Markdown
Contributor

Summary

  • Routes MCP HTTP, SSE, and Streamable HTTP requests through the shared SSRF-guarded fetch path.
  • Keeps operator-configured MCP origin trust scoped to the configured origin, while redirect hops are re-evaluated independently.
  • Preserves MCP header behavior and same-origin TLS/client-certificate options, without keeping the duplicate Streamable HTTP redirect loop.
  • Out of scope: changing MCP configuration shape, OAuth flow behavior, provider routing, plugin APIs, or global network proxy policy.

Reviewers should focus on redirect behavior, exact-origin trust boundaries, dispatcher cleanup, and the per-hop dispatcher policy path in fetchWithSsrFGuard.

Linked context

Private maintainer security tracking; no public issue is linked from this PR.

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: MCP HTTP redirects now go through the shared SSRF guard, so redirect targets are checked per hop instead of inheriting trust from the configured MCP URL.
  • Real environment tested: Local OpenClaw source checkout on Node 24.15.0; no live external MCP server was used.
  • Exact steps or command run after this patch: node scripts/run-vitest.mjs src/agents/mcp-transport.test.ts src/agents/mcp-http-fetch.test.ts src/infra/net/fetch-guard.ssrf.test.ts
  • Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output): Vitest passed 2 shards; src/infra/net/fetch-guard.ssrf.test.ts passed 85 tests and MCP transport/fetch tests passed 12 tests.
  • Observed result after fix: A Streamable HTTP redirect to 169.254.169.254 is rejected before the redirected request is sent.
  • What was not tested: A live external MCP server redirect flow was not exercised locally.
  • Proof limitations or environment constraints: Validation used mocked DNS and HTTP fetches for deterministic SSRF regression coverage.
  • Before evidence (optional but encouraged): Existing Streamable HTTP redirect tests only asserted manual redirect following and header scrubbing; they did not cover SSRF blocking on redirected targets.

Tests and validation

Commands run:

  • pnpm exec oxfmt --write --threads=1 src/agents/mcp-http-fetch.ts src/agents/mcp-transport.ts src/infra/net/fetch-guard.ts src/agents/mcp-transport.test.ts src/agents/mcp-http-fetch.test.ts
  • node scripts/run-vitest.mjs src/agents/mcp-transport.test.ts src/agents/mcp-http-fetch.test.ts src/infra/net/fetch-guard.ssrf.test.ts
  • node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.test.src.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/test-src.tsbuildinfo
  • git diff --check origin/main...HEAD

Regression coverage added:

  • Streamable HTTP redirect to a private/link-local target is blocked before the second fetch.
  • MCP TLS override scoping still keeps custom TLS options on the configured MCP origin only.
  • Shared fetch guard redirect loop detection now accounts for the rewritten request method.

Risk checklist

Did user-visible behavior change? (Yes/No)

Yes. MCP HTTP redirects to blocked private/internal/special-use targets now fail instead of being followed.

Did config, environment, or migration behavior change? (Yes/No)

No.

Did security, auth, secrets, network, or tool execution behavior change? (Yes/No)

Yes. Network egress for MCP HTTP transports now uses the shared SSRF guard and per-hop redirect checks.

What is the highest-risk area?

MCP servers that relied on redirects to private/internal destinations outside the configured MCP origin may now fail.

How is that risk mitigated?

The configured MCP origin still receives exact-origin trust, TLS overrides stay scoped to that origin, and redirect behavior is covered by focused MCP and shared fetch-guard tests.

Current review state

What is the next action?

Await maintainer review, automated checks, review-pr, autoreview, and the advisory gate.

What is still waiting on author, maintainer, CI, or external proof?

GitHub Actions and post-PR review gates are still pending.

Which bot or reviewer comments were addressed?

None yet.

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: M maintainer Maintainer-authored PR labels Jun 3, 2026
@clawsweeper

clawsweeper Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 4, 2026, 2:42 AM ET / 06:42 UTC.

Summary
The PR routes MCP HTTP/SSE/Streamable HTTP fetches through shared SSRF-guarded redirect handling, removes the Streamable-specific redirect loop, and adds focused MCP/fetch-guard regression tests.

PR surface: Source -7, Tests +120. Total +113 across 5 files.

Reproducibility: yes. at source level: current main's Streamable redirect follower follows redirect targets through the MCP fetch helper outside fetchWithSsrFGuard. The PR tests and supplied local HTTP proof cover the private-target redirect being blocked before the second request.

Review metrics: 2 noteworthy metrics.

  • MCP redirect trust change: 1 duplicate redirect loop removed; shared guard now owns MCP HTTP redirects. Maintainers should notice that redirect behavior is centralized instead of preserving the old Streamable-specific path.
  • Config and migration surface: 0 added, 0 changed, 0 migrations. The private-redirect block is unconditional, so compatibility acceptance cannot be deferred to an operator setting.

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] MCP servers that intentionally relied on redirects from the configured MCP origin to private, link-local, or internal targets will now fail; that is likely the desired security posture, but it is still an upgrade-visible compatibility break.
  • [P1] The patch changes a security boundary in core network egress, so maintainer/advisory approval should own the final accept-risk decision even though the source review found no concrete patch defect.
  • [P1] The proof covers deterministic tests and a local live HTTP redirect setup, but not a live third-party MCP/OAuth server redirect flow.

Maintainer options:

  1. Land after security approval (recommended)
    Accept the intentional fail-closed compatibility break once the maintainer/advisory gate confirms private redirect targets should be blocked by default.
  2. Add an explicit exception path
    If maintainers decide some private redirect workflows are supported, add a narrowly documented and tested opt-in rather than weakening the default guard.
  3. Pause if advisory scope changes
    If the private tracking issue requires live external MCP/OAuth proof or a different trust boundary, pause this branch until that requirement is explicit.

Next step before merge

  • No automated repair is indicated; the remaining action is maintainer/security review of the intentional fail-closed redirect behavior and private advisory gate.

Security
Cleared: The diff is security-sensitive and changes MCP network egress, but source/dependency review found no concrete security or supply-chain regression in the patch.

Review details

Best possible solution:

Land the shared guarded-fetch hardening after maintainer/advisory approval accepts the intentional fail-closed MCP redirect behavior, without adding a compatibility escape hatch unless owners explicitly request one.

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

Yes at source level: current main's Streamable redirect follower follows redirect targets through the MCP fetch helper outside fetchWithSsrFGuard. The PR tests and supplied local HTTP proof cover the private-target redirect being blocked before the second request.

Is this the best way to solve the issue?

Yes, this is the best fix shape: the MCP SDK calls OpenClaw's supplied fetch for Streamable and SSE network requests, so moving redirect handling into the shared SSRF guard removes duplicate policy. The remaining question is maintainer acceptance of the intentional compatibility break.

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against ea6d3a35ff01.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The contributor supplied after-fix local HTTP-server redirect proof plus focused tests, and the reviewed head has identical changed files to the proofed head.
  • 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 (live_output): The contributor supplied after-fix local HTTP-server redirect proof plus focused tests, and the reviewed head has identical changed files to the proofed head.
  • remove rating: 🌊 off-meta tidepool: Current PR rating is rating: 🦞 diamond lobster, so this older rating label is no longer current.

Label justifications:

  • P0: The PR addresses an SSRF/network egress security boundary where MCP redirects could reach private or metadata targets.
  • merge-risk: 🚨 compatibility: Existing MCP servers that redirect to private/internal destinations can stop working after this fail-closed behavior lands.
  • merge-risk: 🚨 security-boundary: The diff changes the core guarded-fetch path that decides which redirected network targets MCP HTTP transports may reach.
  • 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 (live_output): The contributor supplied after-fix local HTTP-server redirect proof plus focused tests, and the reviewed head has identical changed files to the proofed head.
  • proof: sufficient: Contributor real behavior proof is sufficient. The contributor supplied after-fix local HTTP-server redirect proof plus focused tests, and the reviewed head has identical changed files to the proofed head.
Evidence reviewed

PR surface:

Source -7, Tests +120. Total +113 across 5 files.

View PR surface stats
Area Files Added Removed Net
Source 3 153 160 -7
Tests 2 130 10 +120
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 5 283 170 +113

What I checked:

  • Current main behavior: Current main keeps a Streamable HTTP-specific redirect follower in resolveMcpTransport; it manually follows redirect locations through the MCP fetch helper rather than the shared SSRF guard. (src/agents/mcp-transport.ts:125, ea6d3a35ff01)
  • Current main fetch helper: Current main's buildMcpHttpFetch only adds optional TLS/client-cert dispatcher behavior and otherwise calls undici fetch directly; it does not call fetchWithSsrFGuard. (src/agents/mcp-http-fetch.ts:15, ea6d3a35ff01)
  • PR guarded MCP fetch path: The PR builds MCP guarded fetch options with a 20-hop redirect cap, per-origin SSRF policy, unsafe replay preservation for MCP redirect compatibility, and managed response cleanup around the guard release. (src/agents/mcp-http-fetch.ts:139, 514e618386b5)
  • PR removes duplicate redirect loop: The PR passes the shared httpFetch directly to StreamableHTTPClientTransport, deleting the local Streamable redirect loop from current main. (src/agents/mcp-transport.ts:139, 514e618386b5)
  • Per-hop guard behavior: The PR re-resolves SSRF policy and dispatcher policy inside the redirect loop, only uses env proxy when eligible, and keys redirect loop detection on the rewritten method plus URL. (src/infra/net/fetch-guard.ts:485, 514e618386b5)
  • Regression coverage: The PR adds Streamable HTTP coverage proving a redirect to 169.254.169.254 is rejected before a second fetch occurs. (src/agents/mcp-transport.test.ts:129, 514e618386b5)

Likely related people:

  • steipete: Recent main history shows MCP operator workflow work and shared runtime helper updates, and current-main blame attributes the MCP redirect and fetch-guard areas to Peter Steinberger. (role: recent area contributor; confidence: high; commits: 38d3d11cbc0c, 6439b64c90e2, ea6d3a35ff01; files: src/agents/mcp-transport.ts, src/agents/mcp-http-fetch.ts, src/infra/net/fetch-guard.ts)
  • pgondhi987: Prior merged history includes Streamable MCP redirect header scrubbing and pinned DNS guarded-fetch hardening, and this PR continues that exact MCP/network-security surface. (role: adjacent security contributor; confidence: high; commits: 47eb2d48d434, 9497629c1e89, 514e618386b5; files: src/agents/mcp-transport.ts, src/infra/net/fetch-guard.ts, src/agents/mcp-http-fetch.ts)
  • Kaspre: Recent shared SSRF policy history includes exact-origin trust and managed proxy bypass hardening that this PR builds on. (role: adjacent SSRF policy contributor; confidence: medium; commits: 44840007d42d, fd2a9adbe6b0; files: src/infra/net/fetch-guard.ts, src/infra/net/ssrf.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. P0 Emergency: data loss, security bypass, crash loop, or unusable core runtime. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels Jun 3, 2026
@pgondhi987

Copy link
Copy Markdown
Contributor Author

Verification for head 632954c8b3f2fa9bd66483678cd4ce30e22e6a7d.

Behavior covered:

  • src/agents/mcp-transport.ts no longer has the Streamable HTTP-specific manual redirect follower; Streamable HTTP now uses the shared MCP HTTP fetch.
  • src/agents/mcp-http-fetch.ts routes MCP HTTP requests through fetchWithSsrFGuard with the MCP resource-origin policy, the existing 20-hop redirect cap, cross-origin unsafe redirect replay where required by MCP behavior, env-proxy preservation, and same-origin TLS/client-cert dispatcher scoping.
  • src/infra/net/fetch-guard.ts re-resolves SSRF policy, pinned hostname, dispatcher policy, and env-proxy eligibility for each redirect hop before the redirected request is sent.

Real behavior proof:

  • Ran a live local Node proof with actual HTTP servers: one MCP-origin server returned 302 Location: http://127.0.0.2:<port>/metadata; a second private loopback server counted any redirected request.
  • Observed result: guard rejected the redirect with Blocked hostname or private/internal/special-use IP address; redirectHits: 1, blockedHits: 0. The redirected private target was not requested.

Local validation:

  • node scripts/run-vitest.mjs src/agents/mcp-transport.test.ts src/agents/mcp-http-fetch.test.ts src/infra/net/fetch-guard.ssrf.test.ts passed: 3 files, 100 tests.
  • node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo passed.
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.test.src.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/test-src.tsbuildinfo passed.
  • git diff --check origin/main...HEAD passed.

Review gates:

  • review-pr: passed, READY FOR /prepare-pr, zero findings; artifacts validated under the canonical .worktrees/pr-89732/.local review worktree.
  • autoreview: passed with timeout 1800 .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main; result was autoreview clean: no accepted/actionable findings reported.

GHSA gates:

Merge/CI:

  • Conflict gate passed: GitHub reports MERGEABLE / CLEAN for this head.
  • GitHub CI statusCheckRollup completed with no failed or pending relevant checks; skipped/neutral checks only where expected.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed 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. labels Jun 3, 2026
@openclaw-barnacle openclaw-barnacle Bot added channel: discord Channel integration: discord channel: whatsapp-web Channel integration: whatsapp-web gateway Gateway runtime scripts Repository scripts size: L and removed size: M labels Jun 4, 2026
@clawsweeper clawsweeper Bot added rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 4, 2026
@pgondhi987

Copy link
Copy Markdown
Contributor Author

Verification for head 6f3fec59eec524f245614e13fde2a7fba79d958f.

Behavior covered:

  • MCP Streamable HTTP no longer uses the bespoke redirect-following helper; it now uses the shared MCP HTTP fetch path.
  • MCP HTTP redirects are evaluated through the shared guarded fetch path before each redirected request, including private/link-local target blocking, env-proxy eligibility, same-origin TLS/client-cert dispatcher scoping, cross-origin header scrubbing, and redirect loop/method handling.
  • The PR remains mergeable against main and has no actionable inline or completed bot feedback at this head.

Verification run:

  • GHSA dry-run: PASS at this head.
  • review-pr: READY FOR /prepare-pr, zero findings; artifacts validated under canonical .worktrees/pr-89732/.local.
  • autoreview: clean, no accepted/actionable findings; one unrelated out-of-scope Parallels helper finding was ignored by the helper.
  • Local validation: node scripts/run-vitest.mjs src/agents/mcp-transport.test.ts src/agents/mcp-http-fetch.test.ts src/infra/net/fetch-guard.ssrf.test.ts; node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo; node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.test.src.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/test-src.tsbuildinfo; git diff --check origin/main...HEAD.
  • GitHub CI: no pending or failing relevant checks in statusCheckRollup; only cancelled/skipped/neutral non-blocking entries remain.
  • Final security gate: PASS at this head.

Known proof gap: no live external MCP server was exercised in this final pass; the redirect behavior is covered by focused deterministic HTTP/DNS tests.

@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. labels Jun 4, 2026
@clawsweeper clawsweeper Bot removed the status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. label Jun 4, 2026
@openclaw-barnacle openclaw-barnacle Bot added size: M and removed channel: discord Channel integration: discord channel: whatsapp-web Channel integration: whatsapp-web gateway Gateway runtime scripts Repository scripts size: L labels Jun 4, 2026
@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: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 4, 2026
@pgondhi987 pgondhi987 merged commit 3c6259e into openclaw:main Jun 4, 2026
2 checks passed
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 5, 2026
traoremp pushed a commit to traoremp/openclaw that referenced this pull request Jun 5, 2026
849261680 pushed a commit to 849261680/openclaw that referenced this pull request Jun 7, 2026
wangmiao0668000666 pushed a commit to wangmiao0668000666/openclaw that referenced this pull request Jun 9, 2026
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jun 9, 2026
…26.6.5) (#963)

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.1` → `2026.6.5` |

---

### Release Notes

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

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

[Compare Source](openclaw/openclaw@v2026.6.1...v2026.6.5)

##### Highlights

- QQBot now strips model reasoning/thinking scaffolding before native delivery, preventing raw `<thinking>` content from leaking into channel replies. ([#&#8203;89913](openclaw/openclaw#89913), [#&#8203;90132](openclaw/openclaw#90132)) Thanks [@&#8203;openperf](https://github.com/openperf).
- MCP tool results now coerce `resource_link`, `resource`, `audio`, malformed image, and future non-text/image blocks at the materialize boundary, preventing Anthropic 400s and poisoned session history after a tool returns richer MCP content. ([#&#8203;90710](openclaw/openclaw#90710), [#&#8203;90728](openclaw/openclaw#90728)) Thanks [@&#8203;RanSHammer](https://github.com/RanSHammer) and [@&#8203;849261680](https://github.com/849261680).
- Anthropic extended-thinking sessions recover after prompt-cache expiry or Gateway restart because stream start events wait for `message_start`, letting pre-generation signature errors trigger the existing recovery retry. ([#&#8203;90667](openclaw/openclaw#90667), [#&#8203;90697](openclaw/openclaw#90697)) Thanks [@&#8203;openperf](https://github.com/openperf).
- Parallel is now a bundled `web_search` provider with `PARALLEL_API_KEY` discovery, guarded endpoint handling, cache-safe session ids, onboarding picker support, and docs. ([#&#8203;85158](openclaw/openclaw#85158)) Thanks [@&#8203;NormallyGaussian](https://github.com/NormallyGaussian).
- Google Vertex ADC users get static catalog rows and runtime model resolution again, while single-provider cooldown recovery and memory adapter status checks are more reliable. ([#&#8203;90506](openclaw/openclaw#90506), [#&#8203;90609](openclaw/openclaw#90609), [#&#8203;90717](openclaw/openclaw#90717), [#&#8203;90816](openclaw/openclaw#90816)) Thanks [@&#8203;849261680](https://github.com/849261680).
- Matrix can preflight voice notes before mention gating, preserve thread reads/replies through Matrix relations pagination, and carry QA coverage for voice and thread flows. ([#&#8203;78016](openclaw/openclaw#78016), [#&#8203;90415](openclaw/openclaw#90415))
- Auth and plugin install state is more durable: auth profiles now live in SQLite, official npm plugin install records keep their trusted pins, and prerelease fallback integrity checks avoid carrying stale integrity forward. ([#&#8203;89102](openclaw/openclaw#89102), [#&#8203;88585](openclaw/openclaw#88585))
- macOS node mode no longer silently self-reconnects away from a healthy direct Gateway session, reducing unexpected companion app session churn. ([#&#8203;90668](openclaw/openclaw#90668), [#&#8203;90815](openclaw/openclaw#90815)) Thanks [@&#8203;vrurg](https://github.com/vrurg).
- Upgrade and service paths are safer: cron legacy JSON stores migrate during doctor preflight, service env placeholders no longer mask state-dir secrets, WhatsApp startup waits are bounded, and disabled WhatsApp accounts tear down on config reload. ([#&#8203;90072](openclaw/openclaw#90072), [#&#8203;90208](openclaw/openclaw#90208), [#&#8203;90277](openclaw/openclaw#90277), [#&#8203;90488](openclaw/openclaw#90488), [#&#8203;90486](openclaw/openclaw#90486), [#&#8203;87951](openclaw/openclaw#87951), [#&#8203;87965](openclaw/openclaw#87965)) Thanks [@&#8203;MonkeyLeeT](https://github.com/MonkeyLeeT), [@&#8203;sallyom](https://github.com/sallyom), [@&#8203;mcaxtr](https://github.com/mcaxtr), and [@&#8203;MukundaKatta](https://github.com/MukundaKatta).

##### Changes

- Search/providers: add the Parallel bundled web-search plugin, live provider tests, registration contracts, onboarding/docs wiring, and guarded `api.parallel.ai/v1/search` support. ([#&#8203;85158](openclaw/openclaw#85158)) Thanks [@&#8203;NormallyGaussian](https://github.com/NormallyGaussian).
- Matrix/channels: add voice-message preflight and thread-aware read/reply behavior, including Matrix QA scenario wiring and docs for voice-message behavior. ([#&#8203;78016](openclaw/openclaw#78016), [#&#8203;90415](openclaw/openclaw#90415))
- Skills/ClawHub: install ClawHub skills backed by GitHub repositories through the resolved install API, download the pinned GitHub commit, keep install-policy checks, and report install telemetry after success. ([#&#8203;90478](openclaw/openclaw#90478)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- Google Chat/channels: add native approval card actions and click handling so Google Chat approvals use platform-native cards instead of generic message flow.
- Mobile: Android provider/model screens now surface expiring, unavailable, unresolved, and attention states more clearly, while iOS settings and Talk tabs keep diagnostics, gateway rows, attachment labels, and unavailable Talk controls reachable.
- Memory: QMD search can use the new rerank toggle, and memory adapter status uses the resolved default model identity when checking plain status. ([#&#8203;61834](openclaw/openclaw#61834))
- Docs/tooling: add Parallel search docs, refresh weather-skill guidance toward `web_fetch`, clarify legacy `openai-codex` auth, document release/test helper scripts, and tighten changed-test routing docs for CI/debugging work. ([#&#8203;90028](openclaw/openclaw#90028), [#&#8203;90250](openclaw/openclaw#90250)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Release/process: switch release trains to `YYYY.M.PATCH` monthly patch numbering, keep pre-transition tags compatible, and pin the June 2026 floor at `2026.6.5` after the published beta.
- Platform maintenance: refresh Android, Swift/macOS, Docker, CodeQL, Buildx, Docker build/push, and Codex Action dependencies for this release train. ([#&#8203;74980](openclaw/openclaw#74980), [#&#8203;81757](openclaw/openclaw#81757), [#&#8203;86481](openclaw/openclaw#86481), [#&#8203;86483](openclaw/openclaw#86483), [#&#8203;90601](openclaw/openclaw#90601))
- QQBot: add `/bot-group-allways on|off` slash command (with named-account and default-account support) to toggle whether group messages require an `@mention` before the bot replies, and clear the runtime config snapshot after the write so the new account-level `defaultRequireMention` takes effect immediately without restart. ([#&#8203;91423](openclaw/openclaw#91423)) Thanks [@&#8203;cxyhhhhh](https://github.com/cxyhhhhh).

##### Fixes

- Channel content boundaries: QQBot now strips reasoning/thinking tags before sending, preserving final answers while hiding internal model narration from users. ([#&#8203;89913](openclaw/openclaw#89913), [#&#8203;90132](openclaw/openclaw#90132)) Thanks [@&#8203;openperf](https://github.com/openperf).
- Agents/MCP/providers: coerce non-text/image MCP tool-result blocks before they reach provider converters, preserving valid images and turning richer MCP content into text instead of malformed image blocks. ([#&#8203;90710](openclaw/openclaw#90710), [#&#8203;90728](openclaw/openclaw#90728)) Thanks [@&#8203;RanSHammer](https://github.com/RanSHammer) and [@&#8203;849261680](https://github.com/849261680).
- Anthropic/Codex/ACP/agent recovery: defer Anthropic stream start events until `message_start`, strip stale compaction thinking signatures before Anthropic replay, detect unsigned thinking-only stalls, refresh prompt fences after compaction writes, reject empty completion handoffs, preserve parent streaming-off overrides/shared progress commentary, forward heartbeat metadata to context-engine hooks, and cover Codex session/thread migration edge cases. ([#&#8203;90667](openclaw/openclaw#90667), [#&#8203;90697](openclaw/openclaw#90697), [#&#8203;90163](openclaw/openclaw#90163), [#&#8203;90108](openclaw/openclaw#90108), [#&#8203;89874](openclaw/openclaw#89874), [#&#8203;89505](openclaw/openclaw#89505), [#&#8203;90632](openclaw/openclaw#90632), [#&#8203;89302](openclaw/openclaw#89302), [#&#8203;90729](openclaw/openclaw#90729), [#&#8203;90317](openclaw/openclaw#90317), [#&#8203;90319](openclaw/openclaw#90319)) Thanks [@&#8203;openperf](https://github.com/openperf), [@&#8203;100yenadmin](https://github.com/100yenadmin), and [@&#8203;ooiuuii](https://github.com/ooiuuii).
- Provider/model resolution: preserve Google Vertex ADC auth markers in generated catalogs, re-probe a single-provider primary after cooldown, share Codex model visibility, fail closed for unknown model auth, preserve Codex alias availability, keep unresolved profile refs unknown, and avoid resolving auth while listing models. ([#&#8203;90506](openclaw/openclaw#90506), [#&#8203;90609](openclaw/openclaw#90609), [#&#8203;90717](openclaw/openclaw#90717), [#&#8203;90702](openclaw/openclaw#90702)) Thanks [@&#8203;849261680](https://github.com/849261680).
- Gateway/macOS/mobile: avoid duplicate Gateway probe warnings by identity, rate-limit node pairing requests while preserving paired-node reconnects, keep macOS node mode on a healthy direct Gateway session, keep iOS diagnostics and gateway rows reachable, and avoid Linux ARM Gradle resource tasks during Android builds. ([#&#8203;85791](openclaw/openclaw#85791), [#&#8203;90147](openclaw/openclaw#90147), [#&#8203;90668](openclaw/openclaw#90668), [#&#8203;90815](openclaw/openclaw#90815)) Thanks [@&#8203;giodl73-repo](https://github.com/giodl73-repo) and [@&#8203;vrurg](https://github.com/vrurg).
- TUI/chat/Workboard/auto-reply: optimistic user messages stay stable across stale history reloads, runId reassignment, and abort windows instead of disappearing, jumping, or lingering as ghost rows; Workboard stale lifecycle bulk updates no longer overwrite newer status/provenance; message-tool sends now count as delivery. ([#&#8203;86205](openclaw/openclaw#86205), [#&#8203;89600](openclaw/openclaw#89600), [#&#8203;88592](openclaw/openclaw#88592), [#&#8203;90123](openclaw/openclaw#90123)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa).
- Cron/update/service env: doctor config preflight now migrates legacy cron JSON stores into SQLite before runtime reads, service env planning skips unresolved placeholders that would mask state-dir `.env` values, and session transcript rewrites keep registry markers/discriminants consistent. ([#&#8203;90072](openclaw/openclaw#90072), [#&#8203;90208](openclaw/openclaw#90208), [#&#8203;90277](openclaw/openclaw#90277), [#&#8203;90488](openclaw/openclaw#90488)) Thanks [@&#8203;MonkeyLeeT](https://github.com/MonkeyLeeT) and [@&#8203;sallyom](https://github.com/sallyom).
- Security/config/tooling: guard MCP HTTP redirects, protect global agent config defaults, and keep release/test/tooling proof failures bounded and explicit. ([#&#8203;89732](openclaw/openclaw#89732), [#&#8203;90145](openclaw/openclaw#90145))
- Channels: WhatsApp restarts when per-account config changes, bounds background startup waits, closes failed sockets, and preserves reconnect behavior; Mattermost slash commands keep their state on `globalThis`; Feishu streaming cards preserve full merged content; voice-call tracks Twilio streams after connect; ClickClack reply tools respect `toolsAllow`. ([#&#8203;87951](openclaw/openclaw#87951), [#&#8203;87965](openclaw/openclaw#87965), [#&#8203;90486](openclaw/openclaw#90486), [#&#8203;68113](openclaw/openclaw#68113), [#&#8203;90534](openclaw/openclaw#90534), [#&#8203;90181](openclaw/openclaw#90181), [#&#8203;90607](openclaw/openclaw#90607), [#&#8203;89500](openclaw/openclaw#89500)) Thanks [@&#8203;MukundaKatta](https://github.com/MukundaKatta), [@&#8203;mcaxtr](https://github.com/mcaxtr), [@&#8203;infoanton](https://github.com/infoanton), [@&#8203;mushuiyu886](https://github.com/mushuiyu886), and [@&#8203;sahibzada-allahyar](https://github.com/sahibzada-allahyar).
- Feishu: retry transient send rate-limit errors (HTTP 429, per-chat code 230020, tenant-level code 11232) with linear backoff, including SDK responses that fulfill with rate-limit bodies instead of throwing, and route streaming-card sends through the retry wrapper. ([#&#8203;89659](openclaw/openclaw#89659)) Thanks [@&#8203;ladygege](https://github.com/ladygege).
- Release/CI/E2E: main CI guard drift, PR merge diff scoping, live Docker credential staging, base-image qualification, installer Docker classification, Playwright dependency install recovery, API-key auth for Codex live Docker lanes, Parallels option terminators, and JSON-mode progress handling are tighter so release proof fails cleaner. ([#&#8203;90532](openclaw/openclaw#90532), [#&#8203;90287](openclaw/openclaw#90287), [#&#8203;90058](openclaw/openclaw#90058)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa), [@&#8203;hxy91819](https://github.com/hxy91819), and [@&#8203;mrunalp](https://github.com/mrunalp).
- Release/CI/E2E: Docker E2E and live Docker harness runs now apply default memory, CPU, and process ceilings while preserving explicit per-lane overrides.
- Release/CI/E2E: plugin lifecycle matrix resource sampling now fails phases that exceed RSS, wall-clock, or CPU ceilings instead of only logging the measurements.
- Release/CI/E2E: Codex npm plugin live assertions now cap transcript discovery and diagnostic log reads so failure proof stays bounded.
- Tests/state isolation: QA Lab valid-tool-call metrics now require runtime tool-call evidence when runtime parity data is available instead of counting tool-backed scenario pass status alone.
- Tests/state isolation: QA Lab runtime parity now fails planned-only tool-call rows without matching tool results instead of treating matching mock plans as real tool evidence.
- Tests/state isolation: provider, media, auth, cron, task, session, sandbox, Gateway, and Codex timeout fixtures now scope more home/state/env data per test, reducing cross-test leakage and making release validation failures less noisy. ([#&#8203;90027](openclaw/openclaw#90027), [#&#8203;89974](openclaw/openclaw#89974))

</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/963
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P0 Emergency: data loss, security bypass, crash loop, or unusable core runtime. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: M 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.

2 participants