Skip to content

Make Voice Input work on first launch, redesign it, add e2e tests - #67

Merged
MarcusJRLee merged 4 commits into
mainfrom
claude/ios_voice_input_polish
Nov 2, 2026
Merged

MarcusJRLee merged 4 commits into
mainfrom
claude/ios_voice_input_polish

Conversation

@MarcusJRLee

Copy link
Copy Markdown
Owner

Why

Voice Input could not dictate on a fresh install (no speech model without a Mac-side prepare + Files import), had no icon, a cluttered single-page UI, and History broke after any reinstall or update.

What

  • Works out of the box: the pinned Whisper Tiny English starter (45 MB) is bundled and admitted through the normal Rust-validated installer on first launch, shown as Verified (0061).
  • History fix: stored audio paths are rebased onto the current app container (iOS moves it between installs/updates).
  • Icon: Signal Bridge, cropped full-bleed; monochrome accent.
  • UI: Dictate / History / Settings tabs. One record button (primary at rest, amber only while recording), result text with Copy/Share, native searchable History with detail, Settings form.
  • E2E tests: testFreshInstallDictatesIntoSearchableHistory (~16 s) drives fresh install → record → ASR → result → History search with jfk.wav replacing only the microphone (Debug-only seam). Plus Settings, style menu, and large-text tests.

Verification

  • scripts/check_ios.sh: build, lint, all unit tests, 4 UI tests pass (304 s).
  • scripts/check_fast.sh passes.
  • Simulator: light and dark mode, dictation end to end.

🤖 Generated with Claude Code

MarcusJRLee and others added 4 commits November 2, 2026 14:21
- Bundle the pinned Whisper Tiny starter model and admit it through the
  normal installer on first launch (decision 0061).
- Fix History failing to load after a reinstall or update: audio paths are
  rebased onto the current app container.
- Add the Signal Bridge app icon and a monochrome accent.
- Replace the single scrolling page with Dictate, History, and Settings tabs;
  one record button, amber only while recording, result with Copy/Share.
- UI tests dictate a recorded clip end to end through capture, ASR,
  formatting, and History search (Debug-only microphone seam).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On a device, directory listing spells the container /private/var while
constructed paths use /var, so an installed package never equalled itself
and every selection failed with "no longer installed". Installed packages
now carry one canonical root path; a symlinked-root test reproduces it.

Provisioning also selects a starter left unselected by an earlier launch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 4 Hz refresh loop republished unchanged state, redrawing SwiftUI and
keeping the app from idling; the style UI test took 258 s and timed out on
CI. Unchanged refreshes now publish nothing (17 s; the iOS check runs in
about a minute). check_ios.sh prints each failing test's message, since
-quiet hid it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CodeQL built the iOS app from its own copy of the preparation steps and
lacked the bundled starter model. prepare_ios_build_inputs.sh is now the
single source for project generation and the traced build, and the
starter's inputs route to the iOS CodeQL lane.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MarcusJRLee
MarcusJRLee merged commit 0ccf862 into main Nov 2, 2026
8 checks passed
@MarcusJRLee
MarcusJRLee deleted the claude/ios_voice_input_polish branch November 2, 2026 21:17
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