The original-asset import has repeatedly stopped before conversion or tests when the archive transfer reached its existing two-minute deadline: landscape CI and UI CI, first attempts. Rerunning the unchanged jobs downloads the pinned archive successfully, but does not correct the recovery gap.
verifiedDownload retries selected HTTP server statuses. A thrown connection/read failure bypasses the retry loop, and an inactive response has no shorter inactivity policy within the total deadline. A real local HTTP reproduction sends four bytes, then stalls and disconnects while a healthy second response is available. The old public downloader made one request, rejected with ECONNRESET after 12,014 ms and left no output file. A retained fast regression also fails after three real seconds because the stalled first response is never replaced. No clocks or HTTP are mocked.
Source owner: scripts/lib/verified-download.ts in the game repository. Parent #20; related #90 and #219.
Acceptance:
- Retain the public-interface partial-transfer failure, including its complete-byte/hash and no-partial-publication expectations.
- Recover transient connection/read failures and stalls before headers or between body chunks, retrying the same URL within the existing total 120,000 ms deadline and three-attempt cap. Keep the existing bounded backoff.
- Measure inactivity independently of healthy transfer duration. A transfer that keeps making byte progress may last longer than the inactivity window. Empty chunks do not reset progress. Production inactivity is capped at 30,000 ms; callers may shorten it, never extend either guard.
- Keep permanent HTTP failures, checksum mismatches and corrupt cached archives terminal. Never combine bytes from different attempts, write a partial archive, cache an unverified transfer or substitute a mirror.
- Abort/cancel each retired request and release stream readers and timers. Exhausted recovery fails with useful transfer diagnostics and no output file.
- Exercise real HTTP header/body stalls, steady progress, exhaustion, fresh/cached integrity and existing HTTP retry behavior without changing the unit-test deadline. Verify a fresh real archive with its pinned hash and the normal asset conversion/provenance pipeline.
- Run lint, types, complete units, original asset checks, production build and all browser gates. Qualify the pushed version and original diagnostics before closing.
This is download reliability work. It changes no game rules, CI limits, original asset identities, redistribution policy or native qualification.