Skip to content

fix: simplify iOS recording to a native start/stop button - #2595

Merged
DoodleBears merged 1 commit into
mainfrom
codex/2594-native-recording-button
Oct 22, 2026
Merged

DoodleBears merged 1 commit into
mainfrom
codex/2594-native-recording-button

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Issue #2594 | Agent claim | Previous repair #2592

Why the change

The iOS microphone is offset and its manual gesture still never reaches speech startup in Batch55, so this change replaces it with a centered native start/stop button.

Special things to note

  • Merge risk: two-way door — revert this commit; small blast radius — iOS dictation entry and explicit centering in the shared iOS composer button, with no data/native dependency changes. Worst case: recording activation remains unavailable. Review focus: native press dispatch, Starting/Stop/Cancel and symbol geometry.
  • Human requested simpler iOS interaction: tap to start, tap again to stop, explicit × to cancel. Hold/drag/lock are removed on iOS; Android gestures and the speech adapter remain unchanged. Human authorized merging before native testing and screenshots; merged on 2026-10-22 as 914bfa57ed04807dc3f94a1ed6a4e678da898591. No release/deployment authorization.
  • Native acceptance remains incomplete. Batch56 now proves real native-button dispatch and speech startup, followed by an immediate audio-capture failure; Stop/Cancel and sustained recording remain unverified. See the real failure and composer screenshots below. Root cause, matched full-matrix evidence and assistive checks remain open.

Change outline

Batch56 — native startup reached; recording still fails

Latest native follow-up on candidate 914bfa57ed048 containing merged #2595, not a rerun of the earlier gesture-only heads. iOS 27 Simulator, English, signed Debug binary 55de08577ac5, strict native fingerprint b3e74315f0c2; full identities and image hashes are in the provenance report.

actual center / edge tap → native Button → available + permission granted
  → native start / audiostart
  → audio-capture after 21 / 22 ms → end at 30 / 31 ms from call:start
  → failure notice; no app stop or abort

FAIL: sustained recording. The centered button now reaches speech startup, but the native task ends immediately; root cause remains undetermined. An uninstrumented real tap reaches the same failure UI. Valid v2 observations stayed current and fully restored. Initial Batch56 traces from the withdrawn v1 observer were contaminated by Hermes eval loop-closure binding and are excluded. No Simulator-wide limitation is inferred from the remaining failure.

Actual candidate failure — light, large, 402 × 874, software keyboard absent. The microphone is centered. This is not a successful Listening state or a matched failure-state Before/After pair; the earlier Batch55 baseline above/below retains its own source, fixture and missing-start result.

Batch56 actual recording failure after startup; centered native microphone

Scoped interaction result: a synthetic three-line draft survived expand/done, attachment-tray open/close and six theme/text-size changes, then was sent once with exact canonical Host text and a real direct DeepSeek reply 42. The software keyboard did not appear, so keyboard avoidance is UNTESTED. Later draft lines are visible in the larger-text fields; full editing, caret and scroll acceptance is not inferred.

Batch56 synthetic multiline draft sent once; real reply 42

Six candidate draft captures — keyboard absent; no matched Batch56 Before matrix

Light: large, accessibility-large, accessibility-extra-extra-extra-large, respectively.

Candidate light large draft; keyboard absent Candidate light accessibility-large draft; keyboard absent Candidate light maximum accessibility text draft; keyboard absent

Dark: the same three OS text sizes, respectively.

Candidate dark large draft; keyboard absent Candidate dark accessibility-large draft; keyboard absent Candidate dark maximum accessibility text draft; keyboard absent

Still unaccepted: stable Listening, second-tap Stop, explicit Cancel, recording interruption/retry, keyboard clearance, full matched Before/After, physical microphone, VoiceOver and Android. The bounded exact-app-PID native log read parsed 1003 records but yielded no allowlisted error facts; that does not locate the native cause. New source repairs, if required, need their own branch/PR and a new owner-cut test batch. No product source change or new merge/release authorization is implied by this evidence update.

Evidence follow-up: t3code/local/mcp:dbfb1c61-ea88-4449-82fe-bce3ae129811, successor claim. Earlier Batch54/55 reports below remain historical and retain their stated limits.

 iOS VoiceButton
- Gesture.Manual → activation/worklets → hold/drag/lock state → speech callbacks
- RN circle → full-size Host → unframed SF Symbol
+ NativeComposerButton → SwiftUI Button.onPress → active ? stop : start
+ SF Symbol → full-size centered SwiftUI frame → filled circle

The existing speech controller still owns permission, recognition events, stop, abort and draft updates; the leading Cancel action stays available while starting/listening. No model, Host or recording backend change.

Source verification: CI39777816235 all applicable checks pass; 52 focused tests pass across native button/speech-owner integration, composer dictation, state transitions, iOS chrome, style and system-text guards. Mobile typecheck, repository lint (existing warnings), change-ledger/feature-map checks, changed-file formatting and diff checks pass. Mocked native boundaries do not prove touch dispatch or pixel geometry.

Before — Batch55 native failure, light, 402 × 874, large text, keyboard hidden

Actual tap and 800ms hold left the microphone idle and visibly offset. The installed/current callback observer saw onHeld/finalize only; no onStart or native preflight/events. Both observers restored. Loaded Hermes includes #2592. Source 87724a3b58d5, strict native fingerprint b3e74315f0c2, signed Debug executable 55de08577ac5. Full provenance.

Before: idle iOS microphone clipped at the upper-left after actual tap and hold

Capture status superseded by Batch56 above. The earlier shared-lane blocker is resolved. Further verification must use a newly assigned owner cut; no successful Listening/Stop/Cancel image is available because the valid native trials end immediately.

Task: codex/local/01a1621c-a81b-7670-86be-1ddaf404c2e2. Refs #2594; acceptance remains open until native verification.

Issue: #2594
Agent-Task: codex/local/01a1621c-a81b-7670-86be-1ddaf404c2e2
@coderabbitai

coderabbitai Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: ca74acca-e575-49ad-85d1-6fa6c07d2c3b
📥 Commits

Reviewing files that changed from the base of the PR and between 87724a3 and 085fdcd.

⛔ Files ignored due to path filters: 1
  • .github/pr-screenshots/b55rec/b.png is excluded by !**/*.png
📒 Files selected for processing: 8
  • .agents/skills/verify-deepseekbot/features/phone-composer.md
  • .github/pr-screenshots/b55rec/report.md
  • apps/mobile/DESIGN.md
  • apps/mobile/src/ui/chat/composer-symbol.ts
  • apps/mobile/src/ui/chat/native-composer-button.ios.tsx
  • apps/mobile/src/ui/chat/voice-button.ios.tsx
  • apps/mobile/test/voice-button-ios.test.tsx
  • changes/2594-native-recording-button.md
+----------------------------------------------------+
| Fluent in over six million forms of bug detection. |
+----------------------------------------------------+
  \
   \     /)/)
        ( '')
        /  |
      o(___)
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@DoodleBears
DoodleBears marked this pull request as ready for review October 22, 2026 12:26
@DoodleBears
DoodleBears merged commit 914bfa5 into main Oct 22, 2026
10 checks passed
@DoodleBears
DoodleBears deleted the codex/2594-native-recording-button branch October 28, 2026 04:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant