# R2 Composer 2.5 recapture only

Base [50c1c5d](https://git.cafe/pingdotgg/t3code/commit/50c1c5dc536493826fc66e220598f38b831d5bde), head [ba75e85](https://git.cafe/pingdotgg/t3code/commit/ba75e8569ce10dde44a3459b0fc0b20ce69f36b1), PR [#28018](https://git.cafe/pingdotgg/t3code/pull/28018).

Environment: real web dev app; T3 preview Chromium 156 / Linux x86_64 (fs-27); CSS viewport 1440x1000, DPR 2, 100% zoom, 16px root font, dark; PNG 1280x889 from the same preview snapshot tool on both sides. Browser and server Date frozen to 2026-11-03T02:30:00Z; real scheduling unchanged. No appearance CSS was injected. No source files were changed.

Fresh base worktree was created at the pinned commit and vp install completed. Both server drivers used T3CODE_DEV_SEED=0 and separate fresh homes. The original discovery cache plus the same three synthetic entries seeded both sides; generated private seed bytes match the earlier private seed exactly. Base is ready/authenticated with 51 models; head is ready/authenticated with 48; Composer 2.5 is present on both.

The original capture flow reproduced exactly two differences: (1265,489), RGB 18 -> 20; (1267,491), RGB 15 -> 14. The same-head full navigation and popup remount changed only those two pixels and matched the base. All 479 computed standard properties for popup, ::before, and ::after matched across the reproduced base/head states. There were no running animations at inspection. Popup had backdrop-filter blur(16px) saturate(1.08), translucent background and a 1px translucent rounded border. Evidence therefore points to history-dependent Chromium rounded-border/backdrop rasterization; a catalog-driven layout change is ruled out by matching boxes. The specific Chromium internal raster mechanism was not instrumented.

Final flow: configure a fresh unsent projectless draft to Cursor Auto, close details, record its actual current draft path (switching to projectless creates a new path). Run recaptureComposer25(d, actualDraftPath) from browser-driver.js, unchanged on both sides. This fully navigates, waits for the projectless composer, freezes Date, opens the picker, explicitly selects Cursor, searches Composer 2.5, blurs input, moves the pointer to (20,500), waits for fonts/resource quiet, and accepts only two pixel-identical frames 500ms apart.

Both final popup boxes: x=1065, y=548.75, width=362, height=348 CSS px. Both list boxes: x=1066, y=592.75, width=359, height=303; scrollTop/scrollLeft=0. Search field: x=1078, y=558.75, width=230.5, height=26. Active element BODY, pointer outside the popup. Final full-frame Diff0: 0 changed pixels, max delta 0/255; DiffT12: 0 pixels. Both captures and both generated diff PNGs were opened and inspected. No images were edited, masked, or retouched.

server-driver.py and seed-fixture.py change scratch paths only. browser-driver.js changes the scratch root and adds recaptureComposer25. make-diffs.py retains the original abs-channel x16 Diff0 and max-channel >12 magenta DiffT calculations, taking one explicit pair and reporting maxDelta. freeze-clock.mjs is unchanged. Capture manifest records accepted raw frame paths and DOM state. The original evidence directory was read-only throughout.

FRICTION:
model | Initial seed invocation used the new scratch root for the old private discovery cache; reran with explicit --source. A base reload used the pre-projectless draft path and reset its UI; recovered by recording the actual post-switch path. | Explicit private fixture source and actual draft-path capture in the one-row runbook.
tool | A full computed-style JSON dump exceeded the shell argument limit; saved comparison counts and differing properties instead (none). | Persist concise comparison data.
