# 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

```bash
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.
