# W5 — registered primary transport failure and retry recovery

Before [701e13c](https://git.cafe/pingdotgg/t3code/commit/701e13cebb040d8433cd9aefb803ddd0d58c41d6); after [37441e9](https://git.cafe/pingdotgg/t3code/commit/37441e905194b062345c76d81caacd00d77ef5e5).

Environment: Linux x86_64 (fs-33); Chromium 148.0.7778.96 / Playwright headless shell build1223; no device emulation; DPR1; zoom/font scale100%; dark; prefers-reduced-motion: reduce; full viewport1440×900 except W6 390×844. Actual Electron44.10.0 under headless-desktop/Xvfb, --no-sandbox --disable-gpu, ImageMagick import, measured renderer1440×900/DPR1. Paired sides share synthetic data, scroll position and rendered clock within each run. Retained web clock20:00 UTC, desktop22:19 UTC; round2 rendered clock00:00 UTC, native Date.now/timers for grace/backoff. This row is1440×900.

Only app /ws attempts close1013; descriptor/auth/static/HTTP stay available. Reload false; observe pre-grace, wait8s real time, capture warning; wait3.5s more and record another retry; restore transport while report stays false. Head retries/backoffs then connects; base parks offline. Short label Development workstation. Native wall time, no logical clock advancement.

Steps and UTC checkpoints (relative seconds from each side’s recording start; a dash means state-only capture):

| Side | UTC | t(s) | Action/state checkpoint |
|---|---|---:|---|
| before | 2026-11-03T00:08:51.612Z | -0.00 | settled-still W5-short-ready  |
| before | 2026-11-03T00:08:51.615Z | 0.00 | W5-short-video-start  |
| before | 2026-11-03T00:08:54.777Z | 3.16 | W5-short-pre-grace  |
| before | 2026-11-03T00:09:02.787Z | 11.17 | W5-short-post-grace PrimaryConnectionTarget:offline |
| before | 2026-11-03T00:09:05.662Z | 14.05 | settled-still W5-short-failed  |
| before | 2026-11-03T00:09:09.172Z | 17.56 | W5-short-next-retry PrimaryConnectionTarget:offline |
| before | 2026-11-03T00:09:09.172Z | 17.56 | W5-short-transport-restored-report-false  |
| before | 2026-11-03T00:09:14.183Z | 22.57 | W5-short-recovered PrimaryConnectionTarget:offline |
| before | 2026-11-03T00:09:15.853Z | 24.24 | settled-still W5-short-recovered  |
| before | 2026-11-03T00:09:16.519Z | 24.90 | W5-short-video-stop  |
| after | 2026-11-03T00:09:26.384Z | -0.00 | settled-still W5-short-ready  |
| after | 2026-11-03T00:09:26.386Z | 0.00 | W5-short-video-start  |
| after | 2026-11-03T00:09:29.603Z | 3.22 | W5-short-pre-grace  |
| after | 2026-11-03T00:09:37.613Z | 11.23 | W5-short-post-grace PrimaryConnectionTarget:connecting |
| after | 2026-11-03T00:09:39.348Z | 12.96 | settled-still W5-short-failed  |
| after | 2026-11-03T00:09:42.857Z | 16.47 | W5-short-next-retry PrimaryConnectionTarget:connecting |
| after | 2026-11-03T00:09:42.857Z | 16.47 | W5-short-transport-restored-report-false  |
| after | 2026-11-03T00:09:57.085Z | 30.70 | W5-short-recovered PrimaryConnectionTarget:connected |
| after | 2026-11-03T00:09:58.803Z | 32.42 | settled-still W5-short-recovered  |
| after | 2026-11-03T00:09:59.705Z | 33.32 | W5-short-video-stop  |

Recordings, with the steps/timestamps above: before [W5-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/449f4e36e8a3683f/W5-before.mp4); after [W5-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/feb725161e3fcaf3/W5-after.mp4).

| Checkpoint | Before | After | Diff0 | DiffT16 |
|---|---|---|---|---|
| W5-failed | ![W5-failed-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1c4a9a24039edf85/W5-failed-before.png)<br>[701e13c](https://git.cafe/pingdotgg/t3code/commit/701e13cebb040d8433cd9aefb803ddd0d58c41d6) | ![W5-failed-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7c1f9dc10cc6d5d6/W5-failed-after.png)<br>[37441e9](https://git.cafe/pingdotgg/t3code/commit/37441e905194b062345c76d81caacd00d77ef5e5) | ![W5-failed-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4fab5160bc6896a0/W5-failed-diff0.png)<br>[701e13c](https://git.cafe/pingdotgg/t3code/commit/701e13cebb040d8433cd9aefb803ddd0d58c41d6) → [37441e9](https://git.cafe/pingdotgg/t3code/commit/37441e905194b062345c76d81caacd00d77ef5e5) | ![W5-failed-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/12f21ac87bedcda9/W5-failed-diff16.png)<br>[701e13c](https://git.cafe/pingdotgg/t3code/commit/701e13cebb040d8433cd9aefb803ddd0d58c41d6) → [37441e9](https://git.cafe/pingdotgg/t3code/commit/37441e905194b062345c76d81caacd00d77ef5e5) |
| W5-recovered | ![W5-recovered-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f9f7c5fae7b91e1/W5-recovered-before.png)<br>[701e13c](https://git.cafe/pingdotgg/t3code/commit/701e13cebb040d8433cd9aefb803ddd0d58c41d6) | ![W5-recovered-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/273695ad8debc27b/W5-recovered-after.png)<br>[37441e9](https://git.cafe/pingdotgg/t3code/commit/37441e905194b062345c76d81caacd00d77ef5e5) | ![W5-recovered-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/14263f00ddf914c0/W5-recovered-diff0.png)<br>[701e13c](https://git.cafe/pingdotgg/t3code/commit/701e13cebb040d8433cd9aefb803ddd0d58c41d6) → [37441e9](https://git.cafe/pingdotgg/t3code/commit/37441e905194b062345c76d81caacd00d77ef5e5) | ![W5-recovered-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a2d3b80520eb0eb7/W5-recovered-diff16.png)<br>[701e13c](https://git.cafe/pingdotgg/t3code/commit/701e13cebb040d8433cd9aefb803ddd0d58c41d6) → [37441e9](https://git.cafe/pingdotgg/t3code/commit/37441e905194b062345c76d81caacd00d77ef5e5) |

Before every selected still: fonts and network idle, reduced motion where supported, then two byte-identical screenshots500ms apart. All selected stills/diffs were opened and recordings skimmed. Diff0 amplifies every nonzero max-RGB delta (including one-level changes) in magenta; DiffT16 uses delta>16/255; unchanged after pixels dimmed to20%. Comparisons are within each row/pair, not across round1/round2 fixture variants. Transient splash/sync frames in recordings are actual startup transitions; selected stills exclude them.

Protocol/state transcript: [web-protocol-r2.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bf1fdba4db4934f3/web-protocol-r2.jsonl).

Reproduction: [runbook-r2.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/87a66f49edaafd9e/runbook-r2.md); [capture-scripts-r1.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/35d67210cb0f10ea/capture-scripts-r1.tar.gz); [capture-scripts-r2.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6e4dbccb05066738/capture-scripts-r2.tar.gz).
