Repository navigation
Conversation
Adds an opt-in "Send immediately" setting for iPhone voice input. It is off by default, so dictated text still lands in the composer for review. Split out of pingdotgg#12893 without the web voice input changes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This adds a device-local, off-by-default option to auto-submit completed iPhone dictation through the existing composer send paths. Existing review-before-send behavior remains unchanged, and focused tests cover the pending-transcription, focus, draft ownership, cancellation, and blocked-send cases. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
⛔ Files ignored due to path filters (1)
📒 Files selected for processing (7)
🚧 Files skipped from review as they are similar to previous changes (1)
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review. 📝 WalkthroughWalkthroughMobile settings now include an optional voice-input setting that can submit a committed composer draft immediately. The controller captures the setting when recording starts and checks the draft and input state before submission. ChangesVoice input settings and submission
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~20 minutes Change: Feature Sequence Diagram(s)sequenceDiagram
participant User
participant VoiceInputController
participant ThreadComposer
participant handleSend
User->>VoiceInputController: Confirm transcription
VoiceInputController->>ThreadComposer: Call onSubmit when owner, draft text, and input remain valid
ThreadComposer->>handleSend: Invoke when canSend is true
Suggested reviewers: Merge Risk: ⚪ Minimal · up to No actionable issue remains that should block merging. Real microphone and speech-recognition behavior was not retested after the rebase, so normal device validation is still appropriate. Security Architecture ReviewSecurity architecture risk: 🟡 Moderate · up to The option is off by default and retains existing send checks. However, automatic submission identifies the thread rather than the specific draft being recorded. A same-thread transition out of a queued-message edit could therefore submit a new agent request instead of saving the intended edit. Retained concerns
Security review detailsSecurity Blast Radius
Security Findings and Attack Paths
Trust Boundaries and Controls
Resilience and Maintainability Implications
Hardening Proposals
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 8 functions across 8 files. (1 skipped: 1 unsupported.)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
…to-send-ios # Conflicts: # apps/mobile/src/features/settings/SettingsKeyboardRouteScreen.tsx # apps/mobile/src/persistence/mobile-preferences.ts
Main added voice input to the scheduled task prompt field, which has nothing to send. Make the controller's submit hook optional so "Send immediately" only applies where a composer can send. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…to-send-ios Main moved dictation into a shared session that keeps running after the composer leaves the screen (pingdotgg#15502). Send immediately now rides on that session: the hook marks a pending send when the transcript lands in a composer that is still mounted and in front, and sends once that composer has rendered the transcript. A transcript that lands anywhere else stays a draft. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…to-send-ios Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Problem
iPhone voice input always stops at the draft. After dictation, the user confirms the transcript, waits, and then taps send. People who dictate short follow-ups and do not edit the text pay that second tap every time. The same request is in Ideas discussion #14719.
Change
Adds Settings → Keyboard & voice → Voice input → Send immediately on iPhone. It is off by default, so dictated text still lands in the composer for review.
With it on, a finished transcript goes through the normal send path:
The setting is device-local. The settings row is renamed from Keyboard to Keyboard & voice because it now holds both.
docs/user/composer.mdgains one paragraph in the voice input section.Surfaces: iPhone only, which is the only client with voice input. No contract, server, or provider changes.
Scope and approval
There is no maintainer approval for this yet. I am submitting it as a focused configuration option for an established capability.
This is the iPhone half of #12893, which was closed because it also added browser speech recognition. The web changes are not in this PR. If you see opt-in sending as a product behavior choice that needs approval first, tell me and I will take it to #14719 instead.
Verification
Checked on this branch (
81a4e6af9, merged with main atd72021099):tsc --noEmitinapps/mobilepasses.handleSendwith no follow-up argument, the same call the send button makes, so a dictated message during a running turn follows the user's queue or steer preference.vp test run src/features/voice-input src/features/threads src/features/settings src/persistenceinapps/mobile: 465 tests pass in 54 files.useVoiceInputController.test.ts(12 tests) renders the hook inside main's realVoiceInputProviderwith a mocked recorder and transcriber. It covers default-off review, sending exactly once after the composer shows the transcript, and the cases that must not send: a blocked send, an empty or failed transcript, a cancel, a draft edited before the composer showed it, a screen that is not in front, and a composer that moved to another draft.The merge with #15502 was more than a conflict fix. Dictation moved from a per-composer controller to a shared session, so the send logic was ported to it: the hook marks a pending send when the transcript lands in a mounted, focused composer, then sends once that composer has rendered the transcript.
Captured for #12893 on the iPhone 17 Pro simulator, iOS 26.5, at the original commit
f22247568:Before video · After video
Those checks covered default-off, toggling, and persistence after an app restart. The videos show the settings flow, not speech recognition.
Not checked:
react-test-renderermoved from 19.2.6 to 19.3.0 to match the mobile React version on main.Original change: GPT-6 in Codex (#12893). Split, rebase, and V2 merge: Claude Opus 5.5 in Claude Code.
🤖 Generated with Claude Code