# Plan: cbd-bundle Ordered tasks; each names its verification (tests in `cbd/src/main.rs` and/or gates in `quality/cbd-bundle.md`). - [x] **T1 — Server library extraction.** Move `playback`/`provider`/ `rpc` and the command/message enums into the `crabidy-server` lib; add `serve(addr)` + `LISTEN_ADDR`; thin `main.rs`. Verifies: the moved server suite passes unchanged; gates "Refactor". - [x] **T2 — TUI library extraction.** `cbd-tui/src/lib.rs` with `run(config)` (orchestrate + run_ui + channels); thin `main.rs` keeps file tracing + config. Verifies: the moved TUI suite passes unchanged. - [x] **T3 — cbd crate.** Workspace member; main = shared file tracing, `cbd-tui.toml` config, spawn `serve(LISTEN_ADDR)`, `wait_for_server` (scheme-stripped TCP poll, adopt-on-occupied-port, dead-server error, bounded attempts), then `cbd_tui::run`. Verifies: `readiness_polls_until_the_socket_accepts`, `readiness_gives_up_and_reports_a_dead_server`; gates "Bundled behavior". - [x] **T4 — Full verification.** Workspace suite green; clippy/fmt/ taplo/markdownlint clean. - [x] **T5 — Live smoke test.** Boot the extracted `serve()` on a free port through `wait_for_server` (temporary ignored probe, removed after passing): the real stack — tidal login, providers, playback, queue restore — accepted a TCP connection in ~1 s. - [x] **T6 — Docs.** `plan/summary.md` section incl. deviations; reconcile `architecture/cbd-bundle.md`.