{"record":{"id":"2dd48caf6e827b78","repo":"siyuan-note/siyuan","slug":"checksum-manifest-is-unavailable","errorCode":null,"errorMessage":"checksum manifest is unavailable","messagePattern":"checksum manifest is unavailable","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kernel/model/updater_release.go","lineNumber":366,"sourceCode":"\t\t\treturn \"\"\n\t\t}\n\t}\n\treturn \"\"\n}\n\nfunc findGitHubReleaseAsset(release *githubRelease, name string) *githubReleaseAsset {\n\tfor _, asset := range release.Assets {\n\t\tif nil != asset && name == asset.Name {\n\t\t\treturn asset\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc getGitHubManifestChecksum(ctx context.Context, release *githubRelease, pkgName string) (string, error) {\n\tmanifestAsset := findGitHubReleaseAsset(release, \"SHA256SUMS.txt\")\n\tif nil == manifestAsset || \"uploaded\" != manifestAsset.State || \"\" == manifestAsset.BrowserDownloadURL {\n\t\treturn \"\", errors.New(\"checksum manifest is unavailable\")\n\t}\n\tmanifestDigest := normalizeSHA256(manifestAsset.Digest)\n\tmanifestCacheKey := \"\"\n\tif \"\" != manifestDigest {\n\t\tmanifestCacheKey = manifestAsset.BrowserDownloadURL + \"#\" + manifestDigest\n\t}\n\tif \"\" != manifestCacheKey {\n\t\tcached, ok := githubManifestCache.Load(manifestCacheKey)\n\t\tif ok {\n\t\t\tif checksum := parseChecksumManifest(cached.(string), pkgName); \"\" != checksum {\n\t\t\t\treturn checksum, nil\n\t\t\t}\n\t\t\treturn \"\", errors.New(\"package checksum is unavailable\")\n\t\t}\n\t}\n\n\tresponse, err := httpclient.NewCloudRequest30s().SetContext(ctx).Get(manifestAsset.BrowserDownloadURL)\n\tif err != nil {","sourceCodeStart":348,"sourceCodeEnd":384,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/251596fc0de2f9528c00c224252fd073a99973f4/kernel/model/updater_release.go#L348-L384","documentation":"Returned by getGitHubManifestChecksum(ctx, release, pkgName) when the release has no asset named exactly 'SHA256SUMS.txt', or that asset's State is not 'uploaded', or its BrowserDownloadURL is empty. The per-asset Digest was empty (otherwise the caller would have used it directly), so the manifest is the fallback checksum source — and it is missing.","triggerScenarios":"A release published without a SHA256SUMS.txt asset. The asset exists but is still processing (State != 'uploaded'). The asset exists but GitHub hasn't populated BrowserDownloadURL yet. An older release predating the manifest convention.","commonSituations":"Release pipeline failed to attach the checksum manifest. Checking immediately after publish before GitHub finishes processing the asset upload. Older historical releases that predate the SHA256SUMS.txt convention.","solutions":["Retry after the release finishes processing; asset State transitions to 'uploaded' once ready.","Switch to the stable channel, whose checksums come from the cloud JSON rather than the GitHub manifest.","If the release is old and never had a manifest, that release simply cannot be auto-installed via the GitHub channel — update manually."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// Before relying on the manifest, check asset presence.\nif asset := findGitHubReleaseAsset(release, \"SHA256SUMS.txt\"); asset == nil || asset.State != \"uploaded\" || asset.BrowserDownloadURL == \"\" {\n    // no manifest; use stable-channel cloud JSON checksums instead\n    return getStablePackageChecksum(rhyResult, pkgName)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat a missing manifest as a soft condition — fall back to another checksum source.","Don't fail the whole update if only the manifest is missing; the asset Digest may still be usable.","Retry after the release finishes processing uploads."],"tags":["update","checksum","manifest","github","asset"],"backgroundTag":null,"analyzedSha":"251596fc0de2f9528c00c224252fd073a99973f4","analyzedAt":"2026-08-12T21:18:37.123Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}