25 — iOS CRUD → First Release
Active. Governed by
00-ROADMAP.md. Created 2026-06-07. The first-release scope upgrade: from the review-only MVP (19) to a create → review → approve app. Built as iOS UI over the backend's already-existing CRUD.
Why this doc exists
The Phase 1 MVP is consumption-only (listen → comment → approve). A shippable first release also needs creation and editing on the phone — you can't demo a collaboration product where nothing can be made or changed in-app. The backend is production-shaped and already exposes full CRUD for the whole hierarchy, so this is overwhelmingly iOS UI work, not backend work. This doc scopes and sequences it, and records two course-corrections from review (Shared parked, version-page removed).
What the backend already gives us (verified 2026-06-07, against the controllers)
| Entity | Create | Update | Delete (+restore) | Notes |
|---|---|---|---|---|
Artist (ArtistSpace) | POST /artist | PUT /artist/:id | DELETE /artist/:id (+ PUT /:id/restore) | soft-delete |
| Project | POST /project | PUT /project/:id | DELETE /project/:id (+ restore) | soft-delete |
| Track | POST /track | PUT /track/:id | DELETE /track/:id (+ restore) | + PATCH /:id/release-status |
| Version (file) | POST /track/:id/file | — | DELETE /:trackId/file/:fileId | needs iOS audio upload |
| Comment | POST /track/:t/file/:f | PUT /:id | DELETE /:id | + POST /:id/responses, resolve via PUT |
| Section | POST /track/:t/file/:f | PUT /:id | DELETE /:id | timeline markers |
Takeaway: every CRUD verb exists except uploading a new audio version from the device. That one piece (file picker / record + multipart to POST /track/:id/file) is the single heavy lift and is staged as its own slice (decision below).
First-release scope (in)
- CRUD UI for Artist, Project, Track: create / rename / edit metadata / delete (use the soft-delete
- restore endpoints).
- Metadata editing (the fields backend already accepts on
PUT). - Comments: create (works today), plus edit / delete / resolve / reply surfaced in the player.
- Inline version switching — the version page between Track and the wave player is removed; version switching moves into the player (the "V# {name}" line). See doc 24 + slice 1.
- Audio upload (new version) — staged: cheap JSON CRUD ships first, then a dedicated upload slice. It's the only path with no ready iOS implementation.
Deferred / being re-envisioned (out)
- Shared (inbound/outbound) — pulled from the app. "Shared" is not a tab; it's a consequence of how Roster / workspaces / actors are modeled, and that isn't decided. Re-envision against
12-ACTORS-WORKFLOWS.mdbefore reintroducing any Shared surface. The Phase 2 browse hierarchy (doc 23) stays; doc 23's Sharing section is parked. See open question below. - Large-file/attachment management, full search, trash UI, analytics, billing — remain on web.
Sequencing (slices) — ✅ COMPLETE 2026-06-08
All five shipped (details per slice in CHANGELOG.md). The create → review → approve loop now closes fully on-device.
- ✅ Inline version switch — collapsed the version page; in-player switcher; tracks open straight to
PlayerView; retiredTrackDetailView. Pulled the Shared tab. - ✅ Track CRUD — create / rename / delete + metadata edit, inside a project. (Surfaced + fixed two backend bugs:
POST /trackorphaning via client-suppliedartistSpace; one orphan 500-ing the whole project list — both inCHANGELOG.md.) - ✅ Project & Artist CRUD — top of the hierarchy buildable on-device.
- ✅ Comment edit / delete / resolve.
- ✅ Audio upload (new version) — file-pick + streaming multipart upload with progress; recording deferred as a fast-follow.
Known follow-ups raised during the push (not blockers — tracked in 24-UX-BACKLOG.md): version-scoped approval, fuller metadata editing/sync, row-ellipsis → Portal on every node. Recording (upload fast-follow). These feed the next phase, not this doc.
Each slice followed .agent/workflows/ios-feature-slice.md.
Open question — actors & Roster (blocks Shared, shapes nav)
Decide, grounded in the real actors (artist / producer / manager / engineer / A&R) and how they actually collaborate:
- Is "Shared" a section within a single workspace, or are there workspaces that each contain rosters (a manager's roster of artists, an engineer's client list)?
- Where does inbound vs outbound sharing live once that's decided?
Until this is answered, no Shared surface ships. → Now being envisioned in 26-IDENTITY-SHARING-NAVIGATION.md (Workspace/Roster model, the "one graph, many lenses" navigation model, sharing-identity badges, Portals-everywhere). Confirm its 3 decisions to unparked Shared; CRUD slices 2–5 proceed independently in the meantime.
Cross-references
- MVP loop (unchanged):
19-IOS-MVP-REVIEW-APPROVE.md - Phase 2 browse (active):
23-IOS-PHASE2-IA.md - UX refinement backlog:
24-UX-BACKLOG.md - Actors (for the Roster decision):
12-ACTORS-WORKFLOWS.md - Design system & components:
22-IOS-DESIGN-SYSTEM.md