The first build in this repo where the Compose APK is new too: it gains
the same caps iris has (tool input, tool output, messages) so the two
apps are still comparing renderers rather than policies, and it stops
wrapping raw text.
The iris side carries the apply_free fix -- one widget's redraw was
O(its own primitives squared), which is what made expanding a big edit
card lag -- and a LazySpan that clips itself instead of requiring a mask.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Iris's report on the previous bench build: a vertical scroll locked to a
horizontal scroll area whose fling was still running, and the message
box clipping its text 12dp inside its own edge.
From ai-app-2 rustify 9c560e3. The three things Iris reported on
2026-09-08:
- A capture no longer strands everybody else's gesture. Panning a code
fence sideways left the transcript's own gesture open at a stale
origin, so the next tap anywhere panned the list by the distance
between two unrelated fingers; and the fence itself never learned its
gesture ended, so the next drag jumped. Vertical drags fall through to
the list and horizontal ones stay in the fence, with a test each way.
- The benchmark's fling is ticked by the frame loop rather than by a
16ms timer, so it runs at the display's own rate instead of 60Hz. The
fling line in the report says ticked=frame-loop.
- The tool cards' open/closed marks are drawn triangles, not font
codepoints the platform may not have (the empty box in her
screenshot). A code fence also no longer opens scrolled to the end of
its longest line.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rebuilt from ai-app-2 38bf630, arm64-v8a release, 9,651,616 bytes
(lib/arm64-v8a/libmain.so 7,518,840 -- the only .so in the APK, checked
rather than assumed, since the ABI trap below is what this build had to
dodge).
What is new for the phone, both unconfirmed there and both from Iris's
2026-09-07 night report:
- A finger put down on a moving list stops the fling at that sample and
pans from it with no DRAG_SLOP wait (Compose's `startDragImmediately =
isScrollInProgress`); a catch released without moving is not a tap.
- A mask carries a shape rather than a rectangle, so a code fence clips
on its own rounded corners instead of an inner square, nested clips
multiply their coverage, and touch obeys the same shape.
Also in it: the winit/Android renderer no longer aborts on a device
whose only usable adapter is GLES, and a frame report's `primitives=`
no longer counts undrawn clip shapes.
The build itself needed ai-app-2's `build-apk.sh` fix landing in the
same pass: Gradle's merged-native-libs cache survives `rm -rf jniLibs`,
so with an x86_64 lib left in this checkout from emulator work, the
"arm64" APK would have carried x86_64 and aborted on the phone with a
Vulkan error that has nothing to do with Vulkan.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rebuilt from ai-app-2 rustify commit 92985ba, against the last delivery
(b47eb73). APK 9,639,224 bytes / libmain.so 7,506,448 bytes, both smaller
from replacing bundled Noto with platform fonts plus a release-profile
tuning pass.
ai-app-2 rustify 4274b8b. Iris's 2026-09-07 phone report on the previous
build: the resume glyph corruption is fixed (closed on her evidence), the
fling "seems to just be linear velocity with an abrupt stop", and the
keyboard still does not push anything up.
The fling was arithmetically linear: two halves of AOSP's spline build loop
were transposed, which made its two tables identical, and the lookup that
reads one against the other then reduces to the identity. Ported exactly
now from OverScroller.java and Compose's SplineBasedDecay.kt. The keyboard
was `targetSdk = 34` in the bench app's build.gradle against the Compose
app's 37; below 35 the window is resized for the IME and the reported ime
inset is therefore zero. Now 37, plus a WindowInsetsAnimation.Callback, and
the Diagnostics pane prints the insets and how many times the platform has
delivered any -- which is what her screenshot will settle, since the
targetSdk reading could not be measured on any device here.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Keyboard reopen and the IME's height are fixed and confirmed on the
emulator; the fling had three faults behind it (batched samples never
read, nothing advancing an animation between input events, and two wrong
constants that made a flick coast for 45 seconds once it finally moved)
and needs the phone to settle, with the logcat line to send named in the
README; the resume/texture fix has a test but no device that can
reproduce the state it fixes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Composed text now syncs back to Gboard via updateSelection, a swipe over
the composer no longer opens the keyboard, and text survives leaving and
returning to the app. Composed text still not visible on screen -- a
separate, unfixed bug; see ai-app-2 docs/RUST.md's P0 box.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Iris's first real-phone report on the previous rebuild found the top
buttons and text rendering fine before any touch, but four defects on
interaction: every glyph vanishing on the first tap or scroll (not
root-caused this pass -- diagnostics added to catch it next report),
bold words rendering as blank gaps (fixed: bundled static Noto Sans/Noto
Sans Mono faces), text far too small (fixed: density-based scaling,
missing on both platforms before this), and the top row sitting under
the status bar (fixed: a new insets hook). Full account in ai-app-2's
docs/RUST.md P0 box.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Iris asked for a faster fling (v1's tween-based swipe barely moved the
list) plus typing and keyboard phases; see ai-app-2's docs/RUST.md P0
box, "Benchmark v2 (2026-09-06)" for the spec and the emulator smoke
run this build was checked against.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The bench APK aborted on Iris's phone in AndroidRenderer::new with only
a truncated "wgpu error: Validation Error". This build carries ai-app-2
commit 46246ea: a renderer-creation failure now reports the adapter,
its limits/downlevel flags, and wgpu's full error chain on screen and
in logcat instead of aborting, and build-apk.sh no longer forces the
GLES backend (force-gles was meant only for one emulator measurement,
but the delivered APK inherited it regardless of target -- the named
hypothesis for the crash, per ai-app-2's RUST.md P0 box).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>