Proof-of-concept proving the protocol-feasibility exit criterion from docs/architecture/proof-of-concept-plan.md §2: "Rust can connect to a compatible server/test double." The spike opens a tsclientlib connection, waits for the BookEvents state snapshot, subscribes to the server channel tree, prints server metadata and the channel tree with client names, and disconnects cleanly. Audio feature is disabled because audio is covered by a separate PoC. Verified on 2026-05-13 against cn.teamspeak.app (TeamSpeak 3 server 3.13.7); 36 channels and 5 online clients retrieved with full UTF-8 (CJK) preservation. See poc/tsclientlib-connect-spike/VERIFICATION.md for the captured run. Authority: PoC plan §2, SysRS-005, SysDes-011, SysDes-029. Not product code; not promoted into chanora_protocol.
2.3 KiB
2.3 KiB
Verification record — tsclientlib-connect-spike
Result
PASS. The PoC exit criterion (from
docs/architecture/proof-of-concept-plan.md §2: "Rust can connect to a
compatible server/test double") is met.
Environment
| Field | Value |
|---|---|
| Date | 2026-05-13 |
| Host OS | Linux (x86_64) |
| Rust toolchain | stable 1.95.0 (59807616e 2026-04-14) |
| Build profile | release |
| Target server | cn.teamspeak.app (resolved to 175.178.125.23) |
| Network | direct outbound UDP/TCP from build host |
Command
cargo build --release
./target/release/tsclientlib-connect-spike \
--address cn.teamspeak.app \
--hold-secs 4 \
--nickname ChanoraPoC
Process exit code: 0.
What was observed
- Identity generated locally (ephemeral, level-0).
- UDP connection negotiated with the server.
StreamItem::BookEventssnapshot received → initial state ready.server.set_subscribed(true)accepted → full channel tree streamed.- Server identity surfaced:
- name:
Vigorous Pro - platform:
Linux - version:
3.13.7 [Build: 1655727713](TeamSpeak 3 server) - clients online: 5
- channels: 36
- name:
- Channel tree printed with multi-byte (CJK) channel and client names intact, validating UTF-8 end-to-end (cross-references SAD ADR-008 "UTF-8 at all boundaries").
- The PoC client appeared in
Default ChannelasChanoraPoC. - Clean disconnect via
DisconnectOptions::new(); no panics or hangs.
Known non-blocking observations
tsproto::packet_codecemitsOut of order command packetwarnings during the initial state burst. These are upstream-level and informational; the snapshot still resolves correctly. Worth tracking when thechanora_protocolcrate is written, but not a spike blocker.- The welcome banner uses TeamSpeak's
[URL...]/[cspacer0]markup — this is server-provided text and per DEC-015 / ADR-008 must be preserved, not translated. The spike does not parse it.
Scope honestly NOT validated by this spike
- Audio capture/playback (separate PoC).
- Persisted identity via secure storage (separate PoC).
- Reconnect / network-loss recovery.
- FFI to Flutter (separate PoC).
- Behaviour against a non-TS3 / TS5 server.
- Behaviour behind restrictive NAT or under packet loss.
- Performance characteristics under sustained load.