Turn the design into a buildable, dependency-free M0 skeleton plus the
onboarding layer so a new agent can pick up instantly.
Build system:
- CMake + CMakePresets (dev = no deps; server-release = vcpkg) + vcpkg.json
- Skeleton builds with just a C++20 compiler; deps stay off until needed
- .gitattributes (LF), .gitignore, .clang-format
Core (libvoicecat):
- core/include/voicecat.h: full C ABI (the client/server contract), stubbed
- core/proto/voicecat.proto: control-plane wire format, matches docs/protocol.md
- src/{net,crypto,codec,protocol,session,audio,core}: subsystem stubs that
return VC_ERR_NOT_IMPLEMENTED, each pointing to its design doc
- server/ (voicecat-server) and tools/vccli/ link the core
- tests/: CTest smoke test asserting the C ABI contract (behavior, not just build)
- clients/{apple,windows}: M4 placeholders
Onboarding for agents:
- CLAUDE.md: hub — build/test commands, architecture at a glance, doc map, rules
- AGENTS.md: working method (behavior-driven; clean compile is the floor not the goal)
- PROGRESS.md: living tracker — M0 done, M1 task checklist, "where we left off"
Verified: cmake --preset dev && cmake --build --preset dev && ctest --preset dev → green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.4 KiB
4.4 KiB
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 incore/src/protocol/and round-trip anEnvelopein a test (see M1 checklist below andAGENTS.md"Suggested first steps").
Milestones (see docs/roadmap.md for full detail)
- 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)
- Repo layout (
core/ server/ tools/ clients/ tests/), CMake + presets, vcpkg manifest. - C ABI header
core/include/voicecat.h(full surface, stubbed). - Protocol source-of-truth
core/proto/voicecat.proto(matches docs/protocol.md). - Core stubs for all six subsystems (net/crypto/codec/protocol/session/audio) +
vc_client. voicecat-server(arg parsing, config, stub run) andvccli(drives the C ABI).- CTest smoke test asserting the C ABI contract (not just "it compiles").
.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/security.md):
- Turn on vcpkg deps; set a real
builtin-baselineinvcpkg.json; wirefind_packagefor protobuf incore/CMakeLists.txtandprotobuf_generateforvoicecat.proto. protocol/: implement the[u32 length][Envelope]FrameCodec(+ oversized-frame guard). Test: round-trip anEnvelopethrough feed/emit.net/: plain TCP connect/accept via Asio; then wrap with TLS 1.3 (mbedTLS) incrypto/. Test:vccli↔voicecat-servercomplete a TLS handshake.- Handshake:
ClientHello/ServerHellowith 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-adminaccount add/reset/del/list. (docs/security.md §4) - Session model: channel tree snapshot (
ServerStateSnapshot) +ChannelEvent/UserEventdeltas; 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_textdrive the above and emitvc_events;vccliexercises them. - Integration test: two
vcclichat through the server over TLS. ← M1 exit.
Decisions log
All architecture/scope decisions are settled and recorded in
docs/roadmap.md §2 "Resolved decisions" and reflected across docs/.
If you make a new decision, record it there and link it here.
How to update this file
- Check off tasks as you complete them; flip a milestone to
[x]only when its exit criterion test passes. - Keep the "Where we left off / next action" block at the top accurate — it's the first thing the next agent reads.
- When you start a milestone, copy its task list from
docs/roadmap.mdinto a section here.