Repository navigation
Conversation
@semantic-release/changelog wrote every release above the whole file, title included, so the title had ended up below them. It now opens the file, and the line releases are written below closes it, as in CHANGELOG.satellites.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0164hf4jJ3KsP3tyC3Uoa55L
.releaserc.json gives @semantic-release/changelog CHANGELOG.md's title, through the line releases are written below: the plugin keeps a title on top only when the file starts with it, and writes the next release right below it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0164hf4jJ3KsP3tyC3Uoa55L
release-train-plugin.mjs releases one train of src/release-trains.json (ADR 0012) from the plan next-version.mjs --trains computes: its trains_json, in a file RELEASE_TRAIN_PLAN names, since a variable above 128 KiB, about 3,200 hashes, would stop every process semantic-release starts. It fails when semantic-release counts from another tag than the plan's, sees a commit the plan did not walk, this run's earlier release commits aside, or does not see one the plan walked, a [skip release] one aside. The release type is the plan's, the line rule included; the version must be the one packed, a dry run included. The notes list the train's commits, [skip release] ones included (a new notes list of each plan row), the core's with the commits no train owns, their breaking marks made plain, a revert's quoted header included, and any other train's end with the core it is packed against; they go below the marker of the train's changelog, which must hold no release above it. release-train.releaserc.json configures it with .releaserc.json's rules and notes, @semantic-release/git committing the changelogs and the documentation as chore(release): <tag> [skip ci], and a draft GitHub Release naming the train's bundle, its notes cut below GitHub's limit on a release body. release-train-plugin.test.mjs replays it in throwaway repositories: a dry run per train of each history of its table, a merge, a range of 3,300 commits, each refusal, and a real run of the core then the satellites, past the core's release commit. The test, the plugin, its configuration and the changelogs run release tooling. No workflow runs it yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0164hf4jJ3KsP3tyC3Uoa55L
GitHub refuses a release body above 125,000 characters, and the notes grow with the range: about 160 characters a commit, 64,000 for the 397 commits since v0.2.1. .releaserc.json's releaseBodyTemplate now cuts them at the last line below 100,000 characters and links CHANGELOG.md at the tag, which holds them whole, as the release commit does; the release-train configuration already does so for each train's changelog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0164hf4jJ3KsP3tyC3Uoa55L
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
This is PR 10b of the phase 2 plan of ADR 0012. The plan's PR 10 now lands in three parts:
release.ymlrehearsal.No workflow runs the plugin yet.
release-train-plugin.mjsThe plugin releases one train from the plan the pack job computes with
next-version.mjs --trains. It reads the plan'strains_jsonfrom a file named byRELEASE_TRAIN_PLAN. The environment carries onlyRELEASE_TRAIN,RELEASE_RUN_COMMITS(this run's earlier release commits) andPACKED_VERSION; each is required, an empty one included.The lists travel in the file because semantic-release passes its environment to every process it starts. Linux refuses to start a process with a variable above 128 KiB, about 3,200 hashes, and a train's range grows by every commit until it releases.
Checks:
[skip release]one aside. A range read from another tag, or through a merge the plan did not follow, fails rather than drops a commit.release-trains.mjs releaseType, the line rule included.Notes:
[skip release]ones included.next-version.mjs'strains_jsonrows gain anoteslist for this; the analyzer never reads it.CHANGELOG.mddoes today. Their breaking marks (!,BREAKING CHANGE) are made plain, since such a commit ships in no package. A revert's quoted header is made plain too, so a reverted pair still drops out.#title and marker, or with a release above the marker.release-train.releaserc.jsonThe configuration has three entries:
.releaserc.json's analyzer rules (the slot aside) and notes options;@semantic-release/git, committing the changelogs and the documentation aschore(release): <tag> [skip ci];@semantic-release/github, with a draft release, no success comment, and assets fromartifacts/release/. Its body names the train's bundle (AdCodicem.ValueObjects.satellites.<version>.sigstore.jsonfor the satellites).The changelog's title
CHANGELOG.mdnow opens with its title, which ends with the marker, asCHANGELOG.satellites.mddoes..releaserc.jsongives@semantic-release/changelogthat title, verbatim. The plugin keeps a title on top only when the file starts with it, and writes the next release right below it. So a one-version release cut before PR 11 writes where the per-train path will.The release body's length
GitHub refuses a release body above 125,000 characters. The notes run about 160 characters a commit: 64,000 for the 397 commits since
v0.2.1, so the limit is about 760 commits away. Both configurations'releaseBodyTemplatenow cut the notes at the last line below 100,000 characters, and link the train's changelog at the tag, which holds them whole. That includes today's.releaserc.json(its own commit).Tests
release-train-plugin.test.mjs(23 tests, about 30 s) runs in throwaway repositories. Each holds two trains at0.2.1, this repository's scripts, configurations and changelogs, itsnode_moduleslinked, and a bare remote. The plan is computed there bynext-version.mjs --trains. semantic-release runs in a child process, since it hooks its process's standard streams, which carrynode:test's reports. Its environment holds the plan alone.The cases:
build(pack)anddocs(readme);[skip release]commits;.releaserc.json's, the git and GitHub entries, and both release bodies rendered short and long.CHANGELOG.md: the entry lands right below the marker, under one# Changelog.CI:
ci-plan.shputs the plugin, its configuration, its test and the changelogs in thereleaselane, and its header names them.Releasable because
.releaserc.json's own options.docs:andci:, so nothing is released or previewed.Validated
node --test '.github/scripts/*.test.mjs': 119 pass. The plugin's commit passes on its own (23). Also clean: shellcheck, actionlint 1.7.12, andEVENT_NAME=push ci-plan.sh.[skip release]exemption, the run's earlier release commits, the commits filter, and the last-release check;!), the "Packed against" and line-move sentences;next-version.mjs --trainsgivesnotesequal tocommitsfor both trains: no[skip release]commit in either range.trains_jsonis 62 KB.[skip release]commits missing from a train's notes;ci-plan.shheader.Checklist
dotnet test --project tests/<tests>, each family'stestsin.github/ci-families.json) anddotnet test --project tests/AdCodicem.ValueObjects.GeneratorTestspass (theintegration suite needs Docker). Not applicable: release tooling and docs only.
docs/adr/0006-coverage-is-a-signal-not-a-goal.md: what staysuncovered is a defensive branch, a compiler branch or a private member no input reaches, and the pull request says so. Not applicable.
[ValueObject<T>]or[EntityId], a hookinterface, a diagnostic, an error code, an extension method — is reflected in
README.md, the matching pageunder
website/docs/, and the agent skill inskills/value-objects/. Not applicable.AnalyzerReleases.Unshipped.md, or RS2008 fails the build. Not applicable.git rev-list --count origin/main..HEAD): 4.Generated by Claude Code