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.

Native Android recording: unsaved X is lost when switching entries, at 16 times speed

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 interactionObserved result
Held queue, saved text, image-bearing entryPass: displayed and opened through taps
Cancel text edit with an independent draftPass: Android draft restored; original queue text unchanged
Failed UpdatePass for preserving draft: alert shown; edited text retained
Switch away from dirty edit and backFail: edit silently lost
Android ReturnPass: newline inserted; edit stayed open
Successful save, reorder, removeBlocked: app repeatedly failed to connect to isolated backend
Empty edit; remove attachment then CancelNot 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.
1. Unsaved SAVE text before Update.
2. Switched directly to the image entry without a dirty-edit warning.
2. Switched directly to the image entry without a dirty-edit warning.
3. Returned to the original saved text: the SAVE edit is lost.
3. Returned to the original saved text: the SAVE edit is lost.
Cancel separately passed: the independent Android draft returned.
Cancel separately passed: the independent Android draft returned.
Failed Update reported an error and retained the draft.
Failed Update reported an error and retained the draft.
Android Return inserted a newline; SECONDLINE was typed on the next line.
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 interactionResult
Enter saves and exits editingPass
Shift+Enter inserts a newlinePass
Ctrl+Enter always preference: Enter adds newline; Ctrl+Enter savesPass
Escape discards text changes and restores draftPass
Ordinary draft survives EscapePass
Suggestions close before editing is canceledPass
Holding Escape closes suggestions without cancelingPass
Image preview closes first; separate Escape cancelsPass
Holding Escape after image preview does not cancelPass
Cancel restores a removed saved attachmentPass
Backward/forward navigation and dirty-edit guardPass

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.

Latest aligned queue thumbnails beside message text

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

Final-head queue keyboard navigation and edit verification

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.

Recorded browser interaction testing queue edit cancellation and popup priority

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 saved the queued text and restored the independent draft
Enter updates the queue and restores the original draft.
Escape canceled the unsaved text while preserving the queued message
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.