# iOS monorepo migration — 2026-10-04 ## Source and history The native app is now maintained under `ios/` on this repository's `master`. Imported source: `snowspeeder/hope-voice-ios`, branch `feat/ios-app`, original tip `7bd893ae5c46ee470203eae273e4a15454d66f04` (41 reachable commits). Original default `main` tip `40aaf4fea7f3ee9d3a5742b4cc6a090520ee0d73` is an ancestor of that feature tip. No source branches had additional unmerged commits or tags. The import is a two-parent, non-squashed subtree-style merge. Backend master `91a0d8820ffdd1cd028e4a1a52599da1a9701aec` remains the first parent; the unchanged original iOS tip is the second parent. Original commit IDs and complete ancestry are retained, not rewritten. Historical native paths were at the old repository root; current paths are under `ios/`. ```bash git log 7bd893ae -- Sources/Chat/ChatViews.swift git show 7bd893ae:Sources/Chat/ChatViews.swift git log --all --graph --oneline ``` The source repository will be archived using authenticated `tea api` **only after** the import is pushed and remote ancestry/tree checks pass. Archival is reversible; no source repository deletion or local checkout deletion is part of this operation. The old local checkout is no longer the development source of truth. ## Working here Open `ios/Voice.xcodeproj`; scheme `Voice_iOS`. Run `xcodegen generate` from `ios/` when changing project membership. Root generator `scripts/generate_hope_themes.py` writes/checks both shared and native Swift theme copies. Native instructions and dated qualification remain under `ios/docs/`. The root ignore file excludes secrets, runtime state, Python/JS caches, Xcode build/results and user state without hiding versioned source, project definitions, lockfiles or environment examples. Docker excludes native/design source from backend contexts. Backend push automation ignores iOS-only and documentation changes; changes to backend code or automation still qualify/deploy normally. The obsolete imported native backend deployment script now fails closed. ## Compatibility scope Read-only independent audit compared the imported native tip to backend master: authentication, bearer confinement, token bootstrap/conversation binding, voice catalog, snake_case envelopes, revisions, uploads and SSE event contracts match. No API compatibility blocker to this migration was found. No production calls or physical-device tests were performed for this import. Two pre-existing functional follow-ups were identified, not introduced or repaired by the directory/history migration: - Native workspace filtering occurs after global pagination; it should use server `workspace_id` filtering and maintain that scope during reload/sync. - Native and web edited/regenerated attachment-bearing turns can lose the original turn's attachment IDs; these need shared regression coverage and ownership-aware preservation. Verification from the relocated tree on 2026-10-04: XcodeGen regenerated the project without a project-file diff; native simulator test target passed 60 Swift Testing cases plus 12 XCTest cases, with one explicit live-chat skip, at `/tmp/hope-ios-redesign-derived/Logs/Test/Test-Voice_iOS-2026.10.04_07-21-55--0400.xcresult` (log `/tmp/hope-monorepo-ios-tests.log`). Shared theme artifacts verified; the backend CI offline selection passed **147 tests**, with one dependency deprecation warning. No device install, live audio or production API probe was performed. These are explicitly not claims of exhaustive UI/functionality qualification. Existing untracked local design prototypes/screenshots were left untouched and were not included in the migration commit.