ci(release): derive the version from commit subjects, and add a manual backdoor #17
Reference in New Issue
Block a user
No description provided.
Delete Branch "feature/release-per-merge"
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?
What & why
A bundle used to cost a second pull request whose entire content was a number. The workflow published only when a merge to
mainleftmodule.jsonat a version with no release yet, so an ordinary merge released nothing.Measured rather than argued:
v0.3.0(2026-08-12) is the only release this repo has ever cut, while the nine Teams phases and the cutover landed onmainin the week since. Not one of them touched that line, so not one produced a bundle.This adopts the engine
linkandinstalleralready run:v*tagfeat!:/BREAKING CHANGEfeat:fix:/perf:module.jsondeclaresThe number that ships is the tag, and CI writes it into the
module.jsoninside the bundle — with an assertion that the rewrite happened, because a bundle carrying the wrong version installs under a number that is not the one it was released as.module.json's version is kept as a floor, not deleted. A version above the newest tag still releases at that version, so the declared model survives as the special case it always was, and is still how acoreApibump overrules the subjects.The backdoor (
workflow_dispatch) covers what the rules cannot reach — amodule.jsonchange worth shipping with no releasable code behind it. Leaveversionblank to bump the newest tag bybump, or name an exact version. Where the log and the input disagree the larger wins: a button pressed on a log full offeat:would otherwise publish itspatchdefault over a minor's worth of work.Two things carried over from
linkin the same pass:$OUTrather thandist/— which now holds the changelog the publish step reads back.The workflow still never writes to a branch, which was always the half of the original design that mattered under branch protection.
Not in scope, raised separately: the bundle's
for d in …include list is the shape the kit's acceptance run found silently drops any newly addedserver/directory. The Integration kit's template was fixed; this repo was not. Left alone deliberately to keep this diff about cadence.On this repo's
maintoday…with a changelog listing the nine Teams
feat:s and twofix:es.How it was tested
The plan step was extracted from the YAML and run against purpose-built git fixtures, plus this repo's real
main. Both the derived path and the backdoor were exercised, withcurlstubbed to return each HTTP code the recovery branch distinguishes:feat:since tag0.4.0, releasefix:only0.3.1, releasefeat!:1.0.0, releasereuse_tag=true, tag step skipped::error::, exit 1 — refuses to guess0.5.0above tag0.3.0, chore only0.5.0(the floor)0.5.0, breaking in log1.0.0(the larger wins)0.10.0vs tag0.9.00.10.0(sort -V, not a string compare)0.3.1bump=minor, no code0.4.01.2.31.2.3patch(default) on afeat:log0.4.0, not0.3.1The bundle's
module.jsonrewrite and its version assertion were run directly against this repo's manifest: the rewrite passes, an un-rewrittenmodule.jsonfails withbundle declares 0.3.0, but this is release 0.4.0, and a missingclient/dist/entry.jsstill fails as before. YAML parses; 9 steps in the expected order.jqis not on the dev box, so the twojqlines were verified by reading only — the runner has it and the workflow already depended on it before this change.Checklist
AI-assisted contributions (required)
Claude Code (Opus 5). I have reviewed and understandevery change, and take responsibility for it. AI-authored commits are
marked with a
Co-Authored-By/Assisted-Bytrailer.License
(GNU GPL v3.0 or later), and I have the right to contribute it.
Pairs with RunicGateway/docs#171 (MODULE_SYSTEM.md §2.7.1 and settled decision 19) and RunicGateway/Integration-kit#8 (the template and chapter 2). Merge the docs one alongside this.