feat(prep): a release without fragments gets its notes from feat/fix commit subjects (#1529) #1531
No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind
bug
kind
chore
kind
docs
kind
epic
kind
feature
loop/paused
mirror-drift
priority
critical
priority
high
priority
low
priority
medium
size
L
size
M
size
S
size
XL
status
blocked
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
frankenbit/release-toolkit!1531
Loading…
Reference in a new issue
No description provided.
Delete branch "claude/1529-commit-notes"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs #1529
In short
featlines go under Added;fixlines go under Fixed;## [Unreleased], works exactly as today. Its output is byte-identical tomain.Release-Notes: skiptrailer;None.. Two caveats: its kind still asks for its bump (an empty*.fixed.mdcan trigger a patch release on its own), andrt fragment-checkv0.48.2 or later refuses empty fragments, so repos running that check use the trailer.47091ff). ADR-0011 is marked as superseded in part. The measurements, mechanics and edge cases are in its companion,docs/adr/0012-commit-subject-release-notes-details.md, next to the ADR.This replaces the first design on this branch, an opt-in "mixed mode". The operator's review redirected it (comments 114541 and 114651). The first seven commits stay in the history; the newer ones carry the new design.
Two behaviours the operator accepted with ADR-0012
bootstrap-shasetting.tag_format, rt prints a warning naming the newest one, instead of refusing.How it was checked (at
b20b59e)golangci-lint2.12.1 in CI's own image (forgejo-ci-go:latest) reports 0 issues.go vetpasses after every commit.rtfrommain.fix:commit alone:### Fixedgets "game: the bench quits after its last bar (#59)".changelog.d/59.fixed.md: all six sections "None.".release_notes:key in the config: refused as an unknown key, exactly asmainrefuses it.rt decide: a lonechore:gives no release; adding an empty59.fixed.mdgives v0.2.1; an empty59.added.mdgives v0.3.0.git describecannot see the toolkit's own tags, because since v0.63.0 they sit on a commit offmain.Details
Decision tree. ADR-0012 has it; the companion document has the measurements.
[Unreleased]text when the release has any; otherwise commit subjects.[Unreleased]text, and ember, cellblock and tmux-tell's 6 fragment-less releases already published their subjects. A key can be added later without breaking anyone.featandfix, plus breaking changes under Upgrade (theBREAKING CHANGE:footer if present, else the subject).perf/revertwait: they would needrt decideto change too.Release-Notes: skiptrailer on the commit itself, which survives rebases;Release-Notes: skip <sha>in a later commit, safe only for commits already onmain;chore/ci/docs/test.Commits since the first review (newest first)
e5fcf1ddocs(adr)docs/adr/0012-commit-subject-release-notes-details.md; links rewritten47091ffdocs(adr)b20b59echore(changelog)4b910d1docs72f09c5feat(prep)release_noteskey removed. Recovery refuses when the config does not load, and gives its own remedy for an unanchored window98ed9c4docs(adr)fb7b9e9fix(lint)db869fachore(changelog)changedentryd7502b2docs2197f3ffeat(prep)4d78c75docs(adr)6979efc…8ddb0f8No re-pin is needed: toolkit-self floats
@main(AGENTS.md §2.1). Adopters get this from the next cut tag. There is no new verb or flag, no workflow file change, and the code is ASCII-only.Follow-ups filed from this review:
rt preprefuses tags that are notvX.Y.Z.rt decideassumesv-prefixed tags.git addlacks its guard.rt prep --dry-runinside a git worktree stages its preview into that worktree.Small leftovers outside this PR:
docs/architecture/c4/release-toolkit.likec4:123still says note rendering is opt-in. Editing it triggers the C4 deploy.integration.md→conventions.md#pre-10-opt-in-…, and ADR-0006 →AGENTS.md#10-….Ratification (
47091ff, docs only):[Unreleased]text.After it: the doc tests and the full suite pass, and the anchor check finds 0 unresolved links. ADR-0005's outdated release-please notes stay with #1536.
Verify at source
An agent can do steps 1 and 2 and post the result as a comment. Approving stays with you: the forge does not let
claudeapprove its own PR. Pin the approval to this head withrt review-submit-check --owner frankenbit --repo release-toolkit --pr 1531 --reviewed-head e5fcf1dd8c5afc80ea1f7601a64f34044750da1d.rtfrome5fcf1d. Runrt prep --dry-runon a Storey clone (expected: only the 5 fragments). Then, on the same clone after a local v0.2.0 tag, add afix:commit (expected: a Fixed line), and then an empty fragment (expected: all "None.")."fix": truefromnoteTypesininternal/prep/commit_notes.go, and see a test turn red.🤖 Generated with Claude Code
HOLD. Please don't review or approve the current head
6979efc. The design changes before review, after the operator's questions on 2026-10-03.What changes, as new commits on this branch (no amend, no force-push):
Proposed. It becomes accepted only once the operator agrees to the rewritten text.[Unreleased]text, only those are used;feat/fixsubjects become the notes;release_notes.source: fragmentsstays as the way back to today's behaviour.git describecannot see the toolkit's own release tags: since v0.63.0 they sit on a "pin action image" commit offmain, so describe answers v0.62.4. A range from that tag is still correct:v0.64.0..maingives 19 commits, against 88 from v0.62.4.### Upgrade.I'll post the new full head SHA here when it is pushed, and lift the HOLD then.
git add --all -- changelog.d(AGENTS.md section 5a) instead of relying on the verb to create the directory #1537rt prep --dry-runinside a linked worktree stages the whole preview into that worktree's index — the scratch copy shares its .git #1538feat(prep): opt-in release notes from feat/fix commit subjects — release_notes.source: commits (#1529)to feat(prep): a release without fragments gets its notes from feat/fix commit subjects (#1529)HOLD lifted. New head:
db869fada7357d1296bacd640133e6663c55211c. It adds four new commits on top of6979efc, with no amend and no force-push. The description is rewritten: a short summary first, the details below.Before approving, please pin the review to this exact head with
rt review-submit-check --owner frankenbit --repo release-toolkit --pr 1531 --reviewed-head db869fada7357d1296bacd640133e6663c55211c.Two design calls are waiting for your decision. Both are described under "Two decisions for you" in the description:
ADR-0012 stays Proposed until you agree. The ratification edits are listed at the end of the description.
HOLD. Two more commits are coming on top of
db869fa, so please don't approve that head.A lint fix. CI's
golangci-lintfound two staticcheck issues:Both are fixed and checked with CI's own image (
forgejo-ci-go:latest, golangci-lint 2.12.1): 0 issues, and all 30 packages pass there and natively on Windows.ADR-0012 shortened, as the operator asked. At 558 lines it buries the decision. The ADR keeps the decision, the decision tree and the consequences. The measurements and mechanics move to a companion document that it links to. ADR-0012 stays Proposed until the operator has read the short version.
I'll post the new full head SHA here once both are pushed.
HOLD lifted. New head:
98ed9c466fc3ddd6e544228d8de84bda78b3e875.fb7b9e9fixes the two staticcheck findings. golangci-lint 2.12.1 in CI's image reports 0 issues.98ed9c4shortens ADR-0012 to 247 lines. The details moved, unshortened, todocs/architecture/commit-subject-release-notes.md.Please read the short ADR: ADR-0012 at this head.
Once the operator agrees, including the two decisions listed in the description, one more commit sets it to Accepted. That commit carries the edits listed under "Ratification edits". The approval then goes on that final head, checked with
rt review-submit-check.HOLD. One more design change is coming on top of
98ed9c4, decided with the operator:release_notes.source: fragmentsis dropped, and with it the wholerelease_noteskey."Nothing to announce" for a whole release becomes an empty fragment. Any fragment switches its release to fragments-only, and an empty one adds nothing. Measured with this head on a Storey copy after v0.2.0:
fix:commit alone renders under### Fixed;changelog.d/59.fixed.mdrenders all "None.".Caveat:
rt fragment-checkrejects an empty fragment (no summary line). Repos that run it decline per commit withRelease-Notes: skipinstead. This goes into the docs and gets pinned by tests.ADR-0012 stays Proposed and gets updated to match. I'll post the new full head SHA when it is pushed.
HOLD lifted. New head:
b20b59ead0d74f874f5c2501a14c03e7cdb0446d.What changed since
98ed9c4:72f09c5: therelease_noteskey is gone. Recovery refuses when the config does not load, and has its own remedy for a window it cannot anchor.4b910d1: ADR-0012, its companion and the docs. The key is gone. The empty fragment is described with both of its caveats: its kind still asks for its bump, andrt fragment-checkv0.48.2 or later refuses it.b20b59e: the changelog fragment's advice is updated to match.At this head, golangci-lint in CI's image reports 0 issues. All 30 packages pass there and natively on Windows.
The ADR is still Proposed: ADR-0012 at this head. Once the operator agrees, one ratification commit follows, and the approval goes on that final head.
HOLD. The operator agreed to ADR-0012. The ratification commit follows on top of
b20b59e: it carries the status flip and the edits under "Ratification edits". Please approve only the head I post after it.HOLD lifted. Final head:
47091ff2c4831266b2132e7ba243379f7f973bd2.47091ffratifies ADR-0012:It changes docs only. After it, the doc tests and the full suite pass, and the anchor check finds 0 unresolved links.
This is the head to approve. Pin the approval to it first:
rt review-submit-check --owner frankenbit --repo release-toolkit --pr 1531 --reviewed-head 47091ff2c4831266b2132e7ba243379f7f973bd2HOLD. Do not approve
47091ffyet. One docs-only commit follows, at the operator's request: ADR-0012's companion document moves next to the ADR, fromdocs/architecture/commit-subject-release-notes.mdtodocs/adr/0012-commit-subject-release-notes-details.md, and every link to it is updated.Nothing treats that folder's files as ADRs:
docs/adr/(internal/wrappers/discover_test.go) looks for*.ymlworkflow files;adr-supersession-checkreads only ADR-0001;I'll post the new full head SHA when it is pushed.
HOLD lifted. Final head:
e5fcf1dd8c5afc80ea1f7601a64f34044750da1d.e5fcf1dchanges docs only. The companion document now sits next to its ADR, asdocs/adr/0012-commit-subject-release-notes-details.md. Git records it as a rename.docs/dead-script-namespace.md, which were already broken. The anchor check finds 0 unresolved anchors in the two files.internal/wrappers,internal/contracts,internal/gatesandcmd/rtpass.This is the head to approve. Pin the approval to it first:
rt review-submit-check --owner frankenbit --repo release-toolkit --pr 1531 --reviewed-head e5fcf1dd8c5afc80ea1f7601a64f34044750da1dLanding identity record
e5fcf1dd8c5afc80ea1f7601a64f34044750da1de5fcf1dd8c5afc80ea1f7601a64f34044750da1dThis is a post-merge identity record. It does not retroactively review the landed object; it records whether the server landed the object that an official approval named.