ADR-0059: Release rights confirmation, splits, identifiers and review submission
Status: Accepted
Date: 2026-10-05
Context
Owned drafts hold credits but no rights information, and nothing moves a draft into
Bitrate review. Pencil screens 19 (Contributors & Rights) and the Review step define a
master-owner choice, two confirmations, a readiness checklist and "Submit for review",
which creates an internal request and never promises delivery. The design deliberately
leaves percentages and identifiers to the future delivery schema; the product owner
chose to add recording/composition splits and UPC/ISRC now. ADR-0052 already models
ReleaseSplit in basis points and places UPC on Release and ISRC on recordings.
Decision
ReleasestoresmasterOwnerType(ARTIST | OTHER),masterOwnerName(required exactly forOTHER, enforced by a CHECK),writersConfirmedAt,accuracyConfirmedAtandsubmittedAt.ArtistTrackDraftstores an optional unique compactisrc.PATCH /releases/:id/rightsreplaces the owner and both confirmations in one request, so every confirmation describes the saved owner. Any credit change clears both confirmations; replacing splits clears accuracy. All of these run in the draft's owner/status/version-guarded transaction.PUT /releases/:id/splitsreplaces one right type. Drafts may be partially allocated but never exceed 10,000 basis points, and every share must reference a credit on the same release.- UPC (UPC-A/EAN-13 with a valid check digit) and ISRC (ISO 3901, stored without hyphens) are optional for submission: artists without codes must not be blocked before a distributor can assign them. Missing codes appear as non-blocking notices. Duplicates return 409.
- Readiness is computed by one pure function over unbounded owned data. Blockers: no recordings, missing master owner, either confirmation, a credit without roles, or a right type not totalling exactly 100%. Audio and artwork are not required until uploads exist.
POST /releases/:id/submitrequires an explicitreviewed: true, re-reads readiness inside the transaction and movesDRAFT → SUBMITTEDwith the version guard; blockers return 422 with their list.POST /releases/:id/withdrawreturnsSUBMITTED → DRAFTwhile no reviewer flow exists. Submission never starts external delivery.
Consequences
The workspace now exposes rights, splits, ISRCs and readiness, and the Review stage is real. Every edit after submission returns 409 until the artist withdraws. A reviewer queue, review decisions, territories, consent evidence, per-territory allocations and partner delivery remain out of scope. When a reviewer flow exists, withdrawal must be restricted to requests that review has not started.
Alternatives considered
- Require UPC/ISRC for submission — rejected: blocks artists who rely on a distributor to assign codes.
- Separate endpoints per confirmation — rejected: a confirmation saved apart from the owner it describes could confirm stale data.
- Store readiness as a column — rejected: it would drift from the data it summarises; it is cheap to compute on read and must be recomputed at submission anyway.