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

  1. Retry with force=true to bypass the rhy cache and fetch fresh data.
  2. Switch to the beta or alpha channel, which reads releases from the GitHub API directly and does not depend on the rhy endpoint.
  3. 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

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


AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12). Data as JSON: /api/errors/ed2c2edb15b7be4e. Report an issue: GitHub.