Skip to content

feat(ios): add Apple Watch voice turns#100283

Merged
steipete merged 3 commits into
mainfrom
codex/watch-voice-turns
Jul 5, 2026
Merged

feat(ios): add Apple Watch voice turns#100283
steipete merged 3 commits into
mainfrom
codex/watch-voice-turns

Conversation

@steipete

@steipete steipete commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Closes #100224

What Problem This Solves

Apple Watch chat accepts dictated text, but replies remain visual-only. Users cannot complete a hands-free voice turn from the Watch.

Why This Change Was Made

Adds an explicit voice-turn action that uses native Watch dictation, the existing WatchConnectivity chat path, and native speech playback for the matching completed assistant reply. The existing Message action remains silent; intermediate tool progress is not spoken, and users can cancel while waiting or stop playback.

User Impact

Users can tap the microphone on Apple Watch, dictate a message, and hear OpenClaw's final reply spoken back. Delivery survives temporary Watch reachability changes through the existing durable WatchConnectivity path.

Evidence

  • xcodebuild test -project apps/ios/OpenClaw.xcodeproj -scheme OpenClaw -destination 'platform=iOS Simulator,id=504AD0F4-BA3E-4012-B7CB-C45A1F613984' -only-testing:OpenClawTests/NodeAppModelInvokeTests — 87 tests passed.
  • xcodebuild test -project apps/ios/OpenClaw.xcodeproj -scheme OpenClawLogicTests -destination 'platform=macOS' -only-testing:OpenClawLogicTests/WatchVoiceTurnTrackerTests — 3 tests passed.
  • xcodebuild build -project apps/ios/OpenClaw.xcodeproj -scheme OpenClawWatchApp -destination 'platform=watchOS Simulator,id=1173986F-82CA-463A-B461-7C3D569E01A0' — succeeded.
  • Rebased Watch app installed and launched on Apple Watch Series 11 simulator, PID 7735.
  • Fresh local autoreview: no accepted/actionable findings.

@openclaw-barnacle openclaw-barnacle Bot added app: ios App: ios size: L maintainer Maintainer-authored PR labels Jul 5, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6cc0781d6c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

private func scheduleVoiceReplyTimeout() {
self.voiceReplyTimeout?.cancel()
self.voiceReplyTimeout = Task { @MainActor in
try? await Task.sleep(for: .seconds(90))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Keep voice waits alive for queued sends

Because sendChatMessage returns the command id before the async receiver.sendAppCommand result is known, voice turns also enter this path when WatchConnectivity falls back to queued transferUserInfo. Starting a fixed 90s timeout here means any queued delivery that reaches the iPhone more than ~15s late (the iPhone then waits up to 75s for the run) cancels the tracker before the watch.chat.completion arrives, so the completion is ignored instead of spoken; base the timeout on actual delivery/result or keep queued voice turns pending longer.

Useful? React with 👍 / 👎.

Comment thread CHANGELOG.md

### Changes

- **Apple Watch voice turns:** dictate a message from the Watch chat and hear the new OpenClaw reply spoken on the Watch, with explicit silent-message and stop-speaking controls. (#100224)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Remove feature entry from release-owned changelog

AGENTS.md marks CHANGELOG.md as release-only and says normal feat/fix work should put release-note context in the PR body or commit, with release generation deriving entries later. Adding this issue-level feature note directly will make the generated release notes stale or duplicated when the release job rebuilds this section, so this entry should be removed from the normal feature commit.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fc74753964

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +1090 to +1093
return "Speaking reply…"
}
if self.voiceTurnTracker.isAwaitingReply {
return "Waiting for spoken reply…"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Add the voice strings to native i18n

These new Watch UI strings are returned from a String? computed property, while scripts/native-app-i18n.ts only extracts direct SwiftUI/modifier literals or var ...: String switch branches; the updated apps/.i18n/native-source.json contains only line-number shifts and no entries for “Speaking reply…”/“Waiting for spoken reply…”. On localized watchOS builds the new voice states remain English, so expose them through an extracted/localized string path or update the inventory.

Useful? React with 👍 / 👎.

@clawsweeper

clawsweeper Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 5, 2026, 9:18 AM ET / 13:18 UTC.

Summary
The PR adds a Watch voice-turn action, a WatchConnectivity chat-completion payload, Watch speech playback/tracking, and focused iOS/watchOS tests for speaking the assistant reply after dictated Watch chat messages.

PR surface: Docs +1, Other +671. Total +672 across 17 files.

Reproducibility: yes. for the review findings from source inspection: the PR head starts a fixed Watch timeout before delivery is known and uses broad fallback reply matching after the submitted row. I did not execute watchOS flows in this read-only review.

Review metrics: 2 noteworthy metrics.

  • Watch payload surface: 1 added (watch.chat.completion). The new iPhone-to-Watch payload must be reviewed with delivery, parsing, and version behavior in mind before merge.
  • Voice strings outside inventory: 5 added, 0 found in native-source search. The new Watch voice status and accessibility strings need native i18n coverage for localized builds.

Stored data model
Persistent data-model change detected: vector/embedding metadata: apps/ios/Sources/Model/NodeAppModel.swift. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #100224
Summary: The linked issue is the canonical product request, and this PR is the open implementation candidate for that Apple Watch voice-turn feature.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🦪 silver shellfish
Patch quality: 🦐 gold shrimp
Result: blocked until stronger real behavior proof 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 the Watch voice-turn path after the fix, such as a simulator/device recording, terminal live output, or logs that show the spoken-reply flow.
  • [P2] Fix queued delivery and fallback reply correlation so delayed or interleaved turns cannot be ignored or spoken for the wrong command.
  • Move the new voice UI strings into the native i18n path and remove the direct CHANGELOG.md entry.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The PR provides CI, focused tests, build output, and simulator launch notes, but it does not show an after-fix Watch dictation-to-spoken-reply turn or visible/logged proof of the changed behavior. 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.

Risk before merge

  • [P2] Merging as-is can miss or misroute a spoken Watch reply when WatchConnectivity queues delivery or when fallback reply matching anchors to the wrong user turn.
  • [P2] The PR currently adds user-visible Watch voice strings outside the native i18n inventory, so localized watchOS builds would keep the new states in English.
  • [P1] The PR includes a normal feature entry in release-owned CHANGELOG.md, which can drift from generated release notes.
  • [P1] The available proof covers CI, tests, build, and simulator launch, but not an observed after-fix Watch dictation-to-spoken-reply turn.

Maintainer options:

  1. Fix turn correlation before merge (recommended)
    Bind fallback reply lookup to the specific Watch turn, stop at the next user row, avoid substring anchors, and keep queued voice waits pending until delivery and completion can arrive.
  2. Accept missed or wrong spoken replies
    Maintainers could intentionally ship the feature with the known risk that delayed or interleaved Watch turns may be ignored or speak the wrong assistant response.
  3. Pause the feature PR
    If reliable turn correlation needs a larger chat-history contract, pause this PR and keep the canonical issue open for a narrower design.

Next step before merge

  • [P1] Human follow-up is needed because the PR lacks sufficient real behavior proof and still needs product/UX acceptance after the code blockers are fixed.

Maintainer decision needed

  • Question: Should Apple Watch voice turns become a supported OpenClaw iOS/watchOS surface after the current delivery, localization, and proof blockers are fixed?
  • Rationale: This PR adds a new user-facing Watch audio mode and the paired issue carries maintainer/product-review signals; code review can identify blockers, but maintainers still own whether this voice surface should ship now.
  • Likely owner: steipete — They proposed the paired feature and have recent current-main history on the iOS Watch surfaces touched here.
  • Options:
    • Sponsor after blockers (recommended): Fix the delivery/localization/release-note issues, require real behavior proof, and then land the feature as the current Watch voice-turn direction.
    • Defer Watch voice turns: Keep Watch chat text-only until the team commits to Watch audio UX and hardware proof expectations.
    • Fold into Talk roadmap: Treat Watch speech as part of a broader cross-device Talk design instead of landing this standalone Watch action.

Security
Cleared: No concrete security or supply-chain regression was found; the diff adds app/watch code and an Apple framework reference, with no dependency, workflow, secrets, or package-resolution changes.

Review findings

  • [P2] Keep queued voice turns pending until delivery completes — apps/ios/WatchApp/Sources/WatchInboxView.swift:1125
  • [P2] Avoid matching queued voice turns by substring — apps/ios/Sources/Model/NodeAppModel.swift:3621
  • [P2] Stop fallback reply search at the next user turn — apps/ios/Sources/Model/NodeAppModel.swift:3624-3626
Review details

Best possible solution:

Land only after reply matching is command/turn-bound, queued voice waits survive delayed WatchConnectivity delivery, voice strings and release-note handling follow repo policy, and redacted real Watch or simulator proof shows the voice turn path.

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

Yes for the review findings from source inspection: the PR head starts a fixed Watch timeout before delivery is known and uses broad fallback reply matching after the submitted row. I did not execute watchOS flows in this read-only review.

Is this the best way to solve the issue?

No, not yet: reusing Watch dictation and WatchConnectivity is a plausible owner-boundary solution, but the current implementation must tighten turn correlation, localization, and release-note handling before it is the best maintainable fix.

Full review comments:

  • [P2] Keep queued voice turns pending until delivery completes — apps/ios/WatchApp/Sources/WatchInboxView.swift:1125
    sendChatMessage returns the command id before the async WatchConnectivity send result is known, so voice turns start this 90-second timeout even when the command falls back to queued delivery. If the command reaches the phone late and the phone then waits for the run/reply, the tracker can cancel before watch.chat.completion arrives and the spoken reply is dropped.
    Confidence: 0.9
  • [P2] Avoid matching queued voice turns by substring — apps/ios/Sources/Model/NodeAppModel.swift:3621
    When the exact runId:user row is missing, entry.text.contains(submittedText) can anchor short dictated text like ok to a later unrelated user row after submittedAtMs. The following assistant lookup can then speak that later turn's reply for the Watch command; use a stronger queued-turn marker or avoid substring anchoring.
    Confidence: 0.89
  • [P2] Stop fallback reply search at the next user turn — apps/ios/Sources/Model/NodeAppModel.swift:3624-3626
    After choosing a user row, the fallback scans all later rows and returns the first terminal assistant message, even if another user turn appears first. In interleaved iPhone/Watch use this can speak the assistant response for the later user turn; bound the search to the current turn before accepting a reply.
    Confidence: 0.88
  • [P2] Route voice UI strings through native i18n — apps/ios/WatchApp/Sources/WatchInboxView.swift:1090-1093
    The new Speaking reply… / Waiting for spoken reply… states and voice-button accessibility labels are returned through computed properties that are not present in apps/.i18n/native-source.json; the only new inventory hit is Message OpenClaw. Localized watchOS builds would show the new voice states in English unless these strings use an extracted/localized path or the extractor is updated.
    Confidence: 0.92
  • [P2] Remove the release-owned changelog entry — CHANGELOG.md:27
    CHANGELOG.md is release-owned in this repo; normal feature PRs should carry release-note context in the PR body or commit message. Adding this entry directly can leave generated release notes duplicated or stale, so remove it from the feature branch.
    Confidence: 0.94

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against f9e194e4a122.

Label changes

Label changes:

  • add merge-risk: 🚨 message-delivery: The PR can miss or misroute the spoken assistant reply for delayed or interleaved Watch chat turns.
  • add rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦐 gold shrimp.
  • add status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The PR provides CI, focused tests, build output, and simulator launch notes, but it does not show an after-fix Watch dictation-to-spoken-reply turn or visible/logged proof of the changed behavior. 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.

Label justifications:

  • P2: This is a bounded Apple Watch feature PR with normal usability impact and source-backed merge blockers, not a core outage or security emergency.
  • merge-risk: 🚨 message-delivery: The PR can miss or misroute the spoken assistant reply for delayed or interleaved Watch chat turns.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The PR provides CI, focused tests, build output, and simulator launch notes, but it does not show an after-fix Watch dictation-to-spoken-reply turn or visible/logged proof of the changed behavior. 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.
Evidence reviewed

PR surface:

Docs +1, Other +671. Total +672 across 17 files.

View PR surface stats
Area Files Added Removed Net
Source 0 0 0 0
Tests 0 0 0 0
Docs 1 1 0 +1
Config 0 0 0 0
Generated 0 0 0 0
Other 16 782 111 +671
Total 17 783 111 +672

What I checked:

  • Live PR context: Live PR metadata shows this PR is open, closes the Apple Watch voice-turn issue, changes 17 files, and reports xcodebuild/CI plus simulator launch evidence but no observed dictated Watch turn or spoken reply artifact. (2cf965142c75)
  • Watch voice UI surface: The PR head adds voice-turn state, speech playback state, completion handling, and a fixed 90-second reply timeout in the Watch chat timeline. (apps/ios/WatchApp/Sources/WatchInboxView.swift:1015, 2cf965142c75)
  • Reply correlation path: The PR head falls back to matching queued user rows with substring containment and then selects the first later terminal assistant row without bounding the search to the current user turn. (apps/ios/Sources/Model/NodeAppModel.swift:3614, 2cf965142c75)
  • Native i18n extraction gap: Current native i18n extraction covers direct Swift modifier literals and var ...: String switch branches, while the PR's voice status/accessibility strings were not present in the generated inventory search. (scripts/native-app-i18n.ts:83, f9e194e4a122)
  • Current main capability check: A current-main search found shared iPhone Talk speech synthesis but no Watch voice-turn, Watch chat-completion, or Watch speech playback implementation, so this PR is not redundant with main. (apps/shared/OpenClawKit/Sources/OpenClawKit/TalkSystemSpeechSynthesizer.swift:12, f9e194e4a122)
  • Feature history provenance: Git history and PR metadata tie the existing Watch companion/message surfaces to earlier Watch MVP and hardening work, with the current iOS app import carried through a recent main commit. (apps/ios/WatchApp/Sources/WatchInboxView.swift:1104, 57083e4220e3)

Likely related people:

  • steipete: They opened the paired feature issue and PR, and current-main history shows recent iOS/WatchApp import and Watch reply coordinator work on the touched paths. (role: recent area contributor and product proposer; confidence: high; commits: b6f4cf5ac432, f399a818ef68, 9b60e1429d1f; files: apps/ios/WatchApp/Sources/WatchInboxView.swift, apps/ios/Sources/Model/NodeAppModel.swift)
  • mbelinky: GitHub PR metadata shows they authored and merged the Apple Watch companion message MVP and later actionable Watch approvals/quick replies that this feature extends. (role: introduced behavior; confidence: high; commits: 57083e4220e3, 738b011624c7; files: apps/ios/WatchExtension/Sources/WatchInboxView.swift, apps/ios/WatchExtension/Sources/OpenClawWatchApp.swift)
  • ngutman: They carried the Watch approval/background hardening pass through WatchConnectivity and app model surfaces adjacent to this PR's new payload flow. (role: recent area contributor; confidence: medium; commits: 6f566585d84f; files: apps/ios/Sources/Model/NodeAppModel.swift, apps/ios/Sources/Services/WatchMessagingPayloadCodec.swift, apps/ios/WatchExtension/Sources/WatchConnectivityReceiver.swift)
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.
Review history (1 earlier review cycle)
  • reviewed 2026-07-05T10:50:50.270Z sha fc74753 :: needs real behavior proof before merge. :: [P2] Keep voice waits alive for queued sends | [P2] Route voice status strings through native i18n | [P2] Remove the normal-PR changelog entry

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels Jul 5, 2026
@steipete

steipete commented Jul 5, 2026

Copy link
Copy Markdown
Contributor Author

Land-ready proof for fc7475396479cbadec47fac6d07d5aa8e8f3051c:

  • Exact-head CI: https://github.com/openclaw/openclaw/actions/runs/28738038140 — completed successfully, including ios-build, macos-swift, native-i18n, generated protocol, lint, and test types.
  • xcodebuild test -project apps/ios/OpenClaw.xcodeproj -scheme OpenClaw -destination 'platform=iOS Simulator,id=504AD0F4-BA3E-4012-B7CB-C45A1F613984' -only-testing:OpenClawTests/NodeAppModelInvokeTests — 87 tests passed.
  • xcodebuild test -project apps/ios/OpenClaw.xcodeproj -scheme OpenClawLogicTests -destination 'platform=macOS' -only-testing:OpenClawLogicTests/WatchVoiceTurnTrackerTests — 3 tests passed after the final main rebase.
  • xcodebuild build -project apps/ios/OpenClaw.xcodeproj -scheme OpenClawWatchApp -destination 'platform=watchOS Simulator,id=1173986F-82CA-463A-B461-7C3D569E01A0' — succeeded after the final main rebase.
  • pnpm native:i18n:check and git diff --check origin/main...HEAD — clean.
  • Rebased Watch app installed and launched on a booted Series 11 simulator.
  • Fresh autoreview: no accepted/actionable findings.
  • Native review artifacts validated with zero findings; scripts/pr prepare-run 100283 passed exact-head hosted gates.

Known proof gap: simulator validation cannot exercise physical Watch microphone dictation or speaker acoustics; those use WatchKit/AVFoundation system APIs and the surrounding state/correlation paths are covered above.

@openclaw-barnacle openclaw-barnacle Bot added scripts Repository scripts docs Improvements or additions to documentation channel: imessage Channel integration: imessage docker Docker and sandbox tooling channel: qqbot size: XL and removed size: L labels Jul 5, 2026
@steipete
steipete force-pushed the codex/watch-voice-turns branch from ef7343a to 6b93d9f Compare July 5, 2026 11:46
@openclaw-barnacle openclaw-barnacle Bot added size: L and removed docs Improvements or additions to documentation channel: imessage Channel integration: imessage scripts Repository scripts docker Docker and sandbox tooling channel: qqbot size: XL labels Jul 5, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6b93d9fa25

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +3624 to +3626
return entries[(userIndex + 1)...].first(where: {
self.isTerminalWatchAssistant($0)
})?.text

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Stop voice reply search at the next user turn

When the fallback cannot match an assistant row by run id, this searches all messages after the matched Watch user row and speaks the first terminal assistant message, even if another user turn appears before it. In a delayed/queued Watch send where the user asks something from the iPhone before the Watch run finishes, the next assistant reply can belong to that later user turn and will be spoken as the Watch voice reply; bound the search to the current user turn, as the chat history reconciliation path does, instead of crossing subsequent user rows.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the codex/watch-voice-turns branch from 6b93d9f to 28ef91d Compare July 5, 2026 11:57
@steipete
steipete force-pushed the codex/watch-voice-turns branch from 28ef91d to 5977a97 Compare July 5, 2026 12:37

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5977a97b50

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

else {
return false
}
return entry.text.contains(submittedText)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Avoid anchoring queued voice replies by substring

When the exact runId:user row is missing (the collected queued path this fallback is meant to cover), lastIndex plus entry.text.contains(submittedText) can anchor a short dictated Watch message like “ok” to a later iPhone/user turn that happens to contain that text after submittedAtMs. The reply lookup then speaks that later turn’s assistant response for the Watch command; use a stronger queued-turn marker or avoid selecting later unrelated user rows by substring.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the codex/watch-voice-turns branch 2 times, most recently from e5812f2 to 2cf9651 Compare July 5, 2026 13:07
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jul 5, 2026
@steipete
steipete force-pushed the codex/watch-voice-turns branch from 2cf9651 to e90c5ac Compare July 5, 2026 13:28
@steipete
steipete merged commit 245092d into main Jul 5, 2026
75 checks passed
@steipete
steipete deleted the codex/watch-voice-turns branch July 5, 2026 13:40
@steipete

steipete commented Jul 5, 2026

Copy link
Copy Markdown
Contributor Author

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 6, 2026
* feat(ios): add Apple Watch voice turns

* chore(ios): sync native i18n inventory

* fix(ios): preserve Watch message label
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 merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P2 Normal backlog priority with limited blast radius. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. size: L 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.

feat: add two-way voice turns to Apple Watch chat

1 participant