# T1 — real Electron desktop process-death flow

Captured: partial reply while running → SIGABRT → failed turn → composer ready for a new draft. Both recordings run the actual Electron desktop shell and embedded server built from their own revision; no packaged-build substitution or browser fallback.

Environment: Linux x86_64, Electron 44.9.3 / Chromium 152.0.7977.167, `headless-desktop` with D-Bus and unlocked keyring, nested Xvfb root 1280×800. Native window and renderer viewport both 1280×800, DPR 1, font scaling 1, root font 16px, dark, no emulation, reduced motion. ImageMagick `import -window root` captures PNGs; ffmpeg x11grab records the whole display at 25fps. X11 resizes the window because Electron's renderer CDP does not expose Browser.getWindowForTarget. DevTools is closed before recording. Unrelated development notifications are dismissed before settled frames.

What else changed:

- The empty and partial/running milestone frames are pixel-identical at zero threshold.
- After failure, the normal error item and thread error banner use the SIGABRT sentence. The banner grows horizontally and overlaps more of the user prompt; label, timestamp, retained partial response and ready composer remain.
- The final unsent draft demonstrates that the composer accepts typing after the failed turn.

The second-mode runtime transcript also executes exit 7 through the real adapter: before has generic text and null code; after has “Claude Code process exited with code 7.” / process_exited_nonzero. SIGABRT after has process_killed_by_signal. Every failing fixture has one normal error item, the partial assistant reply remains, and no stderr sentinel enters failure.message.

PR [#26086](https://git.cafe/pingdotgg/t3code/pull/26086) ([GitHub mirror](https://github.com/pingdotgg/t3code/pull/26086)). Before [d1c4b52](https://git.cafe/pingdotgg/t3code/commit/d1c4b52b7c7c7e1b7637ec47e4c959ff0c2d8d99); after [652e9c1](https://git.cafe/pingdotgg/t3code/commit/652e9c18cee800df7e255916365967ba211097ae). Synthetic fixtures only; no tracked edits, component harnesses or live databases.

Clock: server and renderer wall time fixed at 2026-10-27 12:00:00 UTC after app boot; timers continue. DPR 1, font scaling 1 (root 16px), no device emulation, reduced motion. Full surfaces; no crops. Each still waited for network idle and fonts, then required two pixel-identical frames at least 500ms apart. Every selected capture and diff was opened for visual inspection; recordings were reviewed at one-second intervals and at their captured milestones.

Diff0 marks any changed channel (>0/255) in full magenta, including one-level changes. DiffT uses >16/255 per channel. Dim grayscale is the before frame. These are whole-frame differences without alignment, masking or region exclusions.

## Scripted interaction and timestamps

| Scripted step | Before timestamp | After timestamp |
|---|---:|---:|
| Settled Electron app; composer empty | 0s | 0s |
| Type user prompt | 1.102s | 1.11s |
| Submit through app RPC without titleSeed to preserve fixture title | 2.287s | 2.271s |
| Partial reply visible while turn is running | 2.854s | 2.776s |
| Process death visible as Provider error | 12.967s | 13.091s |
| Turn failed; partial reply retained; composer ready | 13.976s | 14.002s |
| Type a new draft into ready composer | 15.668s | 15.722s |
| End | 17.17s | 17.224s |

| Before [d1c4b52](https://git.cafe/pingdotgg/t3code/commit/d1c4b52b7c7c7e1b7637ec47e4c959ff0c2d8d99) | After [652e9c1](https://git.cafe/pingdotgg/t3code/commit/652e9c18cee800df7e255916365967ba211097ae) |
|---|---|
| [T1-desktop-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8f26c9848f9088b5/T1-desktop-before.mp4) | [T1-desktop-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6c0060bd820f9cef/T1-desktop-after.mp4) |

[steps.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7657f3629051f969/steps.json), [steps.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9312ce0ce8dcbd66/steps.json)

## Whole-surface milestone comparisons

| State / viewport / theme | Before<br>[d1c4b52](https://git.cafe/pingdotgg/t3code/commit/d1c4b52b7c7c7e1b7637ec47e4c959ff0c2d8d99) | After<br>[652e9c1](https://git.cafe/pingdotgg/t3code/commit/652e9c18cee800df7e255916365967ba211097ae) | Diff0<br>[d1c4b52](https://git.cafe/pingdotgg/t3code/commit/d1c4b52b7c7c7e1b7637ec47e4c959ff0c2d8d99) → [652e9c1](https://git.cafe/pingdotgg/t3code/commit/652e9c18cee800df7e255916365967ba211097ae) | DiffT = 16/255<br>[d1c4b52](https://git.cafe/pingdotgg/t3code/commit/d1c4b52b7c7c7e1b7637ec47e4c959ff0c2d8d99) → [652e9c1](https://git.cafe/pingdotgg/t3code/commit/652e9c18cee800df7e255916365967ba211097ae) |
|---|---|---|---|---|
| 00-start / 1280×800 / dark | ![00-start.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9d1f731943ccb836/00-start.png) | ![00-start.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bd4192b1812b6b10/00-start.png) | ![00-start-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/06e09368233366ce/00-start-diff0.png) | ![00-start-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7de5b9404d77fbde/00-start-diff16.png) |
| 01-partial / 1280×800 / dark | ![01-partial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1835b634657e48b6/01-partial.png) | ![01-partial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec074e6152ab254d/01-partial.png) | ![01-partial-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f051ffcbc1c46d65/01-partial-diff0.png) | ![01-partial-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5ca858d8ed122ca7/01-partial-diff16.png) |
| 02-failed / 1280×800 / dark | ![02-failed.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b47725c0db2d1508/02-failed.png) | ![02-failed.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/14100c68fc24a4d4/02-failed.png) | ![02-failed-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/365241ba17df7226/02-failed-diff0.png) | ![02-failed-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/982649e0e928ad2d/02-failed-diff16.png) |
| 03-ready / 1280×800 / dark | ![03-ready.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e548e3ea46318455/03-ready.png) | ![03-ready.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/82b5af44da7488fe/03-ready.png) | ![03-ready-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b37434f91d755426/03-ready-diff0.png) | ![03-ready-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e020d5f466147d3e/03-ready-diff16.png) |

## Reproduction and runtime evidence

[reproduce-round2.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/004e9365be860eb4/reproduce-round2.md), [rpc.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/885b1dc16355bf1b/rpc.mjs), [browser.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7b9e4173c3414e4a/browser.mjs), [seed.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b9c6a37e909b58bd/seed.mjs), [claude-exit-stub.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e45e57d6fc897e35/claude-exit-stub.mjs), [frozen-clock.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c88162503374a97a/frozen-clock.mjs), [start-web.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/047d3b31ce8dca8e/start-web.py)

[desktop-session.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/88d1fa4ebb8c0ba1/desktop-session.sh), [start-desktop.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9790c5a4dfdec02a/start-desktop.py), [stop-desktop.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a41072b64f2a7b88/stop-desktop.py), [launch-safety.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/abe27dbd1955032b/launch-safety.mjs), [capture-desktop.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6e00b4c4464039a7/capture-desktop.mjs)

[runtime-transcript.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/60b24eb99fa0d11b/runtime-transcript.mjs), [validate-runtime.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c57a246f209e627a/validate-runtime.py), [before-runtime-transcript.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ed084b59e180e469/before-runtime-transcript.json), [after-runtime-transcript.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f1dc121110e38bb8/after-runtime-transcript.json), [runtime-validation.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b1fad9cf05ff93a5/runtime-validation.txt), [build-diffs.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/febbe054e7e08dc1/build-diffs.py)

Unverified assigned captures: none. 
