• v0.6.0 ba10f67cad

    Release v0.6.0
    All checks were successful
    release / decide + act (push) Successful in 4s
    release / release (push) Successful in 0s
    Stable

    quartermaster released this 2026-06-26 09:36:44 +02:00 | 1556 commits to main since this release

    Added

    • v0.5.1 substrate-correction sprint: Layer 2 race-condition retry (#86), stale rolling PR auto-close at cut-success (#87), Layer-2/3 FAIL-path test coverage (#64), release_token workflow_call secret for path-α autonomous cuts (#88), §Branch protection doc rewrite. Closes #86, #87, #64.
    Downloads
  • v0.5.0 f03c437d04

    Release v0.5.0
    All checks were successful
    release / decide + act (push) Successful in 8s
    release / release (push) Successful in 0s
    Stable

    Ghost released this 2026-06-26 00:47:47 +02:00 | 1561 commits to main since this release

    Added

    • v0.5.0 docs lock-in: integration.md rewritten for v0.4.0+ push-triggered + rolling-PR shape with new sections for the summary: frontmatter convention + branch-protection compatibility; new AGENTS.md carry-forward pre-flight checklist for contributors; new docs/migration/v0.3-to-v0.5.md migration guide. Closes #52 slice 5.
    • Fragment frontmatter (summary:) bifurcates release-notes vs CHANGELOG.md — short consumer-facing summaries land in the Forgejo release body via .release-toolkit-release-notes.md sidecar; long-form prose still lands in CHANGELOG.md. Closes #77.

    Fixed

    • _release.yml cut path now opens a PR for the manifest update instead of direct-pushing to main, then attempts auto-merge via the Forgejo API. Self-contained — no admin-scope tokens required from consumers. Closes #78.
    Downloads
  • v0.4.0 5f4812d76f

    Release v0.4.0
    All checks were successful
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    release / decide + act (push) Recovered via manual manifest push at 595c10f (see #78)
    release / release (push) Recovered via manual manifest push at 595c10f (see #78)
    Stable

    Ghost released this 2026-06-25 22:19:43 +02:00 | 1571 commits to main since this release

    Added

    Push-triggered rolling-release-PR mechanic — v0.4.0 replaces the v0.3.x operator-dispatched prep flow with a push: branches: [main] trigger backed by a committed .release-toolkit-manifest.json state file and a shell-based decision engine (scripts/release-decide.sh). On every push to main, the workflow walks git log <last_released_sha>..HEAD and decides one of three modes: noop (no release-relevant content), update (refresh the rolling release-prep PR with the accumulated bump), or cut (the operator merged the rolling PR — fire draft-release.sh + commit-and-push the manifest update). The substrate-honest escape from the Forgejo Actions expression-engine bug (#41 / #47) that constrained the v0.3.x flow — no ${{ github.event.* }} / ${{ forgejo.event.* }} accesses on the load-bearing path.

    Fixed

    • scripts/release-prep.sh: DRY_RUN_INPUT/DRY_RUN_ENV env-var sources now use truthy semantics — the literal string "false" no longer falsely enables dry-run (closes #70).
    • scripts/release-prep.sh + .forgejo/workflows/_release.yml: defensive git identity setup before git commit — works on fresh CI runner containers without pre-configured git config; configurable via RELEASE_TOOLKIT_GIT_NAME / RELEASE_TOOLKIT_GIT_EMAIL env vars; consumer-provided config preserved (closes #73).
    Downloads
  • v0.3.5 ee4a9b4fb8

    Release v0.3.5
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Failing after 4s
    manifest-check / check (pull_request) Failing after 0s
    Stable

    Ghost released this 2026-06-25 18:41:24 +02:00 | 1580 commits to main since this release

    Patch release closing a latent semver-correctness bug in last-tag detection that the v0.4.0 architectural arc's bootstrap-tag surfaced as a dogfood catch.

    Fixed

    scripts/manifest-check.sh + scripts/release-prep.sh: last-tag detection now skips pre-release tags via git describe --exclude '*-*'. Without the fix, a pre-release tag (e.g. v0.4.0-rc.1) closer to HEAD than the last stable release falsely tripped manifest-check's tag-vs-manifest step (manifest 0.3.4 BEHIND tag v0.4.0-rc.1) AND silently shifted release-prep.sh's cc_categorize_commits_since walk window to the prerelease, dropping conventional-commits content from the cut's CHANGELOG section. Surfaced as a dogfood catch during the v0.4.0 architectural arc — slice 3's bootstrap-tag v0.4.0-rc.1 blocked slice 2's CI (#65). The fix is semver-correctness (pre-releases are not releases), not a dogfood-only workaround: any consumer creating their own -rc / -beta / -alpha tag would have hit the identical false-failure. Closes #66.

    Downloads
  • v0.3.4 16c1868ef8

    Release v0.3.4
    All checks were successful
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    Stable

    quartermaster released this 2026-06-25 01:21:01 +02:00 | 1599 commits to main since this release

    The auto-fire of release-draft on prep-PR merge has been retired:
    release-draft is now operator-dispatched only via workflow_dispatch with an explicit tag input. This formalizes the empirical reality — the auto-fire mechanic has never worked since #41 was filed (every release cut to date has used the manual scripts/draft-release.sh fallback) because Forgejo Actions' expression engine cannot reliably resolve github.* / forgejo.* accesses pulling from the pull_request event payload on .closed events. See #41 + #47 for the substrate-evidence (n=3 falsifications during the v0.3.4 sprint's hypothesis-test arc).

    A release-please-shaped redesign (push: branches: [main] trigger + state-file manifest + shell git-log walk — zero pull_request expression-engine exposure) is planned to reinstate single-button auto-fire in the next architectural arc, tracked as #52.

    Fixed

    • .forgejo/workflows/release-draft.yml + docs/integration.md template: drop the pull_request: types: [closed] auto-fire trigger entirely. release-draft is now operator-dispatched only via workflow_dispatch with an explicit tag input. Consumer integration docs updated to match + explain the substrate constraint inline. Closes #41.
    Downloads
  • v0.3.3 b75ac359a8

    Release v0.3.3
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    debug-event-payload / dump github.event JSON (pull_request) Successful in 1s
    release-draft / create Forgejo draft release (pull_request) Failing after 4s
    release-draft / draft (pull_request) Failing after 0s
    Stable

    quartermaster released this 2026-06-24 23:52:17 +02:00 | 1606 commits to main since this release

    v0.3.3 patch sprint — closes 2 v0.3.x candidates from the v0.3.2
    review cycle: #35 fragment-kind lint (warning-only authoring
    discipline that flags suspicious kind-vs-body-content mismatches at
    release-prep time) + #41 disposition (A) probe (temporary
    diagnostic workflow that logs github.event payload on
    pull_request.closed to root-cause the consumer-side empty-version
    issue exposed by the v0.3.1 inline-collapse fix's guard).

    Both items ship as kind=internal per the consumer-facing-surface
    test refined in v0.3.2: the discriminator is whether RELEASE OUTPUT
    changes, not whether any author-side behavior is observable. The
    lint emits stderr warnings to AUTHORS; the probe is temporary
    scaffolding that will be removed once #41's right-layer fix lands
    in v0.3.4. Neither changes the consumer-observable release artifact.

    Internal

    • scripts/lib/fragments.sh: new lint_fragment_kind + lint_fragments functions that flag suspicious kind-vs-body-content mismatches per the consumer-facing-surface test (docs/conventions.md). Two heuristics: (A) minor-bumping kind (added/changed/...) + docs-only body → warn "should this be .internal.md?"; (B) patch-bumping kind + new-capability body → warn "should this be .added.md?". Warning-only; never fails the cut. Author opt-out per fragment via <!-- lint-fragment-kind: ok --> body marker. Wired into release-prep.sh at bump-determination time. Same observability-not-author-discipline family as the #29 install-deps probe + the #16 empty-version ::error:: guard. See #35.

    • .forgejo/workflows/debug-event-payload.yml (consumer-side, temporary): diagnostic workflow firing on pull_request.closed events that logs the full github.event JSON + individual field evaluations (head.ref, head.label, merged, startsWith() test). Surfaces the data needed to root-cause #41 — why the consumer-side release-draft.yml line 28 expression evaluates to empty. This workflow will be REMOVED once #41's right-layer fix lands (tracked on the issue). Disposition (A) per Surveyor e455 framing: probe first, don't fix on hypothesis.

    Downloads
  • v0.3.2 a1e59f0165

    Release v0.3.2
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    release-draft / create Forgejo draft release (pull_request) Failing after 4s
    release-draft / draft (pull_request) Failing after 0s
    Stable

    quartermaster released this 2026-06-24 22:44:16 +02:00 | 1612 commits to main since this release

    v0.3.2 patch sprint — closes the v0.3.x observation queue from the
    v0.3.1 review cycle: the #16 chicken-and-egg closure (toolkit's own
    consumer-side @v0.2.0 → @v0.3.1 across all 3 reusable-invoking
    workflows), the #29 install-deps observability echo, and the #30/#34
    fragment-kind-side discipline restructure folded into docs/conventions.md.

    First fully-dogfooded chicken-and-egg-closure cut: this is the
    first prep-PR-merge cycle where the autonomous release-draft.yml
    exercises the v0.3.1 inline-collapse fix (per #16). Substrate-of-record
    milestone for the toolkit-on-toolkit feedback loop.

    Internal

    • .forgejo/workflows/release-draft.yml (consumer-side): bump uses: ...@v0.2.0 + toolkit_ref: v0.2.0 → @v0.3.1 to pick up the inline-collapse fix shipped in v0.3.1. Closes the #16 chicken-and-egg for the toolkit's own autonomous release-draft path; the next v0.3.x cut's prep-PR merge will exercise the fixed reusable via dogfood. External consumers (cellblock + tmux-tell migrations) pick up the bump at adoption time.

    • _release-prep.yml + _release-draft.yml + _manifest-check.yml: add echo "[install-deps] complete" at the end of each install-deps step. Makes the step's run-state visible in future logs (previously the step produced zero output when pre-baked deps were present, making it indistinguishable from a skipped step — the ambiguity that bit the #16 diagnostic). See #29. Observability-not-author-discipline pattern; same family as #35.

    • docs/conventions.md: restructure the chore-vs-feat subsection per "state the consumer-facing-surface test once, map onto both surfaces" — the same test applies to commit subjects AND fragment kinds. Folds #30 (adopter-friendly worked-instance, drops internal PR refs) + #34 (fragment-kind side of the discipline) into one restructure. Adds an asymmetry note explaining when chore: (silent) vs .internal.md (visible in ### Internal) is the right home.

    • .forgejo/workflows/release.yml + manifest-check.yml (consumer-side): bump uses: ...@v0.2.0 + toolkit_ref: v0.2.0 → @v0.3.1 to match release-draft.yml (bumped in v0.3.2 via #36). Closes the mixed-version dogfood version-skew Surveyor flagged on #36 review — the toolkit now exercises its OWN v0.3.1 reusables consistently across all 3 consumer-side workflows + picks up the v0.2.1 sudo-fix on the release-prep + manifest-check paths.

    Downloads
  • v0.3.1 b8ae12934c

    Release v0.3.1
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    release-draft / create Forgejo draft release (pull_request) Failing after 4s
    release-draft / draft (pull_request) Failing after 0s
    Stable

    quartermaster released this 2026-06-24 21:59:55 +02:00 | 1620 commits to main since this release

    v0.3.1 patch sprint — closes 3 v0.3.x candidates surfaced during
    the v0.3 cut: a load-bearing workflow fix that unblocks autonomous
    release-draft cycles, a bats portability fix that removes 2 hidden
    test failures, plus the chore-vs-feat commit-subject guidance that
    prevents bump-escalation.

    Consumer-bump note: the _release-draft.yml fix below only takes
    effect when consumers bump their release-draft.yml's uses: ...@v0.2.0
    → uses: ...@v0.3.1. Toolkit's own consumer wrapper gets bumped in a
    post-cut PR; cellblock + tmux-tell migrations pick it up at adoption time.

    Fixed

    • _release-draft.yml: inline-collapse version-normalization into the script-invocation step. Sidesteps a runtime step-skip that was leaving the script's --version empty on every release-draft cycle. See #16.

    • tests/conventional-commits.bats: rewrite the 4 cc_parse_subject tests to compare against $output directly (with explicit newline boundaries via $'...' syntax) instead of ${lines[N]} indexing. Fixes 2 pre-existing failures on bats 5.2.37+ where the run wrapper collapses empty strings out of the lines array, silently shifting indices. Test logic + the function under test are unchanged. See #18.

    Internal

    • docs/conventions.md: new subsection "Choosing chore: vs feat: for internal-infrastructure changes" with the consumer-facing-surface test + the v0.2.1 cut-escalation worked instance. Helps human authors avoid the cut-escalation footgun where a chore:-shaped commit lands as feat: and pulls the next cut into a higher version lane. See #14.
    Downloads
  • v0.3.0 ff328f697b

    Release v0.3.0
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    release-draft / create Forgejo draft release (pull_request) Failing after 4s
    release-draft / draft (pull_request) Failing after 0s
    Stable

    quartermaster released this 2026-06-24 20:52:51 +02:00 | 1626 commits to main since this release

    v0.3 sprint — tmux-tell migration enablement (closes
    release-toolkit#4).
    4 config additions + a migration guide that let pre-1.0 Go projects
    (tmux-tell + similar) adopt the toolkit without compromising the
    defaults for strict-SemVer projects. Each addition is opt-in;
    existing consumers see zero behavior change.

    This is the first fully-dogfooded MINOR cut — operator dispatched
    release.yml in the Forgejo UI, the toolkit's own reusable
    workflows fired autonomously, all 4 config additions exercised in
    a single release. Substantive milestone closing the v0.3 arc.

    Added

    • pre_v1_breaking_to_minor config flag (opt-in) lets pre-1.0 projects in settling-shape express "breaking change" semantically (in commits or fragments) without triggering the major-version commitment that 1.0+ implies. Set pre_v1_breaking_to_minor: true in release-toolkit.yml to downgrade major → minor bumps while the manifest is 0.x.y. Once the project crosses 1.0.0, the flag silently becomes a no-op — major bumps survive as major. Default false (strict SemVer); the policy is opt-in via the config flag. See docs/conventions.md for mechanics + semver_apply_pre_v1_policy for the implementation. First v0.3 / release-toolkit#4 slice (1 of 5).

    • version_files: [] accepted as a valid config — opts into tag-is-version mode where git describe --tags is the authoritative version source. The lockstep check in manifest-check.sh step 2 emits SKIP rather than failing; step 4 (tag-vs-manifest) treats the git tag as its own manifest (no comparison required). release-prep.sh does NOT bump any files when configured this way; the new version propagates via the CHANGELOG transition + the tag at release-draft + publish. Distinguishes "field missing" (defaults to VERSION per v0.1 behavior) from "field explicitly empty" (tag-is-version opt-in). Right shape for Go projects with -ldflags version injection (tmux-tell + similar) and projects where the tag IS the source of truth. See docs/integration.md for the config example. Second v0.3 / release-toolkit#4 slice (2 of 5).

    • section_format: { tag_prefix, separator } config lets consumers customize the CHANGELOG.md section heading shape. Defaults match Keep a Changelog's example (## [vX.Y.Z] - YYYY-MM-DD); consumers can override either or both fields independently. Empty string for tag_prefix is a meaningful opt-out that drops the v-prefix (## [X.Y.Z] — matches tmux-tell's existing shape); separator: " — " switches to em-dash. The heading is constructed as ## [<tag_prefix><X.Y.Z>]<separator><DATE>. changelog_transition gains 2 new optional positional params (5th = TAG_PREFIX, 6th = SEPARATOR) with ${var-default} (not ${var:-default}) semantics so explicit empty string is preserved. See docs/integration.md for examples + the missing-vs-empty semantic distinction. Third v0.3 / release-toolkit#4 slice (3 of 5).

    • post_bump_hooks: [path] config lets consumers register hook scripts that fire AFTER version_files are bumped + BEFORE the git commit. Used for per-consumer bookkeeping that doesn't belong in the toolkit's general flow (updating a --version example in README to match the cut, regenerating versioned docs, syncing vendored manifests). Each hook is an executable script invoked from the consumer repo root + receives RELEASE_TOOLKIT_NEW_VERSION + RELEASE_TOOLKIT_NEW_TAG + RELEASE_TOOLKIT_PREVIOUS_TAG env vars. Zero exit → release-prep continues; non-zero exit aborts the cut with the hook's stderr propagated (no commit, no push, no PR). Multiple hooks run in declaration order; first failure aborts the chain. Hook paths are operator-controlled (no injection risk) and properly arg-quoted (paths with spaces are safe). See docs/integration.md for the full mechanics + safety surfaces. Fourth v0.3 / release-toolkit#4 slice (4 of 5).

    • docs/migration/tmux-tell.md migration guide — step-by-step migration walkthrough for projects with tmux-tell's substrate shape (Go projects with no VERSION file, build-time version injection via -ldflags, pre-1.0 BREAKING-as-minor discipline, em-dash CHANGELOG headings, per-consumer release-time bookkeeping). Covers: tmux-tell-shape release-toolkit.yml config; 4 consumer-side workflow wrappers; the README pin-update hook script with the post_bump_hooks env-var contract; trust-model checkpoint (branch-protect the hook + the config); one-cycle parity check before retiring the old workflow chain. Generalizes to any pre-1.0 Go project with similar shape; cellblock's node-strategy migration doesn't need any of these flags. Fifth + final v0.3 / release-toolkit#4 slice (5 of 5).

    Downloads
  • v0.2.1 e6e156052a

    Release v0.2.1
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
    manifest-check / check (pull_request) Successful in 0s
    release-draft / create Forgejo draft release (pull_request) Failing after 4s
    release-draft / draft (pull_request) Failing after 0s
    Stable

    quartermaster released this 2026-06-24 19:15:18 +02:00 | 1636 commits to main since this release

    Fixed

    • Sudo-aware install-deps step in _release-prep.yml + _release-draft.yml + _manifest-check.yml. v0.2.0 hard-coded sudo apt-get install for the yq/jq/curl fallback, which failed opaquely with sudo: command not found on minimal root-only CI images (a common shape: Debian-derived images that run as root with no sudo package installed). v0.2.1 replaces the bare sudo calls with a 3-shape handler: (1) if EUID=0, apt-get directly; (2) else if sudo is on PATH, sudo apt-get; (3) else fail loud with ::error:: annotations naming the missing tools + actionable remedies ("pre-bake into your runner image, run as root, or install sudo"). _release-publish.yml is unchanged — it has no install-deps step (pure tag-format validation). Closes #10.

    • list_fragments warns on unrecognized basenames instead of silently skipping. v0.2.0 dropped fragments named <id>.<kind>.<suffix>.md (e.g., 3.fixed-2.md) without any signal — the parser extracts the LAST dot-segment as kind (fixed-2), which isn't a recognized kind, and the file was treated as "not a fragment" and quietly excluded from the cut. This was caught manually during the v0.2.0 release when a file-count probe surfaced a missing fragment. v0.2.1 emits warning: <path> does not match \..md` (unknown kind in basename) — skippingto stderr so the operator sees the dropped file before the cut consumes the workspace. A smarter parser that accepts...md` shapes is deferred to v0.3 (release-toolkit#9 disposition B). Closes #9.

    Internal

    • Toolkit's own consumer-shape workflows (release.yml + release-draft.yml + manifest-check.yml) added in v0.2.0 so the toolkit cuts itself through its own machinery from v0.2.1+ (closes the bootstrap chicken-and-egg). v0.2.1 is the first cut produced via this path: operator dispatches release.yml → reusable _release-prep.yml@v0.2.0 → release-prep.sh runs → prep PR opens autonomously. No external-consumer surface change; internal substrate-of-record only.
    Downloads