diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index d02118e..656939e 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -7,6 +7,21 @@ marked **DEFERRED** are ones the agent chose not to decide alone. ## 2026-09-05 +- **P0, a phone benchmark gate before any porting, asked for by Iris + 2026-09-05**: "before P1 I'd like to see benchmarks & also maybe stress + test on my own phone ... If it doesn't match compose reasonably well then + I don't think I'd wanna continue." Design (RUST.md's P0 box has the + detail): the same embedded synthetic fixture in both apps with no server + needed; the same scripted scroll loop then a streaming phase, run + programmatically since the phone has no usable system tracing and no + agent can drive it; the same report from both (frames, janky %, p50/p90/ + p99, process CPU time, peak RSS, battery current where readable) with a + copy button; the iris app under its own id and the Compose one as a new + `bench` build type with an id suffix, so neither replaces her production + install; two arm64 APKs plus instructions delivered under `~/host/bench/`. + The gate is hers: iris within a reasonable margin of Compose release on + p50, p99 and CPU time, no crashes, no visible stutter. If it fails, the + port stops. - **The rest of the port is one UI crate, `iris/app-ui`, grown out of `iris/transcript-ui` rather than started beside it.** It holds a `Screen` enum plus a back stack — the Rust equivalent of `AppRoot.kt`'s diff --git a/docs/RUST.md b/docs/RUST.md index 05e07f8..5c40427 100644 --- a/docs/RUST.md +++ b/docs/RUST.md @@ -3238,6 +3238,39 @@ AVD, `ui-trace` by accessibility name, GrapheneOS phone quirks, the running any pass condition below that touches an emulator or a real device. +- [ ] **P0 — the phone benchmark gate (asked for 2026-09-05; must pass + before P1 starts).** Iris runs both apps on her own phone and pastes + the reports back; the emulator's numbers are not a substitute. + Two halves, buildable independently: + - **Compose half** (`app/`): a `bench` build type (release + optimisations, `applicationIdSuffix ".bench"`, own label "AI + Sessions bench") whose session screen can open an embedded fixture + transcript from assets with no server, and a "Run benchmark" + control in the existing render-report place that programmatically + performs the fixed scroll loop (same distances and timings as + `transcript-bench.sh`, driven through the `LazyListState`), then a + streaming phase (append fixture events at 20/s for 20 s into the + same fold path a live SSE reply uses), then shows the report with + the existing copy button. The report adds process CPU time over + the run (`Process.getElapsedCpuTime`), peak RSS, and + `BatteryManager.BATTERY_PROPERTY_CURRENT_NOW` samples. + - **iris half** (`iris/android-app`, `transcript-screen` feature): the + same fixture embedded, the same scripted loop and streaming phase + driven through `List::scroll` and the fold, the same report fields + added to `FrameReport`'s line, shown on screen with a copy-to- + clipboard control (through the shell's Java side), arm64 release. + - **The fixture**: one synthetic transcript generated from + `app/ui-sandbox.sh`'s invented sessions (never a real one), at + least 3,000 events, with headings, code fences, links, tool calls + with kilobyte outputs, and a few images; committed once under + `app/bench-fixture/` and read by both apps. + - **Delivery**: `~/host/bench/` gets `iris-bench-arm64.apk`, + `compose-bench-arm64.apk`, and `README.md` saying how to run each + and what to paste back. + **Pass**: Iris's call from the two reports — iris within a reasonable + margin of Compose on p50, p99 and CPU time, no crash, no stutter she + can see. Fail stops the port. + - [ ] **P1 — session screen parity.** History paging backward (with the page-boundary healing `client-core` does not have yet, below), `TranscriptSource`-backed cache/server stitching, jump-to-latest,