PR #33569: e18783e4e8fe08ab5afcae5291e0cd4f37a67751 Baseline github/main: 4c924ff4e6d0828e0a5810336ec7d7827d752645 Linux Boat VM; repo Playwright + /usr/bin/google-chrome. One dev server at a time, isolated .t3 homes. Native Chrome PDF plugin disabled through its saved preference to use the app's PDF.js viewer. Dev-only asset URL and browser-cache lifetimes shortened to 60 seconds in both checkouts, then restored. No mocked responses or fixture data. Data path: UI Add project -> real git repository -> Codex gpt-6.1-sol turn -> generated 5-page mixed-size reading-guide.pdf, notes.txt, guide.html -> local commit e3df790. PR app: real Codex turn read notes.txt and pdfinfo; completed. UI upload PDF -> send to Codex -> provider confirmed receipt of 4,829-byte attachment. Main workspace PDF: 12:56:53 initial asset GET 200 12:57:54 reopen after expiry: same asset GET 404 12:58:04 click Try again: same asset GET 404; error remains PR workspace PDF: 13:02:15 initial asset GET 200 13:03:23 reopen after expiry: old asset GET 404 13:03:33 click Try again: renewed asset GET 200 Before/after: page 3/5, zoom 66%, scrollTop 1064, scrollLeft 70. Next page -> 4/5; Previous page -> 3/5 after retry. PR renewal failure: Temporarily move the real workspace PDF out of its path. Expired GET 404 -> Try again -> actual URL issuance fails -> Unable to load file preview. + Try again. Restore same file -> click Try again -> PDF loads. Moving it changes its file revision, so this check asserts recovery, not preservation across revisions. PR stored attachment: Hold a real browser asset request without fulfilling or replacing the response; viewer reaches its normal 30-second load timeout. Wait beyond the signed URL's expiry. Direct GET of that exact old URL: 404. Click Try again: new asset URL GET 200. Before/after: page 3/5, zoom 109%, scrollTop 1671, scrollLeft 40. Neighbors: Local draft PDF: next-page navigation and search for checkpoint 5 reach page 5/5. Workspace HTML: rendered h1 = PDF Reading and Retry Recovery Guide. HTML source emits Theme pierre-dark has not been resolved in both main and PR; main still renders source. No change made outside PDF retry scope. Blacksmith: vp test run apps/web/src/components/files/PdfViewer.browser.test.tsx Test Files: 1 passed. Tests: 3 passed. vp run check:changed github/main pass format; pass lint; pass knip 1/2; pass knip 2/2; pass typecheck (2 packages); pass test (5 files); pass react compiler (4 files). PR CI: 28 successful, 0 failing, 0 pending at inspected head.