# PROGRESS — VoiceCat Living status. **Update this file in the same commit as your work** so the next agent picks up instantly. Newest status at the top. - **Date convention:** ISO (YYYY-MM-DD). - Statuses: `[ ]` not started · `[~]` in progress · `[x]` done. --- ## ▶ Where we left off / next action - **Done:** design docs (`docs/`) + **M0 skeleton** — repo builds, links, and passes the smoke test with no third-party deps. - **Next:** start **M1 — control plane**. First concrete task: implement protobuf + the `[u32 length][Envelope]` frame codec in `core/src/protocol/` and round-trip an `Envelope` in a test (see M1 checklist below and [`AGENTS.md`](AGENTS.md) "Suggested first steps"). --- ## Milestones (see [docs/roadmap.md](docs/roadmap.md) for full detail) - [x] **M0 — Scaffolding** ✓ complete - [~] **M1 — Control plane** (TCP/TLS, auth, channels, ephemeral text) ← current - [ ] **M2 — Voice, single stream** (UDP, Opus, jitter buffer, APM send-side, VAD/PTT) - [ ] **M3 — Multi-stream & per-channel tuning** (screen audio, listener-side per-user NR) - [ ] **M4 — Native clients** (Windows C#, macOS/iOS Swift) - [ ] **M5 — Moderation, polish, beyond** (perms, bans, DRED; then file transfer, E2EE, …) --- ## M0 — Scaffolding ✓ (completed) - [x] Repo layout (`core/ server/ tools/ clients/ tests/`), CMake + presets, vcpkg manifest. - [x] C ABI header `core/include/voicecat.h` (full surface, stubbed). - [x] Protocol source-of-truth `core/proto/voicecat.proto` (matches docs/protocol.md). - [x] Core stubs for all six subsystems (net/crypto/codec/protocol/session/audio) + `vc_client`. - [x] `voicecat-server` (arg parsing, config, stub run) and `vccli` (drives the C ABI). - [x] CTest **smoke test** asserting the C ABI contract (not just "it compiles"). - [x] `.gitattributes` (LF), `.gitignore`, `.clang-format`, onboarding docs. - **Verified:** `cmake --preset dev && cmake --build --preset dev && ctest --preset dev` → green. --- ## M1 — Control plane (current) **Exit criterion (definition of done):** two `vccli` instances connect to a real `voicecat-server` over **TLS 1.3**, authenticate (guest + admin-provisioned account), browse the channel tree, and exchange channel + private text messages. Encode this as an integration test driving two clients. Tasks (rough order — see [docs/protocol.md](docs/protocol.md), [docs/security.md](docs/security.md)): - [ ] Turn on vcpkg deps; set a real `builtin-baseline` in `vcpkg.json`; wire `find_package` for protobuf in `core/CMakeLists.txt` and `protobuf_generate` for `voicecat.proto`. - [ ] `protocol/`: implement the `[u32 length][Envelope]` `FrameCodec` (+ oversized-frame guard). **Test:** round-trip an `Envelope` through feed/emit. - [ ] `net/`: plain TCP connect/accept via Asio; then wrap with **TLS 1.3 (mbedTLS)** in `crypto/`. **Test:** `vccli` ↔ `voicecat-server` complete a TLS handshake. - [ ] Handshake: `ClientHello`/`ServerHello` with version + feature negotiation. - [ ] Server identity: generate/persist Ed25519 key + self-signed cert on first run; expose fingerprint; client TOFU pin. (docs/security.md §1) - [ ] Auth: `AuthRequest` → `AuthResult`; guest path + Argon2id password verify (libsodium); SQLite accounts; `voicecat-admin` account add/reset/del/list. (docs/security.md §4) - [ ] Session model: channel tree snapshot (`ServerStateSnapshot`) + `ChannelEvent`/`UserEvent` deltas; join/leave; create/edit/delete (permission-gated). - [ ] Text: ephemeral relay of channel + private messages with acks (no history). (protocol.md §5) - [ ] Wire the C ABI: `vc_connect/authenticate_*/join_channel/send_text` drive the above and emit `vc_event`s; `vccli` exercises them. - [ ] **Integration test:** two `vccli` chat through the server over TLS. ← M1 exit. --- ## Decisions log All architecture/scope decisions are settled and recorded in [docs/roadmap.md §2 "Resolved decisions"](docs/roadmap.md) and reflected across `docs/`. If you make a *new* decision, record it there and link it here. --- ## How to update this file 1. Check off tasks as you complete them; flip a milestone to `[x]` only when its **exit criterion test** passes. 2. Keep the **"Where we left off / next action"** block at the top accurate — it's the first thing the next agent reads. 3. When you start a milestone, copy its task list from `docs/roadmap.md` into a section here.