siyuan-note/siyuan · error
stable release version is invalid
Error message
stable release version is invalid
What it means
Returned by getStableUpdateRelease(force) when the cloud 'rhy' endpoint's version field fails validation: the 'ver' key is missing/not a string, normalizeReleaseVersion yields something semver.IsValid rejects, or semver.Prerelease is non-empty (stable channel must not serve a prerelease). This protects the stable channel from serving pre-release or malformed versions.
Source
Thrown at kernel/model/updater_release.go:100
channel := Conf.System.UpdateChannel
if conf.UpdateChannelStable == channel {
return getStableUpdateRelease(force)
}
if !isValidUpdateChannel(channel) {
return nil, errors.New("update channel is invalid")
}
return getGitHubUpdateRelease(channel, force)
}
func getStableUpdateRelease(force bool) (*updateRelease, error) {
result, err := util.GetRhyResult(context.TODO(), force)
if err != nil {
return nil, err
}
version, ok := result["ver"].(string)
normalizedVersion := normalizeReleaseVersion(version)
if !ok || !semver.IsValid(normalizedVersion) || "" != semver.Prerelease(normalizedVersion) {
return nil, errors.New("stable release version is invalid")
}
version = strings.TrimPrefix(normalizedVersion, "v")
release := &updateRelease{
Version: version,
ReleaseURL: getStableReleaseURL(result, version),
Packages: map[string]*updatePackage{},
}
pkgName := currentInstallPackageName(release.Version)
if "" == pkgName {
return release, nil
}
checksum := getStablePackageChecksum(result, pkgName)
if "" == checksum {
return release, nil
}
release.Packages[pkgName] = &updatePackage{
URLs: getStablePackageURLs(release.Version, pkgName),View on GitHub (pinned to 251596fc0d)
Solutions
- Retry with force=true to bypass the rhy cache and fetch fresh data.
- Switch to the beta or alpha channel, which reads releases from the GitHub API directly and does not depend on the rhy endpoint.
- If persistent, check whether the cloud endpoint is in maintenance; report the malformed version to the maintainers.
Defensive patterns
Strategy: fallback
Try / catch
// Fall back to the GitHub channel if the stable cloud endpoint serves a bad version.
release, err := getStableUpdateRelease(force)
if err != nil {
logging.LogWarnf("stable release invalid: %s; falling back to GitHub beta", err)
release, err = getGitHubUpdateRelease(conf.UpdateChannelBeta, force)
} Prevention
- Treat the rhy cloud endpoint as best-effort; have a fallback to the GitHub channel.
- Avoid force=true spamming the rhy endpoint during outages.
- Surface 'update check temporarily unavailable' rather than a hard failure.
When it happens
Trigger: util.GetRhyResult returned a JSON map whose 'ver' field is missing, null, a non-string, or a non-semver string like "3.x" or "latest". The endpoint returned a prerelease-tagged version (e.g. "3.1.0-beta1") for the stable channel. The endpoint is temporarily returning a placeholder/maintenance payload.
Common situations: Cloud service (rhy) degraded or returning a stale/malformed payload during a deployment. CDN cache serving an intermediate bad response. A legitimate stable release whose version string deviates from semver expectations.
Related errors
- failed to connect cloud server
- version is up to date
- get GitHub releases failed: %d
- GitHub releases are empty
- checksum manifest response is empty
AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12).
Data as JSON: /api/errors/ed2c2edb15b7be4e.
Report an issue: GitHub.