# Phase 2.2 — Per-task stream token (deferred) Status: deferred. Requires coordinated change in the web app (`torrentclaw-web`) and the CLI daemon. Pulled out of the Phase 2 security pass because the CLI-only fixes (UPnP opt-in, SSE caps, signed self-update) ship without web-side work; the stream-token work cannot. ## Problem `/stream`, `/playlist.m3u` and `/hls//...` on the daemon HTTP server have no authentication. Today, anyone who can reach the listener and guesses (or learns) the `taskID` (for `/stream`) or `sessionID` (for `/hls`) can fetch the active file. Mitigations already in place after Phase 1+2: - `sessionID` is restricted to a safe regex and is a server-issued UUID v4 (122-bit entropy, not enumerable in practice). - `/health` no longer leaks the active filename, taskID prefix or client IP to remote callers (loopback diagnostics preserved). - UPnP is opt-in, so by default the daemon is not exposed to the public internet. - The web client probes `/health` to pick LAN vs Tailscale. Residual risk: - On a shared LAN (open Wi-Fi, office network, dorm) any device can reach the listener and brute-force `?id=` against `/stream`. taskIDs are also UUIDs, so this is high entropy, but the URL may leak through browser history, sharing, screen capture or a passive logger and there is no second factor. - A user who explicitly opts into UPnP exposes the same surface to the entire internet. A per-task secret carried in the URL closes this without breaking the `