# Four comparison repairs for [#32936](https://git.cafe/pingdotgg/t3code/pull/32936)

**Rows repaired: 4 / 4. Unverified requested rows: none.** Read-only repair of the supplied synthetic source frames. No new app capture, server, simulator, lease, checkout, source edit, commit, push, PR edit or paid turn.

Target head [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013); current main merge-base [80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17). S2 and I3 retain their original capture SHAs below; they are not relabelled as current-head captures. The [fixture audit](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b57e665a0dd726d7/fixture-matrix.md) accepted those earlier iOS render paths as equivalent. This work repairs comparisons only and makes no new interaction or merge-readiness claim.

All rows: native T3 Code Dev simulator captures, light theme, **1 PNG pixel per device point (1× capture ratio)**. Device/OS, text-size provenance, viewport, crop and masks are repeated per row. No system setting was changed or independently re-read in this offline repair. All coordinates are **half-open original source pixels**, without scaling or registration. Cropped-image coordinates are source x minus crop.left, source y minus crop.top. No normalization, denoising, interpolation or selective pixel removal.

Method: reused the supplied [earlier repair script](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/38d5ded03dd79506/repair-comparisons.py), retaining its ImageMagick compare function verbatim and adapting only the four fixed crop/mask definitions. **Diff0** uses 0% fuzz, full-magenta changed pixels (#ff00ff) on #151515, so one RGB level shows. **DiffT** uses the same ImageMagick `compare -metric AE -fuzz 5% -highlight-color '#ff00ff' -lowlight-color '#151515' -compose src` operation. This is ImageMagick 5% fuzz, as in the earlier repair; it is not a newly substituted maximum-channel threshold.

Opened and visually inspected all eight final crops and eight final diffs individually at full source resolution. Independently compared every RGB pixel: S2 changes are confined to source (16,146)–(110,160); all three feed comparisons to (20,104)–(359,241), with **zero differing pixels elsewhere**. Each reply-text block is pixel-identical after translating from source y=111 to y=199, exactly **88 pt lower**. The [validation record](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c4d299e2ed66bc6b/zero-threshold-validation.json) and [validation script](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5b6dcc1875c75966/validate-repairs.py) preserve these checks.

## S2 — empty sidebar; iPad (7th generation), iOS 18 (minor unrecorded), light; 1080×810 landscape; crop (0,24)–(1080,810), 1080×786; masks: none

Environment: **iPad (7th generation) / iOS 18 (minor unrecorded) / 1× pixels per point / text size: default system large, no custom scale / viewport 1080×810 landscape / light**. Fixed crop as labelled above, identical on both sides; top 24px status strip excluded. No masks. Full navigation/header controls and all content below the strip are retained.

| Before | After | Diff0 | DiffT (5% fuzz) |
|---|---|---|---|
| ![S2: Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/214dba0baa94b354/S2-before-crop.png)<br>[ca796d5211](https://git.cafe/pingdotgg/t3code/commit/ca796d52119592de771d8ccfa955d70dba84d11e)<br>[Original full frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/41e0c6a92b20ec35/before-S2-clean.png) | ![S2: After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e74303a637954cf8/S2-after-crop.png)<br>[eb39186ba6](https://git.cafe/pingdotgg/t3code/commit/eb39186ba693087529323f5e4da65018d8377ad5)<br>[Original full frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2b18f4fd8e6118be/after-S2-clean.png) | ![S2: Diff0: all nonzero pixels](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ab359d489adf9bea/S2-Diff0.png)<br>[ca796d5211](https://git.cafe/pingdotgg/t3code/commit/ca796d52119592de771d8ccfa955d70dba84d11e) → [eb39186ba6](https://git.cafe/pingdotgg/t3code/commit/eb39186ba693087529323f5e4da65018d8377ad5) | ![S2: DiffT: 5% fuzz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fd04b07c52e80244/S2-DiffT-5pct.png)<br>[ca796d5211](https://git.cafe/pingdotgg/t3code/commit/ca796d52119592de771d8ccfa955d70dba84d11e) → [eb39186ba6](https://git.cafe/pingdotgg/t3code/commit/eb39186ba693087529323f5e4da65018d8377ad5) |

Changed pixels: **Diff0 534; DiffT 456**.

**What else changed:** Excluded status clock: 2:54 → 2:55. After exclusion, only “No threads yet” becomes visible below Search. All other retained pixels are identical at zero threshold.

## I3-up — first actual composer send into an existing empty thread; keyboard up; iPhone Xs, iOS 18 (minor unrecorded), light; 375×812 portrait; crop (0,30)–(375,812), 375×782; masks: none

Environment: **iPhone Xs / iOS 18 (minor unrecorded) / 1× pixels per point / text size: default system large per original fixture report, no custom scale / viewport 375×812 portrait / light**. Fixed crop as labelled above, identical on both sides; top 30px status strip excluded. No masks. Full navigation/header controls and all content below the strip are retained.

| Before | After | Diff0 | DiffT (5% fuzz) |
|---|---|---|---|
| ![I3-up: Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2a5dd693ff722ba2/I3-up-before-crop.png)<br>[ca796d5211](https://git.cafe/pingdotgg/t3code/commit/ca796d52119592de771d8ccfa955d70dba84d11e)<br>[Original full frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/278bfdecf4b4a46f/before-I3-anchor-up.png) | ![I3-up: After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0b787edabb2b8c98/I3-up-after-crop.png)<br>[f76e21be6c](https://git.cafe/pingdotgg/t3code/commit/f76e21be6cdcf0936a28521badaf66e4a85bb9cc)<br>[Original full frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ed035e8374b354de/after-I3-anchor-up.png) | ![I3-up: Diff0: all nonzero pixels](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/58fa536f0486750e/I3-up-Diff0.png)<br>[ca796d5211](https://git.cafe/pingdotgg/t3code/commit/ca796d52119592de771d8ccfa955d70dba84d11e) → [f76e21be6c](https://git.cafe/pingdotgg/t3code/commit/f76e21be6cdcf0936a28521badaf66e4a85bb9cc) | ![I3-up: DiffT: 5% fuzz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ff8245399a97c5a4/I3-up-DiffT-5pct.png)<br>[ca796d5211](https://git.cafe/pingdotgg/t3code/commit/ca796d52119592de771d8ccfa955d70dba84d11e) → [f76e21be6c](https://git.cafe/pingdotgg/t3code/commit/f76e21be6cdcf0936a28521badaf66e4a85bb9cc) |

Changed pixels: **Diff0 11,242; DiffT 10,545**.

**What else changed:** Excluded status clock: 4:37 → 4:36. The same 4:35 AM timestamps move with their rows. The sent bubble becomes visible at source y=104, 16 pt below the header edge y=88. Reply text and its action row move down 88 pt. Header controls, composer, keyboard and all other pixels are identical at zero threshold.

## N1a — New task draft → first send; settled keyboard up after immediate refocus; iPhone Xs, iOS 18.6, light; 375×812 portrait; crop (0,40)–(375,812), 375×772; masks: generated title: (49,54)–(196,78); before reply timestamp: (78,139)–(130,154); after sent timestamp: (279,155)–(327,170); after reply timestamp: (78,227)–(130,242)

Environment: **iPhone Xs / iOS 18.6 / 1× pixels per point / text size: default/unscaled appearance; original N1 report did not record the system text category separately / viewport 375×812 portrait / light**. Fixed crop as labelled above, identical on both sides; top 40px status strip excluded. All four opaque #888888 rectangles are applied identically to BOTH source images before cropping. The title mask remains inside the opaque navigation header; it does not intersect either visible bubble or reply. The before-reply timestamp mask ends at x=130, clear of the after bubble starting x=137. No mask covers visible sent-bubble or reply text/geometry. The timestamp in the before sent row is already hidden by the native bar, so no extra mask is applied there. See the labelled mask key below.

| Before | After | Diff0 | DiffT (5% fuzz) |
|---|---|---|---|
| ![N1a: Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/94888d75113a193f/N1a-before-crop.png)<br>[80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17)<br>[Original full frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/11832851b0d1ce23/before-keyboard-up.png) | ![N1a: After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/19143aa194b5a023/N1a-after-crop.png)<br>[4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013)<br>[Original full frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/82f35ac00186149e/after-keyboard-up.png) | ![N1a: Diff0: all nonzero pixels](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/016a3e34cbf86972/N1a-Diff0.png)<br>[80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17) → [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013) | ![N1a: DiffT: 5% fuzz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e72819dda0a223ef/N1a-DiffT-5pct.png)<br>[80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17) → [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013) |

Changed pixels: **Diff0 10,896; DiffT 10,328**.

**What else changed:** Masked generated title: “Review Heade…” → “Header Spaci…”. Masked message timestamps: 6:46 AM → 6:51 AM. Both supplied still clocks already show 9:41; the fixed status crop also excludes their Settings return indicator. Remaining changes are the sent bubble becoming visible below the bar and reply/action row moving down 88 pt. Header controls, composer, caret, keyboard and every other retained pixel are identical at zero threshold.

## N1b — New task draft → first send; reply complete, keyboard down; iPhone Xs, iOS 18.6, light; 375×812 portrait; crop (0,40)–(375,812), 375×772; masks: generated title: (49,54)–(196,78); before reply timestamp: (78,139)–(130,154); after sent timestamp: (279,155)–(327,170); after reply timestamp: (78,227)–(130,242)

Environment: **iPhone Xs / iOS 18.6 / 1× pixels per point / text size: default/unscaled appearance; original N1 report did not record the system text category separately / viewport 375×812 portrait / light**. Fixed crop as labelled above, identical on both sides; top 40px status strip excluded. All four opaque #888888 rectangles are applied identically to BOTH source images before cropping. The title mask remains inside the opaque navigation header; it does not intersect either visible bubble or reply. The before-reply timestamp mask ends at x=130, clear of the after bubble starting x=137. No mask covers visible sent-bubble or reply text/geometry. The timestamp in the before sent row is already hidden by the native bar, so no extra mask is applied there. See the labelled mask key below.

| Before | After | Diff0 | DiffT (5% fuzz) |
|---|---|---|---|
| ![N1b: Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1ef96e28d27be916/N1b-before-crop.png)<br>[80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17)<br>[Original full frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4ac1edb11a5ca068/before-keyboard-down.png) | ![N1b: After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0c667e1104d436a1/N1b-after-crop.png)<br>[4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013)<br>[Original full frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0c9fb587705aff41/after-keyboard-down.png) | ![N1b: Diff0: all nonzero pixels](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f239b3d97d7e9f6d/N1b-Diff0.png)<br>[80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17) → [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013) | ![N1b: DiffT: 5% fuzz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a1fac13624b01fe/N1b-DiffT-5pct.png)<br>[80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17) → [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013) |

Changed pixels: **Diff0 10,896; DiffT 10,328**.

**What else changed:** Masked generated title: “Review Heade…” → “Header Spaci…”. Masked message timestamps: 6:46 AM → 6:51 AM. Both supplied still clocks already show 9:41; the fixed status crop also excludes their Settings return indicator. Remaining changes are the sent bubble becoming visible below the bar and reply/action row moving down 88 pt. Header controls, composer and every other retained pixel are identical at zero threshold.

## Masks, scripts and provenance

![Labelled identical N1 masks, source coordinates](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/762d023799cba059/N1-mask-key.png)

- [Four-row reproduction script](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/281e49023c8b31f3/repair-four-comparisons.py)
- [Original supplied script, unchanged](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/020f388fcd103ff2/repair-comparisons.py)
- [Mask/crop definitions](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/652d64ba41b4dad7/masks.json)
- [Source/crop/diff SHA-256 manifest](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ebdb5954684ff3a6/manifest.json)
- [Zero-threshold validation](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c4d299e2ed66bc6b/zero-threshold-validation.json)
- [Validation script](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5b6dcc1875c75966/validate-repairs.py)

Reproduce: `python3 repair-four-comparisons.py <new-output-directory>`, then `python3 validate-repairs.py <new-output-directory>`. Requires curl, Python standard library and ImageMagick. URLs in the script are public synthetic fixtures only.

Source write-ups: [S2/run1](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0d2178a66f13bfec/evidence.md), [I3/run3](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/148756f4b5740cf9/evidence.md), [N1](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5cc35ce1f8366ac5/N1-pr-snippet.md). N1a retains the original capture limitation: Send dismisses the draft keyboard on both sides; the driver immediately refocused the live composer. These static repairs do not change the original recordings or interaction claims.

Cleanup: no processes, simulators, leases or worktrees were created. Only `/tmp/lead-32936-r2/evidence-capture-2/` is removed after successful public upload and presentation. The supplied worktree and parent scratch remain untouched.

AI-assisted; verified with the tests and tools listed above.

## Verbatim ghdrop asset output

![S2-before-crop.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/214dba0baa94b354/S2-before-crop.png)
![S2-after-crop.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e74303a637954cf8/S2-after-crop.png)
![S2-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ab359d489adf9bea/S2-Diff0.png)
![S2-DiffT-5pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fd04b07c52e80244/S2-DiffT-5pct.png)
![I3-up-before-crop.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2a5dd693ff722ba2/I3-up-before-crop.png)
![I3-up-after-crop.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0b787edabb2b8c98/I3-up-after-crop.png)
![I3-up-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/58fa536f0486750e/I3-up-Diff0.png)
![I3-up-DiffT-5pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ff8245399a97c5a4/I3-up-DiffT-5pct.png)
![N1a-before-crop.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/94888d75113a193f/N1a-before-crop.png)
![N1a-after-crop.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/19143aa194b5a023/N1a-after-crop.png)
![N1a-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/016a3e34cbf86972/N1a-Diff0.png)
![N1a-DiffT-5pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e72819dda0a223ef/N1a-DiffT-5pct.png)
![N1b-before-crop.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1ef96e28d27be916/N1b-before-crop.png)
![N1b-after-crop.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0c667e1104d436a1/N1b-after-crop.png)
![N1b-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f239b3d97d7e9f6d/N1b-Diff0.png)
![N1b-DiffT-5pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a1fac13624b01fe/N1b-DiffT-5pct.png)
![N1-mask-key.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/762d023799cba059/N1-mask-key.png)
[repair-four-comparisons.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/281e49023c8b31f3/repair-four-comparisons.py)
[repair-comparisons.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/020f388fcd103ff2/repair-comparisons.py)
[validate-repairs.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5b6dcc1875c75966/validate-repairs.py)
[masks.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/652d64ba41b4dad7/masks.json)
[manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ebdb5954684ff3a6/manifest.json)
[zero-threshold-validation.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c4d299e2ed66bc6b/zero-threshold-validation.json)

FRICTION:
- tool | The inline gallery preview timed out even with self-contained images. All final crops and diffs were inspected individually through the image viewer; public Markdown embeds remain available | make the HTML renderer report load failures without blocking its image-only document.
