{"record":{"id":"e5b9b80d935a2352","repo":"router-for-me/CLIProxyAPI","slug":"download-checksums-txt-w","errorCode":null,"errorMessage":"download checksums.txt: %w","messagePattern":"download checksums\\.txt: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/pluginstore/install.go","lineNumber":127,"sourceCode":"\tif releaseVersion != version {\n\t\treturn InstallResult{}, fmt.Errorf(\"release tag %q resolved version %q, want %q\", releaseTag, releaseVersion, version)\n\t}\n\tplugin.Version = version\n\treturn c.installRelease(ctx, plugin, release, version, options)\n}\n\nfunc (c Client) installRelease(ctx context.Context, plugin Plugin, release Release, version string, options InstallOptions) (InstallResult, error) {\n\tarchiveAsset, checksumAsset, errAssets := SelectReleaseAssets(release, plugin.ID, plugin.Version, options.GOOS, options.GOARCH)\n\tif errAssets != nil {\n\t\treturn InstallResult{}, errAssets\n\t}\n\tarchiveData, errArchive := c.DownloadAsset(ctx, archiveAsset)\n\tif errArchive != nil {\n\t\treturn InstallResult{}, fmt.Errorf(\"download %s: %w\", archiveAsset.Name, errArchive)\n\t}\n\tchecksumData, errChecksum := c.DownloadAsset(ctx, checksumAsset)\n\tif errChecksum != nil {\n\t\treturn InstallResult{}, fmt.Errorf(\"download checksums.txt: %w\", errChecksum)\n\t}\n\tchecksums, errParse := ParseChecksums(checksumData)\n\tif errParse != nil {\n\t\treturn InstallResult{}, errParse\n\t}\n\tif errVerify := VerifyChecksum(archiveAsset.Name, archiveData, checksums); errVerify != nil {\n\t\treturn InstallResult{}, errVerify\n\t}\n\tplugin.Version = version\n\tresult, errInstall := InstallArchive(archiveData, plugin, options)\n\tif errInstall != nil {\n\t\treturn InstallResult{}, errInstall\n\t}\n\tresult.InstallType = InstallTypeGitHubRelease\n\tresult.ReleaseTag = strings.TrimSpace(release.TagName)\n\treturn result, nil\n}\n","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/router-for-me/CLIProxyAPI/blob/78f0c4079e3e6273d65d03b5549cffc898703264/internal/pluginstore/install.go#L109-L145","documentation":"During installRelease, the archive downloaded successfully but downloading the checksums.txt asset failed; the error wraps the underlying cause. Checksum download happens after the archive, so seeing this error means the archive fetch itself was fine.","triggerScenarios":"InstallVersion/InstallFromManifest when DownloadAsset for the checksums.txt asset returns an error — transient network failure mid-install, rate limiting on the second request, or the asset becoming unavailable between listing and download.","commonSituations":"Second consecutive unauthenticated GitHub request hitting a rate limit; flaky connection; checksums.txt removed right after the release listing was fetched.","solutions":["Retry the install — checksum download failures are usually transient","Add GitHub credentials/token to raise the rate limit in CI","Confirm checksums.txt still exists on the release"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"download checksums.txt\") {\n    // retry once with backoff; persistent failure means the release is broken upstream\n}","preventionTips":["Retry the whole install on checksum download failure (idempotent install dir)","Respect GitHub rate limits / add a token for CI installs","Never proceed past a missing checksum — verification is mandatory"],"tags":["network","download","checksum","install","go"],"backgroundTag":null,"analyzedSha":"78f0c4079e3e6273d65d03b5549cffc898703264","analyzedAt":"2026-08-15T12:26:37.444Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}