dagger/dagger · error

invalid git-latest tag %q: not a semantic version

Error message

invalid git-latest tag %q: not a semantic version

What it means

This error is returned by ValidateGitLatestRef when the ref is a tag but its version portion is not a valid semantic version. The library throws it because the git-latest machinery requires the latest ref to be a clean semver release tag so it can compare and validate releases.

Source

Thrown at core/git.go:180

		return "", nil
	}
	return refs[selected.Name], nil
}

// ValidateGitLatestRef validates a ref selected by git-latest.
func ValidateGitLatestRef(refName string, tagPrefix string) error {
	if tag, ok := strings.CutPrefix(refName, "refs/tags/"); ok {
		version := tag
		tagPrefix = strings.Trim(tagPrefix, "/")
		if tagPrefix != "" {
			version, _ = strings.CutPrefix(version, tagPrefix+"/")
		}
		parsed, ok := parseReleaseTag(releaseTagCandidate{
			Name:    tag,
			Version: version,
		})
		if !ok {
			return fmt.Errorf("invalid git-latest tag %q: not a semantic version", tag)
		}
		if parsed.Semver.Prerelease != "" {
			return fmt.Errorf("invalid git-latest tag %q: prerelease tags are not supported", tag)
		}
		return nil
	}

	if branch, ok := strings.CutPrefix(refName, "refs/heads/"); ok && branch != "" {
		return nil
	}
	return fmt.Errorf("invalid git-latest ref %q", refName)
}

var _ dagql.PersistedObject = (*GitRepository)(nil)
var _ dagql.PersistedObjectDecoder = (*GitRepository)(nil)
var _ dagql.OnReleaser = (*GitRepository)(nil)
var _ dagql.HasDependencyResults = (*GitRepository)(nil)
var _ dagql.PersistedObject = (*GitRef)(nil)

View on GitHub (pinned to 82ba2681db)

Solutions

  1. Retag with a valid semantic version, e.g. v1.2.3 instead of v1.2
  2. Point the latest ref at an existing valid semver release tag
  3. Adjust the tag prefix so it only matches semver release tags
  4. Strip or rename legacy non-semver tags if they must not be selected

Example fix

// before
git tag v1.2
// after
git tag v1.2.0 && git push origin v1.2.0
Defensive patterns

Strategy: validation

Validate before calling

func isStableSemverTag(tag string) bool {
    v, err := semver.StrictNewVersion(strings.TrimPrefix(tag, "v"))
    return err == nil && v.String() != ""
}
if !isStableSemverTag(candidate) { skip() }

Type guard

func looksLikeSemver(s string) bool {
    _, err := semver.NewVersion(s)
    return err == nil
}

Try / catch

if err := ValidateGitLatestRef(ctx, repo, ref); err != nil {
    if strings.Contains(err.Error(), "not a semantic version") {
        return nil, fmt.Errorf("latest ref must be a semver tag like v1.2.3; got %s", ref)
    }
    return err
}

Prevention

When it happens

Trigger: Calling ValidateGitLatestRef with a tag ref (refs/tags/<name>) where parsing parseReleaseTag fails — e.g. tags like v1.2, release-2024, or v01.2.3 with malformed formatting.

Common situations: Repositories using non-semver tagging conventions; tag typos; a tag prefix matched but the remaining version string isn't semver (e.g. v1.2.3.4).

Related errors


AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05). Data as JSON: /api/errors/758133650e4bb78a. Report an issue: GitHub.