{"record":{"id":"edc9907914318b99","repo":"multica-ai/multica","slug":"no-matching-release-asset-for-s-s-tried-s","errorCode":null,"errorMessage":"no matching release asset for %s/%s (tried: %s)","messagePattern":"no matching release asset for (.+?)/(.+?) \\(tried: (.+?)\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/internal/cli/update.go","lineNumber":167,"sourceCode":"\t// Prefer the versioned name (current scheme); fall back to the legacy\n\t// `multica_{os}_{arch}` name for releases that still ship it.\n\treturn []string{\n\t\tfmt.Sprintf(\"multica-cli-%s-%s-%s.%s\", version, goos, goarch, ext),\n\t\tfmt.Sprintf(\"multica_%s_%s.%s\", goos, goarch, ext),\n\t}\n}\n\nfunc findReleaseAsset(assets []GitHubReleaseAsset, targetVersion, goos, goarch string) (*GitHubReleaseAsset, error) {\n\tfor _, candidate := range releaseAssetCandidates(targetVersion, goos, goarch) {\n\t\tfor i := range assets {\n\t\t\tif assets[i].Name == candidate {\n\t\t\t\treturn &assets[i], nil\n\t\t\t}\n\t\t}\n\t}\n\n\tcandidates := strings.Join(releaseAssetCandidates(targetVersion, goos, goarch), \", \")\n\treturn nil, fmt.Errorf(\"no matching release asset for %s/%s (tried: %s)\", goos, goarch, candidates)\n}\n\n// findChecksumManifestAsset locates the GoReleaser-generated checksums.txt\n// among a release's assets. Required for the direct-download path's SHA-256\n// verification — if it is missing we refuse to replace the binary rather\n// than fall back to unverified install, because the auto-update poller runs\n// unattended and an unverified binary swap is a supply-chain risk.\nfunc findChecksumManifestAsset(assets []GitHubReleaseAsset) (*GitHubReleaseAsset, error) {\n\tfor i := range assets {\n\t\tif assets[i].Name == ChecksumManifestName {\n\t\t\treturn &assets[i], nil\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"checksum manifest %q not present in release\", ChecksumManifestName)\n}\n\n// parseChecksumManifest reads a GoReleaser-style \"<sha256>  <filename>\"\n// manifest and returns the lowercase hex SHA-256 for assetName. Returns an","sourceCodeStart":149,"sourceCodeEnd":185,"githubUrl":"https://github.com/multica-ai/multica/blob/2c0912b6ec764b373d44eeea1e80f0d9f11ab417/server/internal/cli/update.go#L149-L185","documentation":"findReleaseAsset scanned a GitHub release's assets and none matched the expected archive names for your GOOS/GOARCH. It tries the current scheme multica-cli-<version>-<goos>-<goarch>.<ext> and the legacy multica_<goos>_<goarch>.<ext>. The message lists exactly which names were attempted.","triggerScenarios":"Running the self-update / install path on a platform the release pipeline does not publish (e.g. windows/arm64, freebsd), on a version whose assets were uploaded with different naming, or when the computed target version's tag normalization produces a name not present in the release.","commonSituations":"New architecture (arm64 windows) before CI added it; a release cut before the versioned naming scheme existed (only legacy names, or vice versa); a manually-published release missing platform archives; dev builds pointing at a draft release.","solutions":["Compare the 'tried:' list in the error against the actual asset names on the release page — usually the extension or version component differs","Update to the latest CLI version, whose naming matches the current release scheme","If your platform is genuinely unpublished, build from source (go install / make build) for that GOOS/GOARCH","If you maintain releases, add the missing platform to the GoReleaser config so the expected asset name is produced"],"exampleFix":"# .goreleaser.yaml — before: no windows-arm64 build\nbuilds:\n  - id: multica\n    goos: [linux, darwin]\n    goarch: [amd64, arm64]\n\n# after\nbuilds:\n  - id: multica\n    goos: [linux, darwin, windows]\n    goarch: [amd64, arm64]","handlingStrategy":"validation","validationCode":"rel, err := cli.FetchLatestRelease()\nif err != nil { return err }\nhave := map[string]bool{}\nfor _, a := range rel.Assets { have[a.Name] = true }\nfor _, name := range []string{\n\tfmt.Sprintf(\"multica-cli-%s-%s-%s.%s\", ver, runtime.GOOS, runtime.GOARCH, ext),\n\tfmt.Sprintf(\"multica_%s_%s.%s\", runtime.GOOS, runtime.GOARCH, ext),\n} {\n\tif have[name] { /* asset exists for this platform */ }\n}","typeGuard":"func hasPlatformAsset(assets []cli.GitHubReleaseAsset, names ...string) bool {\n\tfor _, a := range assets {\n\t\tfor _, n := range names {\n\t\t\tif a.Name == n { return true }\n\t\t}\n\t}\n\treturn false\n}","tryCatchPattern":"asset, err := cli.FindReleaseAsset(assets, ver, goos, goarch) // or equivalent\nif err != nil && strings.Contains(err.Error(), \"no matching release asset\") {\n\t// skip update for this platform, or fall back to building from source\n}","preventionTips":["Publish assets for every GOOS/GOARCH your users run via GoReleaser","Keep release asset naming stable with the current versioned scheme","Check the release page asset list before scripting installs for new platforms"],"tags":["release","self-update","platform-support","go"],"backgroundTag":null,"analyzedSha":"2c0912b6ec764b373d44eeea1e80f0d9f11ab417","analyzedAt":"2026-08-15T13:25:18.241Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}