Adopt updated release toolchain policy
This commit is contained in:
@@ -2,11 +2,12 @@
|
|||||||
|
|
||||||
## Standard Repository Policies
|
## Standard Repository Policies
|
||||||
|
|
||||||
Material: `docs/policy/meta.md`, `docs/policy/oss.md`,
|
Material: `docs/policy/release.md`, adapted from
|
||||||
|
`e833faddf120c789a9b45348edaf75720de16348`; `docs/policy/meta.md`, `docs/policy/oss.md`,
|
||||||
`docs/policy/documentation.md`, `docs/policy/agents.md`,
|
`docs/policy/documentation.md`, `docs/policy/agents.md`,
|
||||||
`docs/policy/architecture.md`, `docs/policy/testing.md`, and
|
`docs/policy/architecture.md`, `docs/policy/testing.md`; root `AGENTS.md`; and the
|
||||||
`docs/policy/release.md`; root `AGENTS.md`; and the Policy Reading Guide in
|
Policy Reading Guide in `docs/development.md`, adapted from
|
||||||
`docs/development.md`, adapted for this repository.
|
`d84a38ebab26f048cafbe59a2246700c35d29843` for this repository.
|
||||||
|
|
||||||
Copyright (C) 2026 Eric Rakestraw
|
Copyright (C) 2026 Eric Rakestraw
|
||||||
|
|
||||||
@@ -14,10 +15,14 @@ SPDX-License-Identifier: CC-BY-SA-4.0
|
|||||||
|
|
||||||
License and notices: [CC BY-SA 4.0](licenses/CC-BY-SA-4.0.txt) |
|
License and notices: [CC BY-SA 4.0](licenses/CC-BY-SA-4.0.txt) |
|
||||||
[COPYRIGHT](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/COPYRIGHT) |
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/COPYRIGHT) |
|
||||||
[LICENSE](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/LICENSE).
|
[LICENSE](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/LICENSE) |
|
||||||
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/policy/src/commit/e833faddf120c789a9b45348edaf75720de16348/COPYRIGHT) |
|
||||||
|
[LICENSE](https://gitea.maximumdirect.net/eric/policy/src/commit/e833faddf120c789a9b45348edaf75720de16348/LICENSE).
|
||||||
|
|
||||||
[Source](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843).
|
[Source](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843).
|
||||||
|
|
||||||
|
[Source](https://gitea.maximumdirect.net/eric/policy/src/commit/e833faddf120c789a9b45348edaf75720de16348).
|
||||||
|
|
||||||
## go-yaml v4
|
## go-yaml v4
|
||||||
|
|
||||||
Selected module: `go.yaml.in/yaml/v4` at `v4.0.0-rc.6`.
|
Selected module: `go.yaml.in/yaml/v4` at `v4.0.0-rc.6`.
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# Release Policy
|
# Release Policy
|
||||||
|
|
||||||
**Base Policy Version:** 1.4
|
**Base Policy Version:** 1.6
|
||||||
|
|
||||||
**Last Updated**: 2026-09-28
|
**Last Updated**: 2026-10-09
|
||||||
|
|
||||||
**Upstream Source:** [Standard Repository Policies](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/docs/policy/release.md)
|
**Upstream Source:** [Standard Repository Policies](https://gitea.maximumdirect.net/eric/policy/src/commit/e833faddf120c789a9b45348edaf75720de16348/docs/policy/release.md)
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
|
|
||||||
@@ -12,6 +12,9 @@ This policy defines a proportionate workflow for validating and publishing an
|
|||||||
intended source revision under a fresh version. Releases should require little
|
intended source revision under a fresh version. Releases should require little
|
||||||
routine intervention, avoid repeated work, and preserve published contents.
|
routine intervention, avoid repeated work, and preserve published contents.
|
||||||
|
|
||||||
|
Adopt stronger verification or reproducibility requirements through an explicit
|
||||||
|
project-specific decision justified by the intended audience and support needs.
|
||||||
|
|
||||||
The repository-specific commands belong in `docs/release.md`. Historical release
|
The repository-specific commands belong in `docs/release.md`. Historical release
|
||||||
summaries belong in `docs/releases/`. The procedure must agree with the adopted
|
summaries belong in `docs/releases/`. The procedure must agree with the adopted
|
||||||
policy and link to it rather than introduce additional release requirements.
|
policy and link to it rather than introduce additional release requirements.
|
||||||
@@ -98,7 +101,8 @@ requires a deliberate update to the policy and procedure where needed.
|
|||||||
For releases at or after `v1.0.0`:
|
For releases at or after `v1.0.0`:
|
||||||
|
|
||||||
- a major release may make intentional incompatible changes;
|
- a major release may make intentional incompatible changes;
|
||||||
- a minor release may add backward-compatible behavior; and
|
- a minor release may add backward-compatible behavior or raise the Go consumer
|
||||||
|
minimum as described below; and
|
||||||
- a patch release may make backward-compatible fixes.
|
- a patch release may make backward-compatible fixes.
|
||||||
|
|
||||||
Before `v1.0.0`, a minor release may change a documented public, operational,
|
Before `v1.0.0`, a minor release may change a documented public, operational,
|
||||||
@@ -110,6 +114,45 @@ Additional compatibility promises and deliberate exceptions belong in the
|
|||||||
adopted policy or canonical contract documentation. Release notes explain
|
adopted policy or canonical contract documentation. Release notes explain
|
||||||
changes; they do not redefine current compatibility contracts.
|
changes; they do not redefine current compatibility contracts.
|
||||||
|
|
||||||
|
## Consumer Minimum And Release Toolchain
|
||||||
|
|
||||||
|
Distinguish the minimum toolchain supported for consumers from the toolchain
|
||||||
|
maintainers use to build and validate a release. Record the consumer minimum in
|
||||||
|
the language's standard metadata and explain its support meaning in canonical
|
||||||
|
documentation. Define the selected release toolchain and its setup commands in
|
||||||
|
`docs/release.md`. Toolchain selection and upgrade cadence are repository-specific
|
||||||
|
choices.
|
||||||
|
|
||||||
|
For Go repositories, normally declare the initial stable release of the selected
|
||||||
|
series as the consumer minimum, such as `go 1.26.0`. Use a higher patch minimum
|
||||||
|
when a dependency or an identified correctness fix requires it, and document
|
||||||
|
the reason.
|
||||||
|
|
||||||
|
For release-policy purposes, successful build and release validation on the
|
||||||
|
selected Go patch release are sufficient to presume support across that Go
|
||||||
|
series, subject to the declared consumer minimum and concrete evidence of
|
||||||
|
incompatibility. Investigate specific compatibility concerns as they arise.
|
||||||
|
|
||||||
|
Use the selected release toolchain for candidate validation and release builds,
|
||||||
|
including CI jobs performing those tasks. A newer validation patch version alone
|
||||||
|
leaves the consumer minimum unchanged.
|
||||||
|
|
||||||
|
A minor release may raise the Go consumer minimum, including from one Go series
|
||||||
|
to the next, both before and after `v1.0.0`. This is an explicit exception to the
|
||||||
|
backward-compatibility requirement for minor releases. Patch releases preserve
|
||||||
|
the consumer minimum. Explain an increase's impact and required consumer action
|
||||||
|
in the release note. Other incompatible changes remain subject to the versioning
|
||||||
|
rules above.
|
||||||
|
|
||||||
|
### ConfigKit Toolchain Selection
|
||||||
|
|
||||||
|
For minor and major releases, select the newest stable Go series available in
|
||||||
|
the development environment. For patch releases, retain the series recorded in
|
||||||
|
`go.mod` and its consumer minimum. Use the latest locally available compatible
|
||||||
|
patch in the selected series, with `GOTOOLCHAIN=local`, to build the
|
||||||
|
module-selected ReleaseKit CLI and validate the candidate. The same Go
|
||||||
|
executable builds the tool and runs its validation commands.
|
||||||
|
|
||||||
## Release Documentation And Preparation
|
## Release Documentation And Preparation
|
||||||
|
|
||||||
Every new release must include `docs/releases/<version>.md` in the tagged
|
Every new release must include `docs/releases/<version>.md` in the tagged
|
||||||
@@ -159,16 +202,9 @@ publish builds, verify the required build targets. Select those targets for
|
|||||||
the application's actual support commitments; native testing on each platform
|
the application's actual support commitments; native testing on each platform
|
||||||
and access to particular hardware are not default release prerequisites.
|
and access to particular hardware are not default release prerequisites.
|
||||||
|
|
||||||
For release preparation, record the initial stable release of the newest
|
Prepare dependencies and build the tool before offline validation; the
|
||||||
locally available Go series in `go.mod`'s `go` directive. Retain a higher patch
|
publication command is the required validation run, with no separate successful
|
||||||
minimum only when required by a dependency or a specific correctness fix. Use
|
test or CI run required before it.
|
||||||
the latest locally available compatible patch in that series, selected with
|
|
||||||
`GOTOOLCHAIN=local`, to build the module-selected ReleaseKit CLI and validate the
|
|
||||||
candidate, provided it meets the current `go.mod` minimum. Review any
|
|
||||||
minimum-version increase under the existing compatibility rules. Prepare
|
|
||||||
dependencies and build the tool before offline validation; the publication
|
|
||||||
command is the required validation run, with no separate successful test or CI
|
|
||||||
run required before it.
|
|
||||||
|
|
||||||
The selected profile runs the complete deterministic, offline default suite
|
The selected profile runs the complete deterministic, offline default suite
|
||||||
once with the race detector and test-time vet disabled. The suite already
|
once with the race detector and test-time vet disabled. The suite already
|
||||||
@@ -265,10 +301,10 @@ release without replacing its contents or reusing its version.
|
|||||||
## Repository Release Procedure
|
## Repository Release Procedure
|
||||||
|
|
||||||
Maintain `docs/release.md` as a short, executable maintainer runbook. It must
|
Maintain `docs/release.md` as a short, executable maintainer runbook. It must
|
||||||
identify prerequisites, the primary branch and authoritative remote, version
|
identify prerequisites, the selected release toolchain, the primary branch and
|
||||||
and note preparation, one publication command with local checks and guards,
|
authoritative remote, version and note preparation, one publication command with
|
||||||
source-only deliverables, the successful-tag-push completion point, and
|
local checks and guards, source-only deliverables, the successful-tag-push
|
||||||
partial or unknown-state recovery.
|
completion point, and partial or unknown-state recovery.
|
||||||
|
|
||||||
Use copyable commands where practical. Keep optional diagnostics and consumer
|
Use copyable commands where practical. Keep optional diagnostics and consumer
|
||||||
verification clearly optional. The procedure must not turn preparation work,
|
verification clearly optional. The procedure must not turn preparation work,
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ container image, generated package, or separate registry publication.
|
|||||||
- Authoritative push URL: `https://gitea.maximumdirect.net/eric/ConfigKit.git`
|
- Authoritative push URL: `https://gitea.maximumdirect.net/eric/ConfigKit.git`
|
||||||
- Tags: stable Semantic Versions such as `v0.5.0`; no prereleases
|
- Tags: stable Semantic Versions such as `v0.5.0`; no prereleases
|
||||||
- Minimum Go version: the first stable patch of the selected Go series, or a
|
- Minimum Go version: the first stable patch of the selected Go series, or a
|
||||||
higher patch when required by a dependency or specific correctness fix
|
higher patch when required by a dependency or specific correctness fix, as
|
||||||
|
recorded in `go.mod`; see the
|
||||||
|
[consumer minimum policy](policy/release.md#consumer-minimum-and-release-toolchain)
|
||||||
- Release-gated targets: Linux amd64 and arm64
|
- Release-gated targets: Linux amd64 and arm64
|
||||||
- Best-effort targets: macOS amd64 and arm64, under the
|
- Best-effort targets: macOS amd64 and arm64, under the
|
||||||
[platform support policy](policy/release.md#platform-support)
|
[platform support policy](policy/release.md#platform-support)
|
||||||
@@ -25,10 +27,16 @@ not release gates; do not wait for or poll CI.
|
|||||||
## 1. Select Go and prepare the tool
|
## 1. Select Go and prepare the tool
|
||||||
|
|
||||||
Use a clean checkout with Git, Bash 3.2 or newer, and a native compiler for race
|
Use a clean checkout with Git, Bash 3.2 or newer, and a native compiler for race
|
||||||
tests. Select the newest stable Go series available in the development
|
tests. Choose the release type before selecting Go. For a minor or major release,
|
||||||
environment and put its latest locally available compatible patch first on
|
select the newest stable Go series available in the development environment.
|
||||||
`PATH`. The same `go` executable must build ReleaseKit and run its child
|
For a patch release, retain the series recorded in `go.mod` and leave its consumer
|
||||||
validation commands. Set local toolchain selection and verify it:
|
minimum unchanged. Follow the
|
||||||
|
[toolchain selection policy](policy/release.md#configkit-toolchain-selection).
|
||||||
|
|
||||||
|
Put the selected series' latest locally available compatible patch first on
|
||||||
|
`PATH`, ensuring it meets `go.mod`'s minimum. The same `go` executable must build
|
||||||
|
ReleaseKit and run its child validation commands. Set local toolchain selection
|
||||||
|
and verify it:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
export GOTOOLCHAIN=local
|
export GOTOOLCHAIN=local
|
||||||
@@ -37,37 +45,30 @@ go env GOVERSION
|
|||||||
command -v go
|
command -v go
|
||||||
```
|
```
|
||||||
|
|
||||||
At release preparation, record the selected series' initial stable release in
|
Only when a minor or major release advances the consumer minimum to a newer Go
|
||||||
`go.mod`. These commands derive that minimum from the selected executable. The
|
series, derive that series' initial stable release from the selected executable:
|
||||||
calculation preserves a higher patch minimum already recorded within that same
|
|
||||||
series; retain it only when dependency or correctness review confirms it is
|
|
||||||
still required. Do not keep a higher patch solely because it was previously
|
|
||||||
recorded:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
selected_go=$(GOTOOLCHAIN=local go env GOVERSION)
|
selected_go=$(GOTOOLCHAIN=local go env GOVERSION)
|
||||||
selected_series=${selected_go#go}
|
selected_series=${selected_go#go}
|
||||||
selected_series=${selected_series%.*}
|
selected_series=${selected_series%.*}
|
||||||
current_minimum=$(go list -m -f '{{.GoVersion}}')
|
release_minimum="$selected_series.0"
|
||||||
release_minimum=$(awk -F. -v current="$current_minimum" -v series="$selected_series" 'BEGIN {
|
|
||||||
split(current, current_parts, "[.]")
|
|
||||||
split(series, selected_parts, "[.]")
|
|
||||||
if (current_parts[1] == selected_parts[1] && current_parts[2] == selected_parts[2] && current_parts[3] + 0 > 0) {
|
|
||||||
print current
|
|
||||||
} else {
|
|
||||||
print series ".0"
|
|
||||||
}
|
|
||||||
}')
|
|
||||||
go mod edit -go="$release_minimum"
|
go mod edit -go="$release_minimum"
|
||||||
go mod download
|
|
||||||
```
|
```
|
||||||
|
|
||||||
For example, Go 1.26.8 records `go 1.26.0` unless a higher minimum is required.
|
If a dependency or identified correctness fix requires a higher patch minimum,
|
||||||
The `go` directive is ConfigKit's consumer minimum, not the toolchain pin. A
|
use that required version instead and document the reason. When the series is
|
||||||
minimum increase requires consumers to use the newer Go version; before v1.0.0,
|
unchanged, leave the minimum unchanged unless a minor or major release
|
||||||
an intentional compatibility increase requires a minor release under the
|
deliberately changes it under the
|
||||||
[versioning policy](policy/release.md#versioning-and-compatibility). Review any
|
[consumer minimum policy](policy/release.md#consumer-minimum-and-release-toolchain).
|
||||||
required higher patch minimum as part of compatibility preparation.
|
For example, validating with Go 1.26.8 leaves `go 1.26.0` unchanged. There is no
|
||||||
|
separate requirement to validate with Go 1.26.0.
|
||||||
|
|
||||||
|
Prepare dependencies whether or not the minimum changes:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go mod download
|
||||||
|
```
|
||||||
|
|
||||||
Build the tool selected by `go.mod` into temporary storage outside the checkout.
|
Build the tool selected by `go.mod` into temporary storage outside the checkout.
|
||||||
Ensure `$TMPDIR` names a system temporary location, not the repository. These
|
Ensure `$TMPDIR` names a system temporary location, not the repository. These
|
||||||
@@ -102,10 +103,9 @@ Choose an unused stable version locally and on the authoritative remote. Compare
|
|||||||
the candidate with the previous tag and review exported Go signatures and
|
the candidate with the previous tag and review exported Go signatures and
|
||||||
ownership, YAML and resolution semantics, diagnostic contracts, minimum Go
|
ownership, YAML and resolution semantics, diagnostic contracts, minimum Go
|
||||||
version, and platform support. Review maintained consumer examples and the
|
version, and platform support. Review maintained consumer examples and the
|
||||||
migration guidance. Before v1.0.0, a minimum-Go increase that changes the
|
migration guidance. Explain any consumer-minimum increase and required consumer
|
||||||
compatibility contract requires a minor release and an explanation of consumer
|
action under the
|
||||||
impact in the release note; patch releases remain compatible within their minor
|
[consumer minimum policy](policy/release.md#consumer-minimum-and-release-toolchain).
|
||||||
line.
|
|
||||||
|
|
||||||
Create `docs/releases/<version>.md`. Its first line must be exactly
|
Create `docs/releases/<version>.md`. Its first line must be exactly
|
||||||
`# ConfigKit <version>`, and it must end with the license and attribution footer:
|
`# ConfigKit <version>`, and it must end with the license and attribution footer:
|
||||||
@@ -118,7 +118,7 @@ Replace `VERSION` with the full tag and confirm the three target files exist in
|
|||||||
the candidate. Retire completed roadmaps, preserve unfinished and deferred
|
the candidate. Retire completed roadmaps, preserve unfinished and deferred
|
||||||
work, and repair affected links. Review the complete candidate for unintended
|
work, and repair affected links. Review the complete candidate for unintended
|
||||||
files and credentials, then commit it on `main`. These are ordinary preparation
|
files and credentials, then commit it on `main`. These are ordinary preparation
|
||||||
tasks, not separate approval gates. The `go.mod` change belongs in this
|
tasks, not separate approval gates. Any `go.mod` change belongs in this
|
||||||
candidate.
|
candidate.
|
||||||
|
|
||||||
## 3. Push the candidate to `main`
|
## 3. Push the candidate to `main`
|
||||||
|
|||||||
Reference in New Issue
Block a user