Captured **4/4 matrix rows on both real-app web builds** for [#17015](https://git.cafe/pingdotgg/t3code/issues/17015): 18 settled stills and 18 diffs. Nothing was committed or pushed.

**Qualification:** these transcript frames include differences outside the fix, listed below. R1 and R3's selected before captures returned immediate status:false rather than the matrix's expected status:true. R2's clean after interval comes from repeating the identical prompt in its newly seeded A thread after excluding a tool-discovery-contaminated attempt. It consequently has two background tabs in its raw tabs array. These limitations are retained in the evidence rather than presented as exact matches to every expected cell.

| Row | Before: preview_open / immediate preview_status | After: preview_open / immediate preview_status | Surface observed |
|---|---|---|---|
| R1 | {"visible":false} / {"visible":false} | {"visible":true} / {"visible":true} | Floating Browser preview visible by capture time on both sides |
| R2 | {"visible":false} / {"visible":false} | {"visible":false} / {"visible":false} | No preview while on B; preview appears when returning to A |
| R3 | {"visible":false} / {"visible":false} | {"visible":false} / {"visible":true} | Auto-show opens the preview on both sides; unset open still returns false |
| R4 | {"visible":false} / {"visible":false} | {"visible":false} / {"visible":false} | No preview on either side |

R2's shell timestamps bracket the call by approximately **152 ms before** (1793121678263 → 1793121678415) and **1,169 ms after** (1793122046946 → 1793122048115), a difference of approximately **1,017 ms**. These intervals include agent/tool overhead; they are approximate, not precise call benchmarks. Both timestamps and the raw results are retained in the transcript and screenshot frames.

The app ran from separate checkouts at [36d4d711b7](https://git.cafe/pingdotgg/t3code/commit/36d4d711b79c73eb33131944f73ea4a8c6156484) and [0b70531b31](https://git.cafe/pingdotgg/t3code/commit/0b70531b3187665650f89b71f1c15b666f13b09d), one server at a time, each started with T3CODE_DEV_SEED=0 and a database freshly created by that build. The driver used T3 preview tools throughout. The app's default agent was Codex “6 Astra,” Medium, Full access. The browser reported Chromium 156 on Linux x86_64 (fs-22), no device emulation, 1280×800 CSS-pixel fill viewport, DPR 2, visualViewport.scale 1, root font 16 px and light theme. Saved screenshots are 1280×800 pixels.

Every selected still was taken after its turn finished, checked against a second screenshot 500 ms apart with **AE=0**, and opened for visual inspection before upload. Readability frames show each tool's visible field; the archive retains full synthetic transcripts and both settled screenshots. Caret blinks, relative-minute ticks and navigation/stream transitions caused rejected captures to be retaken. No source screenshot was cropped, masked, rewritten or normalized.

**What else changed**

- Generated titles: R1 “Run T3 Preview Tools” → “Inspect T3 Preview Tool Status”; R2 “Measure Browser Preview Startup Time” → “Measure Browser Preview Timing”; R3 “Inspect T3 Preview Tab Status” → “Run T3 Preview Tool Calls”; R4 “Inspect T3 Preview Tools” → “T3 Preview Tool Status.”
- The sidebar's thread count, order, titles, relative ages, active row, hover/Settle controls and branch lines differ because each build owns its own synthetic threads and retries.
- Tab IDs and their UUID suffixes differ: R1 tab_4 → tab_1, R2 tab_7 → tab_4, R3 tab_8 → tab_5, R4 tab_9 → tab_6. R2 after also lists its earlier background tab_3 because of the repeated prompt.
- Transcript formatting differs: R2 after prints shell-result and MCP wrappers, while before prints timestamp stdout and inner JSON. R4 before prints MCP wrappers, while after prints inner JSON. Labels, code-block heights, line wrapping, available scroll range and “Scroll to end” placement therefore differ. The status captures use a different scroll position where needed to expose the result.
- Shell timestamps, chunk IDs and reported shell wall times differ. Visible worked durations are R1 18s → 20s, R2 21s → 24s, R3 17s → 17s, R4 23s → 15s; these are agent turn durations, not the preview wait.
- The right card shows “Select ref,” disabled “Commit,” and +0/−0 before, versus branch fix/issue-17015, “Push & create PR,” and +58/−2 after. Those are the app's branch-versus-base display; this capture task left tracked files untouched.
- Floating preview stream pixels and scaled Example Domain text differ slightly with stream attachment and the currently selected tab. R4 has no floating preview on either side.
- R2 thread B contains the initial failed DNS-attempt transcript before and the synthetic “Reply only READY.” control after. That content difference, including the DNS error, is outside this fix. Both frames prove the absence of a Browser preview on B.
- R1's immediate status false → true and R3's immediate status false → true are visible transcript differences. Only R1's explicit open waits in the fix; R3's status difference reflects when the later tool call sees a viewer and does not establish a change to unset-open semantics. A prior before R1 warmup returned true/true, confirming that the original return is timing-sensitive.

**Unverified**

- The exact before R1/R3 expectation “open:false, immediate status:true” was not observed in the selected captures; both immediate statuses were false. Their real frames and raw outputs are supplied.
- Desktop-rendered tabs: the implementation excludes them via tab.desktop === null, and headless-desktop is absent from PATH on this VM.
- Remaining-deadline clamp: no prompt-level way to set the required short budget; source-only, not runtime-verified here.
- Closing the tab during the wait: requires closing before a client attaches; no capture, prediction only.

The 390 px viewport and second theme were skipped as directed for this server-only change. No video was needed: R2 uses the timestamped transcript and stills.

Artifacts: [prompts.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a120092b3934d57/prompts.txt), [evidence-raw.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/00386734c59cd6c1/evidence-raw.zip), [manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/74bb41b858cf3bbe/manifest.json), [capture-driver.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c084392fc555ae0f/capture-driver.js), [workflow-driver.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c072c7dc24d94056/workflow-driver.js), [prepare-diffs.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/44ed819f91dc5e96/prepare-diffs.py).

## Evidence

[Exact prompts and retry notes](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a120092b3934d57/prompts.txt). Environment for every cell: web, 1280×800 fill viewport, light theme; Chromium 156 / Linux, no emulation, DPR 2, scale 1, root font 16 px. Diff0 uses 0% fuzz; DiffT uses 5% fuzz. Both amplify detected changes to saturated red on white.

**R1 — 1280×800, light**

| Frame | Before<br>[36d4d711b7](https://git.cafe/pingdotgg/t3code/commit/36d4d711b79c73eb33131944f73ea4a8c6156484) | After<br>[0b70531b31](https://git.cafe/pingdotgg/t3code/commit/0b70531b3187665650f89b71f1c15b666f13b09d) | Diff0 | DiffT |
|---|---|---|---|---|
| open | ![R1 open Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e844eb7ab3f18c95/R1-open-before.png) | ![R1 open After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f1aeedaf9eed0a4c/R1-open-after.png) | ![R1 open zero threshold amplified diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/94bccbbe154214ee/R1-open-diff0.png) | ![R1 open 5 percent fuzz diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5abc2a7ba217a5cb/R1-open-diffT.png) |
| status | ![R1 status Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0f0813400598c58b/R1-status-before.png) | ![R1 status After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5291a8b8732acb82/R1-status-after.png) | ![R1 status zero threshold amplified diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4905bcf22a87bb2d/R1-status-diff0.png) | ![R1 status 5 percent fuzz diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/224233d34d2ed279/R1-status-diffT.png) |

**R2 — 1280×800, light**

| Frame | Before<br>[36d4d711b7](https://git.cafe/pingdotgg/t3code/commit/36d4d711b79c73eb33131944f73ea4a8c6156484) | After<br>[0b70531b31](https://git.cafe/pingdotgg/t3code/commit/0b70531b3187665650f89b71f1c15b666f13b09d) | Diff0 | DiffT |
|---|---|---|---|---|
| open | ![R2 open Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7b97879ac8906a7a/R2-open-before.png) | ![R2 open After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c30bac2dc9c0b1c3/R2-open-after.png) | ![R2 open zero threshold amplified diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/577a501bfe3497e8/R2-open-diff0.png) | ![R2 open 5 percent fuzz diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/81d9f0403a560e3c/R2-open-diffT.png) |
| status | ![R2 status Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c6cfc5bd5867b074/R2-status-before.png) | ![R2 status After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ea2ea3c4f29158e2/R2-status-after.png) | ![R2 status zero threshold amplified diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0f01a7e1975cb46/R2-status-diff0.png) | ![R2 status 5 percent fuzz diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8d32efc24124cc1f/R2-status-diffT.png) |
| thread-B | ![R2 thread-B Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/caa3e3af626b3b8e/R2-thread-B-before.png) | ![R2 thread-B After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/def5481c06b6e148/R2-thread-B-after.png) | ![R2 thread-B zero threshold amplified diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f27b79eadd2e933c/R2-thread-B-diff0.png) | ![R2 thread-B 5 percent fuzz diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/93dcd4576a39e0e2/R2-thread-B-diffT.png) |

**R3 — 1280×800, light**

| Frame | Before<br>[36d4d711b7](https://git.cafe/pingdotgg/t3code/commit/36d4d711b79c73eb33131944f73ea4a8c6156484) | After<br>[0b70531b31](https://git.cafe/pingdotgg/t3code/commit/0b70531b3187665650f89b71f1c15b666f13b09d) | Diff0 | DiffT |
|---|---|---|---|---|
| open | ![R3 open Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ff971c922df9a76b/R3-open-before.png) | ![R3 open After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8f0f694ee532acaf/R3-open-after.png) | ![R3 open zero threshold amplified diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/12b8f2a714568b44/R3-open-diff0.png) | ![R3 open 5 percent fuzz diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9ede95848fd6dacb/R3-open-diffT.png) |
| status | ![R3 status Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a9cdc504d89689a8/R3-status-before.png) | ![R3 status After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b53a7471e32d7cec/R3-status-after.png) | ![R3 status zero threshold amplified diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c751c96aea29213a/R3-status-diff0.png) | ![R3 status 5 percent fuzz diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bad7b2e05f29b8ba/R3-status-diffT.png) |

**R4 — 1280×800, light**

| Frame | Before<br>[36d4d711b7](https://git.cafe/pingdotgg/t3code/commit/36d4d711b79c73eb33131944f73ea4a8c6156484) | After<br>[0b70531b31](https://git.cafe/pingdotgg/t3code/commit/0b70531b3187665650f89b71f1c15b666f13b09d) | Diff0 | DiffT |
|---|---|---|---|---|
| open | ![R4 open Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c643fdfc704cc636/R4-open-before.png) | ![R4 open After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e17ffc07eb7a8cf8/R4-open-after.png) | ![R4 open zero threshold amplified diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5ba355434514bdd0/R4-open-diff0.png) | ![R4 open 5 percent fuzz diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/de27b9f57b37fed6/R4-open-diffT.png) |
| status | ![R4 status Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9c7c2cad7826d2b5/R4-status-before.png) | ![R4 status After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9bd18fa19b64f242/R4-status-after.png) | ![R4 status zero threshold amplified diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b94f3b5c9d338a86/R4-status-diff0.png) | ![R4 status 5 percent fuzz diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec44a91f00f63bb9/R4-status-diffT.png) |


Both dev server sessions are stopped; their four server/web ports are empty; both preview tabs are closed; the temporary before worktree is removed. The lead's original after-worktree userdata is restored, with the synthetic fixture retained in scratch. Disk space at cleanup: 24 GB free. No tracked edits, commits, pushes or PRs were made.

Uploads used [ghdrop](/home/ubuntu/.codex/skills/ghdrop/SKILL.md).

<details>
<summary>ghdrop upload -m output, verbatim</summary>

```text
![R1-open-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e844eb7ab3f18c95/R1-open-before.png)
![R1-open-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f1aeedaf9eed0a4c/R1-open-after.png)
![R1-open-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/94bccbbe154214ee/R1-open-diff0.png)
![R1-open-diffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5abc2a7ba217a5cb/R1-open-diffT.png)
![R1-status-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0f0813400598c58b/R1-status-before.png)
![R1-status-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5291a8b8732acb82/R1-status-after.png)
![R1-status-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4905bcf22a87bb2d/R1-status-diff0.png)
![R1-status-diffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/224233d34d2ed279/R1-status-diffT.png)
![R2-open-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7b97879ac8906a7a/R2-open-before.png)
![R2-open-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c30bac2dc9c0b1c3/R2-open-after.png)
![R2-open-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/577a501bfe3497e8/R2-open-diff0.png)
![R2-open-diffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/81d9f0403a560e3c/R2-open-diffT.png)
![R2-status-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c6cfc5bd5867b074/R2-status-before.png)
![R2-status-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ea2ea3c4f29158e2/R2-status-after.png)
![R2-status-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0f01a7e1975cb46/R2-status-diff0.png)
![R2-status-diffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8d32efc24124cc1f/R2-status-diffT.png)
![R2-thread-B-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/caa3e3af626b3b8e/R2-thread-B-before.png)
![R2-thread-B-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/def5481c06b6e148/R2-thread-B-after.png)
![R2-thread-B-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f27b79eadd2e933c/R2-thread-B-diff0.png)
![R2-thread-B-diffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/93dcd4576a39e0e2/R2-thread-B-diffT.png)
![R3-open-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ff971c922df9a76b/R3-open-before.png)
![R3-open-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8f0f694ee532acaf/R3-open-after.png)
![R3-open-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/12b8f2a714568b44/R3-open-diff0.png)
![R3-open-diffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9ede95848fd6dacb/R3-open-diffT.png)
![R3-status-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a9cdc504d89689a8/R3-status-before.png)
![R3-status-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b53a7471e32d7cec/R3-status-after.png)
![R3-status-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c751c96aea29213a/R3-status-diff0.png)
![R3-status-diffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bad7b2e05f29b8ba/R3-status-diffT.png)
![R4-open-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c643fdfc704cc636/R4-open-before.png)
![R4-open-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e17ffc07eb7a8cf8/R4-open-after.png)
![R4-open-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5ba355434514bdd0/R4-open-diff0.png)
![R4-open-diffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/de27b9f57b37fed6/R4-open-diffT.png)
![R4-status-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9c7c2cad7826d2b5/R4-status-before.png)
![R4-status-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9bd18fa19b64f242/R4-status-after.png)
![R4-status-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b94f3b5c9d338a86/R4-status-diff0.png)
![R4-status-diffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec44a91f00f63bb9/R4-status-diffT.png)
[prompts.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a120092b3934d57/prompts.txt)
[capture-driver.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c084392fc555ae0f/capture-driver.js)
[workflow-driver.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c072c7dc24d94056/workflow-driver.js)
[prepare-diffs.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/44ed819f91dc5e96/prepare-diffs.py)
[manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/74bb41b858cf3bbe/manifest.json)
[evidence-raw.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/00386734c59cd6c1/evidence-raw.zip)
```

</details>

FRICTION:
- infra | example.org initially failed with ERR_NAME_NOT_RESOLVED; DNS recovered without config changes | Healthy DNS before the fixture.
- tool | A snapshot crossed navigation; a text locator was invalid; one guessed thread title caused a delayed R2 switch | Use the discovered CSS/aria selector and wait for the persisted route before switching.
- model | One after R2 interval included tool discovery and a preliminary status call | Load required tools before the timed sequence; the clean repeat is separately identified.
- brief | Immediate before status was false in R1/R3, and the before result varied across attempts | Treat expected race outcomes as observations and retain raw results.
- tool | Caret blinking, minute ticks and first stream frames broke pixel identity on some attempts | Blur the composer and accept only a subsequent AE=0 pair.
- tool | A detached shell launch exited before starting the server; the initial skill path was wrong | Retain the terminal session and use the exact catalog skill path.
