Part of #983.
Context
Two visual-capture paths exist and must reconcile into ONE before/after preview path. reviewbot has core/browser-render.ts (headless HTML render via the Browser binding, degraded-fetch fallback) + agents/gittensory/{capture,shot}.ts (the taopedia-style realtime before/after screenshot pipeline: route resolution, mobile viewport, authed-route preview-session via ?preview=1/VITE_PREVIEW, the preview-session param). gittensory has src/visual-agent/visual-diff.ts (pixelmatch/pngjs, Node-only, NOT wired to any Browser binding) — so capture is a real gap while the diff is native. The Browser binding is added in #1017. Authed /app/* routes previously showed sign-in walls; the existing synthetic preview session + an honest auth-wall placeholder are the fix.
Deliverables
Acceptance criteria
- A single before/after preview path produces capture (Browser) + diff (pixelmatch) for visual PRs.
- Authed
/app/* routes preview via the synthetic session, not a sign-in wall; walled routes show the honest placeholder.
- Missing/failed Browser binding degrades gracefully to no-preview, never errors the review.
Notes
Part of #983.
Context
Two visual-capture paths exist and must reconcile into ONE before/after preview path. reviewbot has
core/browser-render.ts(headless HTML render via the Browser binding, degraded-fetch fallback) +agents/gittensory/{capture,shot}.ts(the taopedia-style realtime before/after screenshot pipeline: route resolution, mobile viewport, authed-route preview-session via?preview=1/VITE_PREVIEW, the preview-session param). gittensory hassrc/visual-agent/visual-diff.ts(pixelmatch/pngjs, Node-only, NOT wired to any Browser binding) — so capture is a real gap while the diff is native. The Browser binding is added in #1017. Authed/app/*routes previously showed sign-in walls; the existing synthetic preview session + an honest auth-wall placeholder are the fix.Deliverables
browser-render/capture/shotwith gittensory'svisual-agent/visual-diffinto ONE before/after preview path (capture from reviewbot, diff from gittensory).VITE_PREVIEW+?preview=1),authedRoutePattern/previewSessionParam, and the honest auth-wall placeholder when a route still walls.Acceptance criteria
/app/*routes preview via the synthetic session, not a sign-in wall; walled routes show the honest placeholder.Notes