Leave release cadence to maintainer judgment

Withdraw the imposed minor-release calendar following clarified founder
intent. Preserve exact-candidate and clean-soak requirements while leaving
scope, version, maturity and timing to evidence-informed judgment.

Keep required backend matrix check names present on documentation-only
changes so policy updates can land without weakening branch protection.

Contract-Neutral: Backend CI check reporting only. The shard test commands,
 dependency security proof and deployment contracts are unchanged.
This commit is contained in:
rcourtman
2026-09-05 12:21:02 +01:00
parent 4f7a8cdc81
commit 5f3b73955a
3 changed files with 20 additions and 16 deletions
+10 -1
View File
@@ -216,7 +216,8 @@ jobs:
backend:
name: Backend tests (${{ matrix.shard }})
needs: changes
if: needs.changes.outputs.code == 'true'
# Expand every required shard even for documentation-only changes. A
# job-level condition skips expansion and leaves the named checks pending.
runs-on: ubuntu-24.04
timeout-minutes: 45
strategy:
@@ -227,12 +228,18 @@ jobs:
shard: [api, rest-0, rest-1]
steps:
- name: Report documentation-only change
if: needs.changes.outputs.code != 'true'
run: echo "No backend code changed. Tests are not required for this shard."
- name: Checkout repository
if: needs.changes.outputs.code == 'true'
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Go
if: needs.changes.outputs.code == 'true'
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: go.mod
@@ -243,12 +250,14 @@ jobs:
# without the ~5 minute frontend build; the real bundle is built and
# size-gated by the frontend job, and release artifacts always build it.
- name: Provide frontend embed stub
if: needs.changes.outputs.code == 'true'
run: |
mkdir -p internal/api/frontend-modern/dist
[ -f internal/api/frontend-modern/dist/index.html ] || \
printf '<!doctype html><title>ci embed stub</title>\n' > internal/api/frontend-modern/dist/index.html
- name: Go unit tests (shard ${{ matrix.shard }})
if: needs.changes.outputs.code == 'true'
env:
PULSE_DATA_DIR: /tmp/pulse-test-data
# internal/api alone takes ~22m under -race on a fast machine since
@@ -241,23 +241,18 @@ stable release is an exact soaked candidate rather than the tip of a branch
that keeps moving, and so that the always-running maintainer can release
without the other lanes changing the candidate underneath it.
1. A minor train runs every two weeks. The first candidate is cut on a
fixed day and time, Tuesday 09:00 Europe/London, and general availability
is the Tuesday one week later; the next train's candidate is cut the
Tuesday after that. The first train is v6.5.0: `v6.5.0-rc.1` on
2026-09-08, general availability on 2026-09-15, then `v6.6.0-rc.1` on
2026-09-22. The cadence follows measured velocity, not preference: at the
70 to 150 commits a day `main` received in the week before adoption, a
four-week train would put two to four thousand commits into every user
upgrade, and a two-week train halves that while keeping a full seven day
soak. The release steward reviews the cadence against velocity after
every third train and records the decision here.
1. Founder intent, clarified on 2026-09-05: fast progress, with willingness
to use many betas before GA. Release scope, version, maturity and timing
belong to the maintainer's judgment from current evidence. The former
fixed v6.5 September 8/15 and v6.6 September 22 calendar is withdrawn.
The existing exact-candidate, source, soak and publication-authority
requirements still apply.
2. Each train has its own branch, `release/v6.N`, created from `main` at cut
time and declared in `docs/release-control/control_plane.json` so the
release workflow refuses a dispatch from any other branch. `main` is never
frozen. A fix for something found in the candidate is backported to the
release branch through a pull request; each backport produces the next
`rc.N` and restarts the soak. After general availability the branch is
frozen. A fix for something found in a checkpoint is backported to the
release branch through a pull request. Each changed RC starts its own full soak; beta time never counts toward
stable promotion. After general availability the branch is
the patch line for that train.
3. General availability promotes the candidate's content. The resolver
refuses a stable promotion whose tree differs from the promoted candidate
+1 -1
View File
@@ -9980,7 +9980,7 @@
},
{
"id": "release-train-exact-candidate-promotion",
"summary": "Stable promotions built whatever the dispatch branch was at that second: the resolver checked that HEAD descends from the promoted RC but not that its content matches, so v6.4.0 shipped 64 changed files that v6.4.0-rc.12 never soaked, and every v6 version was mapped to main, which moves every few minutes under the autonomous maintainer. The release train needs a branch per train declared in the control plane, a resolver rule that refuses stable content beyond release metadata without a recorded hotfix reason, and a seven day soak for minor releases so the two-week cadence carries a real soak.",
"summary": "Stable promotions built whatever the dispatch branch was at that second: the resolver checked that HEAD descends from the promoted RC but not that its content matches, so v6.4.0 shipped 64 changed files that v6.4.0-rc.12 never soaked, and every v6 version was mapped to main, which moves every few minutes under the autonomous maintainer. The release train needs a branch per train declared in the control plane, a resolver rule that refuses stable content beyond release metadata without a recorded hotfix reason, and a seven day soak for minor releases. Founder direction on 2026-09-05 replaces the fixed minor calendar with maintainer-owned release judgment informed by the preference for fast progress and willingness to use many betas, while retaining exact-candidate, branch and clean-soak requirements.",
"owner": "project-owner",
"status": "triaged",
"recorded_at": "2026-09-01",