You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix(install): name the archive when its download fails - #35854
scripts/install.sh called download() for the release archive without checking its status. With stderr not a terminal, download() delegates to fetch(), which returns 44 on a 404 without printing anything, so set -e ended the installer silently after 'Downloading...'. The archive download now ends in || fail "could not download ${archive}", the same fail() the checksum fetch above it uses, so any non-zero status (404, HTTP error, network failure, interactive or not) prints a 't3 install:' line naming the archive and exits 1. A 404 here is not mapped to the checksum step's 'no release archive for platform' message, because SHA256SUMS has already listed the archive by this point, so a 404 means a broken mirror rather than an unsupported platform. No new regex or parser.
Commit 36371de (origin/main), Linux x64, /bin/sh, curl 8.5.0. Ran the reporter's repro.sh unchanged against scripts/install.sh: a Python fixture serves a valid archive + SHA256SUMS under /good/ and SHA256SUMS but HTTP 404 for the archive under /missing/. The good-mirror control installed successfully (.install-complete written). The missing-archive run exited 44 with stderr only ' Finding your release...', ' Installing T3 Code 1.2.3', '', ' Downloading...' and no 't3 install:' line -> 'RESULT: defect reproduced'. Added a failing test to scripts/install.test.ts ('installer archive download > names the archive when it returns 404') that serves SHA256SUMS and 404s the archive; it fails on main because the output ends at 'Downloading...'.
Evidence
Ran the unchanged reporter reproduction on both commits using Linux x64, /bin/sh and curl 8.5.0, with stderr redirected. The local fixture serves valid checksums on both mirrors, a valid archive under /good/, and HTTP 404 for the archive under /missing/. Both successful-install controls passed and wrote .install-complete.
Interactive-terminal downloads, other operating systems and architectures, and non-404 network failures were not exercised; this proof covers the reported non-interactive Linux x64 archive-404 path.
Tests
vp test run scripts/install.test.ts: 1 failed (the repro test 'installer archive download > names the archive when it returns 404') with the fix stashed; 9 passed, 1 skipped with the fix. sh -n scripts/install.sh: ok. vp run check:changed: format, lint, knip, typecheck and tests all pass.
Not in this change
The interactive download path prints curl's error and then the new fail line, so the user sees both; I left that path as it was apart from the added fail.
Who did the work
Written by Claude Opus 5.5, in Claude Code
Reviewed by GPT-6.1 Sol, in Codex, and by Claude Opus 5.5, each on its own
Proof captured by GPT-6.1 Sol and checked by Claude Opus 5.5
Macroscope's review found this PR approvable — The installer now names the release archive when its download fails. The change is limited to failure reporting and exit status, while successful installation and existing cleanup safeguards remain unchanged.
You can add or adjust custom eligibility rules. Learn more.
No actionable comments were generated in the recent review.
Walkthrough
The shell installer now reports an archive-specific error when an archive download fails. A Linux-only regression test verifies the failure exit and output when the archive endpoint returns 404.
Changes: Installer archive download error
Layer / File(s)
Summary
Report and test archive download failures scripts/install.sh, scripts/install.test.ts
The installer reports the failed archive name and exits when its download fails. A Linux-only test checks the nonzero exit and archive filename after a 404 response.
The installer now names the archive and exits with an error when the archive download fails, instead of ending silently. The change is small and has no identified merge risk.
Pre-merge checks: 4
Check name
Status
Explanation
Title check
The title names the change: the installer now reports the archive name when its download fails. It uses the conventional commit format and matches the install.sh change and its test. It is specific an…
Linked Issues check
[#35834] requires that a failed archive download print an installer error naming the failed download and exit non-zero. At head, scripts/install.sh line 251 reads `download "${base_url}/v${version}/${…
Out of Scope Changes check
The whole-PR diff from merge base 36371de to head e37fb4b changes one executable line in scripts/install.sh. That line adds only the || fail "could not download ${archive}" guard that #35834 request…
Description check
The description is thorough and covers the problem (silent exit after 'Downloading...' on a non-interactive 404), the change (|| fail "could not download ${archive}"), scope (links issue #35834 and …
Full details: Title check
Explanation
The title names the change: the installer now reports the archive name when its download fails. It uses the conventional commit format and matches the install.sh change and its test. It is specific and does not need revision.
Full details: Linked Issues check
Explanation
[#35834] requires that a failed archive download print an installer error naming the failed download and exit non-zero. At head, scripts/install.sh line 251 reads download "${base_url}/v${version}/${archive}" "${staging}/${archive}" || fail "could not download ${archive}". The fail helper prints t3 install: <message> to stderr and exits 1. I checked both download paths. In the non-interactive path, download calls fetch, which returns 44 for a 404 and 1 for other failures. In the interactive path, download returns the curl result. Either way, a non-zero status now reaches fail. The message names the archive, so the diagnostic the issue asks for is present. The checksum-download step and its 'no release archive' message are unchanged. The PR description reports a failing-then-passing regression test (installer archive download > names the archive when it returns 404) in scripts/install.test.ts. I did not re-run the tests. The PASS rests on the source change and the reported test results. The Evidence section of the PR description is pending. It is non-coding and does not affect this verdict.
Full details: Out of Scope Changes check
Explanation
The whole-PR diff from merge base 36371de to head e37fb4b changes one executable line in scripts/install.sh. That line adds only the || fail "could not download ${archive}" guard that #35834 requests. The supporting regression test in scripts/install.test.ts (about 52 added lines, per the change summary) covers the same 404 archive-download behavior. The PR description makes no other code claims. No unrelated behavior change was found in the reviewed diff.
Full details: Description check
Explanation
The description is thorough and covers the problem (silent exit after 'Downloading...' on a non-interactive 404), the change (|| fail "could not download ${archive}"), scope (links issue #35834 and explains the non-interactive Linux x64 scope), and verification (before/after reproduction, failing-then-passing regression test, sh -n, check:changed). It also discloses what was not tested and who did the work. It is not a literal match to the template headings, but every required section's information is present. The 'Problem' and 'Change' content is in the opening paragraph rather than under template headings, which is a minor structural gap.
Finishing Touches
Generate unit tests (beta)
Commit to this branch
Create a new PR
Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Reviewing files that changed from the base of the PR and between 95cb068 and e37fb4b.
Files selected for processing: 2
scripts/install.sh
scripts/install.test.ts
Limit details: You’ve used all 10 included reviews currently available. Your 17 included PR review attempts over the past 7 days set your current allowance at 10 reviews per hour.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
size:XS0-9 changed lines (additions + deletions).vouch:trustedAuthor is trusted by repo permissions or the VOUCHED list.
1 participant
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
scripts/install.sh called download() for the release archive without checking its status. With stderr not a terminal, download() delegates to fetch(), which returns 44 on a 404 without printing anything, so
set -eended the installer silently after 'Downloading...'. The archive download now ends in|| fail "could not download ${archive}", the same fail() the checksum fetch above it uses, so any non-zero status (404, HTTP error, network failure, interactive or not) prints a 't3 install:' line naming the archive and exits 1. A 404 here is not mapped to the checksum step's 'no release archive for platform' message, because SHA256SUMS has already listed the archive by this point, so a 404 means a broken mirror rather than an unsupported platform. No new regex or parser.Fixes #35834
Reproduction on main
Commit 36371de (origin/main), Linux x64, /bin/sh, curl 8.5.0. Ran the reporter's repro.sh unchanged against scripts/install.sh: a Python fixture serves a valid archive + SHA256SUMS under /good/ and SHA256SUMS but HTTP 404 for the archive under /missing/. The good-mirror control installed successfully (.install-complete written). The missing-archive run exited 44 with stderr only ' Finding your release...', ' Installing T3 Code 1.2.3', '', ' Downloading...' and no 't3 install:' line -> 'RESULT: defect reproduced'. Added a failing test to scripts/install.test.ts ('installer archive download > names the archive when it returns 404') that serves SHA256SUMS and 404s the archive; it fails on main because the output ends at 'Downloading...'.
Evidence
Ran the unchanged reporter reproduction on both commits using Linux x64, /bin/sh and curl 8.5.0, with stderr redirected. The local fixture serves valid checksums on both mirrors, a valid archive under /good/, and HTTP 404 for the archive under /missing/. Both successful-install controls passed and wrote .install-complete.
Images render the captured CLI output. Before transcript · After transcript · Unchanged reproduction script
Not shown:
Tests
vp test run scripts/install.test.ts: 1 failed (the repro test 'installer archive download > names the archive when it returns 404') with the fix stashed; 9 passed, 1 skipped with the fix. sh -n scripts/install.sh: ok. vp run check:changed: format, lint, knip, typecheck and tests all pass.
Not in this change
Who did the work
Run by the t3code factory in T3 Code.