Files
hope-voice-api/docs/PROJECT_STATUS.md
T

8.4 KiB

Project status and handoff

Last updated: 2026-09-12.

Current direction

Keep Qwen 2.5. The user explicitly canceled the earlier request to switch to a ChatGPT subscription/device-token login. Do not revive that migration because an old saved goal mentions it. Current work is the native iOS UI/UX redesign and end-to-end qualification.

2026-09-12: the embedded music player was removed by user decision — the feature is gone from the app (Media tab, Sources/Media/, MediaPanelView, MediaAPI, MediaPlayerController, PinnedMediaResourceLoader, media tests, and the media_state control publish). The backend media API still exists and is untouched. The backend AAC compatibility patch (below) is now irrelevant to the iOS app but remains deployed.

The UI and playback changes are implemented, and the NAS deployment was verified on September 8. Full app qualification is not complete: physical-device tests and some broader live scenarios remain. This report summarizes prior evidence; server health and device availability must be rechecked when resuming.

Completed work

Native interface and usability

  • Reorganized the app into native Talk, Music, Activity tabs, sharing one session. (The Music tab was removed again on 2026-09-12 by user decision; the app now has Talk and Activity tabs.)
  • Replaced the large animated orb with a compact waveform/status presentation; added a clearer welcome screen, Voice/Type selection before connecting, explicit start/end controls, microphone meter, and recoverable connection errors.
  • Improved transcript readability, timestamps, live updates, copy/selection, follow-latest scrolling, and explicit Cancel/Clear confirmation.
  • Reworked Settings around voice, input mode, model, and connection; server changes require an explicit validated save. Voice selection persists.
  • Improved Music library/search navigation, now-playing controls, seek/volume, empty/loading/error states, and validated station-entry sheet. (Removed 2026-09-12.)
  • Improved Activity hierarchy and task detail presentation with an active-task badge.
  • Removed forced dark appearance; adopted adaptive system styling, Dynamic Type, and larger interaction targets, informed by the Impeccable native-iOS guidance.

Functional fixes

  • Observed nested transcript/state/task objects so asynchronous updates render.
  • Preserved latest-wins server replacement. (All media-related behaviors — media clearing on server switch, standalone media controls/reports, track metadata refresh, pinned-TLS artwork, cached-AAC requests, UTI content-type fix, bounded-range media loader — were removed with the music player on 2026-09-12.)

Tests and tooling

  • Installed XcodeBuildMCP and its skills; used it for simulator build/run/test work.
  • Added the VoiceUITests target in project.yml and regenerated the Xcode project.
  • Added isolated DEBUG UI-test preferences and optional fixtures; normal application preferences are not reset by those UI-test launch arguments.
  • Added media-control/error/metadata tests and opt-in real-NAS UI tests. (Media tests were removed with the music player on 2026-09-12.)
  • Live tests retain failure screenshots/UI hierarchy and attempt to stop music they initiated even when an assertion fails. (Music playback test removed 2026-09-12.)

Backend deployment and cross-repository dependency

SSH host: [email protected] (Unraid). App URL: https://192.168.86.2:9178.

  • voice image: hope-voice-api-voice:68f4c46-ios-audio, host networking, restart policy unless-stopped. Includes LiveKit, voice agent, token service, media API, and nginx.
  • LLM: qwen2.5-vl-3b through existing OpenWebUI at http://192.168.86.2:3005/api. Existing Azure speech configuration retained.
  • voice, open-webui, and local-vl-models were present and healthy when the user suspected deletion. Do not recreate healthy services unnecessarily.
  • Original library, certificates, and skills were retained under /mnt/user/dev/hope-voice-api; the dirty remote checkout was not overwritten.
  • Separate deployment source: /mnt/user/dev/hope-voice-deploy-68f4c46.
  • Stopped rollback container: voice-before-ios-audio.
  • Backend AAC conversion preserves original WebM files and serves cached AAC with byte-range support. Browser/raw requests retain their original behavior.

Important: the backend patch and its test are in a different local repository: /Users/shane/dev/hope-voice-api/web/media_server.py and /Users/shane/dev/hope-voice-api/tests/test_ios_audio.py. They were still uncommitted at this handoff. Committing/pushing voice-ios does not publish those files. The deployed image contains the patch, but a future backend CI rebuild can lose it unless it is committed and deployed through that repository's workflow. Inspect that workflow before pushing: it may replace the live container.

Launch configuration and rollback details: DEPLOYMENT.md. Do not copy credentials or .env contents into documentation or commits.

Verification performed

Project Voice.xcodeproj, scheme Voice_iOS, iPhone 17 Pro simulator.

  • 49 unit tests passed (after the 2026-09-12 music-player removal; previously 68 with media tests); four offline UI tests passed (navigation/error recovery, settings persistence/validation, transcript/task UI, large text).
  • Real NAS tests verified Qwen replies, background task completion, reconnect, library loading, advancing playback time, pause, forward-seek control and stop. (Playback evidence predates the music-player removal; the feature no longer exists in the app.)
  • Qwen/task/reconnect passed three consecutive iterations.
  • Backend integration: 16 passed, 7 skipped, 2 deselected.
  • Backend AAC regression: one passed (conversion, cache reuse, original preservation, and byte ranges); deployed range request returned HTTP 206.
  • The final bounded-range change was verified by focused playback repetitions, not a new full combined regression run.

Exact result-bundle names and qualifications: VERIFICATION.md. Artifacts live on this Mac under the XcodeBuildMCP workspace, not in Git.

What remains, in order

  1. Pair the physical iPhone. Done 2026-09-12. iPhone 14 Pro Max (BF93D35E-0853-5470-A125-6EB0DB3F17AB) is paired and available.
  2. Build, sign, install and run on that iPhone. Done 2026-09-12. Signing team is the free personal team YJFYRB92NW (DEVELOPMENT_TEAM in project.yml; H8D4WY66F6 is the certificate's individual-ID suffix, not a team ID — do not use it). Xcode required a fresh account sign-in, then the user tapped Trust under Settings → General → VPN & Device Management before first launch. App installed and launched via devicectl. Limitation: free provisioning expires the app after 7 days; reinstall to re-sign.
  3. Qualify real audio: microphone capture, TTS audibility, speaker/headphones, barge-in, Siri/phone interruptions, lock/background behavior, microphone-permission-denied fallback, and network-loss recovery. Some checks require the user's speech/listening or a real interruption; simulator state tests do not prove them. Follow DEVICE_TESTING.md.
  4. Broader regression: rerun the full suite after the music-player removal; test slow network/cancellation and server replacement. Exercise voice/model selection against the live agent.
  5. Final visual/accessibility pass: inspect all populated/error screens in light and dark mode, large text and small-device layouts; test VoiceOver and focus. The existing large-text navigation test is not a full accessibility audit.
  6. Publish the backend compatibility source safely in the sibling repository and ensure its normal deployment preserves mounts, certificates and Qwen settings. (Lower priority now: the iOS app no longer consumes the media API, but the deployed container still serves it for the web UI.)
  7. Update this report with results and remaining limitations. Do not mark the whole app qualified until the outstanding end-to-end gates have evidence.

Repository handoff

The iOS work and this report belong to branch feat/ios-app, remote origin (https://git.srmr.xyz/snowspeeder/hope-voice-ios.git). The requested handoff commit includes the implementation, tests, deployment notes and startup instructions. Check Git history/remote status for the final commit and push result.