# 09 — Milestone Map & Design-to-Delivery Traceability Status: planning contract. Maps every normative section of this design package (docs 00–08 + `api/openapi.yaml`) to the milestone expected to deliver it, so any dev team can pick up a milestone and know exactly which design sections bind it and what "done" means. --- ## 1. Proposed Milestones | # | Milestone | Binding design sections | Key acceptance criteria | |---|---|---|---| | M1 | **Architecture & Design** (this package) | all | This document set delivered ✔ | | M2 | **Server core: storage + library + scan** | doc 01 §3–6; doc 03 (all); doc 02 §1–5 (schema + migrations) | Mount S3 + WebDAV sources; scan populates DB; ranged streaming of raw files passes the doc 03 §9 conformance suite; pagination of 100k-object S3 buckets; PROPFIND traversal depth handling per doc 03 §5 | | M3 | **REST + Subsonic API & auth** | `api/openapi.yaml`; doc 05 (all); doc 02 §6–7 | OpenAPI contract tests green; an unmodified third-party Subsonic client (e.g. DSub) browses, streams, and creates playlists; token auth + URL-scoped tokens per doc 05 §6 | | M4 | **Transcoding & caching** | doc 04 (all); doc 03 §6.4 | On-the-fly Opus/MP3 transcode with time-seek (`?t=`); cache eviction under quota; concurrent-transcode limits; cold-start latency budget (doc 04 §7) met | | M5 | **Web client (basic)** | doc 01 §7; API contract; doc 06 §8.2 (sender stub) | Browse/search/play/playlists in browser; queue UX; history reporting | | M6 | **Recommendation engine** | doc 07 (all); doc 02 §8–9 | Latency gate (<100 ms p95 @ 50k); fallback ladder behaviors testable via `strategy` field; `getSimilarSongs` Subsonic mapping; analysis worker throughput target | | M7 | **Chromecast** | doc 06 (all) | The 7 acceptance criteria of doc 06 §11 | | M8 | **Android app** | doc 08 (all); doc 06 §8.1; doc 07 §8 | Doc 08 §11 release criteria; auto-play parity local/cast; offline downloads + deferred scrobbles | | M9 | **Hardening & 1.0** | doc 05 §8 (threat-model mitigations checklist); ops docs | Security checklist closed; upgrade/migration tested; load test (50 concurrent streams, 4-core ref box); packaged releases (Docker, binaries, APK) | Dependency order: M2 → M3 → {M4, M6} → M5 → M7 → M8 → M9. M4 and M6 are parallelizable after M3. M7 requires M4 (Cast transcode profiles) and M3 (cast tokens). ## 2. Cross-cutting Invariants (apply to every milestone) 1. **No storage credential ever leaves the server** (doc 03 §7). Reviewed in every milestone's security pass. 2. **All client-visible behavior is in the OpenAPI spec first.** API changes land as spec PRs before code. 3. **Feature versioning:** `feature_version` (doc 07 §3.2) and DB migrations (doc 02 §10) are forward-only. 4. **Deferred decisions log:** Items explicitly deferred by this design — multi-room sync, ListenBrainz enrichment plugin, receiver-side scrobble buffering (doc 06 §7), per-user scoring-weight overrides (doc 07 §6.1) — are tracked here and must be re-triaged at M9. ## 3. Open Questions (to resolve at the start of the owning milestone) | Question | Owner milestone | Notes | |---|---|---| | HNSW persistence format: custom snapshot vs rebuild-on-boot threshold | M6 | doc 07 §3.3 allows either; decide by benchmark | | WebDAV servers without `Depth: infinity` support — traversal batch size tuning | M2 | doc 03 §5 gives the algorithm; constants are tunable | | Cast default-receiver UX wording when auto-play unavailable | M7 | doc 06 §11.6 | | F-Droid flavor: Cast code isolation strategy (flavor vs dynamic feature) | M8 | doc 08 §11 |