Skip to content

Rate limit node pairing requests [AI]#90147

Merged
pgondhi987 merged 3 commits into
openclaw:mainfrom
pgondhi987:fix/fix-721
Jun 4, 2026
Merged

Rate limit node pairing requests [AI]#90147
pgondhi987 merged 3 commits into
openclaw:mainfrom
pgondhi987:fix/fix-721

Conversation

@pgondhi987

@pgondhi987 pgondhi987 commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds a gateway auth-rate-limit scope for node-role pairing requests created during WebSocket connect.
  • Runs first-time node pairing requests through the existing serialized per-IP limiter before they enter the node-pairing storage lock.
  • Returns the existing structured rate-limit connect error when a first-time node pairing bucket is exhausted.
  • Preserves already paired node reconnects on their approved effective surface when only the fresh upgrade pairing request is throttled.
  • Adds regression coverage for concurrent first-time node connects and paired-node upgrade reconnects under an exhausted bucket.

AI-assisted: yes.

Linked context

No public issue is linked in this PR body.

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: repeated first-time node connection attempts are throttled before they can queue node-pairing storage writes, while paired upgrade reconnects keep their approved surface.
  • Real environment tested: local source checkout with the gateway WebSocket integration test harness, plus GitHub Actions PR CI pending on the latest head.
  • Exact steps or command run after this patch: pnpm format -- src/gateway/node-connect-reconcile.ts src/gateway/node-connect-reconcile.test.ts src/gateway/server/ws-connection/message-handler.ts src/gateway/server.node-pairing-rate-limit.test.ts; node scripts/run-vitest.mjs src/gateway/node-connect-reconcile.test.ts src/gateway/server.node-pairing-rate-limit.test.ts src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts src/gateway/auth-rate-limit.test.ts; node scripts/run-oxlint.mjs src/gateway/auth-rate-limit.ts src/gateway/node-connect-reconcile.ts src/gateway/node-connect-reconcile.test.ts src/gateway/server/ws-connection/message-handler.ts src/gateway/server.node-pairing-rate-limit.test.ts; git diff --check HEAD~1..HEAD.
  • Evidence after fix: focused Vitest shard passed 12 files / 136 tests; review-pr wrapper tests passed on the same targeted files; autoreview passed clean on the current branch.
  • Observed result after fix: with maxAttempts: 3, eight concurrent first-time node connects create three pending node-pairing requests and return five structured auth rate-limit responses; a paired node reconnecting with an upgraded capability declaration remains connected and does not create an extra pending request while the bucket is exhausted.
  • What was not tested: external live non-loopback device traffic outside the local gateway test harness.
  • Proof limitations or environment constraints: no external device or remote network environment was used; the gateway WebSocket harness exercises the real connect path in-process.
  • Before evidence: the affected connect path called requestNodePairing directly without a node-pairing rate-limit scope.

Tests and validation

Commands run:

  • pnpm format -- src/gateway/auth-rate-limit.ts src/gateway/server/ws-connection/message-handler.ts src/gateway/server.node-pairing-rate-limit.test.ts
  • node scripts/run-vitest.mjs src/gateway/server.node-pairing-rate-limit.test.ts src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts src/gateway/auth-rate-limit.test.ts
  • node scripts/run-oxlint.mjs src/gateway/auth-rate-limit.ts src/gateway/server/ws-connection/message-handler.ts src/gateway/server.node-pairing-rate-limit.test.ts
  • git diff --check
  • pnpm format -- src/gateway/node-connect-reconcile.ts src/gateway/node-connect-reconcile.test.ts src/gateway/server/ws-connection/message-handler.ts src/gateway/server.node-pairing-rate-limit.test.ts
  • node scripts/run-vitest.mjs src/gateway/node-connect-reconcile.test.ts src/gateway/server.node-pairing-rate-limit.test.ts src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts src/gateway/auth-rate-limit.test.ts
  • node scripts/run-oxlint.mjs src/gateway/auth-rate-limit.ts src/gateway/node-connect-reconcile.ts src/gateway/node-connect-reconcile.test.ts src/gateway/server/ws-connection/message-handler.ts src/gateway/server.node-pairing-rate-limit.test.ts
  • git diff --check HEAD~1..HEAD
  • scripts/pr review-tests 90147 src/gateway/node-connect-reconcile.test.ts src/gateway/server.node-pairing-rate-limit.test.ts src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts src/gateway/auth-rate-limit.test.ts
  • timeout 1800 .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main

Regression coverage added: src/gateway/server.node-pairing-rate-limit.test.ts covers concurrent first-time node-pairing attempts and paired reconnect upgrades through the real WebSocket connect path; src/gateway/node-connect-reconcile.test.ts covers preserving the approved effective surface when a paired upgrade request is throttled.

What failed before this fix: the node connect path had no node-pairing limiter before requestNodePairing entered the shared storage lock.

Risk checklist

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

Yes. Repeated first-time node pairing attempts from the same rate-limit identity can now receive the existing structured rate-limit connect error when the configured bucket is exhausted. Paired reconnects keep their approved surface when only the fresh upgrade request is throttled.

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

No. This reuses the existing gateway auth rate-limit configuration and defaults.

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

Yes. This changes the gateway security/auth boundary for node-role pairing requests by adding per-IP throttling before node-pairing storage writes.

What is the highest-risk area?

Unusually low gateway.auth.rateLimit settings can throttle rapid first-time node onboarding from the same rate-limit identity.

How is that risk mitigated?

The bucket uses the existing gateway rate-limit configuration, loopback exemption behavior, browser-origin limiter selection, and serialized attempt helper already used by auth-sensitive connect paths. Existing paired reconnects keep their approved surface if an upgrade pairing request is throttled.

Current review state

What is the next action?

Wait for GitHub Actions CI and fresh bot review on the latest head.

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

GitHub Actions CI is pending on the latest pushed head; external live non-loopback proof was not run.

Which bot or reviewer comments were addressed?

Addressed ClawSweeper feedback to preserve paired reconnects on their approved surface when node-pairing request throttling trips.

@pgondhi987 pgondhi987 requested a review from a team as a code owner June 4, 2026 03:37
@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime size: S maintainer Maintainer-authored PR labels Jun 4, 2026
@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 4, 2026, 12:11 AM ET / 04:11 UTC.

Summary
The branch adds a node-pairing auth-rate-limit scope, wraps WebSocket node-pairing request creation in serialized rate-limit checks, preserves paired reconnects when upgrade pairing is throttled, and adds gateway regression tests.

PR surface: Source +72, Tests +186. Total +258 across 5 files.

Reproducibility: no. high-confidence live reproduction is present. Source inspection shows current main enters requestNodePairing directly, and the PR adds harness coverage for the claimed burst and paired-reconnect paths, but no external non-loopback run was provided.

Review metrics: 1 noteworthy metric.

  • Existing config semantics widened: 1 changed surface. The PR reuses gateway.auth.rateLimit for node-pairing request creation, so existing operator thresholds can affect onboarding rather than only failed auth.

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 real gateway proof from a non-loopback node-pairing scenario; terminal output, copied live output, logs, or a recording with diagnostics are acceptable after redacting private details.
  • Get explicit gateway/security owner approval for the broadened auth-rate-limit semantics, or revise the patch so existing failed-auth tuning is preserved by default.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR body provides focused Vitest/gateway harness output and explicitly says external live non-loopback device traffic was not tested. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Risk before merge

  • [P1] Existing deployments with tight gateway.auth.rateLimit settings can now reject legitimate first-time node onboarding from the same client IP or NAT even though the shared gateway auth succeeded.
  • [P1] The PR changes a gateway auth/security boundary and carries the protected maintainer label, so the fail-closed pairing policy needs explicit gateway/security owner judgment before merge.
  • [P1] The contributor proof is still local gateway harness output; external live non-loopback node-pairing behavior was explicitly not tested.

Maintainer options:

  1. Align contract before merge (recommended)
    Update or narrow the implementation so operators can understand and safely upgrade the changed gateway.auth.rateLimit semantics for node onboarding, then add the corresponding proof.
  2. Accept as intentional hardening
    A gateway/security owner may decide that reusing the existing auth-rate-limit bucket is the desired fail-closed policy and explicitly accept the onboarding compatibility risk.
  3. Pause for live proof
    Keep the PR paused until a redacted non-loopback node-pairing run demonstrates the changed connect behavior outside the in-process test harness.

Next step before merge

  • [P1] Human review is needed because the blockers are contributor real-environment proof and a gateway auth-rate-limit compatibility decision, not a narrow automation repair.

Security
Cleared: No concrete credential handling, secret exposure, supply-chain, or security-boundary weakening was found; the remaining auth-boundary concern is tracked as compatibility and availability risk.

Review findings

  • [P1] Align the rate-limit contract before throttling pairing — src/gateway/server/ws-connection/message-handler.ts:228
Review details

Best possible solution:

Land node-pairing throttling only after the auth-rate-limit contract is explicitly approved and documented or adjusted, paired-reconnect compatibility remains covered, and redacted non-loopback gateway proof is added.

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

No high-confidence live reproduction is present. Source inspection shows current main enters requestNodePairing directly, and the PR adds harness coverage for the claimed burst and paired-reconnect paths, but no external non-loopback run was provided.

Is this the best way to solve the issue?

Unclear as merge-ready. Throttling before the node-pairing storage lock is the right layer for the pressure point, but reusing the documented failed-auth limiter for successful pairing requests needs owner approval, documentation, or a safer contract before it is the best fix.

Full review comments:

  • [P1] Align the rate-limit contract before throttling pairing — src/gateway/server/ws-connection/message-handler.ts:228
    This records successful node-pairing request creation against gateway.auth.rateLimit, but current docs/types define that setting as failed-auth throttling. Existing deployments with tight buckets can now reject first-time node onboarding from the same IP/NAT even though auth succeeded; please either make node-pairing throttling an explicitly approved/documented contract with upgrade proof or preserve the existing failed-auth semantics by default.
    Confidence: 0.86

Overall correctness: patch is incorrect
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

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

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: The PR body provides focused Vitest/gateway harness output and explicitly says external live non-loopback device traffic was not tested. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • remove status: 📣 needs proof: Current PR status label is status: 🛠️ actively grinding.

Label justifications:

  • P2: This is a bounded gateway hardening/compatibility change with real user impact but no evidence of an emergency outage or data loss.
  • merge-risk: 🚨 compatibility: The diff broadens the documented failed-auth rate-limit setting to throttle successful node-pairing request creation during upgrade.
  • merge-risk: 🚨 availability: Low existing buckets can make legitimate first-time node onboarding fail closed from a shared rate-limit identity.
  • 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: The PR body provides focused Vitest/gateway harness output and explicitly says external live non-loopback device traffic was not tested. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +72, Tests +186. Total +258 across 5 files.

View PR surface stats
Area Files Added Removed Net
Source 3 82 10 +72
Tests 2 186 0 +186
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 5 268 10 +258

What I checked:

  • Repository policy read: The root AGENTS.md and scoped src/gateway/AGENTS.md were read fully; the applicable guidance treats gateway auth/config/fail-closed behavior as compatibility-sensitive and asks gateway tests to reuse suite-level servers where possible. (AGENTS.md:1, 7b02080fa179)
  • Current main lacks the limiter: On current main, node-role WebSocket connect calls reconcileNodePairingOnConnect with requestPairing wired directly to requestNodePairing, so first-time node pairing enters the pairing storage path without a node-pairing rate-limit scope. (src/gateway/server/ws-connection/message-handler.ts:1588, 7b02080fa179)
  • PR records node-pairing attempts against auth rate limit: The PR adds requestNodePairingFromConnect and calls recordFailure after requestNodePairing succeeds, so successful pairing request creation now consumes the existing gateway auth rate-limit bucket for the new node-pairing scope. (src/gateway/server/ws-connection/message-handler.ts:228, f40e41204d81)
  • Documented contract is failed-auth throttling: The public gateway configuration reference describes gateway.auth.rateLimit as an optional failed-auth limiter, with shared-secret and device-token scopes tracked independently; the PR changes behavior without updating that contract. Public docs: docs/gateway/configuration-reference.md. (docs/gateway/configuration-reference.md:572, 7b02080fa179)
  • Type-level contract also says failed attempts: GatewayAuthConfig and GatewayAuthRateLimitConfig comments describe the setting as failed authentication attempt limiting, so existing operators can reasonably tune it for failed auth rather than successful node onboarding bursts. (src/config/types.gateway.ts:198, 7b02080fa179)
  • Regression coverage is focused but harness-only: The PR adds gateway tests for concurrent first-time node pairing and paired-node upgrade reconnects, but the PR body says no external live non-loopback device traffic was tested. (src/gateway/server.node-pairing-rate-limit.test.ts:75, f40e41204d81)

Likely related people:

  • Peter Steinberger: Recent current-main history and blame show work across gateway auth, rate-limit serialization, node-pairing reconciliation, and the WebSocket message handler. (role: recent area contributor; confidence: high; commits: ad958fd97aab, 032dbf0ec6cd, db0cea5689ac; files: src/gateway/server/ws-connection/message-handler.ts, src/gateway/auth-rate-limit.ts, src/gateway/server/ws-connection/auth-context.ts)
  • Harald Buerbaumer: git history shows commit 30b6ecc adding gateway auth rate limiting and brute-force protection, the config surface this PR reuses. (role: introduced auth rate-limit surface; confidence: medium; commits: 30b6eccae5af; files: src/gateway/auth-rate-limit.ts)
  • Agustin Rivera: git history shows commit a383878 requiring re-pairing for node reconnect command upgrades, which is directly adjacent to the paired reconnect behavior this PR preserves. (role: adjacent node-pairing behavior contributor; confidence: medium; commits: a383878e97b7; files: src/gateway/node-connect-reconcile.ts, src/infra/node-pairing.ts)
  • pgondhi987: Beyond authoring this PR, current-main history shows prior merged work in the same WebSocket auth/session path for shared-token/password session invalidation. (role: recent adjacent gateway auth contributor; confidence: medium; commits: 5880ec17b18c; files: src/gateway/server/ws-connection/message-handler.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: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. labels Jun 4, 2026
@pgondhi987

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Updated the PR after the prior review:

  • Preserved paired-node reconnects on the already approved surface when only the fresh upgrade pairing request is throttled.
  • Added regression coverage for that paired reconnect path plus the first-time node-pairing burst path.
  • Updated the PR body with the current validation commands and observed results.

@clawsweeper

clawsweeper Bot commented Jun 4, 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:

@pgondhi987

Copy link
Copy Markdown
Contributor Author

Verification before merge:

Behavior addressed: First-time node-role WebSocket pairing requests are rate-limited before entering shared node-pairing storage, while already paired node upgrade reconnects keep their approved surface when fresh pairing is throttled.

Real environment tested: Local source checkout with gateway WebSocket integration tests; GitHub Actions PR CI on head f40e412. No external live non-loopback device environment was used.

Exact steps or command run after this patch:

  • pnpm format -- src/gateway/node-connect-reconcile.ts src/gateway/node-connect-reconcile.test.ts src/gateway/server/ws-connection/message-handler.ts src/gateway/server.node-pairing-rate-limit.test.ts
  • node scripts/run-vitest.mjs src/gateway/node-connect-reconcile.test.ts src/gateway/server.node-pairing-rate-limit.test.ts src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts src/gateway/auth-rate-limit.test.ts
  • node scripts/run-oxlint.mjs src/gateway/auth-rate-limit.ts src/gateway/node-connect-reconcile.ts src/gateway/node-connect-reconcile.test.ts src/gateway/server/ws-connection/message-handler.ts src/gateway/server.node-pairing-rate-limit.test.ts
  • git diff --check HEAD~1..HEAD
  • scripts/pr review-tests 90147 src/gateway/node-connect-reconcile.test.ts src/gateway/server.node-pairing-rate-limit.test.ts src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts src/gateway/auth-rate-limit.test.ts
  • timeout 1800 .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main
  • auto-pr.sh issue 721 --run-stage ghsa_dry_run
  • auto-pr.sh issue 721 --run-stage ghsa_real_gate

Evidence after fix:

  • Focused Vitest passed 12 files / 136 tests, including first-time burst throttling and paired upgrade reconnect preservation.
  • review-pr: passed on f40e412; READY FOR /prepare-pr; 0 findings; artifacts validated.
  • autoreview: passed on f40e412; no accepted/actionable findings.
  • GHSA dry-run: passed on f40e412; HARDEN / SOLVES / BC PASS.
  • GHSA real gate: passed on f40e412.
  • CI: gh pr checks reported 164 check rows, no non-pass buckets, and only pass/skipping/neutral outcomes.

Observed result after fix: Repeated first-time node pairing attempts from the same rate-limit key are rejected before queueing node-pairing storage work, and paired upgrade reconnects continue on the already approved effective surface.

What was not tested: External live non-loopback node/device traffic outside the local gateway WebSocket test harness.

Regression Risk:
Low to medium. This is gateway availability hardening within OpenClaw's local-first, trusted-operator model rather than a new multi-tenant auth boundary. It reuses existing gateway.auth.rateLimit semantics under a dedicated node-pairing scope; no auth credentials, approval scopes, sandboxing, storage schema, provider/plugin/channel behavior, migrations, or persisted secrets change. The main compatibility risk is tight custom rate-limit settings throttling rapid first-time node onboarding; paired reconnects are specifically preserved by the revised fix and tests.

Best fix verdict: Best/appropriate. The gateway connect layer owns the client rate-limit key, so gating before requestNodePairing() avoids shared-lock contention without changing the pairing store API or protocol surface. The main alternative, changing the storage lock itself, would be broader and would not distinguish first-time unpaired abuse from paired reconnect compatibility.

User behavior change:
Before, repeated first-time node-role connects could all reach node-pairing state writes. After, repeated attempts from the same rate-limit identity can receive the existing structured rate-limit connect error before storage work. Already paired nodes keep their approved surface when only an upgrade pairing request is throttled. Config schema, CLI, protocol shape, persisted state, provider/plugin/channel behavior, auth credentials, and approval scopes are unchanged.

@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 4, 2026
@pgondhi987 pgondhi987 merged commit 3f1e0eb into openclaw:main Jun 4, 2026
7 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 4, 2026
* fix: rate limit node pairing requests

* fix: preserve paired node reconnects
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
* fix: rate limit node pairing requests

* fix: preserve paired node reconnects
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
* fix: rate limit node pairing requests

* fix: preserve paired node reconnects
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
* fix: rate limit node pairing requests

* fix: preserve paired node reconnects
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
* fix: rate limit node pairing requests

* fix: preserve paired node reconnects
traoremp pushed a commit to traoremp/openclaw that referenced this pull request Jun 5, 2026
* fix: rate limit node pairing requests

* fix: preserve paired node reconnects
849261680 pushed a commit to 849261680/openclaw that referenced this pull request Jun 7, 2026
* fix: rate limit node pairing requests

* fix: preserve paired node reconnects
wangmiao0668000666 pushed a commit to wangmiao0668000666/openclaw that referenced this pull request Jun 9, 2026
* fix: rate limit node pairing requests

* fix: preserve paired node reconnects
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
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
* fix: rate limit node pairing requests

* fix: preserve paired node reconnects
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: M status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant