openclaw - 💡(How to fix) Fix CLI 'devices approve' fails with 'missing scope: operator.talk.secrets' when Android app requests talk.secrets [1 participants]

Official PRs (…)
ON THIS PAGE

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#60076Fetched 2026-04-08 02:36:45
View on GitHub
Comments
0
Participants
1
Timeline
1
Reactions
0
Participants
Timeline (top)
subscribed ×1

openclaw devices approve fails with missing scope: operator.talk.secrets when trying to approve an Android app pairing request that includes the operator.talk.secrets scope.

The CLI itself fails to start — the error occurs before the approve command runs, likely during CLI startup when talk.config(includeSecrets: true) is called.

openclaw devices list works fine (read-only, no talk.secrets needed).

Error Message

[openclaw] Failed to start CLI: GatewayClientRequestError: missing scope: operator.talk.secrets at GatewayClient.handleMessage (...)

Root Cause

  • operatorScopeSatisfied() correctly returns true when operator.admin is in the granted set
  • But the error suggests client.connect.scopes does not contain operator.admin at the point where talk.config(includeSecrets: true) is called during CLI startup
  • devices list works because it does not trigger talk.config with includeSecrets

Fix Action

Workaround

None found through supported CLI paths. Manual JSON file manipulation (moving pending to paired) works but is not a proper fix.

Code Example

[openclaw] Failed to start CLI: GatewayClientRequestError: missing scope: operator.talk.secrets
  at GatewayClient.handleMessage (...)
RAW_BUFFERClick to expand / collapse

Bug type

Behavior bug (incorrect output/state without crash)

Summary

openclaw devices approve fails with missing scope: operator.talk.secrets when trying to approve an Android app pairing request that includes the operator.talk.secrets scope.

The CLI itself fails to start — the error occurs before the approve command runs, likely during CLI startup when talk.config(includeSecrets: true) is called.

openclaw devices list works fine (read-only, no talk.secrets needed).

Steps to reproduce

  1. Install OpenClaw Android app (2026.3.29) and pair via Tailscale Serve
  2. Android app requests scopes: operator.read, operator.write, operator.talk.secrets
  3. openclaw devices list shows the pending request correctly
  4. openclaw devices approve <requestId> fails immediately:
[openclaw] Failed to start CLI: GatewayClientRequestError: missing scope: operator.talk.secrets
  at GatewayClient.handleMessage (...)
  1. openclaw devices approve --latest also fails with same error
  2. Providing explicit --token also fails

Expected behavior

openclaw devices approve should work. The CLI connects with operator.admin scope, and operatorScopeSatisfied() in pairing-token should treat operator.admin as covering all operator.* scopes including operator.talk.secrets.

Actual behavior

The CLI fails to start before reaching the approve logic. The error appears to originate from a talk.config method call during CLI initialization that checks canReadTalkSecrets(client) against client.connect.scopes.

Analysis

  • operatorScopeSatisfied() correctly returns true when operator.admin is in the granted set
  • But the error suggests client.connect.scopes does not contain operator.admin at the point where talk.config(includeSecrets: true) is called during CLI startup
  • devices list works because it does not trigger talk.config with includeSecrets

Environment

  • OpenClaw: 2026.4.2 (d74a122) — also reproduced on 2026.4.1
  • OS: macOS 15 (Apple M4 Pro)
  • Gateway: local loopback, Tailscale Serve
  • Auth: token
  • Android app: 2026.3.29, Samsung SM-F968N, Android 16 (SDK 36)

Workaround

None found through supported CLI paths. Manual JSON file manipulation (moving pending to paired) works but is not a proper fix.

extent analysis

TL;DR

The openclaw devices approve command fails due to a missing operator.talk.secrets scope, which is not included in the client's connect scopes during CLI startup.

Guidance

  • Verify that the operator.admin scope is correctly granted and included in the client's connect scopes before calling talk.config(includeSecrets: true).
  • Check the implementation of canReadTalkSecrets(client) to ensure it correctly handles the operator.admin scope as covering all operator.* scopes.
  • Investigate why client.connect.scopes does not contain operator.admin during CLI startup, despite operatorScopeSatisfied() returning true when operator.admin is in the granted set.
  • Consider modifying the talk.config method to handle the operator.admin scope correctly or to delay the scope check until after the CLI has fully initialized.

Example

No code snippet is provided as the issue does not contain sufficient information to create a specific example.

Notes

The issue seems to be related to the scope handling during CLI startup, and the provided analysis suggests that the operator.admin scope is not being correctly included in the client's connect scopes. However, without more information about the implementation of talk.config and canReadTalkSecrets, it is difficult to provide a more specific solution.

Recommendation

Apply a workaround to manually include the operator.admin scope in the client's connect scopes during CLI startup, as the root cause of the issue is not immediately clear and may require further investigation.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

openclaw devices approve should work. The CLI connects with operator.admin scope, and operatorScopeSatisfied() in pairing-token should treat operator.admin as covering all operator.* scopes including operator.talk.secrets.

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING