feat(examples): populate examples/go-project and examples/node-project with drop-in consumer setups #152

Closed
opened 2026-06-27 01:34:48 +02:00 by quartermaster · 0 comments

The current state

The examples/ directory has two subdirectories that were scaffolded in the initial commit but never populated:

  • examples/go-project/.keep
  • examples/node-project/.keep

Both contain ONLY a .keep file. Surfaced during the pre-1.0 audit pass 2026-06-27.

The substantive value (per operator framing 2026-06-27)

Examples would serve as copy-pasteable starting points for new consumers: clone the example, rename, adjust 2-3 things, and you have a working release-toolkit-driven repo. Onboarding value is concrete — currently consumers must read docs/integration.md + assemble the pieces by hand from text descriptions.

What each example would contain

Each project would be a minimal working consumer setup:

File Purpose
README.md What this is + the 2-3 adjustments (org/repo name, runner label, project specifics)
release-toolkit.yml Consumer config — pre-filled with sensible defaults for the language
CHANGELOG.md Keep-a-Changelog skeleton with ## [Unreleased] section
changelog.d/.keep Seeds the fragment directory
.forgejo/workflows/release.yml Consumer wrapper with paths-ignore + secrets: inherit + publish_mode: immediate defaults
.forgejo/workflows/manifest-check.yml PR CI guard
Project-specific package.json (node) / VERSION + go.mod (go)

Total per example: 6-7 files of consumer-side content. Both examples combined: ~14 files / ~250 lines.

Why probing was worth it (vars + ref discoveries)

The 2026-06-27 probes for variabilizing the consumer wrapper produced these findings:

  1. uses: ${{ vars.X }} does NOT work in Forgejo Actions (HTTP 500 on dispatch; the uses: clause requires a compile-time literal). The @<ref> line must stay literal.
  2. github.workflow_ref in a reusable points at the CALLER, not the reusable. So the reusable can't self-discover its own ref via context vars. (Documented in #148.)
  3. vars.X in workflow_call has timing quirks — value reads showed cached/stale values in dispatched runs. Vars work but the reliability is unclear; not worth the cognitive load for runner-label selection. Keep runs_on as an explicit input.

Two paths forward for the examples shape

The examples' consumer wrapper shape depends on #148 (build-bake toolkit_ref elimination) resolution:

| If #148 ships first | Examples use the simpler schema | uses: ...@vX.Y.Z + runs_on: go only |
| If #148 deferred or rejected | Examples use current schema | uses: ...@vX.Y.Z + toolkit_ref: vX.Y.Z (literal duplication) + runs_on: go |

Recommended sequencing: ship #148 first → then ship this examples sprint with the cleaner schema. Avoids reworking the examples post-#148.

Implementation surface

  • examples/go-project/: 6-7 files (drop .keep)
  • examples/node-project/: 6-7 files (drop .keep)
  • docs/integration.md: link to the examples from the quick-start
  • README updates as needed

Estimated scope: ~250 lines + 1 PR cycle.

What this PR does NOT do

  • Does NOT define a new release_type — existing node + go + multi + python types are sufficient
  • Does NOT add multi-language combinations (e.g., go-with-node) — keep examples single-language for clarity
  • Does NOT bake working CI for the example projects themselves — example projects don't need to compile/test; they're documentation artifacts

Composition

  • Sequencing: #148 first (cleaner consumer schema) → then this. Skipping that sequencing means the examples need updating once #148 lands.
  • Sister tracker #151: examples/*/.keep retirement — when examples get populated, the .keep files become redundant + can be dropped in the same PR.
  • Cellblock adoption reference: the cellblock first-cut adoption (cellblock#168, 2026-06-26) is essentially this template materialized; the examples can be derived from that pattern + simplified to be vendor-agnostic.

Refs

  • Operator engagement 2026-06-27: surfaced the examples question + reframed from "drop scaffolding" to "populate as onboarding value"
  • Probe findings 2026-06-27: uses: vars.X impossible, github.workflow_ref shows caller's ref, vars.X timing quirks (captured in #148)
  • Sister trackers: #148 (build-bake toolkit_ref refactor — sequenced before this), #151 (.keep cleanup — bundled-with-this PR likely)
  • Cellblock reference: frankenbit/cellblock#168 (first external consumer adoption)
## The current state The `examples/` directory has two subdirectories that were scaffolded in the initial commit but never populated: - `examples/go-project/.keep` - `examples/node-project/.keep` Both contain ONLY a `.keep` file. Surfaced during the pre-1.0 audit pass 2026-06-27. ## The substantive value (per operator framing 2026-06-27) Examples would serve as **copy-pasteable starting points for new consumers**: clone the example, rename, adjust 2-3 things, and you have a working release-toolkit-driven repo. Onboarding value is concrete — currently consumers must read `docs/integration.md` + assemble the pieces by hand from text descriptions. ## What each example would contain Each project would be a minimal working consumer setup: | File | Purpose | |---|---| | `README.md` | What this is + the 2-3 adjustments (org/repo name, runner label, project specifics) | | `release-toolkit.yml` | Consumer config — pre-filled with sensible defaults for the language | | `CHANGELOG.md` | Keep-a-Changelog skeleton with `## [Unreleased]` section | | `changelog.d/.keep` | Seeds the fragment directory | | `.forgejo/workflows/release.yml` | Consumer wrapper with `paths-ignore` + `secrets: inherit` + `publish_mode: immediate` defaults | | `.forgejo/workflows/manifest-check.yml` | PR CI guard | | Project-specific | `package.json` (node) / `VERSION` + `go.mod` (go) | Total per example: 6-7 files of consumer-side content. Both examples combined: ~14 files / ~250 lines. ## Why probing was worth it (vars + ref discoveries) The 2026-06-27 probes for variabilizing the consumer wrapper produced these findings: 1. **`uses: ${{ vars.X }}` does NOT work** in Forgejo Actions (HTTP 500 on dispatch; the `uses:` clause requires a compile-time literal). The `@<ref>` line must stay literal. 2. **`github.workflow_ref` in a reusable points at the CALLER**, not the reusable. So the reusable can't self-discover its own ref via context vars. (Documented in [#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148).) 3. **`vars.X` in workflow_call has timing quirks** — value reads showed cached/stale values in dispatched runs. Vars work but the reliability is unclear; not worth the cognitive load for runner-label selection. Keep `runs_on` as an explicit input. ## Two paths forward for the examples shape The examples' consumer wrapper shape depends on [#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148) (build-bake `toolkit_ref` elimination) resolution: | If [#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148) ships first | Examples use the simpler schema | `uses: ...@vX.Y.Z` + `runs_on: go` only | | If [#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148) deferred or rejected | Examples use current schema | `uses: ...@vX.Y.Z` + `toolkit_ref: vX.Y.Z` (literal duplication) + `runs_on: go` | **Recommended sequencing**: ship [#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148) first → then ship this examples sprint with the cleaner schema. Avoids reworking the examples post-[#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148). ## Implementation surface - `examples/go-project/`: 6-7 files (drop `.keep`) - `examples/node-project/`: 6-7 files (drop `.keep`) - `docs/integration.md`: link to the examples from the quick-start - README updates as needed Estimated scope: ~250 lines + 1 PR cycle. ## What this PR does NOT do - **Does NOT define a new release_type** — existing `node` + `go` + `multi` + `python` types are sufficient - **Does NOT add multi-language combinations** (e.g., go-with-node) — keep examples single-language for clarity - **Does NOT bake working CI for the example projects themselves** — example projects don't need to compile/test; they're documentation artifacts ## Composition - **Sequencing**: [#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148) first (cleaner consumer schema) → then this. Skipping that sequencing means the examples need updating once [#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148) lands. - **Sister tracker [#151](https://git.frankenbit.de/frankenbit/release-toolkit/issues/151)**: `examples/*/.keep` retirement — when examples get populated, the `.keep` files become redundant + can be dropped in the same PR. - **Cellblock adoption reference**: the cellblock first-cut adoption (cellblock#168, 2026-06-26) is essentially this template materialized; the examples can be derived from that pattern + simplified to be vendor-agnostic. ## Refs - **Operator engagement 2026-06-27**: surfaced the examples question + reframed from "drop scaffolding" to "populate as onboarding value" - **Probe findings 2026-06-27**: `uses: vars.X` impossible, `github.workflow_ref` shows caller's ref, `vars.X` timing quirks (captured in [#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148)) - **Sister trackers**: [#148](https://git.frankenbit.de/frankenbit/release-toolkit/issues/148) (build-bake `toolkit_ref` refactor — sequenced before this), [#151](https://git.frankenbit.de/frankenbit/release-toolkit/issues/151) (`.keep` cleanup — bundled-with-this PR likely) - **Cellblock reference**: frankenbit/cellblock#168 (first external consumer adoption)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#152
No description provided.