25 September 2026 · Linux Chromium + native Android · Isolated app state
#12892 test results
Open PR · Head c808dedbf2 · Target: V2 t3code/codex-turn-mapping
Implemented and browser-tested
Queued-message editing now has a keyboard exit: Enter saves with the default send preference; Escape cancels. Both restore the independent draft. Unsaved edits still block queue navigation until Save or Cancel.
Final-head CI passed. Macroscope correctness and UI consistency passed with no findings; the unchanged Effect check was skipped. Browser checks passed. Native Android interaction reproduced unsaved-edit loss when switching queue entries; successful saving remains blocked by the test connection. Macroscope requires human review for the workflow and default-keybinding changes. No merge performed.
Android recording: unsaved X disappears
Opened “Saved with keyboard,” typed X, selected the image-bearing entry, and returned. The editor showed the original text again. No Save or Cancel was pressed and no dirty-edit warning appeared.

MP4 preview · 16× playback · Full-speed continuous reproduction
Recorded from T3’s live Android Device stream with AgentDevice taps and typing. Startup is trimmed; the sequence remains continuous. The unaccelerated emulator is slow, so the preview is accelerated. The connection failure is visible: this proves local draft loss, not successful saving or app performance. The native code is unchanged by this web PR.
Android: unsaved edits are lost when switching entries
Tested by tapping, typing, and inspecting screenshots in the native Android 15 x86_64 app built from c808dedbf2. This PR changes the shared web/desktop composer; native mobile code is unchanged. The failure is a pre-existing mobile parity gap, not an Android regression introduced by this PR.
Reproduction: edit “Saved with keyboard” to “Saved with ke SAVEyboard.” Update fails while disconnected and retains the edit. Open the held queue, select the image-bearing third message, then return to the first edited entry. No Save/Cancel warning appears; the text is back to “Saved with keyboard.” The unsaved edit is gone.
| Android interaction | Observed result |
| Held queue, saved text, image-bearing entry | Pass: displayed and opened through taps |
| Cancel text edit with an independent draft | Pass: Android draft restored; original queue text unchanged |
| Failed Update | Pass for preserving draft: alert shown; edited text retained |
| Switch away from dirty edit and back | Fail: edit silently lost |
| Android Return | Pass: newline inserted; edit stayed open |
| Successful save, reorder, remove | Blocked: app repeatedly failed to connect to isolated backend |
| Empty edit; remove attachment then Cancel | Not verified |
Successful Save was actually attempted: the app showed “Could not save the queued message” and “Your edit is still in the composer.” A read-only database check confirmed the saved text did not change. Refreshing the isolated pairing also timed out at environment discovery. This run does not establish the cause of the connection failure.
1. Unsaved SAVE text before Update.
2. Switched directly to the image entry without a dirty-edit warning.
3. Returned to the original saved text: the SAVE edit is lost.
Cancel separately passed: the independent Android draft returned.
Failed Update reported an error and retained the draft.
Android Return inserted a newline; SECONDLINE was typed on the next line.These screenshots show the earlier interaction pass; the new recording above independently reproduces the loss without attempting Save. The emulator has no KVM acceleration, so this run is not a useful performance benchmark. iOS is deferred to the maintainer’s Mac. No source changes or merge were performed.
Readiness: web behavior and CI support the PR’s web scope. All-platform readiness is not established: mobile needs dirty-edit protection, a connected mutation pass, and iOS testing.
Browser behavior checked
| Real mouse/keyboard interaction | Result |
| Enter saves and exits editing | Pass |
| Shift+Enter inserts a newline | Pass |
| Ctrl+Enter always preference: Enter adds newline; Ctrl+Enter saves | Pass |
| Escape discards text changes and restores draft | Pass |
| Ordinary draft survives Escape | Pass |
| Suggestions close before editing is canceled | Pass |
| Holding Escape closes suggestions without canceling | Pass |
| Image preview closes first; separate Escape cancels | Pass |
| Holding Escape after image preview does not cancel | Pass |
| Cancel restores a removed saved attachment | Pass |
| Backward/forward navigation and dirty-edit guard | Pass |
What changed
Escape uses the existing Cancel action. A composer-level handler covers focus on attachment thumbnails as well as text. Suggestions retain priority, modified Escape is not treated as Cancel, and repeated keydown events cannot discard an edit after dismissing a popup.
The browser pass caught a real focus gap: after closing an image preview, the next Escape did nothing. The local composer handler fixed it, and the full two-press sequence passed on retest.
Checks and scope
- 259 focused tests across six files passed before the final one-line CSS adjustment.
- Web typecheck passed.
- Targeted lint completed with warnings in the two large composer components; formatting and diff checks passed.
- Rebased onto V2
1f2f91ded4, including its two latest server fixes.
Shared web/desktop code was exercised in Linux Chromium using mouse and keyboard on an isolated virtual desktop. The T3 Browser host was unavailable. Electron, macOS/Windows, IME input, relay/tunnel, and queue draining were not verified in the browser pass. Android results are reported separately above. Native mobile keyboard navigation is outside this PR.
Latest alignment and keyboard verification
The thumbnail remains on the left. A one-pixel upward adjustment aligns it visually with the text. Verified at normal width, in a narrow window, at 125% browser zoom, and while editing.

Final-head browser recording: backward and forward navigation, dirty-edit protection, Escape cancellation, Ctrl+Enter save, and draft restoration.

Final-head MP4 recording
Earlier popup-priority verification
Escape cancellation, suggestion dismissal with held Escape, and the image-preview sequence after the focus fix. Cropped at original speed.

Full MP4 recording
Recording captured the final UI patch before two server-only V2 commits were incorporated. After rebasing, backward/forward navigation, the dirty-edit guard, Escape and Ctrl+Enter were checked again. Those automated checks ran on the prior head; final-head CI is tracked above.
Enter updates the queue and restores the original draft.
Escape leaves the saved queue unchanged and restores the original draft.
The held queue reused isolated fixtures and messages submitted through the UI. Its stale Working label was observed in earlier provider testing and has not been isolated to this PR. No new provider execution or queue-draining test is claimed here.