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
Signed-off-by: sallyom <somalley@redhat.com>
@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
Signed-off-by: sallyom <somalley@redhat.com>
traoremp pushed a commit to traoremp/openclaw that referenced this pull request Jun 5, 2026
Signed-off-by: sallyom <somalley@redhat.com>
849261680 pushed a commit to 849261680/openclaw that referenced this pull request Jun 7, 2026
Signed-off-by: sallyom <somalley@redhat.com>
wangmiao0668000666 pushed a commit to wangmiao0668000666/openclaw that referenced this pull request Jun 9, 2026
Signed-off-by: sallyom <somalley@redhat.com>
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

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