2026-03-18-120259-GPT-5-3-Codex-scope.md 4.3 KB

Deliberation: scope — GPT-5.3-Codex

Date: 2026-03-18 12:02 Model: GPT-5.3-Codex Type: scope Artifact: ## Cloud Download Brief (Draft) ### Problem Cloud tracks in MixBoard playlists cannot be exported t


Scope/Appetite Review

Verdict

Current brief is slightly too big in the wrong places and too vague in one critical place.

Cut to the smallest useful ship

Ship export-time staging only:

  • On export, for each cloud track without local file:
    • Resolve download URL
    • Download into a temp export staging folder
    • Use staged path for exporter input
  • Do not mutate Track model in v1
  • Do not add persistent cache semantics in v1
  • Do not add standalone “Download” UI in v1

This delivers ~80% value (cloud tracks export) with less data-model risk.


What to cut now

  1. Cut Track model mutation (filePath, hasLocalFile)
    • This introduces semantic confusion (isCloud=true but local path exists), likely follow-up bugs in library views/filtering/sync logic.
  2. Cut persistent cache design
    • Persistence, invalidation, and migration are separate product decisions.
  3. Cut “future-proof auth headers” unless required now
    • ChadMusicAPIClient.authHeaders is [UNVERIFIED] in provided context.

What is underspecified (blocking)

  1. Failure policy is missing (blocking: ambiguous requirements)
    • If 1 of N downloads fails: fail whole export, skip failed tracks, or ask user?
    • Must define this now or estimate is unreliable.
  2. Filename/extension derivation is missing (blocking: untestable edge cases)
    • Exporters often need correct extension/format.
  3. Concurrency policy is missing (blocking: performance/scope risk)
    • Parallel downloads can spike memory/disk/network and complicate progress.
    • Recommend serial in v1.

Hidden dependencies likely to blow estimate

  • SwiftData migration if Track gets new persisted field (cachedFilePath)
  • Existing logic that assumes hasLocalFile == !isCloud
  • Disk space checks and cleanup for large playlists
  • Export cancellation behavior while download in progress
  • Duplicate track IDs / filename collisions in cache path
  • Offline / timeout / retry behavior

Simpler architecture (recommended)

  • Add ExportAssetResolver (or small helper in exporter) that returns local URL per track:
    • local track → existing filePath
    • cloud track → download to temp staging, return staged URL
  • Keep download files in export temp folder; delete on completion/failure
  • Optional micro-cache later (deterministic path + existence check), but out of v1 scope

Direct answers to open questions

  1. Standalone download action? No (v1).
  2. Persist cached path in SwiftData? No (v1).
  3. Change hasLocalFile or add cachedFilePath? Neither (v1) if using export-time staging.

Hallucination detection

  • ChadMusicAPIClient.authHeaders[UNVERIFIED] (context confirms streamURL(for:) only).
  • “No auth on file routes” is stated in context; acceptable assumption.
  • All other named components align with provided context.
Session State **Blocking findings**: - Ambiguous failure policy for partial download/export outcomes - Missing testable rules for filename/format handling - Missing concurrency policy (serial vs parallel) creates performance/scope risk **Advisory findings**: - Scope should avoid Track model mutation in v1 - Avoid persistent cache and standalone download UI in v1 - Prefer export-time temp staging to reduce follow-up and migration cost - `ChadMusicAPIClient.authHeaders` is **[UNVERIFIED]** **Decisions**: - Recommend smallest shippable slice: export-triggered download-to-temp only - Keep data model unchanged for v1 **Open Questions**: - Exact behavior when some cloud tracks fail to download - Serial-only vs limited parallel downloads in v1 - Cleanup timing for staged files on cancel/failure **Key Entities**: - `DownloadService.swift` - `Track.filePath` - `Track.hasLocalFile` - `Track.isCloud` - `cachedFilePath` - `ExportSheet` - `MixExporter` - `ChadMusicAPIClient.streamURL(for:)` - `ChadMusicAPIClient.authHeaders` **[UNVERIFIED]** - `~/Library/Application Support/MixBoard/CloudCache/`