WP5b of punktfunk-planning/design/console-ui-sweep-2026-08-19.md — the sweep's last open item, following up #333.
pf-client-core: logring's ring half (note/render/wallclock — std only) is Android-enabled; send_to_host stays desktop-gated with the rest of the ureq fetches. wallclock moves in from the session's ring_layer so every ring feeder stamps lines identically.
Android native: JNI_OnLoad installs a RingTee — every log record reaches logcat AND the ring, in the desktop ring_layer's line shape (the tracing→log bridge means core transport warnings land too). New nativeRenderLogs(header) hands Kotlin the rendered bundle.
Kotlin: SkiaConsole.sendLogs replaces the "isn't available on this device yet" stub — renders the ring and POSTs it to /api/v1/client-logs over mtlsHttpClient (the library/art path), with the desktop console's notice wording. The upload deliberately stays Kotlin-side: OkHttp already owns HTTPS-to-the-pinned-host on Android, and pulling ureq+rustls into the .so for one POST would be a dependency change, not a feature. (This corrects the plan's D4 assumption that send_to_host was portable — the ring is; its ureq agent is not.)
console-ui: the host menu's "Send logs" desktop-only gate is removed — paired-and-reachable is the whole condition again; the pinning test flips to assert the row on both platforms.
Gates run: cargo fmt (all edited crates); :app:testDebugUnitTest green — full Android-target Rust stack for all 3 ABIs, check-android-jni-imports clean at the API-28 floor, unit tests pass. Desktop side (logring gate split, ring_layer dedupe, options.rs) rides this PR's CI.
WP5b of `punktfunk-planning/design/console-ui-sweep-2026-08-19.md` — the sweep's last open item, following up #333.
- **pf-client-core**: `logring`'s ring half (`note`/`render`/`wallclock` — std only) is Android-enabled; `send_to_host` stays desktop-gated with the rest of the ureq fetches. `wallclock` moves in from the session's `ring_layer` so every ring feeder stamps lines identically.
- **Android native**: `JNI_OnLoad` installs a `RingTee` — every `log` record reaches logcat AND the ring, in the desktop `ring_layer`'s line shape (the tracing→log bridge means core transport warnings land too). New `nativeRenderLogs(header)` hands Kotlin the rendered bundle.
- **Kotlin**: `SkiaConsole.sendLogs` replaces the "isn't available on this device yet" stub — renders the ring and POSTs it to `/api/v1/client-logs` over `mtlsHttpClient` (the library/art path), with the desktop console's notice wording. The upload deliberately stays Kotlin-side: OkHttp already owns HTTPS-to-the-pinned-host on Android, and pulling ureq+rustls into the `.so` for one POST would be a dependency change, not a feature. (This corrects the plan's D4 assumption that `send_to_host` was portable — the ring is; its ureq agent is not.)
- **console-ui**: the host menu's "Send logs" desktop-only gate is removed — paired-and-reachable is the whole condition again; the pinning test flips to assert the row on both platforms.
Gates run: `cargo fmt` (all edited crates); `:app:testDebugUnitTest` green — full Android-target Rust stack for all 3 ABIs, `check-android-jni-imports` clean at the API-28 floor, unit tests pass. Desktop side (logring gate split, ring_layer dedupe, options.rs) rides this PR's CI.
WP5b of punktfunk-planning design/console-ui-sweep-2026-08-19.md (the last open item):
- pf-client-core: the logring's RING half (note/render/wallclock — std only) is
Android-enabled; `send_to_host` stays desktop-gated with the rest of the ureq
fetches. `wallclock` moves in from the session's ring_layer so every ring feeder
stamps lines the same way.
- Android native: JNI_OnLoad installs a RingTee — every `log` record goes to logcat
AND into the ring, in the desktop ring_layer's line shape. `nativeRenderLogs(header)`
hands Kotlin the rendered bundle.
- Kotlin: `SkiaConsole.sendLogs` replaces the not-available stub — renders the ring
and POSTs it to /api/v1/client-logs over `mtlsHttpClient` (the library/art path),
noticing the desktop wording on success/failure. The upload deliberately stays on
the Kotlin side: OkHttp already owns HTTPS-to-the-pinned-host on this platform,
and pulling ureq+rustls into the .so for one POST would be a dependency change,
not a feature.
- console-ui: the host menu's "Send logs" desktop-only gate is gone — paired and
reachable is the whole condition again; the pinning test flips to assert both
platforms offer it.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
WP5b of
punktfunk-planning/design/console-ui-sweep-2026-08-19.md— the sweep's last open item, following up #333.logring's ring half (note/render/wallclock— std only) is Android-enabled;send_to_hoststays desktop-gated with the rest of the ureq fetches.wallclockmoves in from the session'sring_layerso every ring feeder stamps lines identically.JNI_OnLoadinstalls aRingTee— everylogrecord reaches logcat AND the ring, in the desktopring_layer's line shape (the tracing→log bridge means core transport warnings land too). NewnativeRenderLogs(header)hands Kotlin the rendered bundle.SkiaConsole.sendLogsreplaces the "isn't available on this device yet" stub — renders the ring and POSTs it to/api/v1/client-logsovermtlsHttpClient(the library/art path), with the desktop console's notice wording. The upload deliberately stays Kotlin-side: OkHttp already owns HTTPS-to-the-pinned-host on Android, and pulling ureq+rustls into the.sofor one POST would be a dependency change, not a feature. (This corrects the plan's D4 assumption thatsend_to_hostwas portable — the ring is; its ureq agent is not.)Gates run:
cargo fmt(all edited crates);:app:testDebugUnitTestgreen — full Android-target Rust stack for all 3 ABIs,check-android-jni-importsclean at the API-28 floor, unit tests pass. Desktop side (logring gate split, ring_layer dedupe, options.rs) rides this PR's CI.