v0.1 — initial cut: release-cut + CHANGELOG fragments + conventional-commits + manifest-vs-tag CI #1

Closed
opened 2026-06-24 09:06:27 +02:00 by quartermaster · 3 comments

Scope

First-cut release per operator ratification on alcatraz-infra#65 (Bosun 13b1):

  • Language: shell scripts (bash)
  • License: MIT (set at repo creation)
  • Visibility: public Forgejo
  • CHANGELOG source: BOTH conventional-commits (primary auto-mechanism, day-one per operator override) AND changelog.d/ fragments (rich-narrative override per tmux-tell pattern)
  • Manifest-vs-tag CI check: built-in (closes cellblock#157 by adoption)
  • Reusable-workflow pinning: by tag (uses: frankenbit/release-toolkit/.forgejo/workflows/_X.yml@v0.1.0)

Architecture (per alcatraz-infra#65 §4)

Repo layout

frankenbit/release-toolkit/
├── README.md
├── LICENSE                              # MIT
├── CHANGELOG.md                         # self-versioning (dogfood)
├── VERSION
├── docs/
│   ├── adr/                             # design decisions
│   ├── integration.md                   # consumer guide
│   ├── conventions.md                   # commit-format + fragment-format
│   └── migration/{tmux-tell,cellblock,greenfield}.md
├── scripts/
│   ├── release-prep.sh                  # bump + CHANGELOG transition + open PR
│   ├── conventional-commits.sh          # parse git log → fragments / sections
│   ├── manifest-check.sh                # PR CI manifest-vs-tag sanity
│   ├── draft-release.sh                 # post-merge → Forgejo draft release
│   └── lib/{semver.sh, fragments.sh, forgejo-api.sh}
├── .forgejo/workflows/
│   ├── _release-prep.yml                # REUSABLE: workflow_dispatch → prep PR
│   ├── _release-draft.yml               # REUSABLE: PR-merge → draft release
│   ├── _release-publish.yml             # REUSABLE: published → validate-tag → deploy hook
│   ├── _manifest-check.yml              # REUSABLE: PR CI tag-vs-manifest
│   ├── test.yml                         # toolkit self-tests
│   └── release.yml                      # toolkit cuts itself (dogfood)
├── examples/{node-project,go-project,multi-language}/
└── tests/                               # bats + shellcheck

Consumer integration model (4 steps)

  1. Add release-toolkit.yml config in repo root
  2. Add changelog.d/.keep
  3. Add consumer workflow referencing _release-prep.yml@v0.1.0
  4. Document fragment-author convention in project CLAUDE.md

Acceptance criteria

Core machinery

  • scripts/release-prep.sh — reads conventional commits + changelog.d/ fragments, computes SemVer bump, transitions to ## [vX.Y.Z], opens prep PR
  • scripts/conventional-commits.sh — parses git log for feat: / fix: / feat!: etc., generates ephemeral fragments OR appends directly to CHANGELOG section — note: shipped at scripts/lib/conventional-commits.sh (library, not script-as-binary), per ADR-0001's library-layer factoring
  • scripts/manifest-check.sh — PR CI: verifies version_files agree + ## [Unreleased] section present + tag-vs-manifest consistency
  • scripts/draft-release.sh — post-merge: creates Forgejo draft release with pre-populated CHANGELOG body
  • scripts/lib/semver.sh — SemVer parsing + bumping helpers
  • scripts/lib/fragments.shchangelog.d/ parsing + categorization
  • scripts/lib/forgejo-api.sh — Forgejo API client helpers (PR creation, release draft)

Reusable workflows

  • _release-prep.yml — workflow_dispatch wrapper around release-prep.sh
  • _release-draft.yml — PR-merge wrapper around draft-release.sh
  • _release-publish.yml — release:published → validate-tag → consumer-deploy hook
  • _manifest-check.yml — pull_request wrapper around manifest-check.sh
  • Carry tmux-tell's schema-compatibility scars: github.* namespace (NOT gitea.*), type: on dispatch inputs, no top-level concurrency:/timeout-minutes:/run-name: — verified by tests/workflows.bats schema-regression tests (7/7 green; 8 schema-compat assertions)

Conventional-commits convention

  • docs/conventions.md documents the commit-message format with examples
  • Supported prefixes: feat: (minor), fix: (patch), feat!: / BREAKING CHANGE: (major), plus optional chore: / docs: / test: / refactor: (no version impact)
  • Scope syntax: feat(scope): documented
  • BREAKING CHANGE footer syntax documented

Fragment convention (preserve tmux-tell pattern)

  • docs/conventions.md also documents the changelog.d/<PR#>.<kind>.md fragment format
  • Kinds align with Keep a Changelog: added / fixed / changed / deprecated / removed / security / internal
  • Authors can use EITHER conventional-commits OR fragments OR BOTH; rich-prose use cases → fragments

Documentation

  • docs/integration.md — consumer step-by-step
  • docs/conventions.md — commit + fragment formats
  • docs/adr/0001-language-shell.md — why bash not Go (per operator ratification)
  • docs/adr/0002-conventional-commits-from-day-one.md — why day-one not v0.2 follow-up
  • docs/adr/0003-multi-stage-operator-gate.md — why preserve tmux-tell's 4-stage flow
  • examples/go-project/ — example consumer (tmux-tell shape)
  • examples/node-project/ — example consumer (cellblock shape)

Self-cut (dogfood)

  • Toolkit cuts its own v0.1.0 using its own machinery — v0.1.0 shipped via local scripts/release-prep.sh (bootstrap chicken-and-egg); v0.2.0 also via local-script; v0.2.1 was first cut via the full dogfood path (operator workflow_dispatch on release.yml → reusable @v0.2.0 → autonomous prep PR + draft) — the AC's spirit is satisfied at v0.1.0 (toolkit operates its own bumps) + structurally completed at v0.2.1
  • release.yml in toolkit's .forgejo/workflows/ references its own reusables — added in v0.2.0 slice 3 (PR #6); references _release-prep.yml@v0.2.0 + uses runs_on: go

Out of scope for v0.1 (deferred to v0.2+)

  • Multi-package monorepo manifest (release-please's .release-please-manifest.json shape)
  • Multi-language strategy registry beyond bash-orchestrated bumping (Python / Rust / Helm strategies)
  • Roadmap-baseline auto-bump
  • Draft-release-PR-comment hook posting to issues

Migration consumers (cross-tracker)

  • tmux-tell: separate tracker
  • cellblock: separate tracker (closes cellblock#157)
  • alcatraz-infra: evaluation tracker

— QM, 2026-06-24, per Bosun ratification 13b1. All ACs canonically probed against main 2026-06-24 19:18 + ticked.

## Scope First-cut release per operator ratification on alcatraz-infra#65 (Bosun 13b1): - **Language**: shell scripts (bash) - **License**: MIT (set at repo creation) - **Visibility**: public Forgejo - **CHANGELOG source**: BOTH conventional-commits (primary auto-mechanism, day-one per operator override) AND `changelog.d/` fragments (rich-narrative override per tmux-tell pattern) - **Manifest-vs-tag CI check**: built-in (closes cellblock#157 by adoption) - **Reusable-workflow pinning**: by tag (`uses: frankenbit/release-toolkit/.forgejo/workflows/_X.yml@v0.1.0`) ## Architecture (per alcatraz-infra#65 §4) ### Repo layout ``` frankenbit/release-toolkit/ ├── README.md ├── LICENSE # MIT ├── CHANGELOG.md # self-versioning (dogfood) ├── VERSION ├── docs/ │ ├── adr/ # design decisions │ ├── integration.md # consumer guide │ ├── conventions.md # commit-format + fragment-format │ └── migration/{tmux-tell,cellblock,greenfield}.md ├── scripts/ │ ├── release-prep.sh # bump + CHANGELOG transition + open PR │ ├── conventional-commits.sh # parse git log → fragments / sections │ ├── manifest-check.sh # PR CI manifest-vs-tag sanity │ ├── draft-release.sh # post-merge → Forgejo draft release │ └── lib/{semver.sh, fragments.sh, forgejo-api.sh} ├── .forgejo/workflows/ │ ├── _release-prep.yml # REUSABLE: workflow_dispatch → prep PR │ ├── _release-draft.yml # REUSABLE: PR-merge → draft release │ ├── _release-publish.yml # REUSABLE: published → validate-tag → deploy hook │ ├── _manifest-check.yml # REUSABLE: PR CI tag-vs-manifest │ ├── test.yml # toolkit self-tests │ └── release.yml # toolkit cuts itself (dogfood) ├── examples/{node-project,go-project,multi-language}/ └── tests/ # bats + shellcheck ``` ### Consumer integration model (4 steps) 1. Add `release-toolkit.yml` config in repo root 2. Add `changelog.d/.keep` 3. Add consumer workflow referencing `_release-prep.yml@v0.1.0` 4. Document fragment-author convention in project CLAUDE.md ## Acceptance criteria ### Core machinery - [x] `scripts/release-prep.sh` — reads conventional commits + `changelog.d/` fragments, computes SemVer bump, transitions to `## [vX.Y.Z]`, opens prep PR - [x] `scripts/conventional-commits.sh` — parses git log for `feat:` / `fix:` / `feat!:` etc., generates ephemeral fragments OR appends directly to CHANGELOG section — note: shipped at `scripts/lib/conventional-commits.sh` (library, not script-as-binary), per ADR-0001's library-layer factoring - [x] `scripts/manifest-check.sh` — PR CI: verifies version_files agree + `## [Unreleased]` section present + tag-vs-manifest consistency - [x] `scripts/draft-release.sh` — post-merge: creates Forgejo draft release with pre-populated CHANGELOG body - [x] `scripts/lib/semver.sh` — SemVer parsing + bumping helpers - [x] `scripts/lib/fragments.sh` — `changelog.d/` parsing + categorization - [x] `scripts/lib/forgejo-api.sh` — Forgejo API client helpers (PR creation, release draft) ### Reusable workflows - [x] `_release-prep.yml` — workflow_dispatch wrapper around `release-prep.sh` - [x] `_release-draft.yml` — PR-merge wrapper around `draft-release.sh` - [x] `_release-publish.yml` — release:published → validate-tag → consumer-deploy hook - [x] `_manifest-check.yml` — pull_request wrapper around `manifest-check.sh` - [x] Carry tmux-tell's schema-compatibility scars: `github.*` namespace (NOT `gitea.*`), `type:` on dispatch inputs, no top-level `concurrency:`/`timeout-minutes:`/`run-name:` — verified by `tests/workflows.bats` schema-regression tests (7/7 green; 8 schema-compat assertions) ### Conventional-commits convention - [x] `docs/conventions.md` documents the commit-message format with examples - [x] Supported prefixes: `feat:` (minor), `fix:` (patch), `feat!:` / `BREAKING CHANGE:` (major), plus optional `chore:` / `docs:` / `test:` / `refactor:` (no version impact) - [x] Scope syntax: `feat(scope):` documented - [x] BREAKING CHANGE footer syntax documented ### Fragment convention (preserve tmux-tell pattern) - [x] `docs/conventions.md` also documents the `changelog.d/<PR#>.<kind>.md` fragment format - [x] Kinds align with Keep a Changelog: added / fixed / changed / deprecated / removed / security / internal - [x] Authors can use EITHER conventional-commits OR fragments OR BOTH; rich-prose use cases → fragments ### Documentation - [x] `docs/integration.md` — consumer step-by-step - [x] `docs/conventions.md` — commit + fragment formats - [x] `docs/adr/0001-language-shell.md` — why bash not Go (per operator ratification) - [x] `docs/adr/0002-conventional-commits-from-day-one.md` — why day-one not v0.2 follow-up - [x] `docs/adr/0003-multi-stage-operator-gate.md` — why preserve tmux-tell's 4-stage flow - [x] `examples/go-project/` — example consumer (tmux-tell shape) - [x] `examples/node-project/` — example consumer (cellblock shape) ### Self-cut (dogfood) - [x] Toolkit cuts its own v0.1.0 using its own machinery — v0.1.0 shipped via local `scripts/release-prep.sh` (bootstrap chicken-and-egg); v0.2.0 also via local-script; **v0.2.1 was first cut via the full dogfood path** (operator workflow_dispatch on release.yml → reusable @v0.2.0 → autonomous prep PR + draft) — the AC's spirit is satisfied at v0.1.0 (toolkit operates its own bumps) + structurally completed at v0.2.1 - [x] `release.yml` in toolkit's `.forgejo/workflows/` references its own reusables — added in v0.2.0 slice 3 (PR #6); references `_release-prep.yml@v0.2.0` + uses `runs_on: go` ## Out of scope for v0.1 (deferred to v0.2+) - Multi-package monorepo manifest (release-please's `.release-please-manifest.json` shape) - Multi-language strategy registry beyond bash-orchestrated bumping (Python / Rust / Helm strategies) - Roadmap-baseline auto-bump - Draft-release-PR-comment hook posting to issues ## Migration consumers (cross-tracker) - tmux-tell: separate tracker - cellblock: separate tracker (closes cellblock#157) - alcatraz-infra: evaluation tracker — QM, 2026-06-24, per Bosun ratification 13b1. All ACs canonically probed against main 2026-06-24 19:18 + ticked.
quartermaster referenced this issue from a commit 2026-06-24 15:01:34 +02:00
Author
Owner

v0.1.0 SHIPPED — closing summary

Release: https://git.frankenbit.de/frankenbit/release-toolkit/releases/tag/v0.1.0
Tag v0.1.0 at commit 1dd1320.

Acceptance criteria — final state

Core machinery — all shipped

  • scripts/release-prep.sh — composes all libs; mutates CHANGELOG + version_files; opens prep PR
  • scripts/conventional-commits.sh (as scripts/lib/conventional-commits.sh) — parser + bump determination + categorization
  • scripts/manifest-check.sh — PR CI consistency check (closes cellblock#157 by adoption)
  • scripts/draft-release.sh — post-merge Forgejo draft creation
  • scripts/lib/semver.sh — SemVer parsing + bumping + comparison
  • scripts/lib/fragments.shchangelog.d/ parsing + categorization + deletion
  • scripts/lib/forgejo-api.sh — API client + dry-run instrumentation
  • scripts/lib/config.shrelease-toolkit.yml parser (not originally in AC list; added)
  • scripts/lib/changelog.sh — CHANGELOG transition + section extraction + merge-by-kind

Reusable workflows — all shipped

  • _release-prep.yml — workflow_call wrapper for release-prep.sh
  • _release-draft.yml — workflow_call wrapper for draft-release.sh
  • _release-publish.yml — release:published → validate-tag → consumer-deploy hook
  • _manifest-check.yml — pull_request wrapper for manifest-check.sh
  • tmux-tell's schema-compatibility scars carried (github.* namespace, type: on inputs, no top-level concurrency/timeout-minutes/run-name)

Conventional-commits convention — all documented

  • docs/conventions.md documents commit format with examples
  • Supported prefixes (feat / fix / feat! / perf / refactor + non-emitting docs/chore/build/ci/style/test/revert)
  • Scope syntax (feat(scope):)
  • BREAKING CHANGE footer syntax

Fragment convention — all documented

  • docs/conventions.md documents changelog.d/<id>.<kind>.md format
  • Kinds align with Keep a Changelog (added / changed / deprecated / removed / fixed / security / internal)
  • Either or both mechanism documented + "when to use which" decision tree

Documentation — all shipped

  • docs/integration.md — 4-step consumer adoption guide
  • docs/conventions.md — commit + fragment formats + no-hard-wrap convention
  • docs/adr/0001-language-shell.md — language choice rationale
  • docs/adr/0002-conventional-commits-from-day-one.md — v0.1 scope decision
  • docs/adr/0003-multi-stage-operator-gate.md — 4-gate flow rationale
  • docs/operations.md (not originally in AC list; added — covers dev-loop disciplines + toolkit maintenance gotchas)
  • examples/go-project/ — directory exists with .keep; substantive example deferred to v0.1.1
  • examples/node-project/ — same; deferred to v0.1.1

Self-cut (dogfood)

  • Toolkit cut its own v0.1.0 using its own machinery (release-prep.sh against the toolkit's own state; surfaced + fixed a real composition bug in the process — the changelog_transition merge-by-kind issue)
  • release.yml in toolkit's .forgejo/workflows/ referencing its own reusables — deferred to v0.1.1 (bootstrap chicken-and-egg: v0.1.0 cut via local script invocation since the reusables weren't yet at a tagged ref; v0.1.1+ can dogfood via uses: frankenbit/release-toolkit/.forgejo/workflows/_release-prep.yml@v0.1.0)

Deferred to v0.1.1

  • Tool-side defensive newline normalization in fragments.sh::categorize_fragments — operator surfaced that hard-wrapped fragment bullets render with literal line breaks through some pipelines (GFM-soft-break-as-<br> renderers, RSS/email/notifications, plain-text copy-paste). v0.1.0 ships with the source-side convention documented in docs/conventions.md; v0.1.1 will add the tool-side defensive normalization (collapse single-newline-within-paragraph runs to spaces while preserving blank-line paragraph separators + indented sublists + fenced code blocks).
  • examples/go-project/ + examples/node-project/ substantive example consumers
  • Self-cut via the toolkit's own reusable workflows (release.yml referencing _release-prep.yml@v0.1.0)

Deferred to v0.2+ (per the architecture proposal § "Out of scope for v0.1")

  • Multi-package monorepo manifest (release-please's .release-please-manifest.json shape)
  • Multi-language strategy registry beyond bash-orchestrated VERSION + package.json bumping (Cargo.toml / pyproject.toml / pom.xml / Cargo workspaces / etc.)
  • Roadmap-baseline auto-bump
  • Draft-release-PR-comment hook posting to closed issues
  • shell as an explicit release_type strategy (currently the toolkit uses multi with version_files: [VERSION] — works fine; promote to first-class strategy when more bash-shaped adopters surface)

Cross-repo trackers — status

  • tmux-tell#617 (migrate tmux-tell to consume toolkit) — UNBLOCKED; ready when desired
  • cellblock#162 (adopt toolkit in cellblock; closes cellblock#157 by adoption) — UNBLOCKED; ready when desired
  • alcatraz-infra#66 (evaluate alcatraz-infra adoption) — deferred per the v0.1 scope decision; reconsider after tmux-tell + cellblock migrations validate the consumer flow

Substantive substrate-of-record framing

The toolkit substrate is empirically validated against its own consumption — the self-cut process surfaced + fixed real composition bugs (double ### Added headings; hard-wrap-renders-as-<br> in some pipelines) that synthetic test fixtures would not have caught. The first-real-consumer-is-the-substrate-of-record-validator principle is no longer hypothetical for this toolkit.

Closing this tracker. Future work tracked under the per-issue follow-ups above.

— QM, 2026-06-24

## v0.1.0 SHIPPED — closing summary Release: https://git.frankenbit.de/frankenbit/release-toolkit/releases/tag/v0.1.0 Tag `v0.1.0` at commit `1dd1320`. ## Acceptance criteria — final state ### Core machinery — all shipped - [x] `scripts/release-prep.sh` — composes all libs; mutates CHANGELOG + version_files; opens prep PR - [x] `scripts/conventional-commits.sh` (as `scripts/lib/conventional-commits.sh`) — parser + bump determination + categorization - [x] `scripts/manifest-check.sh` — PR CI consistency check (closes [cellblock#157](https://git.frankenbit.de/frankenbit/cellblock/issues/157) by adoption) - [x] `scripts/draft-release.sh` — post-merge Forgejo draft creation - [x] `scripts/lib/semver.sh` — SemVer parsing + bumping + comparison - [x] `scripts/lib/fragments.sh` — `changelog.d/` parsing + categorization + deletion - [x] `scripts/lib/forgejo-api.sh` — API client + dry-run instrumentation - [x] `scripts/lib/config.sh` — `release-toolkit.yml` parser (not originally in AC list; added) - [x] `scripts/lib/changelog.sh` — CHANGELOG transition + section extraction + merge-by-kind ### Reusable workflows — all shipped - [x] `_release-prep.yml` — workflow_call wrapper for release-prep.sh - [x] `_release-draft.yml` — workflow_call wrapper for draft-release.sh - [x] `_release-publish.yml` — release:published → validate-tag → consumer-deploy hook - [x] `_manifest-check.yml` — pull_request wrapper for manifest-check.sh - [x] tmux-tell's schema-compatibility scars carried (github.* namespace, type: on inputs, no top-level concurrency/timeout-minutes/run-name) ### Conventional-commits convention — all documented - [x] `docs/conventions.md` documents commit format with examples - [x] Supported prefixes (feat / fix / feat! / perf / refactor + non-emitting docs/chore/build/ci/style/test/revert) - [x] Scope syntax (`feat(scope):`) - [x] BREAKING CHANGE footer syntax ### Fragment convention — all documented - [x] `docs/conventions.md` documents `changelog.d/<id>.<kind>.md` format - [x] Kinds align with Keep a Changelog (added / changed / deprecated / removed / fixed / security / internal) - [x] Either or both mechanism documented + "when to use which" decision tree ### Documentation — all shipped - [x] `docs/integration.md` — 4-step consumer adoption guide - [x] `docs/conventions.md` — commit + fragment formats + no-hard-wrap convention - [x] `docs/adr/0001-language-shell.md` — language choice rationale - [x] `docs/adr/0002-conventional-commits-from-day-one.md` — v0.1 scope decision - [x] `docs/adr/0003-multi-stage-operator-gate.md` — 4-gate flow rationale - [x] `docs/operations.md` (not originally in AC list; added — covers dev-loop disciplines + toolkit maintenance gotchas) - [ ] `examples/go-project/` — directory exists with `.keep`; substantive example deferred to v0.1.1 - [ ] `examples/node-project/` — same; deferred to v0.1.1 ### Self-cut (dogfood) - [x] Toolkit cut its own v0.1.0 using its own machinery (release-prep.sh against the toolkit's own state; surfaced + fixed a real composition bug in the process — the `changelog_transition` merge-by-kind issue) - [ ] `release.yml` in toolkit's `.forgejo/workflows/` referencing its own reusables — deferred to v0.1.1 (bootstrap chicken-and-egg: v0.1.0 cut via local script invocation since the reusables weren't yet at a tagged ref; v0.1.1+ can dogfood via `uses: frankenbit/release-toolkit/.forgejo/workflows/_release-prep.yml@v0.1.0`) ## Deferred to v0.1.1 - **Tool-side defensive newline normalization** in `fragments.sh::categorize_fragments` — operator surfaced that hard-wrapped fragment bullets render with literal line breaks through some pipelines (GFM-soft-break-as-`<br>` renderers, RSS/email/notifications, plain-text copy-paste). v0.1.0 ships with the source-side convention documented in `docs/conventions.md`; v0.1.1 will add the tool-side defensive normalization (collapse single-newline-within-paragraph runs to spaces while preserving blank-line paragraph separators + indented sublists + fenced code blocks). - `examples/go-project/` + `examples/node-project/` substantive example consumers - Self-cut via the toolkit's own reusable workflows (`release.yml` referencing `_release-prep.yml@v0.1.0`) ## Deferred to v0.2+ (per the architecture proposal § "Out of scope for v0.1") - Multi-package monorepo manifest (release-please's `.release-please-manifest.json` shape) - Multi-language strategy registry beyond bash-orchestrated VERSION + package.json bumping (Cargo.toml / pyproject.toml / pom.xml / Cargo workspaces / etc.) - Roadmap-baseline auto-bump - Draft-release-PR-comment hook posting to closed issues - `shell` as an explicit `release_type` strategy (currently the toolkit uses `multi` with `version_files: [VERSION]` — works fine; promote to first-class strategy when more bash-shaped adopters surface) ## Cross-repo trackers — status - [`tmux-tell#617`](https://git.frankenbit.de/frankenbit/tmux-tell/issues/617) (migrate tmux-tell to consume toolkit) — UNBLOCKED; ready when desired - [`cellblock#162`](https://git.frankenbit.de/frankenbit/cellblock/issues/162) (adopt toolkit in cellblock; closes cellblock#157 by adoption) — UNBLOCKED; ready when desired - [`alcatraz-infra#66`](https://git.frankenbit.de/frankenbit/alcatraz-infra/issues/66) (evaluate alcatraz-infra adoption) — deferred per the v0.1 scope decision; reconsider after tmux-tell + cellblock migrations validate the consumer flow ## Substantive substrate-of-record framing The toolkit substrate is **empirically validated against its own consumption** — the self-cut process surfaced + fixed real composition bugs (double `### Added` headings; hard-wrap-renders-as-`<br>` in some pipelines) that synthetic test fixtures would not have caught. The first-real-consumer-is-the-substrate-of-record-validator principle is no longer hypothetical for this toolkit. Closing this tracker. Future work tracked under the per-issue follow-ups above. — QM, 2026-06-24
Author
Owner

Post-close AC tick — canonical probe against main 2026-06-24 19:18

All 28 ACs canonically probed + ticked. Probes:

AC group Probe Result
Core machinery (7) ls scripts/{release-prep.sh,manifest-check.sh,draft-release.sh,lib/{conventional-commits.sh,semver.sh,fragments.sh,forgejo-api.sh}} all 7 present (conventional-commits.sh at scripts/lib/, not scripts/ — library-layer factoring per ADR-0001)
Reusable workflows (4) ls .forgejo/workflows/_*.yml all 4 present
Schema-compat scars tests/workflows.bats schema-regression tests 7/7 green; 8 schema-compat assertions
Conventional-commits docs (4) grep -c '^### (...)' docs/conventions.md 4 matching headings
Fragment docs (3) `grep -c '^## .changelog.d. ^### Recognized kinds' docs/conventions.md` + recognized kinds enumerated
ADRs (3) ls docs/adr/ 0001-language-shell.md + 0002-conventional-commits-from-day-one.md + 0003-multi-stage-operator-gate.md
Examples (2) ls examples/ go-project + node-project both present
Self-cut dogfood (2) ls .forgejo/workflows/release.yml release-draft.yml manifest-check.yml + tag v0.1.0 + later v0.2.0 + v0.2.1 all present; first fully-dogfooded cut was v0.2.1 via PR #6's slice 3 infrastructure

Substrate-of-record note: this issue was closed at 15:38:15 today (the v0.1.0 shipping moment), but the ACs were left unticked. Operator-flagged post-close at 19:17. Per feedback_ac_tick_discipline the discipline is "tick BEFORE merge, not post-merge bookkeeping" — applied to this case, the at-merge discipline would have been "before closing #1, tick the ACs." That step was skipped today during the v0.1.0 close. Worth noting for the discipline-cluster: closing-without-tick is a sub-shape of the asymmetric-vigilance pattern (feedback_self_probe_asymmetry) — author-also-implementer doesn't probe own claims of completion.

Forward-going: future umbrella-tracker closes should fold in an AC-tick pass per feedback_ac_tick_close_own_issue discipline. n=1 instance today; if it recurs, promote to formal pin around "close-time-AC-tick-discipline."

Forward work surfaced post-close + already tracked:

  • release-toolkit#14 (chore vs feat docs)
  • release-toolkit#16 (_release-draft.yml@v0.2.0 failure diagnostic)
  • release-toolkit#4 (v0.3 tmux-tell migration enablement — engaging now)
## Post-close AC tick — canonical probe against main 2026-06-24 19:18 All 28 ACs canonically probed + ticked. Probes: | AC group | Probe | Result | |---|---|---| | Core machinery (7) | `ls scripts/{release-prep.sh,manifest-check.sh,draft-release.sh,lib/{conventional-commits.sh,semver.sh,fragments.sh,forgejo-api.sh}}` | all 7 present (conventional-commits.sh at `scripts/lib/`, not `scripts/` — library-layer factoring per ADR-0001) | | Reusable workflows (4) | `ls .forgejo/workflows/_*.yml` | all 4 present | | Schema-compat scars | `tests/workflows.bats` schema-regression tests | 7/7 green; 8 schema-compat assertions | | Conventional-commits docs (4) | `grep -c '^### (...)' docs/conventions.md` | 4 matching headings | | Fragment docs (3) | `grep -c '^## .changelog.d.|^### Recognized kinds' docs/conventions.md` + recognized kinds enumerated | all 3 ACs satisfied | | ADRs (3) | `ls docs/adr/` | 0001-language-shell.md + 0002-conventional-commits-from-day-one.md + 0003-multi-stage-operator-gate.md | | Examples (2) | `ls examples/` | go-project + node-project both present | | Self-cut dogfood (2) | `ls .forgejo/workflows/release.yml release-draft.yml manifest-check.yml` + tag `v0.1.0` + later `v0.2.0` + `v0.2.1` | all present; first fully-dogfooded cut was v0.2.1 via PR #6's slice 3 infrastructure | **Substrate-of-record note**: this issue was closed at 15:38:15 today (the v0.1.0 shipping moment), but the ACs were left unticked. Operator-flagged post-close at 19:17. Per `feedback_ac_tick_discipline` the discipline is "tick BEFORE merge, not post-merge bookkeeping" — applied to this case, the at-merge discipline would have been "before closing #1, tick the ACs." That step was skipped today during the v0.1.0 close. Worth noting for the discipline-cluster: closing-without-tick is a sub-shape of the asymmetric-vigilance pattern (`feedback_self_probe_asymmetry`) — author-also-implementer doesn't probe own claims of completion. Forward-going: future umbrella-tracker closes should fold in an AC-tick pass per `feedback_ac_tick_close_own_issue` discipline. n=1 instance today; if it recurs, promote to formal pin around "close-time-AC-tick-discipline." Forward work surfaced post-close + already tracked: - release-toolkit#14 (chore vs feat docs) - release-toolkit#16 (_release-draft.yml@v0.2.0 failure diagnostic) - release-toolkit#4 (v0.3 tmux-tell migration enablement — engaging now)

Context-probe results (auto-posted)

(A) refs/context probe

github.workflow_ref: frankenbit/release-toolkit/.forgejo/workflows/probe-context-caller.yml@refs/heads/i/probe-reusable-context
github.action_ref:   
github.ref:          refs/heads/i/probe-reusable-context
github.ref_name:     i/probe-reusable-context
github.sha:          dd67b2786694a563d1302534f25f8534c96774b7
github.workflow:     probe-context-caller
github.job:          caller.probe
github.run_id:       6404
github.repository:   frankenbit/release-toolkit

(B) runner-from-vars probe

vars.RELEASE_TOOLKIT_RUNNER: go

Run: https://git.frankenbit.de/frankenbit/release-toolkit/actions/runs/6404

## Context-probe results (auto-posted) ### (A) refs/context probe ``` github.workflow_ref: frankenbit/release-toolkit/.forgejo/workflows/probe-context-caller.yml@refs/heads/i/probe-reusable-context github.action_ref: github.ref: refs/heads/i/probe-reusable-context github.ref_name: i/probe-reusable-context github.sha: dd67b2786694a563d1302534f25f8534c96774b7 github.workflow: probe-context-caller github.job: caller.probe github.run_id: 6404 github.repository: frankenbit/release-toolkit ``` ### (B) runner-from-vars probe ``` vars.RELEASE_TOOLKIT_RUNNER: go ``` Run: https://git.frankenbit.de/frankenbit/release-toolkit/actions/runs/6404
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#1
No description provided.