Skip to content

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)

EntityCreateUpdateDelete (+restore)Notes
Artist (ArtistSpace)POST /artistPUT /artist/:idDELETE /artist/:id (+ PUT /:id/restore)soft-delete
ProjectPOST /projectPUT /project/:idDELETE /project/:id (+ restore)soft-delete
TrackPOST /trackPUT /track/:idDELETE /track/:id (+ restore)+ PATCH /:id/release-status
Version (file)POST /track/:id/fileDELETE /:trackId/file/:fileIdneeds iOS audio upload
CommentPOST /track/:t/file/:fPUT /:idDELETE /:id+ POST /:id/responses, resolve via PUT
SectionPOST /track/:t/file/:fPUT /:idDELETE /:idtimeline 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.md before 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.

  1. Inline version switch — collapsed the version page; in-player switcher; tracks open straight to PlayerView; retired TrackDetailView. Pulled the Shared tab.
  2. Track CRUD — create / rename / delete + metadata edit, inside a project. (Surfaced + fixed two backend bugs: POST /track orphaning via client-supplied artistSpace; one orphan 500-ing the whole project list — both in CHANGELOG.md.)
  3. Project & Artist CRUD — top of the hierarchy buildable on-device.
  4. Comment edit / delete / resolve.
  5. 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

Ctrl-Audio Platform Documentation