Rename the entire workspace:
- Crate packages: quicnprotochat-{core,proto,server,client,gui,p2p,mobile} -> quicproquo-*
- Binary names: quicnprotochat -> qpq, quicnprotochat-server -> qpq-server,
quicnprotochat-gui -> qpq-gui
- Default files: *-state.bin -> qpq-state.bin, *-server.toml -> qpq-server.toml,
*.db -> qpq.db
- Environment variable prefix: QUICNPROTOCHAT_* -> QPQ_*
- App identifier: chat.quicnproto.gui -> chat.quicproquo.gui
- Proto package: quicnprotochat.bench -> quicproquo.bench
- All documentation, Docker, CI, and script references updated
HKDF domain-separation strings and P2P ALPN remain unchanged for
backward compatibility with existing encrypted state and wire protocol.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.3 KiB
3.3 KiB
Phase 2 (Protocol Hardening) + M4–M6 Roadmap
This page tracks implementation of Phase 2 (protocol hardening) from the Production Readiness WBS, followed by M4 (Group CLI), M5 (Multi-party groups), and M6 (Persistence).
Legacy code removed
The following legacy behaviour has been removed; only current behaviour is supported:
- Auth: Server no longer accepts "any non-empty token" when no static token is configured. Either a static
auth_tokenor a valid OPAQUE session token is required (auth version 1 only). - Wire version: Only wire version
1is accepted onenqueue,fetch,fetchWait. Version0is rejected. - Delivery storage: Server only loads the channel-aware delivery map format (v2). Old v1
deliveries.binfiles will not load; delete or migrate the file. - Client: Hybrid decryption is required for Welcome and application payloads. No fallback to plaintext MLS; missing or failed hybrid decrypt returns an error.
Phase 2 — Protocols and Core Hardening
| Task | Status | Notes |
|---|---|---|
| Ciphersuite allowlist | Done | Server rejects KeyPackages whose ciphersuite is not MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519. See quicproquo_core::validate_keypackage_ciphersuite and upload_key_package (E021). |
| ALPN enforcement | Done | Server TLS config sets alpn_protocols = [b"capnp"]; handshake completes only if client offers capnp. |
| Connection draining | Done | On Ctrl+C, server calls endpoint.close(0, b"server shutdown") and exits the accept loop. |
| Wire versioning | Done | enqueue, fetch, fetchWait require version == CURRENT_WIRE_VERSION (1). Other RPCs use auth version. |
| Downgrade guards | Deferred | MLS epoch/ciphersuite consistency is enforced by openmls when processing commits. Explicit epoch-rollback checks can be added in M5. |
| KeyPackage rotation | Doc | Clients should upload a fresh KeyPackage before the 24h TTL. Helper or background task can be added in M4. |
M4 — Group CLI Subcommands
Goal: Persistent, composable CLI for group operations (replace monolithic demo-group).
| Deliverable | Status |
|---|---|
create-group |
Planned |
invite <identity> |
Planned |
join |
Planned |
send <message> |
Planned |
recv |
Planned |
Keep demo-group |
Existing |
See Milestones.
M5 — Multi-party Groups
Goal: N > 2 members, commit fan-out, proposal handling.
| Deliverable | Status |
|---|---|
| Commit fan-out via DS | Planned |
| Proposal handling (Add, Remove, Update) | Planned |
| Epoch sync across N members | Planned |
| Benchmarks | Planned |
M6 — Persistence
Goal: Server survives restart; client state persists across sessions.
| Deliverable | Status |
|---|---|
| SQLite/SQLCipher (AS + DS) | Partial (SqlStore exists) |
migrations/ |
Planned |
| Client reconnect + session resume | Planned |
| Docker + healthcheck | Partial (Dockerfile exists) |
Cross-references
- Production Readiness WBS — Phase 2 definition
- Milestones — M4, M5, M6 details
- Auth, Devices, and Tokens — Phase 3