{"record":{"id":"145f35ad3b098082","repo":"siyuan-note/siyuan","slug":"update-package-is-unavailable-s-checksum-is-un","errorCode":null,"errorMessage":"update package is unavailable: [%s] checksum is unavailable","messagePattern":"update package is unavailable: \\[(.+?)\\] checksum is unavailable","errorType":"exception","errorClass":"errUpdatePackageUnavailable","httpStatus":null,"severity":"error","filePath":"kernel/model/updater.go","lineNumber":128,"sourceCode":"\t}\n\n\tif isVersionUpToDate(release.Version) {\n\t\terr = fmt.Errorf(\"version is up to date\")\n\t\treturn\n\t}\n\n\tpkgName := currentInstallPackageName(release.Version)\n\tif \"\" == pkgName {\n\t\terr = fmt.Errorf(\"%w for the current platform\", errUpdatePackageUnavailable)\n\t\treturn\n\t}\n\tpkg := release.Packages[pkgName]\n\tif nil == pkg || 0 == len(pkg.URLs) {\n\t\terr = fmt.Errorf(\"%w: [%s]\", errUpdatePackageUnavailable, pkgName)\n\t\treturn\n\t}\n\tif \"\" == pkg.Checksum {\n\t\terr = fmt.Errorf(\"%w: [%s] checksum is unavailable\", errUpdatePackageUnavailable, pkgName)\n\t\treturn\n\t}\n\tdownloadPkgURLs = append(downloadPkgURLs, pkg.URLs...)\n\tchecksum = pkg.Checksum\n\treturn\n}\n\nfunc downloadInstallPkg(pkgURL, checksum string) (err error) {\n\tif \"\" == pkgURL || \"\" == checksum {\n\t\terr = errors.New(\"update package URL or checksum is empty\")\n\t\treturn\n\t}\n\n\tpkg := path.Base(pkgURL)\n\tsavePath := filepath.Join(util.TempDir, \"install\", pkg)\n\tif gulu.File.IsExist(savePath) {\n\t\tlocalChecksum, _ := sha256Hash(savePath)\n\t\tif localChecksum == checksum {","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/251596fc0de2f9528c00c224252fd073a99973f4/kernel/model/updater.go#L110-L146","documentation":"Returned by getUpdatePkg() when the package entry exists and has download URLs, but pkg.Checksum is empty. Without a checksum the downloader cannot verify integrity, so the update is refused rather than risk installing a tampered or corrupt artifact. Wrapped form of errUpdatePackageUnavailable.","triggerScenarios":"On the stable channel: getStablePackageChecksum returned \"\" because the cloud JSON's 'checksums' map omits the pkgName or the value fails normalizeSHA256 (wrong length / non-hex). On the GitHub channel: the asset's Digest field is empty AND getGitHubManifestChecksum failed (no SHA256SUMS.txt, manifest download error, digest mismatch, or pkgName not listed in the manifest).","commonSituations":"A release whose SHA256SUMS.txt manifest was not uploaded or was uploaded as a non-asset. GitHub asset digest fields absent for older releases. A mirror serving a manifest that doesn't yet list the newest package. Network failure fetching the manifest (see errors 953–959).","solutions":["Retry shortly; the SHA256SUMS.txt asset may still be uploading.","Switch to the stable channel if on beta/alpha, or vice-versa, to use a different checksum source (cloud JSON vs GitHub manifest).","Check the GitHub release page directly to confirm SHA256SUMS.txt exists and lists your package; if not, report the release as incomplete."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Distinguish checksum-missing from other unavailability; retry once after refresh.\n_, _, err := getUpdatePkg()\nif err != nil && strings.Contains(err.Error(), \"checksum is unavailable\") {\n    getUpdateRelease(true) // force-refresh release metadata\n    _, _, err = getUpdatePkg()\n}","preventionTips":["Never bypass checksum verification by patching the guard — it exists to prevent tampered installs.","Retry after forcing a release refresh, since manifests propagate after assets.","Switch channels to change checksum source (cloud JSON vs GitHub manifest)."],"tags":["update","checksum","integrity","package","manifest"],"backgroundTag":null,"analyzedSha":"251596fc0de2f9528c00c224252fd073a99973f4","analyzedAt":"2026-08-12T21:18:37.123Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}