# Issue 15974 Android evidence

Plain New thread restores the saved unsent prompt on the changed bundle in both light and dark. The supplied original-main recordings show an empty composer after the same bottom-right action. This is a partial matrix pass, not a full selection/exclusion or merge-readiness verdict.

## Revision and environment

- Before: [3de45c6254](https://git.cafe/pingdotgg/t3code/commit/3de45c6254), supplied original-main baseline. Only `before-light-valid` and `before-dark` are used. Earlier non-valid files are excluded.
- After: [1dd0ed5542](https://git.cafe/pingdotgg/t3code/commit/1dd0ed554202da054664a06968f0a038e5cc6717). Local HEAD was verified, and the worktree was clean at entry. Diff is one mobile file, 60 inserted lines including imports. No source changes were made during this capture pass.
- Existing pooled Android session `issue-15974`, native 1080×2424. Every AgentDevice invocation included `--session issue-15974`. Existing installed `com.t3tools.t3code.dev`; existing Metro 8081 and isolated backend 13773 on fs-17.tail131df4.ts.net were reused. No new server, device, checkout, or subagent.
- Bundle attribution: lead supplied that the committed changed bundle was cold relaunched using its dev URL and independently passed restoration. This pass confirms HEAD and observed changed behavior; it did not reinstall/relaunch or independently establish the installed bundle's embedded revision. Baseline revision attribution is also supplied context.
- Synthetic text: `issue 15974 resume this Android draft`; project `server`; environment `fs-17`; visible branch `fix/issue-15974`. No Send action, queued run, or provider run was initiated.
- Existing app contained three same-text drafts plus one stopped empty thread. Visual review finds only two text drafts in the light baseline recording, versus three in dark baseline and after recordings. Thus the principal text/framing matches, but draft fixture cardinality is not identical across all videos. These recordings do not establish the complete M1 fixture.

## Interaction timing (seconds, approximate video time)

Telemetry supplies tap times; visible destination frames and fresh role-specific snapshots establish results. Navigation can finish after a command returns. None of these timings is a performance benchmark.

| Recording | Trace and result |
|---|---|
| Before light, 15.58 s | Initial blank composer, synthetic text present by 2 s, draft list by 6 s; bottom-right New thread at 13.315 s; empty `Ask anything` composer by 14 s and at terminal frame. |
| Before dark, 13.33 s | Synthetic text visible by 2 s; three draft rows by 4 s; plain New thread leads to empty composer by 11–12 s. |
| After dark, 24.49 s | Starts on stopped empty thread; Navigate up at 1.519 s; bottom-right New thread at 9.044 s; restored text visible by 10 s. Navigate up at 16.401 s; repeat New thread at 22.311 s; restored again by 23.49 s. |
| After light, 35.10 s | Starts on stopped empty thread; Navigate up at 3.771 s; bottom-right New thread at 13.498 s; restored text by 16 s. Navigate up at 20.819 s; repeat at 31.294 s; restored text by 34 s. |
| Controls light, 96.27 s | Project picker at 1.415 s; same server selected at 16.483 s, content retained. List at 19.794 s; third explicit draft selected at 28.334 s; changed to unique `issue 15974 older explicit draft control` around 31–35 s. List at 38.311 s; plain New thread at 44.132 s opens original resume text, although marker draft was edited last. Back at 46.487 s; explicit marker row at 51.743 s retains marker through 70 s. Original text restored around 70–80 s; final plain New thread at 93.297 s restores original text. |
| Retarget dark, 50.03 s | Append `[retarget control]` around 8–10 s; open project picker at 12.914 s; choose No project at 19.055 s; marker preserved. Reopen picker at 24.854 s; choose server at 30.716 s; marker preserved through settled captures. Restore original text around 45.746 s. |

The controls clip's first picker action initially returned a stale composer snapshot; a later fresh snapshot showed the picker. Role=text-field waits plus fresh snapshots were used before accepting composer results. Long pauses are tool/capture inspection time, not app latency.

## Matrix coverage

Based on the [supplied proof matrix](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/57f39c368f3d0bea/issue-15974-matrix.md).

| Row | Observed coverage | Remaining UNVERIFIED |
|---|---|---|
| M1 | PASS for plain Android bottom-right New thread restoring identical text in light/dark, correct visible project/environment, back/re-entry, no send. Control shows last-edited third row does not replace plain-entry text. | Full newest-by-creation ordering remains UNVERIFIED: no independently known creation timestamps, unique A/B ordering, newer whitespace/settings draft C, foreign-project/environment decoys, or storage-level duplicate count. Same-text baseline rows cannot prove identity. |
| M2 | None. | UNVERIFIED: no attachment-only eligible draft plus newer whitespace-only fixture; not seeded by unrelated file/device setup. |
| M3 | None. | UNVERIFIED: only one real project and environment available; no empty P2 or E2 collision/decoy fixture. No-project retarget is not P2 scope proof. |
| M4 | Partial: existing composer → project picker → same server retains prompt (controls 1–19 s); direct stopped server thread → plain entry works. Lead's cold-relaunch result is inherited context. | UNVERIFIED: initial picker entry with no intended project; different-project thread; delayed hydration and typing before hydration. |
| M5 | Partial PASS: unique extra marker survives server → No project → server within the active flow (retarget clip). No second resume replaces it. | UNVERIFIED: retarget to a second actual project with a competing eligible draft; none available. |
| C1 | PASS explicit draft subcase: third list row given unique marker, plain entry chooses another saved prompt, then explicit row reopens its marker unchanged. Its “older” label is a synthetic marker, not proof of timestamp ordering. | UNVERIFIED: queued-task editing; no queued fixture, and creating a real run was prohibited. |
| C2 | None. Current branch displayed throughout ordinary flow only. | UNVERIFIED: incoming-share payload, explicit branch entry, clone exclusion routes. Merely displaying the branch is not explicit branch-route proof; no share/clone fixtures or repository mutations. |
| C3 | None. | UNVERIFIED: command palette and hardware newTask; no keyboard fixture exercised. Shared source path does not count as runtime proof. |

Web/desktop/iOS/tablet/remote-mode/provider sweeps were not performed. Scope is the requested Android evidence. No repository tests were run because there was no implementation change.

## Still stability and whole-frame differences

All source screenshots and recordings retain native 1080×2424. Comparison canvases add labels around two unscaled native stills; contact sheets alone use thumbnails. Diff computation uses every pixel, including status bar, without crop, alignment, clock masking, or normalization. A pixel differs if any RGB channel's absolute delta exceeds 0 or 16 respectively.

| Pair | Pixels >0 | Pixels >16 | Total pixels |
|---|---:|---:|---:|
| Light supplied before PNG vs after PNG | 180,160 | 70,441 | 2,617,920 |
| Dark supplied before PNG vs after PNG | 180,273 | 169,074 | 2,617,920 |
| After light two screenshots, ≥500 ms apart | 0 | 0 | 2,617,920 |
| After dark two screenshots, ≥500 ms apart | 0 | 0 | 2,617,920 |
| Explicit-control two screenshots, ≥500 ms apart | 0 | 0 | 2,617,920 |
| Retarget-control two screenshots, ≥500 ms apart | 0 | 0 | 2,617,920 |

The terminal screenshots were separate AgentDevice screenshot calls with an explicit 500 ms pause between them; command overhead makes actual separation longer. The stable pairs are exact RGB equality, not only threshold equality.

Supplied baselines have no independent paired raw screenshots. Extracted light baseline frames at 14.0/14.5 s are identical; dark baseline frames at 11.0/11.5 s differ at 16 pixels with maximum channel delta 1, and zero pixels above threshold 16. Compressed video extraction is supplementary and does not fulfill a paired-raw-screenshot claim for the supplied baselines.

Visible differences: before prompt is empty, input is compact, model name is collapsed, Send appears inactive; after prompt is present, composer taller, model/reasoning text visible, Send active. Taller composer shifts branch row and hero upward. Status clock changes from 6:06 in supplied stills to 6:18 dark / 6:19 light; cellular indicator pixels differ too. No claim that “nothing else changed.”

## Inspection, scripts, and retained state

Opened every uploaded still, comparison, and diff; opened timestamped contact sheets for all six uploaded videos. Reviewed sampled frames across each interaction including the terminal result. ffprobe confirmed native dimensions and durations. Zero-threshold masks, threshold-16 masks, 4× amplified differences, numeric statistics, raw gesture telemetry, original captures, and review sheets are included below.

External scripts contain no credentials or pairing URLs: `reproduce.py` restates the observed core trace using fresh refs and role waits (syntax compiled; not itself replayed); `analyze.py` computes differences and baseline frame samples (executed); `contact-sheets.py` creates timestamped video sheets (executed). These live outside the repository. The reproduction helper assumes the existing session is already connected and the synthetic fixture exists; it neither leases nor installs nor sends nor starts servers.

All four recordings started here were stopped successfully. The session and lease remain open, existing servers were not stopped, app left dark on the draft composer with the original prompt restored. Both temporary markers were removed. No forge calls, push, merge, watch, code edits, or DB fixture writes.

## FRICTION

- One Android Back command returned “Remote daemon is unavailable”; the following snapshot succeeded and Navigate up worked. No reconnect, new lease, or transport switch.
- Global `--help` with session was rejected because help does not accept a session; inspected installed CLI source instead. All AgentDevice invocations still included the required session.
- One attempted stale-ref click after fill was rejected; fresh snapshot recovered. No Send action occurred.
- Navigation snapshots can be stale; a wait on destination role and another snapshot were necessary. Text-only waits would also match list draft labels.
- Same-label drafts make identity/ordering ambiguous; the temporary unique explicit-draft marker proves only the observed control. Full M1, scope, attachment, queue/share/clone, keyboard, and hydration race fixtures remain explicitly UNVERIFIED.
- Original light baseline has two visible draft rows, dark/after have three. Both demonstrate the same empty-versus-restored behavior; they are not a matched ordering experiment.
- Supplied dark baseline lacks an exact stable raw screenshot pair. Its compressed samples have tiny nonzero codec differences as reported above.
- Initial coarse contact sheets omitted terminal samples; replaced with timestamped sheets including near-end frames. A locally unavailable font was replaced with Pillow's built-in font for readable labels. No app code was touched.

## Uploaded artifacts

[issue-15974-before-light-valid.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9d6123ba829923c4/issue-15974-before-light-valid.mp4)
[issue-15974-before-light-valid.gesture-telemetry.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6383c87a609fb2b5/issue-15974-before-light-valid.gesture-telemetry.json)
[issue-15974-before-light-valid-sheet.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c98b865ccb18035c/issue-15974-before-light-valid-sheet.png)
[issue-15974-before-dark.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8b4063d883aa9085/issue-15974-before-dark.mp4)
[issue-15974-before-dark.gesture-telemetry.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/75a59052e9063f84/issue-15974-before-dark.gesture-telemetry.json)
[issue-15974-before-dark-sheet.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0940aefc8f3a6939/issue-15974-before-dark-sheet.png)
[issue-15974-after-light.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d5bfb1ead11afebe/issue-15974-after-light.mp4)
[issue-15974-after-light.gesture-telemetry.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d8ead8620208ca32/issue-15974-after-light.gesture-telemetry.json)
[issue-15974-after-light-sheet.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b95e5359188bc2b1/issue-15974-after-light-sheet.png)
[issue-15974-after-dark.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7ff5ec6bf0dc1708/issue-15974-after-dark.mp4)
[issue-15974-after-dark.gesture-telemetry.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d835bf44988e5306/issue-15974-after-dark.gesture-telemetry.json)
[issue-15974-after-dark-sheet.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ba2d4ca677d86b88/issue-15974-after-dark-sheet.png)
[issue-15974-controls.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3ef1234dbd8983ea/issue-15974-controls.mp4)
[issue-15974-controls.gesture-telemetry.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fa544ce1dbb48f1c/issue-15974-controls.gesture-telemetry.json)
[issue-15974-controls-sheet.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7bc48e565caa0bdb/issue-15974-controls-sheet.png)
[issue-15974-retarget.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0df0d67a7937f658/issue-15974-retarget.mp4)
[issue-15974-retarget.gesture-telemetry.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/41d4172c4d62be94/issue-15974-retarget.gesture-telemetry.json)
[issue-15974-retarget-sheet.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/680bbb93f477421f/issue-15974-retarget-sheet.png)
[issue-15974-before-light-valid.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2206013ebd0c47a9/issue-15974-before-light-valid.png)
[issue-15974-before-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/250f223c227051b5/issue-15974-before-dark.png)
[issue-15974-after-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3141559c85ae4c60/issue-15974-after-light.png)
[issue-15974-after-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/50023141a4634111/issue-15974-after-dark.png)
[issue-15974-after-light-settled.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8baf67c06f316bb6/issue-15974-after-light-settled.png)
[issue-15974-after-dark-settled.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ddae610fa604a720/issue-15974-after-dark-settled.png)
[issue-15974-control-explicit.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/07aa9a54a0162f95/issue-15974-control-explicit.png)
[issue-15974-control-explicit-settled.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4b2f7a9097312b95/issue-15974-control-explicit-settled.png)
[issue-15974-control-retarget.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0e03b6f97ca5059c/issue-15974-control-retarget.png)
[issue-15974-control-retarget-settled.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eb1911813ef4ff53/issue-15974-control-retarget-settled.png)
[issue-15974-before-light-valid-terminal-a.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/42ba55ca4e129f7a/issue-15974-before-light-valid-terminal-a.png)
[issue-15974-before-light-valid-terminal-b.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a0358e2c97654568/issue-15974-before-light-valid-terminal-b.png)
[issue-15974-before-dark-terminal-a.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1b46e9ac77b3edde/issue-15974-before-dark-terminal-a.png)
[issue-15974-before-dark-terminal-b.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/541f4f4691ad6933/issue-15974-before-dark-terminal-b.png)
[issue-15974-light-comparison.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/06751bb478d24b92/issue-15974-light-comparison.png)
[issue-15974-dark-comparison.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2254b4640a41a923/issue-15974-dark-comparison.png)
[issue-15974-light-diff-threshold0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/99beef3c8e188e22/issue-15974-light-diff-threshold0.png)
[issue-15974-light-diff-threshold16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/89d0403412a7702d/issue-15974-light-diff-threshold16.png)
[issue-15974-light-diff-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2b917b5642350f37/issue-15974-light-diff-amplified.png)
[issue-15974-dark-diff-threshold0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3cdf256c8753ae38/issue-15974-dark-diff-threshold0.png)
[issue-15974-dark-diff-threshold16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9e3ab3c586d298c4/issue-15974-dark-diff-threshold16.png)
[issue-15974-dark-diff-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/350d6cffe6dc506b/issue-15974-dark-diff-amplified.png)
[issue-15974-pixel-stats.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b0071a8aabe81449/issue-15974-pixel-stats.json)
[issue-15974-analyze.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8df7dff6d5f8e6f1/issue-15974-analyze.py)
[issue-15974-contact-sheets.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8f8a4abbcc8632b7/issue-15974-contact-sheets.py)
[issue-15974-reproduce.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f6e2dcf3d4d5c83d/issue-15974-reproduce.py)
