# tsclientlib Connect Spike

Chanora proof-of-concept. **Not product code.**

| Field | Value |
|---|---|
| PoC name | `tsclientlib-connect-spike` |
| PoC plan | [`docs/architecture/proof-of-concept-plan.md`](../../docs/architecture/proof-of-concept-plan.md) §2 |
| Purpose | Prove protocol feasibility via `tsclientlib` |
| Exit criterion | "Rust can connect to a compatible server/test double" |

## What it does

1. Generates an ephemeral identity (or accepts one via `--identity`).
2. Connects to a TeamSpeak-3-compatible server.
3. Waits for the initial state snapshot (`StreamItem::BookEvents`).
4. Subscribes to the server's channel tree.
5. Prints server metadata + the channel tree with client names.
6. Disconnects cleanly.

## Run

Requires Rust stable (developed against 1.95). Network access required so
that `cargo` can fetch `tsclientlib` from GitHub on first build.

```bash
cargo run --release -- --address cn.teamspeak.app
```

Useful flags:

| Flag | Meaning |
|---|---|
| `-a, --address <host[:port]>` | Server (default `cn.teamspeak.app`) |
| `-n, --nickname <name>` | Nickname (default `ChanoraPoC`) |
| `--password <pw>` | Server password if required |
| `--identity <base64>` | Reuse an existing identity instead of generating one |
| `--hold-secs <n>` | Seconds to hold the connection before disconnect (default 3) |
| `-v` / `-vv` / `-vvv` | Increase tsclientlib log verbosity |

## Scope boundaries

This spike is intentionally narrow:

- No audio capture or playback (covered by `audio-capture-playback-spike`).
- No FFI surface (covered by `flutter-rust-bridge-hello`).
- No persistent identity (covered by `secure-storage-spike`).
- No diagnostic redaction policy (covered by `diagnostics-redaction-spike`).
- No Chanora architecture layering — does **not** live inside
  `chanora_protocol` and does not expose typed DTOs. The intent of the
  spike is to validate the upstream `tsclientlib` API surface before the
  product crate is written, per the PoC plan.

## Verification log

See `VERIFICATION.md` in this directory for the most recent run captured
against `cn.teamspeak.app`.
