Skip to content

ci: split the release into a prepare step and a publish step so the changelog can be reviewed - #123

Merged
tylerdavis merged 1 commit into
mainfrom
worktree-release-review-step
Sep 2, 2026
Merged

ci: split the release into a prepare step and a publish step so the changelog can be reviewed#123
tylerdavis merged 1 commit into
mainfrom
worktree-release-review-step

Conversation

@tylerdavis

Copy link
Copy Markdown
Owner

mise run release:<level> used to bump, regenerate, infer the changelog snippets, commit, tag, and push in one go, so the inferred summary and migration prompt were published before anyone read them (v0.13.0 went out that way). The release is now two steps with the review in between.

The flow

mise run release:minor     # prepare: bump Cargo.toml + docs.json, regenerate CHANGELOG.md,
                           #   infer docs/snippets/changelog/vX.Y.Z/, compose docs/changelog.mdx — then stop
# edit docs/snippets/changelog/vX.Y.Z/ (and look at CHANGELOG.md)
mise run release:publish   # recompose the page from the reviewed snippets, commit, tag, push
mise run release:abort     # or drop the prepared release
  • Prepare runs every check it did before (on main and in sync, clean tree, graph on PATH, level floor, scope/constant agreement, changelog-worthy commits, dogfood leak) and every mutation except the commit. It ends by printing what to review and the two commands.
  • Publish refuses a tree with changes outside the release's file set, refuses if Cargo.toml names an already-tagged version, re-derives the tag message from the same facts prepare used (last tag, constants at HEAD, unreleased commits) rather than trusting a scratch file, re-runs compose_changelog so a snippet added or removed during the review reaches the page, then commits chore(release): vX.Y.Z, tags, and pushes.
  • Abort restores the release file set and removes the new snippet directory.

scripts/release.sh is restructured into functions for this; the checks are unchanged. RELEASING.md and CLAUDE.md describe the new flow.

Verification

End to end in a scratch clone of this branch with a bare throwaway origin and one feat: commit on top of v0.13.0: prepare left exactly Cargo.toml, Cargo.lock, CHANGELOG.md, docs/docs.json, docs/changelog.mdx, and docs/snippets/changelog/v0.13.1/ modified with no commit; abort returned a clean tree; a second prepare plus a hand edit to the summary snippet, then publish with a stray file present was refused naming the file; publish without it produced the chore(release): v0.13.1 commit, the v0.13.1 tag with file versions: config 1, plan 1, tool 1, store 1 in its message, and the push to the throwaway origin.

@graph-graph

graph-graph Bot commented Sep 2, 2026

Copy link
Copy Markdown

Note

graph_review_9000 · Splits the one-shot release script into prepare/publish/abort functions to insert a review checkpoint before pushing, with docs and mise tasks updated to match.

At a glance

Pass Area Status
4 Rust/Async/Storage Footguns 🟡 Unverified / Intentional
6 Test Coverage 🟡 Unverified / Intentional
1 Stated Intent ✅ Pass
2 Pipeline/Control-Step Invariants ⚪ N/A
3 Template/Shape Engine ⚪ N/A
5 Plan Composition/Model Routing ⚪ N/A
7 Repo Conventions/Docs Parity ✅ Pass
8 CLI Surface/Copy ✅ Pass

🧵 0 new · 0 open · 0 resolved this run · 0 declined

🟡 Needs verification / intentional (2)

Rust/Async/Storage Footguns — publish's git add "${release_files[@]}" includes docs/snippets/changelog as a directory entry, which stages any new snippet files but won't stage a deletion of a file already tracked if abort/edit removed one — not fully verifiable from the diff alone whether git add on a directory captures snippet removals made by hand during review; worth a manual check in a real run.

Test Coverage — No automated test file changed for the new prepare/publish/abort split; the description's manual scratch-clone walkthrough exercises the flow but there is no scripted test harness for scripts/release.sh in this diff or visible elsewhere in the repo.

N/A · ✅ Pass

Stated Intent — Diff matches the stated intent precisely: prepare stops short of commit, publish re-derives and commits/tags/pushes, abort restores the file set — all as described, with no unrelated scope creep.

Pipeline/Control-Step Invariants — Diff is entirely shell script/docs/mise config touching the release process; no plan pipeline or control-step code is touched.

Template/Shape Engine — No template engine or shape inference files are touched by this change.

Plan Composition/Model Routing — No plan-composition, ModelRouter, or provider/failover code is touched; the script only invokes existing plans (changelog_entry, compose_changelog) as opaque commands.

Repo Conventions/Docs Parity — RELEASING.md and CLAUDE.md are updated in the same change to describe the new two-step flow, satisfying the docs-parity invariant for this user-facing (release process) behavior change.

CLI Surface/Copy — New mise task descriptions and the prepare-step printed instructions are clear, consistent with existing task copy, and route to stderr/exit 1 for error paths as before; no stdout/exit-code contract issue found.

@tylerdavis
tylerdavis merged commit 15f14ea into main Sep 2, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant