# Local candidate check Use `releasekit.Check` to verify a candidate against the current local repository state: ```go result, err := releasekit.Check(ctx, releasekit.ReleaseRequest{ RepositoryDir: "/work/project", Product: "Example", Version: "v1.2.3", AdditionalChecks: func(ctx context.Context, candidate releasekit.Candidate) error { return runProjectChecks(ctx, candidate.RepositoryDir) }, }) if err != nil { return err } fmt.Println(result.Version, result.Commit) ``` The repository must have a clean index and worktree on `main`, and the selected version must be stable `vMAJOR.MINOR.PATCH`. The committed `docs/releases/.md` note must have a first Markdown H1 containing the product name and exact version as complete title elements. No local tag with that version may already exist. ReleaseKit always runs `go test -mod=readonly -count=1 ./...` with the available compatible local Go toolchain, then calls `AdditionalChecks` once when supplied. It does not download a different toolchain automatically. The standard suite uses the Go host target, disables workspace and module network access, and ignores ambient `GOFLAGS`, experiment, and CPU feature overrides. Effective cache and native cgo/C-tool settings are preserved, including values from Go's persistent environment file. The check revalidates the branch, commit, and cleanliness after validation. A successful check is evidence about the local candidate only. It does not check whether a remote branch or tag is available and does not create a tag. The [`check` command](../cli.md) reads the product and optional additional commands from `releasekit.json`. ## Publishing the source tag `releasekit.Publish` uses the same request and validation order: the standard suite runs first, followed by `AdditionalChecks` when supplied. It then performs authoritative remote checks, annotated-tag creation, and an exact tag push. The selected remote must publish `main` at the captured commit and must not already contain the selected version tag. A successful result includes the endpoint and tag object ID. Publication states distinguish an unattempted push, a tag that was created locally but not pushed, a successful push, a guard conflict, and an unresolved push error. See the [publication guide](publish.md) for the complete workflow. When a push reports an error, ReleaseKit makes one bounded query for the authoritative tag. An exact tag object match confirms success. An absent tag is reported as `not_published`, a different object as `conflict`, and an unreadable query as `unknown`. The local annotated tag is retained in every case; an `unknown` result is neither success nor proof that the remote lacks the tag.