Skip to content

Block provider credentials from workspace dotenv [AI]#83655

Merged
drobison00 merged 6 commits into
openclaw:mainfrom
mmaps:fix/fix-666
May 28, 2026
Merged

Block provider credentials from workspace dotenv [AI]#83655
drobison00 merged 6 commits into
openclaw:mainfrom
mmaps:fix/fix-666

Conversation

@mmaps

@mmaps mmaps commented May 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Problem: Workspace .env filtering did not cover registered provider credential env vars, so cwd files could provide those values before the trusted global fallback.
  • Why it matters: Provider credential selection should come from shell or trusted global runtime config, not project-local cwd files.
  • What changed: Added registered provider credential env var names to the workspace dotenv blocklist and added regression coverage against the provider env-var registry.
  • What did NOT change (scope boundary): Trusted global .env and shell environment values still work; user-defined non-control workspace vars remain allowed.

AI-assisted: yes.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

  • N/A
  • This PR addresses a bug or regression

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: Registered provider credential env vars from cwd .env are ignored, and trusted global .env values are retained.
  • Real environment tested: Local OpenClaw source checkout using temp cwd and state-dir fixtures, installed as a local node package. Also used openclaw@2026.5.12 as the public version with the issue to be fixed.
  • Exact steps or command run after this patch: node scripts/run-vitest.mjs src/infra/dotenv.test.ts and from the regular home and evil/ subdirectory run:
HOME=/tmp/dotenv-lab/op-home node --input-type=module -e '
import { t as loadDotEnv } from "/tmp/dotenv-lab/dist/dotenv-CM15HNAf.js";
loadDotEnv({ quiet: true });
for (const k of ["GEMINI_API_KEY","XAI_API_KEY","MISTRAL_API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY"])
  console.log(k + "=" + (process.env[k] || "<unset>"));
'
  • What was not tested: A complete local installation and execution of OpenClaw, instead the code changed was tested with a simulated attacker controlled .env file in a subfolder, "evil".
  • Before evidence (optional but encouraged): Real proof by reproducing the security issue on ubuntu latest with openclaw@2026.5.12 per researcher findings and proof-of-concept. Behavior before patch with openclaw@2026.5.12:
root@dd9bd6c64dce:/openclaw# cd /tmp/dotenv-lab/
root@dd9bd6c64dce:/tmp/dotenv-lab# HOME=/tmp/dotenv-lab/op-home node --input-type=module -e '
import { t as loadDotEnv } from "/tmp/dotenv-lab/node_modules/openclaw/dist/dotenv-DpVSuK0u.js";
loadDotEnv({ quiet: true });
for (const k of ["GEMINI_API_KEY","XAI_API_KEY","MISTRAL_API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY"])
  console.log(k + "=" + (process.env[k] || "<unset>"));
'
GEMINI_API_KEY=op_legit_gemini_DO_NOT_LEAK
XAI_API_KEY=op_legit_xai_DO_NOT_LEAK
MISTRAL_API_KEY=op_legit_mistral_DO_NOT_LEAK
ANTHROPIC_API_KEY=op_legit_anthropic_DO_NOT_LEAK
OPENAI_API_KEY=op_legit_openai_DO_NOT_LEAK
root@dd9bd6c64dce:/tmp/dotenv-lab# cd /tmp/dotenv-lab/evil/
root@dd9bd6c64dce:/tmp/dotenv-lab/evil# HOME=/tmp/dotenv-lab/op-home node --input-type=module -e '
import { t as loadDotEnv } from "/tmp/dotenv-lab/node_modules/openclaw/dist/dotenv-DpVSuK0u.js";
loadDotEnv({ quiet: true });
for (const k of ["GEMINI_API_KEY","XAI_API_KEY","MISTRAL_API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY"])
  console.log(k + "=" + (process.env[k] || "<unset>"));
'
GEMINI_API_KEY=attacker_gemini_VICTIM_PROMPTS_GO_HERE
XAI_API_KEY=attacker_xai_VICTIM_PROMPTS_GO_HERE
MISTRAL_API_KEY=attacker_mistral_VICTIM_PROMPTS_GO_HERE
ANTHROPIC_API_KEY=op_legit_anthropic_DO_NOT_LEAK
OPENAI_API_KEY=op_legit_openai_DO_NOT_LEAK
root@dd9bd6c64dce:/tmp/dotenv-lab/evil# cat .env
GEMINI_API_KEY=attacker_gemini_VICTIM_PROMPTS_GO_HERE
XAI_API_KEY=attacker_xai_VICTIM_PROMPTS_GO_HERE
MISTRAL_API_KEY=attacker_mistral_VICTIM_PROMPTS_GO_HERE
ANTHROPIC_API_KEY=attacker_anthropic_BLOCKED_BY_POLICY
OPENAI_API_KEY=attacker_openai_BLOCKED_BY_POLICY
  • Observed result after fix: Provider auth env vars in the regression fixture came from the trusted global .env, not the workspace .env, and all key values are the correct *_DO_NOT_LEAK.
  • Evidence after fix (console output): Test Files 1 passed (1); Tests 31 passed (31) and console output below. Behavior after this PR, all key values are the correct *_DO_NOT_LEAK:
Node.js v24.15.0
root@21c249a0364f:/tmp/dotenv-lab# HOME=/tmp/dotenv-lab/op-home node --input-type=module -e '
import { t as loadDotEnv } from "/tmp/dotenv-lab/dist/dotenv-CM15HNAf.js";
loadDotEnv({ quiet: true });
for (const k of ["GEMINI_API_KEY","XAI_API_KEY","MISTRAL_API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY"])
  console.log(k + "=" + (process.env[k] || "<unset>"));
'
GEMINI_API_KEY=op_legit_gemini_DO_NOT_LEAK
XAI_API_KEY=op_legit_xai_DO_NOT_LEAK
MISTRAL_API_KEY=op_legit_mistral_DO_NOT_LEAK
ANTHROPIC_API_KEY=op_legit_anthropic_DO_NOT_LEAK
OPENAI_API_KEY=op_legit_openai_DO_NOT_LEAK
root@21c249a0364f:/tmp/dotenv-lab# cd evil/
root@21c249a0364f:/tmp/dotenv-lab/evil# cat .env
GEMINI_API_KEY=attacker_gemini_VICTIM_PROMPTS_GO_HERE
XAI_API_KEY=attacker_xai_VICTIM_PROMPTS_GO_HERE
MISTRAL_API_KEY=attacker_mistral_VICTIM_PROMPTS_GO_HERE
ANTHROPIC_API_KEY=attacker_anthropic_BLOCKED_BY_POLICY
OPENAI_API_KEY=attacker_openai_BLOCKED_BY_POLICY
root@21c249a0364f:/tmp/dotenv-lab/evil# HOME=/tmp/dotenv-lab/op-home node --input-type=module -e '
import { t as loadDotEnv } from "/tmp/dotenv-lab/dist/dotenv-CM15HNAf.js";
loadDotEnv({ quiet: true });
for (const k of ["GEMINI_API_KEY","XAI_API_KEY","MISTRAL_API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY"])
  console.log(k + "=" + (process.env[k] || "<unset>"));
'
GEMINI_API_KEY=op_legit_gemini_DO_NOT_LEAK
XAI_API_KEY=op_legit_xai_DO_NOT_LEAK
MISTRAL_API_KEY=op_legit_mistral_DO_NOT_LEAK
ANTHROPIC_API_KEY=op_legit_anthropic_DO_NOT_LEAK
OPENAI_API_KEY=op_legit_openai_DO_NOT_LEAK
root@21c249a0364f:/tmp/dotenv-lab/evil#

Root Cause (if applicable)

  • Root cause: Workspace dotenv filtering used an explicit blocklist that covered only part of the provider credential surface.
  • Missing detection / guardrail: No regression test compared workspace dotenv handling against the registered provider auth env-var names.
  • Contributing context (if known): Provider credential env vars are declared across provider/plugin metadata while dotenv filtering is maintained separately.

Regression Test Plan (if applicable)

  • Coverage level that should have caught this:
    • Unit test
    • Seam / integration test
    • End-to-end test
    • Existing coverage already sufficient
  • Target test or file: src/infra/dotenv.test.ts
  • Scenario the test should lock in: Every registered provider auth env var remains sourced from trusted global .env when workspace .env contains the same key.
  • Why this is the smallest reliable guardrail: It exercises the actual dotenv loader and uses the provider env-var registry without live provider calls.
  • Existing test that already covers this (if any): Existing dotenv tests covered selected credential and runtime-control keys, but not the registered provider auth set.
  • If no new test is added, why not: N/A

User-visible / Behavior Changes

Workspace .env no longer supplies registered provider credential env vars. Use shell env or trusted global OpenClaw runtime .env for provider credentials.

Diagram (if applicable)

N/A

Security Impact (required)

  • New permissions/capabilities? (Yes/No) No
  • Secrets/tokens handling changed? (Yes/No) Yes
  • New/changed network calls? (Yes/No) No
  • Command/tool execution surface changed? (Yes/No) No
  • Data access scope changed? (Yes/No) No
  • If any Yes, explain risk + mitigation: Workspace dotenv can no longer provide registered provider credential names; shell and trusted global runtime dotenv remain supported.

Repro + Verification

Environment

  • OS: Linux
  • Runtime/container: Node via repo Vitest wrapper
  • Model/provider: N/A
  • Integration/channel (if any): N/A
  • Relevant config (redacted): Temporary cwd and state-dir dotenv fixtures

Steps

  1. Create a workspace .env and trusted global .env containing the same registered provider credential keys.
  2. Run the dotenv loader through the focused test file.
  3. Assert each credential key resolves to the trusted global value.

Expected

  • Registered provider credential keys from workspace .env are ignored.
  • Trusted global .env values are loaded.

Actual

  • Focused regression passed with all dotenv tests green.

Evidence

Attach at least one:

  • Failing test/log before + passing after
  • Trace/log snippets
  • Screenshot/recording
  • Perf numbers (if relevant)

node scripts/run-vitest.mjs src/infra/dotenv.test.ts -> Test Files 1 passed (1); Tests 31 passed (31)

Human Verification (required)

What you personally verified (not just CI), and how:

  • Verified scenarios: Focused dotenv test file with provider-auth registry regression.
  • Edge cases checked: Trusted global dotenv remains accepted; workspace credential values do not win for registered provider auth keys.
  • What you did not verify: Full package install flow, broad changed checks, live provider traffic.

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

Compatibility / Migration

  • Backward compatible? (Yes/No) Yes, with narrowed workspace dotenv credential sourcing.
  • Config/env changes? (Yes/No) Yes
  • Migration needed? (Yes/No) No
  • If yes, exact upgrade steps: Operators who intentionally kept provider credentials only in workspace .env should move them to shell env or trusted global OpenClaw runtime .env.

Risks and Mitigations

  • Risk: Some workflows may have relied on cwd .env for provider credentials.
    • Mitigation: Shell env and trusted global runtime .env remain supported credential sources.

@openclaw-barnacle openclaw-barnacle Bot added size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 18, 2026
@clawsweeper

clawsweeper Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed May 27, 2026, 6:53 PM ET / 22:53 UTC.

Summary
The PR expands workspace dotenv filtering to block registered provider credential env vars, adds dotenv/docs regression tests, and updates environment/security docs for trusted credential sources.

PR surface: Source +107, Tests +176, Docs +20. Total +303 across 6 files.

Reproducibility: yes. A high-confidence reproduction path is to create cwd and global .env files with the same registered provider keys; current main loads cwd first and only blocks selected credential names, and the PR body supplies before/after terminal output for that path.

Review metrics: 1 noteworthy metric.

  • Credential-source policy surface: 1 changed dotenv source boundary. Provider credential env vars are newly blocked from workspace .env, which can affect existing upgrade behavior even when CI is green.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
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:

  • Run node scripts/run-vitest.mjs src/infra/dotenv.test.ts src/docs/environment-docs.test.ts on the final head.
  • Run a changed check in Testbox before merge because the change touches startup/config/provider metadata behavior.

Risk before merge

  • Existing users who intentionally keep provider credentials only in workspace .env will lose provider auth after upgrade until they move keys to process env, global runtime dotenv, config env, or login-shell import.
  • Workspace dotenv parsing now consults provider metadata for dynamic auth names, so final validation should cover startup/config/provider metadata paths before merge.
  • The change is a deliberate auth-source policy boundary; maintainers should explicitly accept that workspace provider credentials are no longer supported.

Maintainer options:

  1. Accept the credential boundary (recommended)
    Maintainers can accept that workspace .env is no longer a provider credential source and land after focused dotenv/docs tests plus changed checks pass.
  2. Preserve project-local keys
    If project-local provider credentials must remain supported, revise toward a warning-on-shadowing path or an explicit strict mode instead of unconditional blocking.
  3. Pause for auth-source policy
    If the permanent provider credential policy is still unsettled, pause this PR until the source boundary is decided.

Next step before merge
Human maintainer review should own the compatibility/auth-source policy acceptance and final changed-check validation; there is no narrow automated repair left.

Security
Cleared: The diff narrows credential sourcing and adds regression/docs coverage without adding dependencies, downloads, lifecycle hooks, CI permission changes, or new code-execution surface.

Review details

Best possible solution:

Land the fail-closed workspace provider-credential boundary after maintainer acceptance and final checks, or revise to warning/opt-in strict mode if project-local provider keys remain supported.

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

Yes. A high-confidence reproduction path is to create cwd and global .env files with the same registered provider keys; current main loads cwd first and only blocks selected credential names, and the PR body supplies before/after terminal output for that path.

Is this the best way to solve the issue?

Yes, if maintainers accept the auth-source policy. The implementation reuses the provider env-var registry and documents trusted sources; the safer alternative is warning or opt-in strict mode if workspace provider keys remain supported.

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. Sufficient terminal proof: the PR body includes before/after output showing workspace provider credential values ignored after the patch while trusted global dotenv values are retained.

Label justifications:

  • P2: This is a focused security hardening and provider-auth behavior change with limited but real compatibility impact.
  • merge-risk: 🚨 compatibility: Existing setups that use workspace .env as the only provider credential source can stop authenticating after merge.
  • merge-risk: 🚨 auth-provider: The PR changes where provider credentials may be sourced during startup and can affect provider auth resolution.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): Sufficient terminal proof: the PR body includes before/after output showing workspace provider credential values ignored after the patch while trusted global dotenv values are retained.
  • proof: sufficient: Contributor real behavior proof is sufficient. Sufficient terminal proof: the PR body includes before/after output showing workspace provider credential values ignored after the patch while trusted global dotenv values are retained.
Evidence reviewed

PR surface:

Source +107, Tests +176, Docs +20. Total +303 across 6 files.

View PR surface stats
Area Files Added Removed Net
Source 1 113 6 +107
Tests 2 176 0 +176
Docs 3 24 4 +20
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 6 313 10 +303

Acceptance criteria:

  • node scripts/run-vitest.mjs src/infra/dotenv.test.ts src/docs/environment-docs.test.ts
  • node scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox --shell -- "pnpm check:changed"

What I checked:

  • Repository policy read: Full root AGENTS.md was read; its auth/provider/config compatibility guidance affects the merge-risk assessment for this PR. (AGENTS.md:1, 6ac3561c6983)
  • Scoped docs policy read: docs/AGENTS.md was read because the PR changes docs/help and docs/gateway pages; the changed docs use root-relative links and generic wording consistent with that guide. Public docs: docs/AGENTS.md. (docs/AGENTS.md:1, 6ac3561c6983)
  • Current main dotenv behavior: Current main blocks selected credential/runtime keys from workspace .env, but loadDotEnv still loads cwd .env before the trusted global runtime .env, so unblocked provider keys can currently win precedence. (src/infra/dotenv.ts:16, 6ac3561c6983)
  • Provider env-var registry contract: Provider auth env-var names are already centralized through listKnownProviderAuthEnvVarNames, which combines provider auth candidates and provider setup env vars. (src/secrets/provider-env-vars.ts:394, 6ac3561c6983)
  • PR implementation: The PR head adds a static provider auth workspace blocklist, augments it from the registered provider env-var registry while excluding untrusted workspace plugin metadata, and applies it during workspace dotenv parsing. (src/infra/dotenv.ts:208, 2459912e604e)
  • Regression coverage: The PR adds tests proving registered provider auth keys and manifest-backed plugin provider auth keys are ignored from workspace .env while trusted global dotenv values are retained. (src/infra/dotenv.test.ts:807, 2459912e604e)

Likely related people:

  • drobison00: Commit 6a79324 introduced untrusted cwd dotenv filtering before OpenClaw startup, which is the central surface this PR extends. (role: introduced behavior; confidence: high; commits: 6a793248024d; files: src/infra/dotenv.ts, src/infra/dotenv.test.ts)
  • Jacob Tomlinson: Commit 7a5c5f3 added auth env var blocking from workspace dotenv, directly adjacent to this PR's provider credential blocklist expansion. (role: adjacent feature contributor; confidence: high; commits: 7a5c5f33d05c; files: src/infra/dotenv.ts)
  • Agustin Rivera: Recent commits dbfcef3 and dafcaf9 hardened workspace runtime/browser override loading, and the same person authored the PR branch docs clarification commit 4ecbf71. (role: recent area contributor and policy reviewer; confidence: medium; commits: dbfcef319618, dafcaf9d69d2, 4ecbf71a988b; files: src/infra/dotenv.ts, docs/help/environment.md, docs/gateway/security/index.md)
  • Peter Steinberger: Current-main blame and recent history show Peter carrying the latest checked-out dotenv file state and release-adjacent changes, making him a useful routing candidate for final compatibility review. (role: recent area contributor; confidence: medium; commits: 94749b0a45ce, 10ad3aa16068; files: src/infra/dotenv.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: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels May 18, 2026
@mmaps

mmaps commented May 18, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

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

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels May 18, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 18, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 18, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. proof: sufficient ClawSweeper judged the real behavior proof convincing. labels May 18, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 18, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 19, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 19, 2026
@eleqtrizit eleqtrizit requested a review from a team as a code owner May 21, 2026 15:39
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation gateway Gateway runtime and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. labels May 21, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels May 21, 2026
@clawsweeper

clawsweeper Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

✨ Hatched: 🥚 common Velvet Clawlet

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.

Rarity: 🥚 common.
Trait: stacks clean commits.
Image traits: location diff observatory; accessory review stamp; palette amber, ink, and glacier blue; mood focused; pose sitting proudly on a smooth stone; shell polished stone shell; lighting cool dashboard glow; background small green status lights.
Share on X: post this hatch
Copy: My PR egg hatched a 🥚 common Velvet Clawlet in ClawSweeper.

What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@eleqtrizit eleqtrizit self-assigned this May 21, 2026
@eleqtrizit

Copy link
Copy Markdown
Contributor

I don't think we should do this PR. The user risk is non-existent.

What It Does

PR #83655 blocks known provider credential env vars from workspace .env files: GEMINI_API_KEY, XAI_API_KEY, MISTRAL_API_KEY, OPENROUTER_API_KEY, plugin-declared provider auth vars, etc.

It does not block .env generally. It only says provider credentials cannot come from the current project/workspace .env; they must come from process env, ~/.openclaw/.env, config env,
SecretRefs, or shell import.

Claimed Risk

OpenClaw currently loads cwd .env before global ~/.openclaw/.env, and dotenv loading is non-overriding. So if a workspace has:

GEMINI_API_KEY=workspace-supplied-key

that value can win over the operator’s global fallback key.

The PR frames that as credential substitution: model traffic could go through the workspace-supplied provider account.

Who Is Actually At Risk

Mostly the owner of the key in the repo/workspace. If they committed or distributed a real provider key, they exposed their own credential and billing. OpenClaw blocking it does not fix
the fact that the key is sitting in the repo.

The OpenClaw user risk is weaker: if they run an untrusted workspace and send sensitive prompts through a workspace-provided provider key, the provider account owner might see logs/usage
depending on the provider. That is real in theory, but it is not the same as stealing the user’s own credentials.

Recommendation

I would not merge this as-is.

It breaks a normal developer workflow: project-local .env containing project-scoped API keys. That pattern is common, useful, and currently consistent with OpenClaw’s env precedence
docs. Blocking provider keys from workspace .env changes product policy from “workspace .env is valid project config except dangerous runtime controls” to “provider credentials are never
valid project config.” That is too broad for the actual risk.

Better options:

  • Close as not planned, with rationale.
  • Or add docs/warnings about .env precedence and not running untrusted workspace credentials with sensitive data.
  • Or warn only when a workspace provider key shadows a global/trusted provider key.

@eleqtrizit

Copy link
Copy Markdown
Contributor

After reconsideration, I think this is ok, since it is happening before a known boundary we expect to be there.

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 22, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 22, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 27, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 27, 2026
@drobison00 drobison00 merged commit 85277c2 into openclaw:main May 28, 2026
111 checks passed
@mmaps mmaps deleted the fix/fix-666 branch May 28, 2026 15:20
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 29, 2026
* fix: block provider credentials from workspace dotenv

* addressing codex review

* fix(dotenv): document provider credential sources

---------

Co-authored-by: Agustin Rivera <agustin@rivera-web.com>
Co-authored-by: Devin Robison <drobison00@users.noreply.github.com>
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 31, 2026
…026.5.28) (#759)

This PR contains the following updates:

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

---

### Release Notes

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

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

[Compare Source](openclaw/openclaw@v2026.5.27...v2026.5.28)

##### Highlights

- Agent and Codex runtime recovery is steadier: subagents keep cwd/workspace separation, hook context stays prompt-local, session locks release on timeout abort while live OpenClaw locks survive cleanup, stale restart continuations are avoided, and Codex app-server/helper failures no longer tear down shared runtime state. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;87409](openclaw/openclaw#87409), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;88129](openclaw/openclaw#88129))
- Channel delivery and session identity got safer across outbound plugin hooks, Matrix room ids, iMessage reactions/approvals, Slack final replies, Discord recovered tool warnings, runtime-config message actions, WhatsApp profile auth roots, Telegram polling, and Microsoft Teams service URL trust checks. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;87160](openclaw/openclaw#87160))
- Mobile and chat surfaces got a broader refresh: the iOS Pro UI, hosted push relay default, realtime Talk tab playback, Gateway chat transport, onboarding, Talk permissions, WebChat reconnect delivery, and session picker behavior now preserve more state across reconnects and empty searches. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;87531](openclaw/openclaw#87531), [#&#8203;87682](openclaw/openclaw#87682), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;ngutman](https://github.com/ngutman) and [@&#8203;BunsDev](https://github.com/BunsDev).
- Browser, channel, and automation inputs are stricter: Browser tool timeouts, viewport/tab indices, Gateway ports, cron retry handling, Discord component ids, schema array refs, Telegram callback pages, and channel progress callbacks now reject malformed values earlier and preserve the intended delivery context. ([#&#8203;82887](openclaw/openclaw#82887))
- Provider, media, and document coverage expands with Claude Opus 4.8, Fal Krea image schemas, NVIDIA featured models, MiniMax streaming music responses, encrypted PDF extraction, voice model catalogs, GitHub Copilot agent runtime support, and a Codex Supervisor plugin path for delegated Codex workflows. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87751](openclaw/openclaw#87751), [#&#8203;87794](openclaw/openclaw#87794))
- CLI, auth, doctor, and provider paths fail faster and recover more clearly: malformed numeric/version options are rejected, workspace dotenv provider credentials are ignored, heartbeat defaults, OAuth/token lifetimes, and local service startup requests are bounded, agent auth health labels are clearer, legacy `api_key` auth profiles migrate to canonical form, and restart guidance is actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924)) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc) and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- Plugin and Gateway hot paths do less repeated work while preserving cache correctness for install records, config JSON parsing, tool search catalogs, session stores, manifest model rows, auto-enabled plugin config, browser tokens, viewer assets, and release-split external plugin packages. ([#&#8203;86699](openclaw/openclaw#86699))
- Release, QA, and E2E validation now bound more log, artifact, harness, and cross-OS waits so failing lanes produce proof instead of hanging or false-greening.

##### Changes

- Status: show active subagent details in status output.
- Diffs: split the default language pack and expand default Diffs language coverage while keeping the host floor aligned. ([#&#8203;87370](openclaw/openclaw#87370), [#&#8203;87372](openclaw/openclaw#87372)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa).
- ClawHub: add plugin display names plus skill verification and trust surfaces. ([#&#8203;87354](openclaw/openclaw#87354), [#&#8203;86699](openclaw/openclaw#86699)) Thanks [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow) and [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- iOS: refresh the dev app with Pro Command, Chat, Agents, Settings, hosted push relay defaults, and realtime Talk playback wired to gateway sessions, diagnostics, chat, and realtime Talk. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin) and [@&#8203;ngutman](https://github.com/ngutman).
- Docs: clarify Codex computer-use setup, paste-token stdin auth setup, macOS gateway sleep troubleshooting, native Codex hook relay recovery, container model auth, install deployment cards, device-token admin gating, CLI setup flow compatibility, Notte cloud browser CDP setup, and backport targets. ([#&#8203;87313](openclaw/openclaw#87313), [#&#8203;63050](openclaw/openclaw#63050), [#&#8203;87685](openclaw/openclaw#87685)) Thanks [@&#8203;bdjben](https://github.com/bdjben), [@&#8203;liaoandi](https://github.com/liaoandi), and [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow).
- PDF/tools: use ClawPDF for PDF extraction, support encrypted PDF extraction, and surface MCP structured content in agent tool results. ([#&#8203;87670](openclaw/openclaw#87670), [#&#8203;87751](openclaw/openclaw#87751))
- Providers: add Claude Opus 4.8 support, Fal Krea image model schemas, NVIDIA featured model catalogs, MiniMax streaming music responses, and provider-backed voice model catalogs. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87794](openclaw/openclaw#87794)) Thanks [@&#8203;eleqtrizit](https://github.com/eleqtrizit) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Codex/GitHub: add the GitHub Copilot agent runtime and the Codex Supervisor plugin package.
- Plugins: externalize GitHub Copilot and Tokenjuice as official install-on-demand plugins with npm and ClawHub publish metadata.
- Workboard: add agent coordination tools for tracking and handing off active agent work.
- Discord: show commentary in progress drafts so live Discord runs expose useful in-progress context. ([#&#8203;85200](openclaw/openclaw#85200))
- Plugin SDK: add a reply payload sending hook for plugins that need to deliver channel-owned replies and flatten package types for SDK declarations. ([#&#8203;82823](openclaw/openclaw#82823), [#&#8203;87165](openclaw/openclaw#87165)) Thanks [@&#8203;piersonr](https://github.com/piersonr) and [@&#8203;RomneyDa](https://github.com/RomneyDa).
- Policy: add policy comparison, ingress-channel conformance, and sandbox-posture conformance checks. ([#&#8203;85572](openclaw/openclaw#85572), [#&#8203;85744](openclaw/openclaw#85744), [#&#8203;86768](openclaw/openclaw#86768))

##### Fixes

- Agents: fall back to local config pruning when the optional `agents delete` Gateway probe cannot authenticate, so offline installs can still delete agents without removing shared workspaces.
- Tighten phone-control mutation authorization \[AI]. ([#&#8203;87150](openclaw/openclaw#87150)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Clarify directive persistence authorization policy \[AI]. ([#&#8203;86369](openclaw/openclaw#86369)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Agents/Codex: keep spawned agent cwd/workspace state separated, forward ACP spawn attachments, keep hook context prompt-local, release session locks on timeout abort and runtime teardown without deleting live OpenClaw-owned locks during cleanup, avoid session event queue self-wait, clean up exec abort listeners, stream assistant deltas incrementally, recover raw missing-thread compaction failures, preserve rotated compaction session identity, keep compaction-timeout snapshots continuable, preserve shared app-server state across startup or helper failures, keep native hook relay alive across restarts and prune stale bridge files, close native hook relay replacement races, keep Claude live tool progress visible for watchdog recovery, suppress abandoned requester completion handoff, route workspace memory through tools, resolve Codex runtime models first, report quarantined dynamic tools, format `skills` command output, bind node auto-review to prepared plans, retry Claude CLI transcript probes, and bound compaction/steering retries. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;86123](openclaw/openclaw#86123), [#&#8203;88129](openclaw/openclaw#88129), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;72574](openclaw/openclaw#72574), [#&#8203;87383](openclaw/openclaw#87383), [#&#8203;87400](openclaw/openclaw#87400), [#&#8203;83022](openclaw/openclaw#83022), [#&#8203;87671](openclaw/openclaw#87671), [#&#8203;87738](openclaw/openclaw#87738), [#&#8203;87747](openclaw/openclaw#87747), [#&#8203;87706](openclaw/openclaw#87706), [#&#8203;87546](openclaw/openclaw#87546), [#&#8203;87541](openclaw/openclaw#87541), [#&#8203;81048](openclaw/openclaw#81048)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky), [@&#8203;Alix-007](https://github.com/Alix-007), [@&#8203;luoyanglang](https://github.com/luoyanglang), [@&#8203;yetval](https://github.com/yetval), [@&#8203;sjf](https://github.com/sjf), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;benjamin1492](https://github.com/benjamin1492), [@&#8203;c19354837](https://github.com/c19354837), [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;pfrederiksen](https://github.com/pfrederiksen), and [@&#8203;dodge1218](https://github.com/dodge1218).
- Codex Supervisor: keep real-home app-server MCP session listing on the loaded state path, bound stored history scans, and close WebSocket probes cleanly.
- Channels: thread canonical session keys into outbound hooks, preserve Matrix room-id case, keep fallback tool warnings mention-inert, retain delivered Slack final replies during late cleanup, continue iMessage polling after denied reactions, suppress duplicate native exec approvals, resolve Gateway message actions against the active runtime config, preserve Telegram SecretRef prompt config and polling keepalives, preserve WhatsApp profile auth roots, QR display, document filenames, and plugin hook config, suppress Discord recovered tool warnings, preserve the Discord voice outbound helper, cap Discord/Signal/Zalo channel request and container timeouts, and block untrusted Teams service URLs while keeping TeamsSDK patterns aligned. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87465](openclaw/openclaw#87465), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;76262](openclaw/openclaw#76262), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;87581](openclaw/openclaw#87581), [#&#8203;77114](openclaw/openclaw#77114), [#&#8203;86426](openclaw/openclaw#86426), [#&#8203;85529](openclaw/openclaw#85529), [#&#8203;87160](openclaw/openclaw#87160)) Thanks [@&#8203;zeroaltitude](https://github.com/zeroaltitude), [@&#8203;lukeboyett](https://github.com/lukeboyett), [@&#8203;jarvis-mns1](https://github.com/jarvis-mns1), [@&#8203;xiaotian](https://github.com/xiaotian), [@&#8203;funmerlin](https://github.com/funmerlin), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;heyitsaamir](https://github.com/heyitsaamir), [@&#8203;amittell](https://github.com/amittell), [@&#8203;lidge-jun](https://github.com/lidge-jun), [@&#8203;liorb-mountapps](https://github.com/liorb-mountapps), [@&#8203;masatohoshino](https://github.com/masatohoshino), [@&#8203;bladin](https://github.com/bladin), and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- CLI/auth/doctor/providers: reject malformed numeric/timeout/subcommand-version inputs, ignore workspace dotenv provider credentials, wait for respawn child shutdown, bound heartbeat defaults plus Codex, GitHub Copilot, OpenAI, Anthropic, Google, Feishu, LM Studio, MiniMax, Xiaomi TTS, and local-provider OAuth/token/model requests, harden Codex auth probes, label auth health by agent, preserve explicit agentRuntime pins during Codex model migration, warm provider auth off the main thread, honor Codex response timeouts, stop migrating current Claude Haiku 4.5 profiles to Sonnet, bound local service startup, resolve GPT-5.5 without cached catalog, migrate legacy memory auto-provider config, rewrite non-canonical `api_key` auth profiles, and make doctor restart follow-ups actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;87719](openclaw/openclaw#87719), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924), [#&#8203;84362](openclaw/openclaw#84362)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;samzong](https://github.com/samzong), [@&#8203;giodl73-repo](https://github.com/giodl73-repo), [@&#8203;alkor2000](https://github.com/alkor2000), [@&#8203;mmaps](https://github.com/mmaps), [@&#8203;nxmxbbd](https://github.com/nxmxbbd), and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Gateway/security/session state: expire browser tokens after auth rotation, scope assistant idempotency dedupe, drain probe client closes, avoid stale restart continuation reuse, preserve retry-after fallbacks and stale rate-limit cooldown probes, bound webchat image and artifact transcript scans, include seconds in inbound metadata timestamps, clear completed session active runs, clear stale chat stream buffers, and evict current plugin-state namespaces at row caps. ([#&#8203;87810](openclaw/openclaw#87810), [#&#8203;87833](openclaw/openclaw#87833), [#&#8203;75089](openclaw/openclaw#75089)) Thanks [@&#8203;joshavant](https://github.com/joshavant) and [@&#8203;litang9](https://github.com/litang9).
- Config/parsing/network: reject partial numeric parsing, parse provider/Discord retry headers and dates strictly, honor IPv6 and bare IPv6 `no_proxy` entries, preserve empty plugin allowlists, canonicalize secret target array indexes, and reject malformed media content lengths, inspected TCP ports, marketplace content lengths, cron epochs, sandbox stat fields, unsafe duration values, empty config path segments, noncanonical schema array refs, unsafe Telegram callback pages, and invalid Teams attachment-fetch DNS targets. ([#&#8203;87883](openclaw/openclaw#87883)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Browser/input hardening: reject invalid tab indexes, excessive viewport resizes, explicit zero CDP ports, malformed geolocation options, unsafe screenshot or permission-grant timeouts, loose response-body limits, invalid cookie expiries, and non-finite Browser tool delays/timeouts.
- Cron/automation: retry recurring jobs after transient model rate limits before waiting for the next scheduled slot, and preflight model fallbacks before skipping scheduled work. ([#&#8203;82887](openclaw/openclaw#82887)) Thanks [@&#8203;chen-zhang-cs-code](https://github.com/chen-zhang-cs-code).
- Auto-reply/directives: respect provider and relayed channel metadata during directive persistence so channel-originated decisions keep their intended context. ([#&#8203;87683](openclaw/openclaw#87683))
- WhatsApp: resolve the auth directory from the active profile so profile-scoped WhatsApp installs do not drift to the wrong credential root. ([#&#8203;82492](openclaw/openclaw#82492)) Thanks [@&#8203;lidge-jun](https://github.com/lidge-jun).
- Gateway/session state: clear completed session active runs, avoid cold-loading providers for MCP inventory, cache single-session child indexes, cap handshake timers, and bound preauth, auth-guard, media, transcript, readiness, and port options.
- Channels/replies: preserve channel-owned progress callbacks when verbose output is off, keep group-room progress suppression intact, prefer external session delivery context, escape Discord component id delimiters, force final TUI chat repaints, show Slack reasoning previews, and normalize Discord/Matrix/Mattermost channel numeric options. ([#&#8203;87476](openclaw/openclaw#87476), [#&#8203;87423](openclaw/openclaw#87423))
- Agents/tool args: harden smart-quoted argument repair for edit arrays and exact escaped arguments so model-produced tool calls recover without corrupting valid input. ([#&#8203;86611](openclaw/openclaw#86611)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).
- Providers/agents: preserve seeded Anthropic signatures, preserve signed thinking payloads, concatenate signature-delta chunks, preserve DeepSeek `reasoning_content` replay across tier suffixes, apply OpenRouter strict9 ids to Mistral routes, promote Ollama plain-text tool calls, load NVIDIA featured model catalogs, stream MiniMax music generation responses, and recover empty preflight compaction. ([#&#8203;87593](openclaw/openclaw#87593), [#&#8203;87493](openclaw/openclaw#87493), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764)) Thanks [@&#8203;Pluviobyte](https://github.com/Pluviobyte) and [@&#8203;eleqtrizit](https://github.com/eleqtrizit).
- Media/images: skip CLI image cache refs when resolving generated images, allow trusted generated HTML attachments, and bound generated video downloads so stale refs and slow providers fail cleanly. ([#&#8203;87523](openclaw/openclaw#87523), [#&#8203;87982](openclaw/openclaw#87982))
- File transfer: handle late tar stdin pipe errors after archive validation or unpacking has already settled.
- Performance: trust install-record caches between reloads, prefer native JSON parsing, reuse unchanged tool-search catalogs, reuse gateway session and plugin metadata paths, skip unchanged store serialization, patch single-entry session writes, add precomputed session patch writers, reduce store clone allocations, cache manifest model catalog rows and auto-enabled plugin config, avoid full session snapshots for entry reads, defer configured Slack full startup, prefer bundled plugin dist entries, and slim current metadata identity caches. ([#&#8203;87760](openclaw/openclaw#87760))
- Docker/release/QA: package runtime workspace templates, stream cross-OS served artifacts, preserve sparse Crabbox run artifacts, isolate npm plugin installs per package, reject incompatible package plugin API installs, drop the leftover root Sharp dependency from package manifests after the Rastermill migration, bound OpenClaw instance logs, plugin gauntlet relay logs, MCP channel buffers, kitchen-sink scans, agent-turn assertions, QA-Lab credential broker calls, QA Matrix substrate requests, and release scenario logs, and keep release/google live guards current. ([#&#8203;87647](openclaw/openclaw#87647), [#&#8203;87477](openclaw/openclaw#87477)) Thanks [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Release/CI: bound manual git fetches, ClawHub verifier responses, ClawHub owner metadata, dependency-guard error bodies, Parallels limits, startup/test/memory budget parsing, and diffs viewer build warnings so release lanes fail with useful proof instead of hanging. ([#&#8203;87839](openclaw/openclaw#87839))

</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/759
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
* fix: block provider credentials from workspace dotenv

* addressing codex review

* fix(dotenv): document provider credential sources

---------

Co-authored-by: Agustin Rivera <agustin@rivera-web.com>
Co-authored-by: Devin Robison <drobison00@users.noreply.github.com>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
* fix: block provider credentials from workspace dotenv

* addressing codex review

* fix(dotenv): document provider credential sources

---------

Co-authored-by: Agustin Rivera <agustin@rivera-web.com>
Co-authored-by: Devin Robison <drobison00@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation gateway Gateway runtime merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants