Files
chanora/poc/tsclientlib-connect-spike/VERIFICATION.md
T
EdisonJwa 02c11ead7e feat(poc/protocol): add tsclientlib connect spike
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.
2026-05-14 12:25:48 +08:00

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::BookEvents snapshot 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
  • 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 Channel as ChanoraPoC.
  • Clean disconnect via DisconnectOptions::new(); no panics or hangs.

Known non-blocking observations

  • tsproto::packet_codec emits Out of order command packet warnings during the initial state burst. These are upstream-level and informational; the snapshot still resolves correctly. Worth tracking when the chanora_protocol crate 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.