Skip to content

Tighten phone-control mutation authorization [AI]#87150

Merged
pgondhi987 merged 9 commits into
openclaw:mainfrom
pgondhi987:fix/fix-695
May 28, 2026
Merged

Tighten phone-control mutation authorization [AI]#87150
pgondhi987 merged 9 commits into
openclaw:mainfrom
pgondhi987:fix/fix-695

Conversation

@pgondhi987

Copy link
Copy Markdown
Contributor

Summary

  • Require operator.admin scope metadata on the bundled /phone plugin command so scoped command dispatch exposes and enforces the intended operator boundary.
  • Add a defensive handler check before /phone arm and /phone disarm mutate gateway.nodes.allowCommands or gateway.nodes.denyCommands.
  • Reverse the external-channel regression expectations so non-owner callers without operator.admin are blocked and do not write config.
  • Keep owner and explicit operator.admin paths covered as allowed behavior.

Linked context

Which issue does this close?

N/A

Which issues, PRs, or discussions are related?

Related private maintainer report.

Was this requested by a maintainer or owner?

Requested through maintainer tracking context.

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: External channel /phone arm and /phone disarm callers must be owner/operator-authorized before changing Gateway node command policy.
  • Real environment tested: Not tested in a live OpenClaw setup for this branch preparation.
  • Exact steps or command run after this patch: None; repository command execution was intentionally left for maintainer/CI validation.
  • Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output): Updated regression coverage in extensions/phone-control/index.test.ts documents the expected blocked and allowed paths.
  • Observed result after fix: Non-owner external callers without operator.admin receive an authorization response and config mutation is not called.
  • What was not tested: Live Telegram/Discord/Slack command dispatch and end-to-end Gateway config persistence.
  • Proof limitations or environment constraints: This metadata draft did not run repository commands.
  • Before evidence (optional but encouraged): Existing tests previously allowed external channel callers without operator.admin to mutate phone-control state.

Tests and validation

Which commands did you run?

None.

What regression coverage was added or updated?

extensions/phone-control/index.test.ts now checks that external non-owner callers without operator.admin cannot arm or disarm phone control, and that owner or operator.admin callers remain allowed.

What failed before this fix, if known?

The test contract allowed an external channel caller without operator.admin to run /phone arm and write Gateway node command policy.

If no test was added, why not?

Regression coverage was updated.

Risk checklist

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

Yes.

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

No schema, environment, or migration behavior changed. The existing config mutation is now gated more narrowly.

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

Yes, authorization behavior changed for phone-control mutations.

What is the highest-risk area?

Shared-channel users who previously could run /phone arm or /phone disarm with only generic command authorization will now need owner status or operator.admin.

How is that risk mitigated?

The change is scoped to the mutation subcommands and preserves explicit owner/admin paths in tests.

Current review state

What is the next action?

Run focused tests for extensions/phone-control/index.test.ts and review the scoped authorization behavior.

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

Maintainer/CI validation and optional live channel proof.

Which bot or reviewer comments were addressed?

None at draft time.

AI-assisted: Yes

@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed May 28, 2026, 1:15 AM ET / 05:15 UTC.

Summary
The PR gates /phone arm and /phone disarm mutations on owner or operator.admin authorization, adds a trusted bundled-command owner-status exposure path, and updates focused phone-control/plugin-command tests.

PR surface: Source +35, Tests +185. Total +220 across 12 files.

Reproducibility: yes. from source inspection: current main and v2026.5.26 only require admin when gateway scopes are present or the channel is webchat, so an external Telegram /phone arm without gateway scope context can reach mutation. I did not run a live Telegram reproduction in this read-only review.

Review metrics: 2 noteworthy metrics.

  • Plugin command API surface: 1 field added. exposeSenderIsOwner changes the command definition contract and affects the owner-status authorization boundary before merge.
  • Phone-control mutation gates: 2 subcommands tightened. /phone arm and /phone disarm now fail closed for external non-owner callers, which is the compatibility behavior maintainers need to approve.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🐚 platinum hermit
Result: blocked until real behavior proof from a real setup is added.

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

Rank-up moves:

  • [P1] Add redacted real behavior proof showing a non-owner external caller is blocked and owner/admin paths still mutate as intended.
  • Update the PR body with the actual focused validation commands/output instead of the current None testing section.
  • Get maintainer approval for the trusted owner-status plugin command boundary.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR body still says no live setup was tested, and the follow-up provides CI/local tests and builds rather than redacted live transport output showing the blocked and allowed /phone paths. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Mantis proof suggestion
Native Telegram proof would directly show the blocked non-owner /phone arm response and the allowed owner/admin mutation path. A maintainer can ask Mantis to capture proof by posting a new PR comment that starts with the OpenClaw Mantis account mention, followed by:

telegram desktop proof: verify /phone arm writes 30s blocks a non-owner Telegram caller and allows owner/admin mutation with private details redacted.

Risk before merge

  • [P1] Merging intentionally fails closed for shared-channel users who previously could run /phone arm or /phone disarm with generic command authorization; they will now need owner status or operator.admin.
  • [P1] The PR adds exposeSenderIsOwner to the plugin command definition path, which is a plugin API and authorization-boundary contract that needs maintainer approval before it becomes permanent.
  • [P1] The current PR body and follow-up proof comment still provide tests/CI/build output rather than redacted live transport proof of the changed external-channel behavior.

Maintainer options:

  1. Approve the trusted owner-status contract (recommended)
    A maintainer can confirm that bundled-only owner-status exposure and the fail-closed /phone mutation behavior are intended, then require redacted transport proof before merge.
  2. Rework the owner-status seam
    If maintainers do not want a new command-definition field on the public plugin type, pause the PR and move the owner-status exposure into an internal bundled-only registration path or another approved API shape.
  3. Pause if the compatibility break is too broad
    If existing shared-channel non-owner mutation should remain supported, pause or close this PR and design a narrower opt-in authorization model instead.

Next step before merge

  • [P1] Human handling is needed because the protected maintainer-labeled PR changes a plugin API/security boundary and still needs maintainer approval plus contributor real behavior proof.

Security
Cleared: No supply-chain, credential-handling, or new code-execution regression was found; the authorization-boundary decision is tracked as merge risk for maintainer approval.

Review details

Best possible solution:

Land a maintainer-approved authorization fix that blocks non-owner external mutation, keeps read-only status/help usable, keeps owner status unavailable to external plugins, and includes focused validation plus redacted live transport proof.

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

Yes from source inspection: current main and v2026.5.26 only require admin when gateway scopes are present or the channel is webchat, so an external Telegram /phone arm without gateway scope context can reach mutation. I did not run a live Telegram reproduction in this read-only review.

Is this the best way to solve the issue?

Unclear until maintainer approval: the mutation guard is narrow and the tests cover blocked/allowed paths, but the new owner-status command field is a plugin API and security-boundary decision. If maintainers reject the public field, the safer path is an internal bundled-only owner-status seam.

AGENTS.md: found and applied where relevant.

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

Label changes

Label justifications:

  • P1: The PR changes authorization for high-risk phone-control mutations reachable from external chat command surfaces.
  • merge-risk: 🚨 compatibility: Existing shared-channel callers that previously mutated phone-control state with generic command authorization will now be blocked unless owner/admin identity is present.
  • merge-risk: 🚨 security-boundary: The patch changes how trusted owner identity is exposed to plugin command handlers and uses that signal to authorize phone-control config mutations.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🐚 platinum hermit.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body still says no live setup was tested, and the follow-up provides CI/local tests and builds rather than redacted live transport output showing the blocked and allowed /phone paths. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • mantis: telegram-visible-proof: Mantis should capture Telegram visible proof. The PR changes visible Telegram /phone arm and /phone disarm authorization responses that a short Telegram Desktop proof can demonstrate.
Evidence reviewed

PR surface:

Source +35, Tests +185. Total +220 across 12 files.

View PR surface stats
Area Files Added Removed Net
Source 7 50 15 +35
Tests 5 209 24 +185
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 12 259 39 +220

What I checked:

  • Current main behavior: Current main still requires operator.admin only when gateway scopes are present, otherwise only for webchat; an external Telegram command with no gateway scope context can reach the /phone arm mutation path. (extensions/phone-control/index.ts:285, 8f6a2f0f6b11)
  • Current test contract: Current main tests explicitly expect external channel callers without operator.admin to arm phone control and write config, which matches the behavior this PR reverses. (extensions/phone-control/index.test.ts:166, 8f6a2f0f6b11)
  • Latest release behavior: The latest release tag has the same requiresAdminToMutatePhoneControl logic, so the requested authorization tightening is not already shipped. (extensions/phone-control/index.ts:285, 10ad3aa16068)
  • PR mutation guard: The PR diff changes phone-control mutation checks to require gateway operator.admin or senderIsOwner === true, and marks the bundled /phone command for owner-status exposure. (extensions/phone-control/index.ts:285, fdd3c67a8aeb)
  • Plugin command API surface: The PR adds exposeSenderIsOwner to OpenClawPluginCommandDefinition, making this a plugin command contract and security-boundary decision rather than only a local phone-control change. (src/plugins/types.ts:2057, fdd3c67a8aeb)
  • Proof state: The current PR body still says no live setup or repository command was run, and the follow-up comment lists CI/local tests and builds rather than redacted live transport output; no proof artifacts were attached to the referenced Actions run. (fdd3c67a8aeb)

Likely related people:

  • steipete: Current blame ties the phone-control mutation guard and plugin command owner-status logic to Peter Steinberger, and recent GitHub path history shows substantial plugin command/runtime work in the same area. (role: recent area contributor; confidence: high; commits: c86667c5cfac, b9f6abf5e845, 77d9ac30bb8d; files: extensions/phone-control/index.ts, src/plugins/commands.ts, src/plugins/types.ts)
  • mbelinky: GitHub path history lists the original Gateway/Plugins device pairing and phone-control plugin commit under this author. (role: feature introducer; confidence: medium; commits: 730f86dd5c43; files: extensions/phone-control/index.ts, extensions/phone-control/index.test.ts)
  • jalehman: Recent src/plugins/commands.ts history includes plugin command authorization work credited to and reviewed by this contributor, adjacent to the owner/scope behavior changed here. (role: recent plugin command auth contributor; confidence: medium; commits: 9119492f158a; files: src/plugins/commands.ts)
  • vincentkoc: GitHub path history for plugin types/command-adjacent surfaces includes recent plugin transport/config exposure work by Vincent Koc. (role: plugin command surface contributor; confidence: medium; commits: e2d5e1b38dca; files: src/plugins/types.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. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels May 27, 2026
@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg: 🎁 locked until real behavior proof passes.

Details
  • No creature or rarity is rolled until proof passes.
  • Eggs are collectible flavor only; they do not affect labels, ratings, merge decisions, or automation.

@pgondhi987

Copy link
Copy Markdown
Contributor Author

Not applicable to this automation stage; changelog/release-note and external real behavior proof requirements are handled outside auto-pr stages.

Quoted comment from @clawsweeper:

Codex review: needs real behavior proof before merge. Reviewed May 27, 2026, 12:47 AM ET / 04:47 UTC.

Summary
The PR gates /phone arm and /phone disarm mutations on owner/admin authorization, adds a trusted bundled-command owner-status exposure path, and updates phone-control/plugin-command regression coverage.

PR surface: Source +38, Tests +154. Total +192 across 9 files.

Reproducibility: yes. from source inspection, not from a live run: current main only requires operator.admin when gateway scopes are present or the channel is webchat, so a Telegram /phone arm without gateway scope context can reach the mutation path.

Review metrics: 1 noteworthy metric.

  • Plugin command API surface: 1 command definition field added. exposeSenderIsOwner changes a public plugin command definition type and affects the owner-status authorization boundary before merge.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🐚 platinum hermit
Result: blocked until real behavior proof from a real setup is added.

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

Rank-up moves:

  • Add redacted real behavior proof showing a non-owner external caller is blocked and owner/admin paths still mutate as intended.
  • Run the focused plugin command tests and include the exact command output or CI link in the PR body.
  • Update the PR body after adding proof; if ClawSweeper does not re-review automatically, ask a maintainer to comment ``@clawsweeper re-review.

Proof guidance:
Needs real behavior proof before merge: The PR body explicitly says no live OpenClaw setup or repository command was run; only regression coverage is offered, so contributor real behavior proof is still required with private details redacted. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment ``@clawsweeper re-review.

Mantis proof suggestion
A native Telegram proof would directly show the blocked non-owner /phone arm response and the allowed owner/admin path. A maintainer can ask Mantis to capture proof by posting a new PR comment that starts with the OpenClaw Mantis account mention, followed by:

telegram desktop proof: verify `/phone arm writes 30s` blocks a non-owner caller and allows an owner/admin caller without leaking private details.

Risk before merge

  • Merging intentionally fails closed for shared-channel users who previously could run /phone arm or /phone disarm with generic command authorization; they will now need owner status or operator.admin.
  • The PR adds a trusted owner-status exposure field to the plugin command definition path, which is a plugin API and security-boundary decision that needs maintainer approval before it becomes the permanent contract.
  • The external PR body says no live OpenClaw setup or repository command was run, so the changed transport-visible authorization behavior still lacks real behavior proof.

Maintainer options:

  1. Approve the trusted owner-status boundary (recommended)
    A maintainer can confirm that a bundled-only owner-status exposure path is the intended plugin command contract, then require focused CI and redacted real behavior proof before merge.
  2. Rework the owner-status seam
    If maintainers do not want a new command-definition field on the public plugin type, pause the PR and move the exposure into an internal bundled-only registration path or another approved API shape.
  3. Accept the fail-closed behavior change
    Maintainers can explicitly accept that existing shared-channel non-owner /phone mutators will stop working unless the caller is owner/admin.

Next step before merge
The protected maintainer-labeled PR needs maintainer approval for the trusted owner-status plugin command boundary and contributor real behavior proof before merge.

Security
Cleared: No supply-chain or credential-handling regression was found in the diff; the security-sensitive authorization boundary still needs maintainer approval and real behavior proof.

Review details

Best possible solution:

Land a maintainer-approved narrow authorization fix that blocks non-owner external mutation, keeps read-only status/help usable, keeps owner status unavailable to external plugins, and includes focused tests plus redacted live transport proof.

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

Yes from source inspection, not from a live run: current main only requires operator.admin when gateway scopes are present or the channel is webchat, so a Telegram /phone arm without gateway scope context can reach the mutation path.

Is this the best way to solve the issue?

Unclear without maintainer approval: the mutation guard is targeted and covered by focused tests, but the new trusted owner-status command field is a plugin API/security-boundary decision.

AGENTS.md: found and applied where relevant.

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

Label changes

Label justifications:

  • P1: The PR changes authorization for a high-risk phone-control mutation path used from external chat channels.
  • merge-risk: 🚨 compatibility: Existing shared-channel callers that previously mutated phone-control state with generic command authorization will be blocked unless they are owner/admin.
  • merge-risk: 🚨 security-boundary: The diff changes how owner status is exposed to plugin command handlers and uses that signal to authorize phone-control config mutations.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🐚 platinum hermit.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body explicitly says no live OpenClaw setup or repository command was run; only regression coverage is offered, so contributor real behavior proof is still required with private details redacted. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment ``@clawsweeper re-review.
  • mantis: telegram-visible-proof: Mantis should capture Telegram visible proof. The changed /phone authorization response is visible in Telegram chat and can be demonstrated in a short Telegram Desktop proof.
Evidence reviewed

PR surface:

Source +38, Tests +154. Total +192 across 9 files.

View PR surface stats
Area Files Added Removed Net
Source 6 47 9 +38
Tests 3 158 4 +154
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 9 205 13 +192

What I checked:

  • Current main allows external no-scope mutation: On current main, the phone-control mutation guard only requires admin when gateway scopes are present or the channel is webchat, so a Telegram command without gateway scope context can reach the arm/disarm mutation paths. (extensions/phone-control/index.ts:285, bf1a5c330397)
  • Current test contract expected the unsafe path: Current main's phone-control tests explicitly expect external channel callers without operator.admin to arm phone control and write config, which matches the reported behavior the PR reverses. (extensions/phone-control/index.test.ts:166, bf1a5c330397)
  • PR blocks non-owner external mutation: The PR changes the phone-control guard to require either gateway operator.admin or senderIsOwner === true, and marks the bundled /phone command as needing owner-status exposure. (extensions/phone-control/index.ts:285, 5cdcfe7533a1)
  • PR covers blocked and trusted paths: The branch adds regression expectations for blocked non-owner Telegram callers, read-only status/help behavior, and owner/admin allowed paths; it also tests that external plugin opt-ins do not receive owner status while trusted bundled commands can. (src/plugins/commands.test.ts:736, 5cdcfe7533a1)
  • Repository policy marks this compatibility-sensitive: Root policy treats plugin APIs, auth state, fail-closed changes, and new operator action as compatibility/upgrade-sensitive; scoped plugin policy lists src/plugins/types.ts as a public contract surface. (AGENTS.md:26, bf1a5c330397)
  • History provenance points to recent plugin refactor: Blame and git log -S tie the current phone-control guard and plugin command owner-status logic to b74cd69c6f87e338805152cda37029b40a247f53, a recent gateway/plugin refactor commit by Peter Steinberger. (extensions/phone-control/index.ts:285, b74cd69c6f87)

Likely related people:

  • steipete: Direct blame and feature-history search tie the current phone-control guard and plugin command execution contract to the same recent gateway/plugin refactor commit. (role: recent area contributor; confidence: medium; commits: b74cd69c6f87; files: extensions/phone-control/index.ts, src/plugins/commands.ts, src/plugins/registry.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.

@pgondhi987

Copy link
Copy Markdown
Contributor Author

Not applicable to this automation stage; changelog/release-note and external real behavior proof requirements are handled outside auto-pr stages.

Quoted comment from @clawsweeper:

ClawSweeper PR egg

🎁 Pass real behavior proof to wake the egg and unlock a hatchable treat.

Where did the egg go?
  • The egg game starts only after the PR passes the real-behavior proof check.
  • Before that, no creature or rarity is rolled. The treat waits for real proof.
  • This is still just collectible flavor: proof affects review readiness, not creature quality.

# Conflicts:
#	src/image-generation/provider-registry.test.ts
#	src/video-generation/provider-registry.test.ts
@openclaw-barnacle openclaw-barnacle Bot added the gateway Gateway runtime label May 27, 2026
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 automation 🚨 May affect CI, automerge, proof capture, label sync, or maintainer automation. label May 27, 2026
@clawsweeper clawsweeper Bot removed the merge-risk: 🚨 automation 🚨 May affect CI, automerge, proof capture, label sync, or maintainer automation. label May 28, 2026
@pgondhi987

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Real behavior proof is now green for the current head fdd3c67a8aeb42ceeaef320bf88b14d49d490ff7:

Local proof also completed on this head:

  • node scripts/run-vitest.mjs src/image-generation/provider-registry.test.ts src/video-generation/provider-registry.test.ts extensions/phone-control/index.test.ts src/plugins/commands.test.ts src/plugins/contracts/host-hooks.contract.test.ts
  • git diff --check
  • pnpm build
  • pnpm build:plugin-sdk:strict-smoke

@clawsweeper

clawsweeper Bot commented May 28, 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:

@BingqingLyu

This comment was marked as spam.

@pgondhi987

pgondhi987 commented May 28, 2026

Copy link
Copy Markdown
Contributor Author

Diff notes

Fix verdict: SOLVES.

The PR solves the GHSA root cause by replacing the old channel-based /phone mutation check with an authorization gate that requires operator.admin when Gateway scopes are present, or confirmed owner status when scope context is absent. It also adds trusted bundled-plugin-only owner-status exposure so phone-control can make that decision without exposing senderIsOwner to ordinary external plugins.

Evidence:

  • extensions/phone-control/index.ts changes the helper from requiresAdminToMutatePhoneControl(channel, scopes) to lacksAdminToMutatePhoneControl({ senderIsOwner, gatewayClientScopes }); absent scopes now block mutation unless senderIsOwner is true.
  • extensions/phone-control/index.ts applies the new gate before both disarm and arm, before disarmNow or mutateConfigFile can change gateway.nodes allowCommands/denyCommands.
  • extensions/phone-control/index.ts sets exposeSenderIsOwner: true on the bundled phone command so the handler can distinguish owner from non-owner callers when gatewayClientScopes is absent.
  • src/plugins/commands.ts and src/plugins/command-registry-state.ts only pass senderIsOwner to commands that are scoped or have trustedOwnerStatusExposure.
  • src/plugins/command-registration.ts and src/plugins/registry.ts only grant trustedOwnerStatusExposure through trusted registration options, preventing ordinary external plugin opt-in from receiving owner status.
  • extensions/phone-control/index.test.ts reverses the old permissive external-channel tests: Telegram-shaped non-owner callers without operator.admin are blocked for arm and disarm, while status/help remain readable and owner/operator.admin paths still mutate.
  • src/plugins/commands.test.ts covers the owner-status plumbing: direct/external plugin opt-in is ignored, and trusted bundled phone-control opt-in receives senderIsOwner.

Plain-language post description

Someone who was already allowed to send commands to an OpenClaw bot from an external chat channel could use /phone arm or /phone disarm to temporarily loosen which phone actions the Gateway may run. That could make sensitive phone capabilities, such as camera, screen recording, calendar writes, contacts, reminders, or SMS, available even though the sender was not the owner or an operator admin.

The PR changes phone-control so /phone arm and /phone disarm require either operator.admin or confirmed owner status when the caller does not have Gateway scope context. Ordinary command-authorized channel users can still read /phone status and help, but they cannot change the phone permission policy.

Change Impact Analysis

  • Change scope: Targeted
  • Regression risk: Medium
  • Change path: Standard fix

The fix is narrowly focused on the /phone mutation path, with a small supporting plugin-command change so trusted bundled commands can receive owner status for subcommand-level authorization. It does not change config shape, defaults, persisted data, CLI syntax, or Gateway wire protocol. The main practical impact is intentional: shared-channel deployments that previously let non-owner allowlisted users run /phone arm or /phone disarm must now use the owner or an operator.admin context.

Impact reasons:

  • The authorization change is limited to /phone arm and /phone disarm; /phone status and help remain readable.
  • The plugin API change is an optional field, exposeSenderIsOwner?: boolean, with trusted-owner exposure limited to bundled/trusted registration paths.
  • No openclaw config migration, default change, persisted schema change, CLI syntax change, or Gateway protocol change is introduced.
  • Regression risk is Medium because the PR touches command authorization plumbing and intentionally changes one shared-channel phone-control workflow.
  • src/gateway/server-methods/config.ts is formatting-only and unrelated to the phone-control behavior.

Verification notes:

  • Reviewed in read-only mode; no GitHub or git state was mutated.
  • The local origin/main...HEAD checkout is an unrelated device-pairing branch, so PR Tighten phone-control mutation authorization [AI] #87150 impact was based on read-only GitHub PR metadata and previously inspected targeted hunks for the requested PR.
  • Reviewed PR file metadata shows focused changes in phone-control, plugin-command owner-status plumbing, and targeted tests.
  • No tests were executed for this impact write-up.

Caveats

Residual risks:

  • The phone-control regression tests exercise the handler directly; runtime owner-status delivery is covered separately by plugin command registry tests rather than one end-to-end external-channel /phone dispatch test.
  • No relevant affected /phone arm|disarm path remains unhandled in the reviewed diff; src/gateway/server-methods/config.ts is formatting-only and unrelated to the GHSA root cause.
  • Tests were not executed in this read-only gate; verdict is based on the PR source diff and directly relevant regression test changes.

Automated review gate:

  • Bot-only unresolved actionable comments: 0
  • No unresolved/unreplied actionable bot comments.

Gate blockers:

  • None

Backward Compatibility Review

Compatibility verdict: PASS.
Informational only: this section does not block GHSA PR gate outcome.

No blocking backward-compatibility concern in the reviewed PR diff. The PR adds an optional plugin command field and internal trusted-registration metadata without changing CLI syntax, config shape, defaults, Gateway wire payloads, or persisted data. The only meaningful user-visible behavior change is the intended hardening: non-owner external-channel users without operator.admin can no longer run /phone arm or /phone disarm.

Blocking concerns:

  • (none)

Notes:

  • API compatibility: OpenClawPluginCommandDefinition gains optional exposeSenderIsOwner?: boolean; existing typed plugin command definitions remain source-compatible.
  • Runtime validation now reserves exposeSenderIsOwner as a boolean field, so an untyped plugin that already used that exact property with a non-boolean value could fail registration; this is narrow and not a blocking BC issue.
  • CLI compatibility: no command names, arguments, or CLI invocation shapes change.
  • Config/default compatibility: no openclaw config keys, default values, migrations, or persisted config schemas change.
  • Wire/schema compatibility: no Gateway protocol, channel payload, or serialized API response shape changes are introduced by the relevant diff.
  • Behavior compatibility: deployments that intentionally let non-owner allowlisted Telegram/Discord/Slack users run /phone arm or /phone disarm will need owner/operator.admin instead; /phone status and help remain available.
  • src/gateway/server-methods/config.ts is formatting-only in this PR and does not change config.openFile behavior.
  • Reviewed in read-only mode; no tests were run and no git/GitHub state was mutated.

@pgondhi987 pgondhi987 merged commit 91a4635 into openclaw:main May 28, 2026
7 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 29, 2026
* fix: require admin authorization for phone control mutations

* addressing codex review

* addressing codex review

* addressing ci

* addressing ci

* test: restore provider registry mock isolation

* docs: add changelog entry for PR merge
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: require admin authorization for phone control mutations

* addressing codex review

* addressing codex review

* addressing ci

* addressing ci

* test: restore provider registry mock isolation

* docs: add changelog entry for PR merge
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
* fix: require admin authorization for phone control mutations

* addressing codex review

* addressing codex review

* addressing ci

* addressing ci

* test: restore provider registry mock isolation

* docs: add changelog entry for PR merge
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

extensions: phone-control gateway Gateway runtime maintainer Maintainer-authored PR mantis: telegram-visible-proof Mantis should capture Telegram visible proof. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P1 High-priority user-facing bug, regression, or broken workflow. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: M status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants