Deliberation: scope — GPT-5.3-Codex
Date: 2026-03-17 22:09
Model: GPT-5.3-Codex
Type: scope
Artifact: ## Shaped Brief: Cloud Upload from MixBoard ### Problem MixBoard can browse and stream the chad-mus
PM Scope Review (ruthless cut)
Verdict
v1 is too big for the stated appetite.
Current scope mixes: multipart ingestion, async job control, beets orchestration, dedup policy, progress UX, and infra config (Nginx/sudo/path mapping). That is not “medium.”
Cut to smallest useful v1 (80% value)
Ship only:
- Single-file upload (not multi-file) to
/api/upload
- Authenticated via
with-user [UNVERIFIED]
- Save to staging, run
beet import --move --quiet in background
- Return job accepted + minimal status endpoint (
queued|running|done|failed)
- Client shows:
- upload byte progress
- then indeterminate “Processing…”
- final success/failure
- Manual “Refresh library” button (no automatic rescan coupling in first cut)
This delivers core value: upload from MixBoard without SSH.
What is under-scoped right now (will create expensive follow-up)
- Duplicate semantics are weak (
artist+title+duration) and likely noisy [CHECK THIS].
Either drop dedup from v1, or define exact source-of-truth (beets/plugins) [UNVERIFIED].
- Progress requirement is ambiguous: upload progress vs server import progress.
Split explicitly or QA will fail acceptance.
- Concurrency policy missing: single-worker queue vs parallel imports.
For v1, force single-worker.
Hidden dependencies likely to blow estimate
- Multipart parsing support in Woo/Clack [UNVERIFIED]
- Request body buffering behavior (memory risk for FLAC) [UNVERIFIED]
- Event-loop blocking if subprocess runs inline
sudo/permissions between web process and uploader user [UNVERIFIED]
- Beets non-interactive behavior and duplicate handling [UNVERIFIED]
- Nginx
client_max_body_size claim “default 1MB” [CHECK THIS] (common, but environment-specific)
- File ownership/cleanup in staging after import/failure
Cheaper alternative nobody should ignore
For single-user personal setup, cheapest path may be:
- Out-of-band file transfer (Syncthing/rsync/SSHFS/watch folder), then
- MixBoard calls a tiny authenticated
/api/import-staging trigger.
This avoids multipart parsing and large-body HTTP handling entirely.
Hallucination detection
Specific claims needing verification:
ChadMusicAPIClient, CloudBrowserView, StreamingPlayer names [UNVERIFIED]
- Existing
with-user macro behavior [UNVERIFIED]
- chatikbot import pipeline details and
uploader sudo flow [UNVERIFIED]
- “rescan thread” existence [UNVERIFIED]
- Woo multipart/body-stream characteristics [UNVERIFIED]
- Nginx default limit statement [CHECK THIS]
No clear fabricated entity detected, but many implementation details are unconfirmed.
Session State
**Blocking findings**: Ambiguous acceptance (progress definition, dedup definition); performance risk (event-loop blocking + large upload memory behavior); untestable requirement as written (dedup correctness without canonical source); scope violation vs appetite (too many cross-layer concerns in v1)
**Advisory findings**: Cut multi-file; use single-worker queue; decouple auto-rescan from upload success; add staging cleanup policy; verify sudo/permissions and nginx limits early
**Decisions**: Recommend redefining v1 to single-file + async job status + basic UI states; defer dedup and multi-file to v2 unless beets-native behavior is already proven
**Open Questions**: Is dedup truly required in v1? Is there existing beets duplicate policy? Can Woo stream to disk safely? Who controls nginx/sudo config rollout?
**Key Entities**: MixBoard, chad-music, Woo, Clack, Myway, SBCL, beets, `with-user`, `/api/upload`, `/api/rescan`, `ChadMusicAPIClient`, `CloudBrowserView`, `StreamingPlayer`, `server.lisp`, `config.lisp`, Enikesha