/** * Soundtrack A/B candidate generation + selection. * * `generateSoundtrackCandidates` runs each AVAILABLE music backend (from the * audio-platform registry, optionally filtered by `backendIds`) for a project, * writes each candidate to `projects//artifacts/audio/soundtrack-.mp3`, * and persists a `soundtrack.json` artifact listing every candidate. A human can * then compare them in the preview portal and pick one. * * `selectSoundtrack` marks one candidate as `selected` in `soundtrack.json` AND * writes its path into the project manifest `soundtrack` field, which the * preview portal's discovery (preview-portal/discovery.ts) reads to render the * headline `