Skip to content

iOS/watch: add actionable watch approvals and quick replies#21996

Merged
mbelinky merged 1 commit intomainfrom
feat/ios-watch-actionable-approvals
Feb 20, 2026
Merged

iOS/watch: add actionable watch approvals and quick replies#21996
mbelinky merged 1 commit intomainfrom
feat/ios-watch-actionable-approvals

Conversation

@mbelinky
Copy link
Contributor

@mbelinky mbelinky commented Feb 20, 2026

Summary

Describe the problem and fix in 2–5 bullets:

  • Problem:
  • Why it matters:
  • What changed:
  • What did NOT change (scope boundary):

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor
  • 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

  • Closes #
  • Related #

User-visible / Behavior Changes

List user-visible changes (including defaults/config).
If none, write None.

Security Impact (required)

  • New permissions/capabilities? (Yes/No)
  • Secrets/tokens handling changed? (Yes/No)
  • New/changed network calls? (Yes/No)
  • Command/tool execution surface changed? (Yes/No)
  • Data access scope changed? (Yes/No)
  • If any Yes, explain risk + mitigation:

Repro + Verification

Environment

  • OS:
  • Runtime/container:
  • Model/provider:
  • Integration/channel (if any):
  • Relevant config (redacted):

Steps

Expected

Actual

Evidence

Attach at least one:

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

Human Verification (required)

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

  • Verified scenarios:
  • Edge cases checked:
  • What you did not verify:

Compatibility / Migration

  • Backward compatible? (Yes/No)
  • Config/env changes? (Yes/No)
  • Migration needed? (Yes/No)
  • If yes, exact upgrade steps:

Failure Recovery (if this breaks)

  • How to disable/revert this change quickly:
  • Files/config to restore:
  • Known bad symptoms reviewers should watch for:

Risks and Mitigations

List only real risks for this PR. Add/remove entries as needed. If none, write None.

  • Risk:
    • Mitigation:

Greptile Summary

added actionable watch approvals and quick replies to iOS/watchOS apps

Major changes:

  • Extended OpenClawWatchNotifyParams with prompt metadata (promptId, sessionKey, kind, details, expiresAtMs, risk, actions)
  • Implemented bidirectional watch communication: iPhone receives replies from Apple Watch via WatchConnectivity delegates
  • Added queuing for watch replies when gateway is offline, with automatic flush on reconnect
  • Watch UI now renders action buttons with styles (destructive/cancel) and shows reply status
  • Haptic feedback varies by risk level (high=failure, medium=notification, low=click)

Issues found:

  • Retry logic has a deduplication bug that silently drops failed replies on retry

Confidence Score: 3/5

  • safe to merge after fixing the retry deduplication bug
  • the PR implements a solid bidirectional watch messaging feature with proper queuing, haptics, and UI updates, but contains one critical logical error in the retry mechanism where failed replies get silently dropped due to deduplication. the test coverage is present but doesn't catch this edge case. the rest of the implementation follows good patterns with proper locking, error handling, and state management
  • pay close attention to apps/ios/Sources/Model/NodeAppModel.swift:2324 for the retry deduplication fix

Last reviewed commit: 7665985

@openclaw-barnacle openclaw-barnacle bot added app: ios App: ios size: L maintainer Maintainer-authored PR labels Feb 20, 2026
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

9 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

} catch {
self.watchReplyLogger.error(
"watch reply forwarding failed replyId=\(event.replyId, privacy: .public) error=\(error.localizedDescription, privacy: .public)")
self.queuedWatchReplies.insert(event, at: 0)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

retry re-queues failed reply at front, but seenWatchReplyIds prevents re-processing

the retry logic inserts failed events at index 0, but the replyId remains in seenWatchReplyIds from the initial attempt, causing retries to be silently dropped in handleWatchQuickReply (line 2275-2279)

Suggested change
self.queuedWatchReplies.insert(event, at: 0)
self.seenWatchReplyIds.remove(event.replyId)
self.queuedWatchReplies.insert(event, at: 0)
Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/ios/Sources/Model/NodeAppModel.swift
Line: 2324

Comment:
retry re-queues failed reply at front, but `seenWatchReplyIds` prevents re-processing

the retry logic inserts failed events at index 0, but the `replyId` remains in `seenWatchReplyIds` from the initial attempt, causing retries to be silently dropped in `handleWatchQuickReply` (line 2275-2279)

```suggestion
            self.seenWatchReplyIds.remove(event.replyId)
            self.queuedWatchReplies.insert(event, at: 0)
```

How can I resolve this? If you propose a fix, please make it concise.

@mbelinky mbelinky force-pushed the feat/ios-watch-actionable-approvals branch from 7665985 to ebe1ee6 Compare February 20, 2026 16:24
@openclaw-barnacle openclaw-barnacle bot added the docs Improvements or additions to documentation label Feb 20, 2026
@mbelinky mbelinky force-pushed the feat/ios-watch-actionable-approvals branch from ebe1ee6 to 3c2a01f Compare February 20, 2026 16:38
@openclaw-barnacle openclaw-barnacle bot removed the docs Improvements or additions to documentation label Feb 20, 2026
@mbelinky mbelinky merged commit 738b011 into main Feb 20, 2026
10 checks passed
@mbelinky mbelinky deleted the feat/ios-watch-actionable-approvals branch February 20, 2026 16:39
@mbelinky
Copy link
Contributor Author

Merged via squash.

Thanks @mbelinky!

rodrigogs pushed a commit to rodrigogs/openclaw that referenced this pull request Feb 20, 2026
…#21996)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
Hansen1018 added a commit to Hansen1018/openclaw that referenced this pull request Feb 21, 2026
…#21996)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
vincentkoc pushed a commit that referenced this pull request Feb 21, 2026
Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
dgarson pushed a commit to dgarson/clawdbot that referenced this pull request Feb 21, 2026
…#21996)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
mmyyfirstb pushed a commit to mmyyfirstb/openclaw that referenced this pull request Feb 21, 2026
…#21996)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
obviyus pushed a commit to guirguispierre/openclaw that referenced this pull request Feb 22, 2026
…#21996)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
mreedr pushed a commit to mreedr/openclaw-custom that referenced this pull request Feb 24, 2026
…#21996)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
hughdidit pushed a commit to hughdidit/DAISy-Agency that referenced this pull request Mar 1, 2026
…#21996)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky

(cherry picked from commit 738b011)

# Conflicts:
#	CHANGELOG.md
#	apps/ios/Sources/Model/NodeAppModel.swift
#	apps/ios/Sources/Services/NodeServiceProtocols.swift
#	apps/ios/Sources/Services/WatchMessagingService.swift
#	apps/ios/Tests/NodeAppModelInvokeTests.swift
#	apps/ios/WatchExtension/Sources/OpenClawWatchApp.swift
#	apps/ios/WatchExtension/Sources/WatchInboxStore.swift
#	apps/ios/WatchExtension/Sources/WatchInboxView.swift
#	apps/shared/OpenClawKit/Sources/OpenClawKit/WatchCommands.swift
hughdidit pushed a commit to hughdidit/DAISy-Agency that referenced this pull request Mar 3, 2026
…#21996)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky

(cherry picked from commit 738b011)

# Conflicts:
#	CHANGELOG.md
#	apps/ios/Sources/Model/NodeAppModel.swift
#	apps/ios/Sources/Services/NodeServiceProtocols.swift
#	apps/ios/Sources/Services/WatchMessagingService.swift
#	apps/ios/Tests/NodeAppModelInvokeTests.swift
#	apps/ios/WatchExtension/Sources/OpenClawWatchApp.swift
#	apps/ios/WatchExtension/Sources/WatchInboxStore.swift
#	apps/ios/WatchExtension/Sources/WatchInboxView.swift
#	apps/shared/OpenClawKit/Sources/OpenClawKit/WatchCommands.swift
zooqueen pushed a commit to hanzoai/bot that referenced this pull request Mar 6, 2026
…#21996)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3c2a01f
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: ios App: ios maintainer Maintainer-authored PR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant