Skip to content

Commit c199d72

Browse files
import: modernize stable publication procedure
History-preserving import of the reviewed release-procedure modernization from tokmd-swarm. Preserve the two-parent publication topology.
2 parents 79503e5 + 7993126 commit c199d72

3 files changed

Lines changed: 670 additions & 77 deletions

File tree

docs/README.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,21 @@ schemas, and verification policy for `tokmd`.
6060
- [handoff.md](handoff.md) — coding-agent handoff bundle workflow and guardrails.
6161
- [publishing-evidence.md](publishing-evidence.md) — release-facing package
6262
surface, metadata, and CI ownership evidence before release mutation.
63-
- [release-readiness.md](release-readiness.md) — quickstart for pre-release
64-
evidence checks without publishing, tagging, or creating releases.
63+
- [release-readiness.md](release-readiness.md) — interpret pre-release evidence
64+
without publishing, tagging, or creating releases.
65+
- [releases/release-checklist.md](releases/release-checklist.md) — canonical
66+
RC/stable procedure, history-preserving import checklist, consumer-proof
67+
requirements, and failure recovery matrix.
68+
- [releases/1.15.md](releases/1.15.md) — user-facing release narrative for the
69+
portable evidence, CLI/Action, archive/WASM, and packet-consumption release.
70+
- [releases/1.15-readiness.md](releases/1.15-readiness.md) — command-backed RC
71+
and stable-readiness state for the 1.15 train.
72+
- [releases/1.15-ledger.md](releases/1.15-ledger.md) — exact artifact,
73+
topology, publication, and consumer-evidence ledger for the 1.15 train.
74+
- [releases/1.15.0-incident.md](releases/1.15.0-incident.md) — stable
75+
publication incident, registry recovery, alias promotion, and closeout.
76+
- [releases/1.15.0-history-audit.md](releases/1.15.0-history-audit.md)
77+
finite audit of the pre-shared-history archive lineage.
6578
- [releases/1.12.md](releases/1.12.md) — user-facing release notes for the 1.12
6679
Bun UB evidence-readiness release.
6780
- [releases/1.12-ledger.md](releases/1.12-ledger.md) — maintainer release

docs/release-readiness.md

Lines changed: 224 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,99 @@
11
# Release Readiness
22

3-
Use this path when you need pre-release evidence before any release mutation.
3+
Use this guide to produce pre-release evidence before any release mutation.
4+
The full operation and recovery checklist lives in
5+
[`docs/releases/release-checklist.md`](releases/release-checklist.md).
46

5-
This guide composes existing `xtask` checks. It does not publish crates, create
6-
tags, create GitHub releases, move release aliases, push images, or approve a
7+
This path composes existing `xtask` checks. It does not publish crates, create
8+
tags, create GitHub Releases, move release aliases, push images, or approve a
79
release.
810

9-
## Run First
11+
## Current stable baseline
12+
13+
The `1.15.0` release is complete. Its authoritative evidence is recorded in
14+
the [incident closeout](releases/1.15.0-incident.md), [registry inventory](releases/1.15.0-registry-inventory.json),
15+
and [history audit](releases/1.15.0-history-audit.md). The stable release
16+
consumer matrix, exact container digest, Action aliases, and all expected
17+
crates are recorded in the [1.15 ledger](releases/1.15-ledger.md).
18+
19+
The two local commands below timed out under Windows Cargo contention during
20+
the 1.15.0 campaign and remain explicitly `not_proven_locally`; hosted release
21+
and consumer workflows are the release evidence for that boundary:
22+
23+
```text
24+
cargo test --workspace --all-features
25+
cargo xtask publish --dry-run
26+
```
27+
28+
Do not reopen 1.15.0 artifact recovery because of that bounded local gap. The
29+
next release must close it with a terminal, adequately budgeted result.
30+
31+
## 1.15.1 reliability controls
32+
33+
The next patch release exists to make the successful 1.15.0 path repeatable:
34+
35+
- create a draft or non-latest stable GitHub Release before registry work;
36+
- inventory crates.io before mutation and persist one receipt per crate;
37+
- resume only exact missing versions and wait for registry visibility;
38+
- finalize the Release object and make it latest only after registry and exact
39+
consumer proof pass;
40+
- promote GHCR and Action aliases through the protected, globally serialized,
41+
forward-only workflow;
42+
- keep recovery overlays explicit and fixture-tested rather than rewriting
43+
package manifests with broad regexes.
44+
45+
These controls are process and release-surface work. They do not authorize a
46+
new product feature, schema change, dependency wave, or alias movement by
47+
themselves.
48+
49+
## Evidence readiness is not publication readiness
50+
51+
Keep the release states separate:
52+
53+
| State | Evidence |
54+
| --- | --- |
55+
| Source prepared | Version and release metadata are aligned on committed source. |
56+
| Source reviewed | Fresh exact-head Codex review has no blocking findings and required CI is green. |
57+
| Publication imported | The two-parent publication merge exists and the repositories are graph-aligned. |
58+
| Candidate verified | The unchanged aligned source passed pre-tag candidate proof. |
59+
| Tag only | A Git tag exists; no GitHub Release object is proven. |
60+
| Release created | The GitHub Release object exists with the intended prerelease/latest state. |
61+
| Assets complete | Required assets, checksums, and attestations are retrievable. |
62+
| Consumer verified | Exact downloaded artifacts passed the consumer-smoke workflow. |
63+
| Stable promoted | Stable crates and mutable aliases moved only after exact proof. |
64+
| Closeout complete | Ledger, readiness, changelog, planning docs, and graph alignment are final. |
65+
66+
A green build is not consumer proof. A tag is not a GitHub Release. A queued
67+
job, timeout, missing receipt, or unavailable required surface is not a pass.
68+
69+
## Run first
1070

1171
Check version alignment:
1272

1373
```bash
1474
cargo xtask version-consistency
1575
```
1676

17-
Check the package surface:
77+
Check the package surface against committed source:
1878

1979
```bash
2080
cargo xtask publish-surface --json --verify-publish
2181
```
2282

23-
Check docs and proof policy control surfaces:
83+
Check docs and proof-policy control surfaces:
2484

2585
```bash
2686
cargo xtask doc-artifacts --check
2787
cargo xtask docs --check
2888
cargo xtask proof-policy --check
2989
```
3090

91+
Check the strict panic-family policy:
92+
93+
```bash
94+
cargo xtask check-no-panic-family --strict
95+
```
96+
3197
If release metadata, workflow files, package manifests, `CHANGELOG.md`, or
3298
publishing docs changed, plan affected proof:
3399

@@ -46,100 +112,183 @@ cargo xtask proof \
46112
--evidence-json target/proof/proof-evidence-release.json
47113
```
48114

49-
## Open First
115+
The affected planner must report zero unknown files.
116+
117+
## Required release-prep proof
118+
119+
A release-preparation PR normally requires terminal results for:
120+
121+
```bash
122+
cargo fmt-check
123+
cargo gate-check
124+
cargo xtask version-consistency
125+
cargo xtask publish-surface --json --verify-publish
126+
cargo xtask doc-artifacts --check
127+
cargo xtask docs --check
128+
cargo xtask proof-policy --check
129+
cargo xtask check-no-panic-family --strict
130+
cargo test --workspace --all-features
131+
cargo clippy --workspace --all-targets --all-features -- -D warnings
132+
cargo deny --all-features check
133+
cargo xtask publish --dry-run
134+
npm --prefix web/runner test
135+
npm --prefix web/runner run build:wasm:archive-zip
136+
```
137+
138+
`publish-surface --verify-publish` and `publish --dry-run` require a clean,
139+
committed tree. A dirty-tree refusal is a pre-commit limitation, not the
140+
authoritative release result. Commit the bounded preparation slice and rerun.
141+
142+
On Windows, prefer repo-native commands such as `cargo fmt-check` over raw
143+
`cargo fmt --all`; the workspace can exceed formatter argv limits.
144+
145+
A local timeout is `not_run`, not `failed` and not `passed`. Obtain a terminal
146+
hosted or adequately budgeted result before release acceptance.
147+
148+
## Open first
50149

51150
1. `version-consistency` output.
52151
2. `publish-surface --json --verify-publish` output.
53152
3. `doc-artifacts --check`, `docs --check`, and `proof-policy --check` output.
54-
4. `target/proof/affected-release.json`, when release-facing files changed.
55-
5. `target/proof/proof-plan-release.json`, when you need the required and
56-
advisory proof command list.
57-
6. `target/proof/proof-evidence-release.json`, when you need the planned
58-
evidence receipt.
153+
4. `check-no-panic-family --strict` output.
154+
5. `target/proof/affected-release.json`.
155+
6. `target/proof/proof-plan-release.json`.
156+
7. `target/proof/proof-evidence-release.json`.
157+
8. The exact-head Codex review receipt.
158+
9. The final required-CI aggregate for that same SHA.
59159

60-
If a CI job or maintainer script saves the first two outputs, use:
160+
If CI or a maintainer script saves the first two outputs, use:
61161

62162
```text
63163
target/publishing/publish-surface.json
64164
target/publishing/version-consistency.txt
65165
```
66166

67-
## What It Means
167+
## What each check means
68168

69169
| Check | Means | Does not mean |
70170
| --- | --- | --- |
71-
| `version-consistency` | Workspace, package, binding, and release metadata versions are aligned. | Package closure is valid or artifacts were uploaded. |
72-
| `publish-surface --json --verify-publish` | Package taxonomy, non-dev publish closure, and package-list checks are valid for the checked workspace state. | Crates were published, crates.io has the version, or release mutation is approved. |
171+
| `version-consistency` | Workspace, package, binding, Action, and release metadata versions are aligned. | Package closure is valid or artifacts were uploaded. |
172+
| `publish-surface --json --verify-publish` | Package taxonomy, non-dev publish closure, and package-list checks are valid for the committed workspace state. | Crates were published, crates.io has the version, or release mutation is approved. |
173+
| `publish --dry-run` | The release publisher can package and order the full publish surface without mutating crates.io. | Publication succeeded or can be resumed without classifying prior partial state. |
73174
| `doc-artifacts --check` | Required documentation-control artifacts are present and wired into policy. | The docs are complete, current, or release-approved. |
74-
| `docs --check` | Generated or checked documentation surfaces are current for this workspace state. | The release note is sufficient or user adoption has been proven. |
175+
| `docs --check` | Generated and checked documentation surfaces are current for this workspace state. | The release note is sufficient or user adoption has been proven. |
75176
| `proof-policy --check` | Proof policy parses and preserves its configured gate/upload behavior. | Proof was promoted or Codecov upload is enabled. |
76-
| `affected` | Changed files route to proof scopes, and unknown files are explicit. | Proof commands ran. |
77-
| `proof --profile affected --plan` | Required and advisory proof commands selected for the changed surface. | Planned proof passed. |
177+
| `affected` | Changed files route to proof scopes and unknown files are explicit. | Proof commands ran. |
178+
| `proof --profile affected --plan` | Required and advisory proof commands were selected for the changed surface. | Planned proof passed. |
179+
| `check-no-panic-family --strict` | Current panic-family findings match the governed policy. | Runtime behavior or release artifacts are consumer-proven. |
180+
| Exact-head Codex review | The final SHA received a fresh adversarial review with no blocking findings. | A prior SHA remains valid after another push. |
181+
| `Tokmd Rust Result` | The required repository aggregate passed for the exact head. | Release assets exist or work when downloaded. |
78182

79-
## Stop Conditions
183+
## Stop conditions
80184

81185
Stop before release mutation when:
82186

83187
- `publish-surface` reports any violation;
84-
- `version-consistency` fails;
85-
- `doc-artifacts`, `docs`, or `proof-policy` checks fail;
188+
- `version-consistency`, documentation, proof-policy, or strict panic-family
189+
checks fail;
86190
- affected planning reports unknown release or publishing files;
87191
- required proof selected by the affected plan has not run or is failing;
88-
- release approval, tag creation, GitHub release creation, crates.io publish,
89-
alias movement, or image publication has not been explicitly requested.
90-
91-
## Next Action
92-
93-
For an ordinary PR:
94-
95-
1. Keep package-surface and version checks green.
96-
2. Keep docs and proof-policy checks green.
97-
3. Confirm release-facing files route to known proof scopes.
98-
4. Do not change release workflow behavior unless the PR is explicitly about
99-
release automation.
100-
101-
For release preparation:
102-
103-
1. Run the checks above.
104-
2. Save the outputs as evidence if the release process needs an artifact trail.
105-
3. Review required affected proof and hosted release checks separately.
106-
4. Treat publish, tag, GitHub release creation, alias movement, and image
107-
publication as separate explicit maintainer decisions.
108-
109-
## Post-Release GHCR Visibility
110-
111-
Pre-release checks above do not prove GHCR public manifest visibility. After an
112-
intentional stable release with Docker publication from `EffortlessMetrics/tokmd`:
113-
114-
1. Read the hosted release workflow's advisory unauthenticated manifest step.
115-
2. Follow the maintainer checklist and receipt template in
116-
[Publishing evidence — Post-Release GHCR Visibility Checks](publishing-evidence.md#post-release-ghcr-visibility-checks).
117-
3. Update the release ledger with `verified-public`, `pending`, or
118-
`private-only` for `ghcr.io/effortlessmetrics/tokmd`. Do not claim GHCR is
119-
publicly pullable without a pass receipt.
120-
121-
Publication GHCR is **verified-public** for `v1.13.1` as of 2026-06-21. Swarm
122-
workbench GHCR is **verified-public** for `:main` as of 2026-06-24 (issue #264
123-
closed) but remains a workbench/experimental runtime, not a supported end-user
124-
install path.
125-
126-
Setting GHCR package visibility and recording the maintainer receipt are
127-
maintainer-only actions. The repository documents the checklist, receipt
128-
template, and advisory workflow signal only.
129-
130-
Related:
131-
132-
- [1.14 release ledger](releases/1.14-ledger.md)
133-
- [1.14 release readiness report](releases/1.14-readiness.md)
134-
- [1.13 release notes](releases/1.13.md)
135-
- [1.13 release ledger](releases/1.13-ledger.md)
136-
- [1.13 release readiness report](releases/1.13-readiness.md)
137-
- [1.12 release notes](releases/1.12.md)
138-
- [1.12 release ledger](releases/1.12-ledger.md)
139-
- [1.11 release notes](releases/1.11.md)
140-
- [1.11 release ledger](releases/1.11-ledger.md)
192+
- full workspace tests, Clippy, cargo-deny, or publish dry-run lack a terminal
193+
required result;
194+
- the final exact-head Codex review is missing or has blocking findings;
195+
- the required CI aggregate is queued, in progress, cancelled, or failing;
196+
- the publication import has not produced a two-parent merge commit;
197+
- repository graph alignment is not `publication_ahead=0` and
198+
`swarm_ahead=0`;
199+
- the final-source candidate proof has not passed against the exact commit to
200+
be tagged;
201+
- tag, GitHub Release, publish, alias, or image mutation was not explicitly
202+
authorized.
203+
204+
## Release-preparation sequence
205+
206+
For an ordinary release-prep PR:
207+
208+
1. Change version and release metadata in `tokmd-swarm`.
209+
2. Run the checks above against committed source.
210+
3. Run a fresh exact-head Codex review and required CI.
211+
4. Freeze unrelated swarm merges.
212+
5. Squash-merge the swarm PR.
213+
6. Import the exact swarm tip into `tokmd` with a merge commit.
214+
7. Assert two parents, fast-forward swarm, and prove graph `0/0`.
215+
8. Prove the unchanged aligned publication source with the candidate workflow.
216+
9. Tag only that proven publication commit.
217+
10. Verify the GitHub Release object and exact asset set separately.
218+
11. Run the exact-artifact consumer-smoke workflow.
219+
12. Let consumer evidence decide whether another RC is required.
220+
221+
The repository has one human maintainer. The review control is the fresh
222+
exact-head Codex receipt plus required checks, not a second-human approval
223+
object.
224+
225+
## Release-object and consumer proof
226+
227+
After tagging, verify independently:
228+
229+
- the tag points at the intended source commit;
230+
- the GitHub Release object exists;
231+
- draft/prerelease/latest flags are correct;
232+
- required assets exist exactly once;
233+
- checksums cover every distributed asset;
234+
- attestations are retrievable and verify;
235+
- the exact GHCR tag resolves to the intended digest.
236+
237+
Then dispatch `.github/workflows/release-consumer-smoke.yml` against the exact
238+
publication tag. The workflow must download the released artifacts rather than
239+
rebuild substitutes.
240+
241+
For required surfaces, missing receipts, crashed jobs, `unavailable`, and
242+
`not_run` fail closed. A consumer failure rejects the RC and requires the next
243+
RC number after the defect is fixed and re-imported. Never move an existing RC
244+
tag.
245+
246+
## Tag-only and partial-release recovery
247+
248+
When a tag exists but no GitHub Release object is proven:
249+
250+
1. classify the state as `tag_only`;
251+
2. do not call it published;
252+
3. do not move, delete, or recreate the tag automatically;
253+
4. determine whether source, workflow, or artifact bytes must change;
254+
5. if they must change, cut the next RC;
255+
6. allow a same-tag metadata-only recovery only through an explicit maintainer
256+
decision and durable receipt.
257+
258+
A release object with missing assets is not complete. Do not move stable aliases
259+
while any exact asset, crate, or consumer gate is failing.
260+
261+
## Post-release GHCR visibility
262+
263+
Pre-release checks above do not prove public GHCR visibility. After an
264+
intentional release from `EffortlessMetrics/tokmd`:
265+
266+
1. read the hosted release workflow's unauthenticated manifest result;
267+
2. run the exact anonymous pull/version/mounted-packet checks owned by the
268+
release policy;
269+
3. update the release ledger with `verified-public`, `pending`, or
270+
`private-only` for `ghcr.io/effortlessmetrics/tokmd`;
271+
4. do not claim public pullability without a pass receipt.
272+
273+
Publication GHCR is verified-public for the currently recorded stable surface.
274+
Swarm workbench GHCR remains a workbench/experimental runtime, not a supported
275+
end-user install path.
276+
277+
Setting package visibility is a maintainer-only action. Repository workflows
278+
and docs own the evidence and claim boundary.
279+
280+
## Related documents
281+
282+
- [Canonical release checklist](releases/release-checklist.md)
283+
- [Short release entry point](../RELEASE.md)
284+
- [Swarm publication topology](ci/swarm-routing.md)
141285
- [Publishing evidence](publishing-evidence.md)
142286
- [Publish surface policy](publish-surface.md)
143287
- [Publishing evidence tree](examples/publishing-evidence-tree.md)
144288
- [Copy-ready workflows](workflows.md)
145289
- [GitHub Action quickstart](action-quickstart.md)
290+
- [1.15 release note](releases/1.15.md)
291+
- [1.15 readiness report](releases/1.15-readiness.md)
292+
- [1.15 release ledger](releases/1.15-ledger.md)
293+
- [1.14 release ledger](releases/1.14-ledger.md)
294+
- [1.14 release readiness report](releases/1.14-readiness.md)

0 commit comments

Comments
 (0)