5be9f1baacb9c9d86ca46a4c8824c1ec8cb7e35a
`app_log` is the platform half: `android_logger` as the logger the ring forwards to, and an optional destination baked in by `build.rs` from `AI_APP_LOG_HOST`/`_PORT`/`_TOKEN` plus the pinned CA -- the same build-time trust boundary the transcript config and the Compose APK's CA already use, so no token is committed and an APK is good for the server that built it. All three or none: two of the three would be a build with nowhere to send its log and no way to say so. `Copy report` now appends the ring to what goes on the clipboard (not to the pane, which is on screen and would be buried) and flushes the uploader first, so the lines are on the server by the time the message describing them arrives. The Diagnostics pane gains two lines: how many lines are held and when the last arrived, and what the uploader last did -- "not tried yet", "failing -- <why>", and "no server configured" are each their own wording, because "nothing is arriving" has three causes that look identical otherwise. Also: the re-emitted lines carry the target `ai_server::client_log`, not a bare `client_log`. `RUST_LOG=ai_server=debug` -- the filter AGENTS.md tells people to run with -- drops a bare target, so every line a phone sent vanished with nothing saying so. Found by running it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Languages
Rust
53%
Kotlin
44.4%
Shell
2.6%