# Proof audit pass 2: PR #23213 (head f7082eceb, base main 8d3b061121)

## Checks
- **SHAs.** `out/*-server-sha.txt` and the checkout HEADs match: base 8d3b061121…, head f7082eceb…. The overlay reads `BEFORE @ 8d3b061121` and `AFTER @ f7082ecebb` in every frame I looked at. Each side's WS and createUrl paths point at its own workspace (`ws-base`, `ws-head`). WS ports also differ by side (base 7703, head 8360).
- **Narration.** I extracted frames at 1 fps (base 46 s, head 49 s) and counted blue and yellow pixels in each. I also viewed the overlays for W-M2, W-M3, W-M5 and W-M4 on both sides.
  - Base never shows yellow until the reload frames (43 onward).
  - Head shows BLUE+YELLOW from frame 30, both after the thread switch (frames 39–41), and YELLOW+YELLOW after the reload (frames 46 onward).
  - The overlay labels and timestamps (W-M3 11.8–11.9 s, W-M5 19.8–19.9 s, W-M4 26.8–26.9 s) agree with the driver's event log.
- **Independent rebuild of W-M2 r2.** I sampled the raw crops with Pillow (`-I`):
  - Base r2: bottom-centre pixel (18,97,232), BLUE; dominant colour BLUE (33141 px).
  - Head r2: (255,225,0), YELLOW; dominant colour YELLOW (32638 px).
  - r1 is BLUE on both sides. All of this matches pixels.json.
- **Same URL vs fresh URL.** The base W-M2 r2 `src` token is identical to r1 (same URL, served from cache). Head r2 has a distinct token, as does each of head's r1/r2 after reload.
- **Overwrite and timing.** The file was overwritten in place: same inode (base 190069, head 190020). Reply 2 mounted 10.3 s (base) and 10.1 s (head) after reply 1, well inside the 5-minute staleTime window.
- **createUrl and cacheRevision (recounted from raw `*-ws.jsonl`).**
  - `media-file` createUrl frames for chart.png, base: 1 before the reload (13:05:15.852) and 1 after it (13:05:42.030).
  - Head: 2 before the reload (13:04:17.984 and 13:04:28.268, i.e. r1 and r2) and 2 after it.
  - `cacheRevision` appears in 0 frames, sent or received, on either side. The payload is `{resource:{_tag,threadId,path}}` only.
- **Driver and uploads.**
  - `sha256(driver.mjs)` is 23d8d8ee…7ed7, both locally and for the uploaded copy.
  - All 21 URLs in urls.txt return HTTP 200. The uploaded mp4s are byte-identical (sha256) to the local ones.
  - The upload content is synthetic: projects `img-proof-*`, threads `chart-*` / `other`, the auto-created `server` project, and /tmp or worktree paths.
  - pixels.json carries only signature tails (the src is cropped to the last ~14 chars of the token). The uploaded createUrl.json has no tokens. The "Update Available: Claude" toast that shows in the W-M4 frames is harmless.
- **Confounders (what-else-changed.md).**
  - Merge-base ed9b7ca9c5 is confirmed, with base 39 commits ahead of it.
  - `http.ts`, `ChatMarkdownMedia.tsx` and `assetUrls.ts` are byte-identical between the fork point and base.
  - Base's added `fileRevision` is not read on the chat image path. In any case it could only make base look *fixed*, and base still reproduces the stale image. No confounder.

## Rows
| row | verdict | note |
|---|---|---|
| W-M1 | PASS | r1 BLUE on both sides (frames, crops, pixels.json agree) |
| W-M2 | PASS | Base r2 BLUE: same URL as r1, stale. Head r2 YELLOW: new URL and a second createUrl. Same inode, mounted at 10 s. Recomputed myself. |
| W-M3 | PASS | r1 stays BLUE on both sides in the same frame (cached URL), as expected |
| W-M5 | PASS | After switching threads and back (19.4 s): base BLUE/BLUE, head BLUE/YELLOW |
| W-M4 | PASS | After full reload: YELLOW/YELLOW on both sides, with fresh tokens on both |
| W-M6 | PASS | createUrl count for the same path before reload: head 2, base 1. `cacheRevision` in 0 frames. |
| Mobile | NOT VERIFIED | Device tools are disabled in this environment and the EAS simulator can't reach the dev server. Acceptable per the brief. |
| Desktop | NOT VERIFIED | No Electron here; desktop wraps the web build. |

Minor point, not blocking: W-M2's "reply 2 mounted" overlay text is on screen for only about 0.6 s before W-M3's label replaces it. The 1 fps frames catch the earlier W-M2 label ("sending reply 2", 9.8–9.9 s). The event log and pixels.json still record the 10.1–10.3 s mount time.

VERDICT: SUFFICIENT
