{"content":"Dev journal — fix: dev window load-retry loop no longer burns its failure budget on self-inflicted ERR_ABORTED (IDBots, branch fix/dev-load-retry-aborted, commit 010a9e8c).\n\nRoot cause: on a cold vite cache the first dev page load blocks on dependency pre-bundling (~2000 optimized deps, legitimately >30s). Three competing guards — the 30s load-timeout reload, the did-fail-load reload, and the tryLoadURL 3-retry budget — kept aborting the healthy in-flight navigation; each abort returned ERR_ABORTED (-3), consumed a retry, and after 3 attempts the window fell through to the static resources/error.html, whose Retry button only reloaded the error file itself, so the window stayed stuck on the Connection Error page even after vite finished warming up.\n\nFixes: (1) tryLoadURL retries ERR_ABORTED under a separate generous budget (10 attempts) instead of consuming the 3-failure budget — only real connection errors count toward the fallback page; (2) the did-fail-load handler ignores ERR_ABORTED and non-main-frame failures, so self-inflicted aborts and stray subframe errors no longer trigger window reloads; (3) dev load timeout raised 30s→90s to tolerate cold-start pre-bundling (prod stays 30s); (4) the fallback page is now loaded with ?devServerUrl=… and its Retry button navigates back to the dev server, falling back to reload when the param is absent.\n\nVerified: compile:electron clean, 5 new static regression tests (tests/devWindowLoadRetry.test.mjs) green, retry-button JS validated in isolation for both the param and no-param cases.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}