Date: 2026-03-18 20:24 Model: GPT-5.3-Codex Type: general Artifact: ## Offline Download — Draft Proposal ### Problem Cloud tracks can only be streamed. No way to make
DownloadService and bounded concurrency is a good low-risk direction.filePath handling is necessary.Routing logic appears inconsistent
The artifact says: “PlayerViewModel already routes by hasLocalFile.”
Context says routing is by isCloud (isCloud -> StreamingPlayer, !isCloud -> AudioEngine).
[CHECK THIS] This is a core correctness issue. If routing is still isCloud-based, downloaded cloud tracks will still stream unless routing is changed.
“Persistent offline” vs ~/Library/Caches is a mismatch
Storing user-expected offline downloads in Caches is risky because macOS may purge it.
[CHECK THIS] If the product promise is “downloaded for offline,” Caches is the wrong default. Use Application Support (or make cache semantics explicit in UX).
Model semantics are overloaded and fragile
Using isCloud=true + filePath set as “downloaded” introduces ambiguous state and increases regression risk around hasLocalFile.
Add explicit state, e.g. downloadState (none/downloading/downloaded/failed) + localFilePath?.
This avoids boolean coupling and makes UI/test logic deterministic.
Recommendation to switch downloaded cloud tracks to AudioEngine in v1 is high-risk
This couples offline delivery with playback pipeline migration.
Keep v1 focused on offline availability; defer EQ-path migration (Phase 2/3) unless required now.
Phase 1 (v1):
downloadState + localFilePath.Phase 2:
Phase 3:
This sequencing reduces irreversibility and isolates regressions.
PlayerViewModel already routes by hasLocalFile” → [CHECK THIS] (conflicts with provided context).~/Library/Caches/MixBoard/CloudTracks/” → [CHECK THIS] (technically possible, but conflicts with persistence expectation).{cloudTrackId}.{ext} naming” → [UNVERIFIED] (extension/source format mapping not demonstrated).