Mobile performance audit, 2026-10-03

Fixture: 1,003 synthetic stopped threads and 8,100 messages; largest thread has 5,000 messages. The default server thread adds one shell. All published data is synthetic. One Mac mini, iOS 26.5 simulator, matching native development binaries, Hermes. These are development-build diagnostics, not release-device latency claims.

Baseline source 1.4: 4804036e04. Current source: fed41fa88b. Navigation captures on current already include cache-encoding fix 0b5ef27774; recorder before/after captures isolate that additional change. This prevents treating the navigation samples as an untouched release-to-release benchmark.

Clean 1.4 fixture adds stopped-session events after final completed turns. Do not use earlier captures with synthetic missing-provider-binding errors. Clean first-open profile: hermes-1791046756682.trace.json; clean warm profile: hermes-1791046797044.trace.json.

HTTP shell response time, alternating 20 requests: 1.4 median30.1ms; current74.8ms. Shell payloads: 1.4 1,366,816 bytes, current1,539,519 bytes. Gzip sizes are similar (~43KB). Thread requests are bounded to the latest10 user turns in both versions with no extra HTTP waterfall in current. Current largest-thread snapshot51,778bytes vs1.4 9,654bytes; actual latest20 messages appear in both.

Hermes schema decode microbenchmark: shell1.4 164.43ms/current224.71ms; bounded thread1.4 2.66ms/current13.96ms. Native cached-shell canonical decoder separately blocks host timers for~194-203ms. Chunking96 rows reduced the largest timer gap to22.42ms, but increased total cached restore193.93→211.44ms. This is a responsiveness tradeoff, not a loading speedup.

Native navigation samples did not reproduce a generalized slowdown: first-open non-idle sampled work1.4 1,223.09ms/current with cache fix847.53ms; warm627.14/521.34ms. These are single debug captures, influenced by React development instrumentation and Metro lazy imports. They are not tap-to-content latency and do not show that the shipped2.0 app is faster. More reproduction detail is needed for any remaining user-observed navigation delay.

Fixes are separately evidenced in the PR stack. Recorder first-open self time52.94→0ms; overall non-idle work847.53→851.84ms unchanged. Native audio preparation fails identically through unchanged Expo and new adapter on this simulator, so actual dictation remains unverified. Android and physical devices were not exercised.

Rejected experiment: cached-shell decoding in96-row chunks. Although isolated longest-gap measurements improved194→22ms with17ms extra elapsed time, two actual cold starts delayed first thread-label commit from1467/1561ms to1637/1649ms. During those starts, cache decode itself took327/368ms vs195/203ms; other startup work lengthened the gaps. The experiment was removed and is NOT in the PR stack. Data is under rejected-decoder/ in this bundle.
