## Desktop (Electron, Linux)

Captured **R1 owner inline** and **R2 owner full-screen dialog**, before [5ef56853ef](https://git.cafe/pingdotgg/t3code/commit/5ef56853ef1854da50bc1909c6c0a32700f2cb13) and after [1b1acc1bc9](https://git.cafe/pingdotgg/t3code/commit/1b1acc1bc93cab057e708aa2ba5e1b5dee190d76), for issue [#27402](https://git.cafe/pingdotgg/t3code/issues/27402). Both reproduce the permissions-policy failure before and succeed after under the desktop app's default permissions. Both successful pastes contain exactly `echo hello-27402`; both baseline pastes retain `CLIPBOARD-SENTINEL-27402`.

**Environment — applies to every image and recording below:** Ubuntu 24.04.5 LTS x86_64, Electron 44.10.0 / Chromium 152.0.7977.169, repository-built desktop app and its own bundled server, Playwright 1.60.0 Electron driver, `headless-desktop` Xvfb 1920×1080×24, app window and captured viewport 1440×900 at (0,0), DPR 1, Electron zoom/font scaling 100%, app root font 16px and HTML document font 14px, dark theme, client clock frozen at 2026-10-30 08:32:00 UTC. ffmpeg x11grab 30fps H.264; ImageMagick import native stills. Dialog zoom 100%; conversation scroll 0 on both sides. No extra permissions, clipboard grants, or permission-handler changes.

Fresh T3 homes (`T3CODE_DEV_SEED=0`) and separate XDG profiles; no live database was used. The same prompt ran through the desktop app with default Codex GPT-6-Astra, Medium. Each agent called `html_render` exactly once, ran no shell commands, and replied “done”. The baseline also called `html_preview` to measure height. The published HTML bodies are byte-identical. Requested height metadata differed (86 before / 160 after), but the live inline content measured 86px on both sides before clicking. Both threads were renamed “Copy test” through the UI.

The following steps are **seconds from the start of each recording**, before / after. Each row uses the same scripted interaction. Clipboard sentinel reset happens before each row's Copy click, through Electron's real clipboard API. Paste uses Ctrl+V into the unsent composer.

| Step | Before | After |
| --- | ---: | ---: |
| R1 idle, sentinel set | 0.000 | 0.000 |
| R1 click page Copy | 2.001 | 2.002 |
| R1 failure / copied visible | 2.158 | 2.158 |
| R1 paste actual clipboard | 4.311 | 4.324 |
| R1 settled still | 6.798 | 6.850 |
| Reset sentinel; open R2 dialog | 8.367 | 8.465 |
| R2 dialog idle | 8.531 | 8.637 |
| R2 click page Copy | 10.532 | 10.638 |
| R2 failure / copied visible | 10.630 | 10.770 |
| R2 settled dialog still | 11.749 | 12.246 |
| Close dialog; R2 paste actual clipboard | 13.963 | 14.437 |
| R2 settled paste still | 17.376 | 18.806 |
| End | 19.378 | 20.808 |

Before recording — [5ef56853ef](https://git.cafe/pingdotgg/t3code/commit/5ef56853ef1854da50bc1909c6c0a32700f2cb13):

[before-R1-R2.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3a3a4b6dd344ed72/before-R1-R2.mp4)

After recording — [1b1acc1bc9](https://git.cafe/pingdotgg/t3code/commit/1b1acc1bc93cab057e708aa2ba5e1b5dee190d76):

[after-R1-R2.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/26b352e49ba3d691/after-R1-R2.mp4)

Every still waited for network idle and document fonts, then two native screenshots 500ms apart with **zero differing pixels**. The canonical stills, both diff variants, and video contact sheets were opened and visually inspected before upload. Diff0 is absolute RGB difference multiplied by 255 and clipped, making a one-level change visible. DiffT retains pixels whose maximum channel difference is **greater than 8/255**, with the same amplification. No alignment, masking, or image normalization was applied.

| Row | Before<br>[5ef56853ef](https://git.cafe/pingdotgg/t3code/commit/5ef56853ef1854da50bc1909c6c0a32700f2cb13) | After<br>[1b1acc1bc9](https://git.cafe/pingdotgg/t3code/commit/1b1acc1bc93cab057e708aa2ba5e1b5dee190d76) | Diff0<br>[5ef56853ef](https://git.cafe/pingdotgg/t3code/commit/5ef56853ef1854da50bc1909c6c0a32700f2cb13) → [1b1acc1bc9](https://git.cafe/pingdotgg/t3code/commit/1b1acc1bc93cab057e708aa2ba5e1b5dee190d76) | DiffT >8/255<br>[5ef56853ef](https://git.cafe/pingdotgg/t3code/commit/5ef56853ef1854da50bc1909c6c0a32700f2cb13) → [1b1acc1bc9](https://git.cafe/pingdotgg/t3code/commit/1b1acc1bc93cab057e708aa2ba5e1b5dee190d76) |
| --- | --- | --- | --- | --- |
| R1 — inline + paste | ![before-R1.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0f9ce09e243b7ad4/before-R1.png) | ![after-R1.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a944182801ff0e2f/after-R1.png) | ![R1-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/51194593c87ed48c/R1-diff0.png) | ![R1-diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/db0563d630015a7f/R1-diff8.png) |
| R2 — dialog | ![before-R2.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/338598e4dd9811f8/before-R2.png) | ![after-R2.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ed3ebfda515d8557/after-R2.png) | ![R2-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e39ff1ff517fd06a/R2-diff0.png) | ![R2-diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6ff650175b307acf/R2-diff8.png) |
| R2 — closed dialog + paste | ![before-R2-paste.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d7cf0b87c68923f8/before-R2-paste.png) | ![after-R2-paste.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/95c8980341c0f83a/after-R2-paste.png) | ![R2-paste-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/041cbb99de8b7c76/R2-paste-diff0.png) | ![R2-paste-diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/32f4bab72b24c6ef/R2-paste-diff8.png) |

**What else changed:**

- Intended: the full permissions-policy `NotAllowedError` becomes “copied” in both render contexts; the composer paste changes from the sentinel to `echo hello-27402`.
- Consequence of the shorter inline status: the frame shrinks from 128px to 86px and “done” moves upward by 42px. Full-screen geometry stays the same.
- Independent agent runtime: “Worked for 33s” before versus “Worked for 14s” after. The prompt, generated HTML, thread title, model, theme, scroll, and clock match.
- Diff0 alone detects 10 faint pixels in the disabled “Open in editor” icon (maximum difference 7/255) and one composer corner pixel (1/255). Both disappear at threshold 8. No other differences were found outside those regions and the expected text/layout changes.

**Scripts and audit trail:** The archive contains every seed/driver script and every executed action script, including discarded setup attempts. Raw capture attempts are supplementary and are not the canonical evidence in the table. Profiles, credentials, databases, and provider protocol logs are excluded.

[desktop-driver.cjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0910a60dec23b52/desktop-driver.cjs)

[seed-turn.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9f7f850c94a3a522/seed-turn.js)

[record-flow.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c494ae3775a418e0/record-flow.js)

[prepare-capture.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/31487b391682edae/prepare-capture.js)

[seed-project.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9e9cf4da1266bc3c/seed-project.js)

[select-project.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6ea91266e4e44c7c/select-project.js)

[make-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c85bde14568b9f5b/make-evidence.py)

[reproduce.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/43bdab2d66202621/reproduce.sh)

[all-seed-and-driver-scripts-final.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a40a35bfb8ffd600/all-seed-and-driver-scripts-final.tar.gz)

[before-seed-calls.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3253ac32ea6d7a38/before-seed-calls.json)

[after-seed-calls.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ada4b36d39c13bd1/after-seed-calls.json)

[before-fixture.html](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/381414a0f52190c9/before-fixture.html)

[after-fixture.html](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c6217eb3bc03dbec/after-fixture.html)

[before-transcript.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b09fd86d475a4f84/before-transcript.json)

[after-transcript.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/710da4cc6f628315/after-transcript.json)

[diff-metrics.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/884ad8cda64d2b96/diff-metrics.json)

[raw-capture-attempts-and-logs.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c34cec1812115e15/raw-capture-attempts-and-logs.tar.gz)

**Unverified:** No requested Linux desktop rows remain. macOS was not tested; R3 attachment harness and R4 guest were outside this R1/R2 desktop-only assignment. This evidence does not establish macOS native permission behavior.

**Cleanup:** Both Electron apps, bundled servers, and driver endpoints stopped; their four assigned ports are closed. The before worktree was removed. The lead's after checkout is clean and remains at its requested head. All task scratch is removed after this report is uploaded. No commits, pushes, or PR were made.

FRICTION:
- runbook | T3CODE_HOME isolates server data but not Electron profiles; initial concurrent launches hit a profile lock and a backend scan race | set a separate XDG_CONFIG_HOME and explicit T3CODE_PORT per side from the first launch.
- tool | the before checkout had no Electron runtime after pnpm install (ENOENT) | reuse the once-downloaded, matching Electron executable across both checkouts.
- tool | a discarded first recording retained a previous Tiptap draft after fill("") | clear using Ctrl+A and Backspace before each paste; final recordings verify exactly one pasted value.
- tool | agent-browser was not installed; the shared Browser panel controls Chromium rather than the requested Electron process | provide the Electron CDP driver in the desktop capture runbook.
- other | the turn interruption stopped the running desktop sessions | preserve timestamped synthetic state and launch metadata for a safe restart.

### Verbatim ghdrop output

![before-R1.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0f9ce09e243b7ad4/before-R1.png)
![after-R1.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a944182801ff0e2f/after-R1.png)
![R1-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/51194593c87ed48c/R1-diff0.png)
![R1-diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/db0563d630015a7f/R1-diff8.png)
![before-R2.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/338598e4dd9811f8/before-R2.png)
![after-R2.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ed3ebfda515d8557/after-R2.png)
![R2-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e39ff1ff517fd06a/R2-diff0.png)
![R2-diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6ff650175b307acf/R2-diff8.png)
[before-R1-R2.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3a3a4b6dd344ed72/before-R1-R2.mp4)
[after-R1-R2.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/26b352e49ba3d691/after-R1-R2.mp4)
![before-R2-paste.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d7cf0b87c68923f8/before-R2-paste.png)
![after-R2-paste.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/95c8980341c0f83a/after-R2-paste.png)
![R2-paste-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/041cbb99de8b7c76/R2-paste-diff0.png)
![R2-paste-diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/32f4bab72b24c6ef/R2-paste-diff8.png)
![before-contact-sheet.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3dd235d6aa5902a9/before-contact-sheet.png)
![after-contact-sheet.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9d2f772f2b5c5f58/after-contact-sheet.png)
[before-transcript.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b09fd86d475a4f84/before-transcript.json)
[after-transcript.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/710da4cc6f628315/after-transcript.json)
[diff-metrics.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/884ad8cda64d2b96/diff-metrics.json)
[all-seed-and-driver-scripts-final.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a40a35bfb8ffd600/all-seed-and-driver-scripts-final.tar.gz)
[raw-capture-attempts-and-logs.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c34cec1812115e15/raw-capture-attempts-and-logs.tar.gz)
[desktop-driver.cjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0910a60dec23b52/desktop-driver.cjs)
[seed-project.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9e9cf4da1266bc3c/seed-project.js)
[select-project.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6ea91266e4e44c7c/select-project.js)
[seed-turn.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9f7f850c94a3a522/seed-turn.js)
[prepare-capture.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/31487b391682edae/prepare-capture.js)
[record-flow.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c494ae3775a418e0/record-flow.js)
[make-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c85bde14568b9f5b/make-evidence.py)
[reproduce.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/43bdab2d66202621/reproduce.sh)
[before-seed-calls.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3253ac32ea6d7a38/before-seed-calls.json)
[after-seed-calls.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ada4b36d39c13bd1/after-seed-calls.json)
[before-fixture.html](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/381414a0f52190c9/before-fixture.html)
[after-fixture.html](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c6217eb3bc03dbec/after-fixture.html)

[desktop-evidence.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ae2ccfcdd3636d78/desktop-evidence.md)
[write-report.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/403144b9381135bb/write-report.py)

[all-seed-and-driver-scripts-final.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a40a35bfb8ffd600/all-seed-and-driver-scripts-final.tar.gz)
