d09954d85d
net/http wraps every transport failure in *url.Error, whose Error() prints the request URL. Telegram accepts the bot token nowhere but the URL path, so a send failure wrote the live token into the daemon log. On 2026-08-01 homesrv could not reach api.telegram.org and did that once a minute for as long as the network stayed down. The token lives in deploy/telegram.env to stay out of the repo; putting it in `docker compose logs` undoes that. Both error sites now go through redact. The structural branch rewrites url.Error.URL and keeps the type, so errors.As still matches; anything else falls back to scrubbing the rendered message. No minimum-token-length guard: a one-character token would shred the message, but that beats leaking it. DESIGN.md still said the classifier cascade was the path that runs today with llmrouter wired nil, and gave the resident checkpoint as Qwen3.5-0.8B. Both stopped being true on 2026-07-31. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TrVSBKe3RFDF4fGYKWYQnX