Skip to content

fix service env placeholder collection#90488

Merged
sallyom merged 1 commit into
openclaw:mainfrom
sallyom:codex/fix-minimax-service-env
Jun 5, 2026
Merged

fix service env placeholder collection#90488
sallyom merged 1 commit into
openclaw:mainfrom
sallyom:codex/fix-minimax-service-env

Conversation

@sallyom

@sallyom sallyom commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Refs #90277.

This fixes the managed gateway service env plan when config contains an unresolved env placeholder such as ${MINIMAX_API_KEY} and the real value lives in $OPENCLAW_STATE_DIR/.env.

The change skips unresolved ${VAR} references while collecting config env vars for runtime/service env. Concrete config env values still work, but placeholder values no longer mask the state-dir .env value during service env planning.

Impact

  • No config schema changes.
  • No MiniMax-specific allowlist or provider special case.
  • Existing concrete config.env values keep working, including values produced by config placeholder resolution.
  • Env-backed SecretRefs can still resolve from the managed service environment after install/restart.
  • Security behavior is slightly tighter because literal unresolved placeholders are not staged as credential-like env values.

Verification

  • git fetch origin main
  • git rebase origin/main
  • git diff --check origin/main
  • node scripts/run-vitest.mjs src/config/config.env-vars.test.ts src/commands/daemon-install-helpers.test.ts
  • node scripts/run-vitest.mjs src/config/config.env-vars.test.ts
  • Blacksmith Testbox tbx_01ktanqfm49ss6avf85qmqaw20: corepack pnpm check:test-types

Real Behavior Proof

Behavior addressed: gateway install service-env planning preserves a concrete MINIMAX_API_KEY from $OPENCLAW_STATE_DIR/.env when config also contains an unresolved self-reference ${MINIMAX_API_KEY}.

Real environment tested: Blacksmith Testbox tbx_01ktakr7a43sym9k546pn17y5n, Linux Node 24.13.0, synced PR checkout for the original proof run. The current amended PR head is 3dfb9b3d06750047294e6682da9dc1fe117edcb9; later amendments only made the MiniMax provider test fixture type-complete and added top-level unresolved plus resolved config env placeholder regression coverage. The fixture type fix was verified separately with check:test-types on Testbox tbx_01ktanqfm49ss6avf85qmqaw20; the config env collector tests were verified with node scripts/run-vitest.mjs src/config/config.env-vars.test.ts.

Exact steps or command run after this patch: On Testbox, created a temp state dir with .env containing a fake MINIMAX_API_KEY, built a config with both env.vars.MINIMAX_API_KEY: "${MINIMAX_API_KEY}" and models.providers["minimax-openai"].apiKey as an env SecretRef, then called the actual buildGatewayInstallPlan managed service env path with platform: "darwin". The command used wrapperPath: process.execPath to bypass package CLI-entrypoint resolution in the synced source checkout; it did not bypass service-env collection or render-policy logic.

Evidence after fix:

{
  "behaviorAddressed": "gateway install plan preserves state-dir .env MINIMAX_API_KEY when config env contains unresolved self-reference",
  "realEnvironmentTested": "Blacksmith Testbox tbx_01ktakr7a43sym9k546pn17y5n using isolated OPENCLAW_STATE_DIR and actual buildGatewayInstallPlan managed service env path",
  "stateDotEnvValuePreserved": true,
  "exportedKey": "MINIMAX_API_KEY",
  "managedKeys": "MINIMAX_API_KEY",
  "platformPlanned": "darwin",
  "launcherResolutionBypassedWithWrapperPath": true,
  "secretValuePrinted": false
}

Observed result after fix: The install plan exported MINIMAX_API_KEY from state-dir .env and kept OPENCLAW_SERVICE_MANAGED_ENV_KEYS=MINIMAX_API_KEY; the unresolved config placeholder did not mask the concrete .env value.

What was not tested: No live macOS LaunchAgent or Linux systemd service was installed, restarted, or inspected; no real MiniMax credential or provider call was used.

@openclaw-barnacle openclaw-barnacle Bot added commands Command implementations size: S maintainer Maintainer-authored PR labels Jun 5, 2026
@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 4, 2026, 9:52 PM ET / 01:52 UTC.

Summary
The PR filters unresolved ${VAR} placeholder values out of config env collection for runtime/service env planning and adds config plus gateway install-plan regression tests.

PR surface: Source +6, Tests +118. Total +124 across 3 files.

Reproducibility: yes. from source inspection, though this read-only review did not execute the repro. Current main lets an unresolved config env placeholder enter durable service env planning and replace the state-dir .env source before macOS inline rendering.

Review metrics: 1 noteworthy metric.

  • Config env semantics: 2 existing config env forms now skip unresolved placeholders. Both env.vars and top-level string env keys change behavior for unresolved ${VAR} values, which is the compatibility decision maintainers need to notice before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🐚 platinum hermit
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

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

Rank-up moves:

  • [P2] Have a maintainer explicitly accept or revise the compatibility policy for literal unescaped ${VAR} config env values before merge.

Risk before merge

  • [P1] Existing configs that intentionally rely on literal unescaped ${VAR} strings in config env values will stop passing those literals through config env collection; that edge case needs explicit maintainer acceptance.
  • [P1] The real proof exercises the actual install-plan path on Testbox with platform: "darwin", but it does not install and restart a live macOS LaunchAgent or call a real MiniMax provider.

Maintainer options:

  1. Accept placeholder filtering policy (recommended)
    Merge after a maintainer confirms that literal unescaped ${VAR} config-env values are unsupported or risky enough to drop from runtime/service env collection.
  2. Narrow the behavior to service env
    If preserving direct config-runtime collector semantics matters, move the unresolved-placeholder skip to the service-env collection path and keep the same regression coverage.

Next step before merge

  • No automated repair is indicated because no blocking patch defect was found; the remaining action is maintainer review of the compatibility-sensitive config-env policy and protected maintainer-labeled PR.

Security
Cleared: The diff adds no dependency, workflow, install-script, or permission changes; the credential-sensitive code change filters unresolved placeholders rather than exposing new secret material.

Review details

Best possible solution:

Land the narrow collector fix after maintainer acceptance that unresolved placeholder-shaped config env values are not supported runtime/service env candidates, then use the merged fix as the implementation path for the linked gateway service-env issue.

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

Yes from source inspection, though this read-only review did not execute the repro. Current main lets an unresolved config env placeholder enter durable service env planning and replace the state-dir .env source before macOS inline rendering.

Is this the best way to solve the issue?

Yes, with a maintainer policy caveat. Filtering unresolved placeholders at the config-env collection boundary is narrower and more generic than a MiniMax allowlist or macOS-only render special case, while tests preserve concrete and resolved config env values.

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🐚 platinum hermit and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body includes after-fix Testbox live-output proof for the actual install-plan service-env path preserving the state-dir .env value despite an unresolved config self-reference.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.
  • remove status: ⏳ waiting on author: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P1: The PR targets a linked managed gateway service-env failure that can leave an affected LaunchAgent gateway in a crash loop with missing provider credentials.
  • merge-risk: 🚨 compatibility: The diff changes existing config env collection semantics for unresolved placeholder-shaped values rather than only adding a new isolated path.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🐚 platinum hermit and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body includes after-fix Testbox live-output proof for the actual install-plan service-env path preserving the state-dir .env value despite an unresolved config self-reference.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix Testbox live-output proof for the actual install-plan service-env path preserving the state-dir .env value despite an unresolved config self-reference.
Evidence reviewed

PR surface:

Source +6, Tests +118. Total +124 across 3 files.

View PR surface stats
Area Files Added Removed Net
Source 1 6 0 +6
Tests 2 118 0 +118
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 3 124 0 +124

What I checked:

  • Repository policy applied: Root AGENTS.md was read fully; its config/env compatibility, proof, protected-label, and review-depth rules affect this PR review. (AGENTS.md:1, 6868cde4d45f)
  • PR diff scope: The PR adds placeholder filtering in both config env collection branches and adds regression coverage for unresolved env.vars, top-level env placeholders, resolved placeholders, and macOS LaunchAgent env SecretRef planning. (src/config/config-env-vars.ts:31, 3dfb9b3d0675)
  • Current main source behavior: Current main collects nonempty config env strings without checking unresolved placeholders, and durable service env composition lets config env override state-dir .env values. (src/config/state-dir-dotenv.ts:126, 6868cde4d45f)
  • Failure path from source: Gateway install planning adds state-dotenv entries before config-env entries, then macOS render policy only re-inlines a managed value when the final normalized entry source is state-dotenv, so an unresolved config placeholder can mask a concrete state-dir .env value. (src/commands/daemon-install-helpers.ts:529, 6868cde4d45f)
  • User-facing contract context: Docs tell managed-service users to provide env SecretRef values from the shell or ~/.openclaw/.env, and secrets docs say active SecretRefs fail fast when unresolved. Public docs: docs/channels/discord.md. (docs/channels/discord.md:117, 6868cde4d45f)
  • Real behavior proof in PR body: The PR body reports Blacksmith Testbox proof on head 3dfb9b3 where buildGatewayInstallPlan preserved MINIMAX_API_KEY from a state-dir .env despite an unresolved config self-reference; it also lists focused vitest and Testbox type-check verification. (3dfb9b3d0675)

Likely related people:

  • sallyom: Prior merged SecretRef provider integration work touched the daemon install helper and included service-env handling before this PR, so the author also has current-main history in the affected area. (role: recent feature contributor; confidence: high; commits: 6037a7466079; files: src/commands/daemon-install-helpers.ts, src/config/types.secrets.ts)
  • steipete: Recent commits and API history show repeated work on config/env helpers, daemon install helpers, and service-env render policy around the affected paths. (role: recent area contributor; confidence: high; commits: 54fe5dc8429b, 4eb3d1fae941, 2b01bcf6c805; files: src/config/config-env-vars.ts, src/commands/daemon-install-helpers.ts, src/daemon/service-env-render-policy.ts)
  • joshavant: History for the prior SecretRef provider integration commit lists joshavant as co-author, and the affected behavior crosses SecretRef service-env planning. (role: adjacent SecretRef owner; confidence: medium; commits: 6037a7466079; files: src/commands/daemon-install-helpers.ts, src/config/types.secrets.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. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. 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: 🦪 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 5, 2026
@sallyom
sallyom marked this pull request as ready for review June 5, 2026 01:03
@sallyom

sallyom commented Jun 5, 2026

Copy link
Copy Markdown
Contributor Author

wrt the [P1]: changes existing config env semantics: unescaped ${VAR} strings in env.vars or top-level config env keys stop being collected for runtime/service environments.

  • Yes, this intentionally stops unresolved ${VAR} strings from being collected as runtime/service env values.
  • The expected supported forms are a concrete value in config env, a resolved ${VAR} substitution, or a real value in $OPENCLAW_STATE_DIR/.env.
  • The only known break is users intentionally passing literal placeholder-shaped strings through config env, which is unlikely and risky for auth envs.

[P1] Cover the resolved config placeholder path — src/config/config-env-vars.ts:34-36: added regression test

I'm willing to accept the small risk of breaking behavior, agent discussion:

What it can break is narrow: configs intentionally using a literal unescaped placeholder-shaped value like ${FOO} as
the env value itself. That value will no longer be collected into runtime/service env. Concrete config values still work, 
resolved ${FOO} substitutions still work, and state-dir .env values still work.

Given this surface is credential/service-env handling, I think filtering unresolved placeholders is the safer behavior: it 
prevents a literal ${MINIMAX_API_KEY} from masking the real durable secret and avoids staging placeholder strings as credential-like env values. Tests now cover unresolved env.vars, unresolved top-level env keys, resolved 
placeholders, and the service install-plan path. CI and Testbox proof are green/sufficient.

@sallyom
sallyom force-pushed the codex/fix-minimax-service-env branch from bf82e20 to 23e662d Compare June 5, 2026 01:24
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. 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 5, 2026
@sallyom
sallyom force-pushed the codex/fix-minimax-service-env branch from 23e662d to e34830f Compare June 5, 2026 01:39
@sallyom
sallyom force-pushed the codex/fix-minimax-service-env branch from e34830f to 3dfb9b3 Compare June 5, 2026 01:44
@clawsweeper clawsweeper Bot added 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: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 5, 2026
@sallyom
sallyom merged commit 7ac1eeb into openclaw:main Jun 5, 2026
182 of 185 checks passed
@sallyom sallyom changed the title [codex] fix service env placeholder collection fix service env placeholder collection Jun 5, 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
badgerbees pushed a commit to badgerbees/openclaw that referenced this pull request Jul 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

commands Command implementations maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: S 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.

1 participant