# Mobile dropped-reply evidence for [#32330](https://git.cafe/pingdotgg/t3code/pull/32330)

Captured **R1 and R2: 2/2 requested rows, 2/15 matrix rows**, with the R5 disconnect → reconnect transition included in both. All four final before/after runtime runs passed. The other 13 rows were intentionally not captured; the supplied audit marks them UNIT or EXEMPT. This report does not re-verify those unit-test claims.

**Form: non-UI runtime transcripts.** A real native attempt prepared the matching Android dev client, opened a named Pixel 9 lease, and attempted installation and app open. The pool worker was disconnected. Installation failed at 16:49:26 UTC and again at 16:50:51 UTC, more than one minute later. App open, snapshot and screenshot failed with the same error. No native image or recording was produced. See [native-attempt.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c2e86febd25ea026/native-attempt.md) and [native-install-retry.sanitized.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7e1ed734e78fd660/native-install-retry.sanitized.log). The explicitly permitted runtime fallback was used; no static screenshot or synthetic UI is presented as native evidence.

**Environment for every transcript:** Linux x86_64, machine fs-46; Node 26.12.1; Vite+ 1.4.0 / test runner 5.0.5; each revision's real mobile delivery code and real server. Native device, rendering OS, font scaling, viewport, theme and scroll position: N/A to this non-UI harness. Pixel 9 was requested for the native attempt, but its actual OS, viewport, font scale and theme could not be observed.

Before: [e5b0718a8a](https://git.cafe/pingdotgg/t3code/commit/e5b0718a8a297823920d1bf3a7d5cbacd57263ea). After: [5551099eb1](https://git.cafe/pingdotgg/t3code/commit/5551099eb1093eca432730a888e94a774e87c8e0). Each row/side used a separate, newly created database at its own revision's migration level, with `T3CODE_DEV_SEED=0`. No live T3 database was read, seeded or modified. Synthetic text, a disposable Git project, no attachments, local workspace and the free Replay development fixture were identical; IDs and scratch paths were unique per run.

## What executed, and the harness boundary

The driver imports the checkout's actual `createThreadOutboxDelivery`, outbox manager and Expo storage adapter, outbox removal, composer draft read/set/merge/flush APIs, project launch-input builder, empty-attachment preparation, and shared `startThreadTurn` RPC conversion. The composer merge is **not mocked**. Expo's filesystem is a declared Node-backed shim, so the real persistence code writes actual scratch files; final reads confirm the on-disk draft and empty outbox directory.

The platform/session/connection shell adapters and atom command dispatcher are harness adapters, following the permissions test's wiring. Operate permission is fixed to granted in the client adapter; the server still authorizes an actual CLI-issued session. Config and project/thread rows are fetched from the real server. The transport bridge sends Effect JSON Request frames over a real WebSocket; a real socket close drives the disconnected atom, and an actual reopened socket plus a fresh server shell snapshot drives connected/live. This does **not** execute the native connection supervisor or render components. Native picker/share/assets facades are stubbed and unused by these text-only fixtures.

The proxy forwards the launch request, waits for its successful Exit, holds that reply, then discards it and terminates the client socket. A separate authenticated control connection proves one committed user message and one turn **before** that drop. The service retains the unchanged queued revision during failure. On reconnect, the shell rows come from the server, not a fabricated thread. The head retries through the real delivery branch with the same durable commandId, messageId and root workspace. The raw protocol request ID is socket-local (`0` on connections 1 and 2); it is distinct from the durable launch command UUID.

This covers R5's disconnect/stale → connected/live transition inside R1/R2. A cached-thread-offline wait lasting beyond retry backoff is not separately exercised. No app restart is performed.

## R1 — lost reply, unchanged revision, empty composer

Identical scripted steps on each revision: enqueue `My dictated idea` at revision 1 → launch → hold the server's success and independently confirm its committed message/turn → keep the composer empty → drop success and close socket → observe disconnected/stale with one queued message → reopen the socket and publish the real live shell containing the thread → allow the delivery service's normal retry timer → read persisted client state and server counts.

All timestamps below are UTC on 2026-11-10, written above the transcript pair:

| Step | Before | After |
|---|---|---|
| Enqueue; first launch forwarded | 16:56:08.689; 16:56:08.699 | 16:56:20.554; 16:56:20.562 |
| Independent query confirms 1 message / 1 turn | 16:56:08.814 | 16:56:20.664 |
| Successful reply dropped; disconnected/stale, queue retained | 16:56:08.817; 16:56:08.820 | 16:56:20.666; 16:56:20.669 |
| Socket reopened; real shell live and contains thread | 16:56:08.831; 16:56:08.858 | 16:56:20.680; 16:56:20.702 |
| Retry | No second launch; text handed back | Same-ID launch forwarded at 16:56:21.671 |
| Final persisted composer / empty outbox | `My dictated idea` at 16:56:09.834 | empty at 16:56:21.715 |

| Fixture / environment | Before | After | Diff0 | DiffT |
|---|---|---|---|---|
| R1 · non-UI Node runtime · device/theme N/A | [R1-before-runtime.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/343f411082822180/R1-before-runtime.md)<br>[e5b0718a8a](https://git.cafe/pingdotgg/t3code/commit/e5b0718a8a297823920d1bf3a7d5cbacd57263ea) | [R1-after-runtime.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/477403507fd9e94f/R1-after-runtime.md)<br>[5551099eb1](https://git.cafe/pingdotgg/t3code/commit/5551099eb1093eca432730a888e94a774e87c8e0) | N/A: no rendered still<br>[e5b0718a8a](https://git.cafe/pingdotgg/t3code/commit/e5b0718a8a297823920d1bf3a7d5cbacd57263ea) → [5551099eb1](https://git.cafe/pingdotgg/t3code/commit/5551099eb1093eca432730a888e94a774e87c8e0) | N/A: no rendered still; no threshold claimed<br>[e5b0718a8a](https://git.cafe/pingdotgg/t3code/commit/e5b0718a8a297823920d1bf3a7d5cbacd57263ea) → [5551099eb1](https://git.cafe/pingdotgg/t3code/commit/5551099eb1093eca432730a888e94a774e87c8e0) |

Both final server queries show **one user message and one turn**. [R1-before-server-counts.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/41e26542e4be842f/R1-before-server-counts.json), [R1-after-server-counts.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7ebedc36563a77cf/R1-after-server-counts.json). Correlated wire logs: [R1-before-proxy.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7f98368c193bff92/R1-before-proxy.jsonl), [R1-after-proxy.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec36b1f9b500dea0/R1-after-proxy.jsonl).

## R2 — lost reply, unchanged revision, unrelated draft

Same steps as R1. While the successful reply is held, set and flush the new thread's composer to `Keep this draft separate` through the **real composer API**, without editing the queued task. Then drop/reconnect/retry identically.

All timestamps below are UTC on 2026-11-10, written above the transcript pair:

| Step | Before | After |
|---|---|---|
| Enqueue; first launch forwarded | 16:56:37.526; 16:56:37.534 | 16:57:02.891; 16:57:02.900 |
| Independent query confirms 1 message / 1 turn | 16:56:37.642 | 16:57:03.023 |
| Unrelated draft set/persisted; queued revision still 1 | 16:56:37.644 | 16:57:03.025 |
| Successful reply dropped; disconnected/stale, queue retained | 16:56:37.644; 16:56:37.648 | 16:57:03.026; 16:57:03.030 |
| Socket reopened; real shell live and contains thread | 16:56:37.658; 16:56:37.682 | 16:57:03.037; 16:57:03.065 |
| Retry | No second launch; text appended to draft | Same-ID launch forwarded at 16:57:04.032 |
| Final persisted composer / empty outbox | `Keep this draft separate\n\nMy dictated idea` at 16:56:38.674 | `Keep this draft separate` at 16:57:04.066 |

| Fixture / environment | Before | After | Diff0 | DiffT |
|---|---|---|---|---|
| R2 · non-UI Node runtime · device/theme N/A | [R2-before-runtime.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4df52d52a5cc25eb/R2-before-runtime.md)<br>[e5b0718a8a](https://git.cafe/pingdotgg/t3code/commit/e5b0718a8a297823920d1bf3a7d5cbacd57263ea) | [R2-after-runtime.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e304f5abe209b478/R2-after-runtime.md)<br>[5551099eb1](https://git.cafe/pingdotgg/t3code/commit/5551099eb1093eca432730a888e94a774e87c8e0) | N/A: no rendered still<br>[e5b0718a8a](https://git.cafe/pingdotgg/t3code/commit/e5b0718a8a297823920d1bf3a7d5cbacd57263ea) → [5551099eb1](https://git.cafe/pingdotgg/t3code/commit/5551099eb1093eca432730a888e94a774e87c8e0) | N/A: no rendered still; no threshold claimed<br>[e5b0718a8a](https://git.cafe/pingdotgg/t3code/commit/e5b0718a8a297823920d1bf3a7d5cbacd57263ea) → [5551099eb1](https://git.cafe/pingdotgg/t3code/commit/5551099eb1093eca432730a888e94a774e87c8e0) |

Both final server queries show **one user message and one turn**. [R2-before-server-counts.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/49f11fb496ec5e90/R2-before-server-counts.json), [R2-after-server-counts.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a294a4f0fc55b767/R2-after-server-counts.json). Correlated wire logs: [R2-before-proxy.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/64557a0581836067/R2-before-proxy.jsonl), [R2-after-proxy.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d6f072d5a3d0d821/R2-after-proxy.jsonl).

## What else changed

- Generated environment, project, thread, command and message UUIDs, timestamps, scratch paths and backend/proxy ports differ by disposable run. The fixture content, local workspace strategy and queued revision are the same.
- Before sends one launch; after sends two with the original durable IDs. Both sides end with an empty persisted outbox and exactly one server user message/turn. The composer difference is the requested behavior.
- Background replay and graceful server shutdown can advance unrelated projection sequences. SQL receipts include shutdown reconciliation; no second user message or turn appears.
- No UI rendering, pixel comparison, still settling, theme comparison or keyboard layout is claimed. Recordings, settled stills, Diff0 and DiffT are unavailable because the pool blocked the native attempt.

## Rebuild and artifacts

Use [run-evidence.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ad38eee2cab736c3/run-evidence.mjs) with [runtime.template.ts](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e4720a425b8d4bc7/runtime.template.ts), [drop-proxy.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/02c3a072e837698a/drop-proxy.mjs), [rpc-client.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8c86105df7036c00/rpc-client.mjs), [expo-fs-shim.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/120a14e4b1ccb526/expo-fs-shim.mjs) and [query-counts.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c226bfe1d1129004/query-counts.mjs) in the same scratch directory. The runner creates a new timestamped run directory every time. Install dependencies in each checkout first. Example commands:

```bash
git -C /home/user/t3code worktree add /home/user/wt/pr-32330-base e5b0718a8a297823920d1bf3a7d5cbacd57263ea
cd /home/user/wt/pr-32330-base
vp install
node /tmp/lead-32330-r1/evidence-capture-1/run-evidence.mjs /home/user/wt/pr-32330-base before R1
node /tmp/lead-32330-r1/evidence-capture-1/run-evidence.mjs /home/user/wt/pr-32330-base before R2
node /tmp/lead-32330-r1/evidence-capture-1/run-evidence.mjs /home/user/wt/pr-32330 after R1
node /tmp/lead-32330-r1/evidence-capture-1/run-evidence.mjs /home/user/wt/pr-32330 after R2
# Query each printed run directory after its server has stopped:
node /tmp/lead-32330-r1/evidence-capture-1/query-counts.mjs /absolute/path/to/printed/run
```

All four final driver files have the same SHA-256 after replacing only the checkout path: `b14acaf1d96f1c9d7eb38bbbbdf9b5856d585445685760bc8929aa40138b5227`. [manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/11ec7dc9192bf95c/manifest.json) records exact run directories and results. [all-drivers-and-iterations.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/42e4a9b58d01a6cb/all-drivers-and-iterations.tar.gz) includes every generated driver/config, earlier failed harness iterations, and their non-secret outputs. Early setup failed on an incomplete RPC bridge export; an early R2 assertion expected one newline while the real merge inserts two. Final evidence uses the corrected identical driver, and all four runs pass. No source changes were made to either checkout.

## Cleanup and unverified work

All locally started dev servers, Metro and proxies were stopped, and their ports were checked empty. The baseline worktree was removed; the lead's worktree remains clean. No commits, pushes or PR edits were made. Disk available at cleanup: 106 GB.

Device cleanup is the remaining tooling limitation: repeated `agent-device close`, including `--force`, failed because the leased worker is disconnected. A targeted gateway DELETE of only this session's recorded lease returned 503; a read-back still returned 200. Release is **not confirmed**. [lease-release.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f83a7ebdfd54a5d0/lease-release.json) and [release-own-lease.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/74e172d423744087/release-own-lease.mjs) record that attempt. No other lease or device was modified.

R1/R2 have runtime proof. Their native rendering/interaction proof, recordings and still/diff pairs remain unverified due to the pool blocker. R0 and R3–R14 are outside this capture request; R5's basic reconnect transition is included but not separately captured.

## Upload inventory — ghdrop output verbatim

[R1-after-driver.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6ccd3b7a49a3c0be/R1-after-driver.log)
[R1-after-proxy.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec36b1f9b500dea0/R1-after-proxy.jsonl)
[R1-after-result.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/200956cd626f73bb/R1-after-result.json)
[R1-after-runtime.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/477403507fd9e94f/R1-after-runtime.md)
[R1-after-server-counts.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7ebedc36563a77cf/R1-after-server-counts.json)
[R1-after-transcript.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f82af571d238cf9a/R1-after-transcript.jsonl)
[R1-before-driver.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/07e4af91910559ba/R1-before-driver.log)
[R1-before-proxy.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7f98368c193bff92/R1-before-proxy.jsonl)
[R1-before-result.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bfa5bb0117796611/R1-before-result.json)
[R1-before-runtime.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/343f411082822180/R1-before-runtime.md)
[R1-before-server-counts.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/41e26542e4be842f/R1-before-server-counts.json)
[R1-before-transcript.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d320e65e6851f8f2/R1-before-transcript.jsonl)
[R2-after-driver.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fefe33746ed2cc49/R2-after-driver.log)
[R2-after-proxy.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d6f072d5a3d0d821/R2-after-proxy.jsonl)
[R2-after-result.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d9590bce27d4a316/R2-after-result.json)
[R2-after-runtime.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e304f5abe209b478/R2-after-runtime.md)
[R2-after-server-counts.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a294a4f0fc55b767/R2-after-server-counts.json)
[R2-after-transcript.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3b802dfdc505f283/R2-after-transcript.jsonl)
[R2-before-driver.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ed917003550bb0c8/R2-before-driver.log)
[R2-before-proxy.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/64557a0581836067/R2-before-proxy.jsonl)
[R2-before-result.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/da275a135ed2c3d2/R2-before-result.json)
[R2-before-runtime.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4df52d52a5cc25eb/R2-before-runtime.md)
[R2-before-server-counts.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/49f11fb496ec5e90/R2-before-server-counts.json)
[R2-before-transcript.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c220e50caf14a9f4/R2-before-transcript.jsonl)
[all-drivers-and-iterations.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/42e4a9b58d01a6cb/all-drivers-and-iterations.tar.gz)
[device-close-final.sanitized.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2d4bf7ac9c6dce2d/device-close-final.sanitized.log)
[device-close-retry.sanitized.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8dde75b2fa5f59cb/device-close-retry.sanitized.log)
[device-close.sanitized.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/56b245c9445b21d1/device-close.sanitized.log)
[device-open.sanitized.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/149243f32540e30c/device-open.sanitized.log)
[drop-proxy.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/02c3a072e837698a/drop-proxy.mjs)
[expo-fs-shim.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/120a14e4b1ccb526/expo-fs-shim.mjs)
[lease-release.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f83a7ebdfd54a5d0/lease-release.json)
[manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/11ec7dc9192bf95c/manifest.json)
[native-attempt-proxy.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f6b80d7a15c1daa5/native-attempt-proxy.jsonl)
[native-attempt.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c2e86febd25ea026/native-attempt.md)
[native-attempt.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/212611b183fd4eec/native-attempt.sh)
[native-install-retry.sanitized.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7e1ed734e78fd660/native-install-retry.sanitized.log)
[native-install.sanitized.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/772605ee50fb4af1/native-install.sanitized.log)
[native-prepare.sanitized.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/45a68c1edae23345/native-prepare.sanitized.log)
[package-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6e9ee3685b0c4eff/package-evidence.py)
[query-counts.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c226bfe1d1129004/query-counts.mjs)
[release-own-lease.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/74e172d423744087/release-own-lease.mjs)
[rpc-client.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8c86105df7036c00/rpc-client.mjs)
[run-evidence.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ad38eee2cab736c3/run-evidence.mjs)
[runtime.template.ts](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e4720a425b8d4bc7/runtime.template.ts)

FRICTION:
- tool | Pixel 9's worker was disconnected; install retry after more than one minute, app open, capture and all close attempts failed; direct release also returned 503 | A connected pool worker and a gateway lease-release path that works while a worker is disconnected.
- tool | Initial scratch bridge omitted an RPC export; initial R2 assertion assumed one newline instead of the real merge's blank line | Start from a complete runtime bridge and derive the baseline expectation from the real composer implementation. Corrected; all four final runs passed.

AI-assisted; verified with the tests and tools listed above.
