All checks were successful
CI / Unit & Component Tests (pull_request) Successful in 3m45s
CI / OCR Service Tests (pull_request) Successful in 23s
CI / Backend Unit Tests (pull_request) Successful in 3m54s
CI / fail2ban Regex (pull_request) Successful in 44s
CI / Semgrep Security Scan (pull_request) Successful in 20s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m3s
CI / Unit & Component Tests (push) Successful in 3m49s
CI / OCR Service Tests (push) Successful in 23s
CI / Backend Unit Tests (push) Successful in 4m14s
CI / fail2ban Regex (push) Successful in 47s
CI / Semgrep Security Scan (push) Successful in 22s
CI / Compose Bucket Idempotency (push) Successful in 1m3s
CI kept failing on the two gutter-render tests because the vitest-browser iframe viewport is narrower than 768 px → window.matchMedia(min-width: 768px) returns false → gutter is hidden → g[role="text"] selector returns []. The previous synchronous-seed fix was insufficient because matchMedia itself was the false branch. Add an optional `showGutter?: boolean` prop. When set, it bypasses the matchMedia detection — tests pass `showGutter: true` to assert the rendered gutter, and `showGutter: false` to assert the absent path. Production callers leave it undefined so the existing media-query detection still governs visibility. Refs #689 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>