chore(release): v0.17.0 #238

Merged
quartermaster merged 1 commit from repin/v0.17.0-rc.1 into main 2026-06-28 15:05:12 +02:00

Added

Added examples/go-project and examples/node-project — complete drop-in consumer bootstraps (config + the two wrapper workflows + a CHANGELOG skeleton + version file) you can cp -r into a new repo to adopt the toolkit, plus an examples/README.md index. Post-Phase-2 shape (no toolkit_ref: input; @v0.16.0 pin).

api_call structured event: forgejo_api_call now emits one JSON event per real API call (endpoint, method, status, ms) to stderr, giving Loki-ingestable observability over the toolkit's Forgejo interactions including latency and non-2xx failures. Emitted at the wrapper on every real call (not in dry-run); ms is the curl wall-clock in integer milliseconds. The emit is guarded so forgejo-api.sh keeps no hard dependency on the events substrate -- callers that sourced events.sh get the event, others degrade cleanly to no-emit. (Part 1 of #204; the workflow-level cut_complete.ms_total remains deferred to the next compose-script cut.)

The toolkit now dogfoods its own post_bump_hooks on its own docs: a new hook (scripts/hooks/update-doc-version-refs.sh), wired in release-toolkit.yml, re-pins the adopter-facing example refs in README.md + docs/integration.md to the freshly-cut tag on every cut -- eliminating the manual doc-ref-pin drift class (#196 was the recurring manual fix; Shipwright #157 found the dogfooding gap). The hook preserves historical "feature-since" references (e.g. v0.12.0+) and pins only the @vX.Y.Z / Latest: / Replace example shapes. A new RELEASE_TOOLKIT_RELEASE_DATE env var is exported to all post_bump_hooks (the cut date, matching the CHANGELOG heading) so hooks can refresh dated examples. The post_bump_hooks docs now also document the staging convention (hooks must git add their own changes; release-prep commits only staged files).

  • hooks: dogfood post_bump_hooks for own doc ref-pins (#209)
  • forgejo-api: emit api_call structured event (#204 part 1)

Changed

docs: sweep adopter-facing ref pins (README + integration.md) to @v0.16.0 (#196).

Fixed

Corrected adopter-facing integration.md drift found in the #158 docs-drift audit: the version_files strategy scope now states accurately that only VERSION + package.json are handled (replacing the invented, mutually-contradictory "v0.3 scope"/"v0.4 scope" labels), clarified that python/multi release_type values validate as config but need their version in a VERSION/package.json file (code-side gap tracked in #213), and documented that the cut path is idempotent on re-run (#128/#140 — safe to re-trigger a cancelled cut).

release-prep.sh --dry-run no longer requires a configured origin remote when none is present. Dry-run skips every remote write, and the sole use of origin is owner/repo inference that (in dry-run) feeds only dry-run-noop API calls plus the echoed owner=/repo= outputs -- so a fresh scratch repo with no remote can now preview a cut. The real git-history read (LAST_TAG via git describe) uses local tags, not the remote. A present-but-unparseable remote stays fatal even in dry-run (a genuine misconfiguration dry-run should surface), and production cuts still hard-require origin. Also fixes a latent silent-abort in the same path: an unparseable remote previously tripped set -e at the owner/repo assignment before the "could not derive owner/repo" diagnostic could print.

  • release-prep: relax origin requirement in dry-run (#216)
  • cut path: add [skip ci] to bake-reset commit to suppress CI noise (#202)
### Added Added `examples/go-project` and `examples/node-project` — complete drop-in consumer bootstraps (config + the two wrapper workflows + a CHANGELOG skeleton + version file) you can `cp -r` into a new repo to adopt the toolkit, plus an `examples/README.md` index. Post-Phase-2 shape (no `toolkit_ref:` input; `@v0.16.0` pin). `api_call` structured event: `forgejo_api_call` now emits one JSON event per real API call (`endpoint`, `method`, `status`, `ms`) to stderr, giving Loki-ingestable observability over the toolkit's Forgejo interactions including latency and non-2xx failures. Emitted at the wrapper on every real call (not in dry-run); `ms` is the curl wall-clock in integer milliseconds. The emit is guarded so `forgejo-api.sh` keeps no hard dependency on the events substrate -- callers that sourced `events.sh` get the event, others degrade cleanly to no-emit. (Part 1 of #204; the workflow-level `cut_complete.ms_total` remains deferred to the next compose-script cut.) The toolkit now dogfoods its own `post_bump_hooks` on its own docs: a new hook (`scripts/hooks/update-doc-version-refs.sh`), wired in `release-toolkit.yml`, re-pins the adopter-facing example refs in `README.md` + `docs/integration.md` to the freshly-cut tag on every cut -- eliminating the manual doc-ref-pin drift class (#196 was the recurring manual fix; Shipwright #157 found the dogfooding gap). The hook preserves historical "feature-since" references (e.g. `v0.12.0+`) and pins only the `@vX.Y.Z` / `Latest:` / `Replace` example shapes. A new `RELEASE_TOOLKIT_RELEASE_DATE` env var is exported to all post_bump_hooks (the cut date, matching the CHANGELOG heading) so hooks can refresh dated examples. The post_bump_hooks docs now also document the staging convention (hooks must `git add` their own changes; release-prep commits only staged files). - **hooks**: dogfood post_bump_hooks for own doc ref-pins (#209) - **forgejo-api**: emit api_call structured event (#204 part 1) ### Changed docs: sweep adopter-facing ref pins (README + integration.md) to `@v0.16.0` (#196). ### Fixed Corrected adopter-facing `integration.md` drift found in the #158 docs-drift audit: the `version_files` strategy scope now states accurately that only `VERSION` + `package.json` are handled (replacing the invented, mutually-contradictory "v0.3 scope"/"v0.4 scope" labels), clarified that `python`/`multi` `release_type` values validate as config but need their version in a `VERSION`/`package.json` file (code-side gap tracked in #213), and documented that the cut path is idempotent on re-run (#128/#140 — safe to re-trigger a cancelled cut). `release-prep.sh --dry-run` no longer requires a configured `origin` remote when none is present. Dry-run skips every remote write, and the sole use of `origin` is owner/repo inference that (in dry-run) feeds only dry-run-noop API calls plus the echoed `owner=`/`repo=` outputs -- so a fresh scratch repo with no remote can now preview a cut. The real git-history read (`LAST_TAG` via `git describe`) uses local tags, not the remote. A *present-but-unparseable* remote stays fatal even in dry-run (a genuine misconfiguration dry-run should surface), and production cuts still hard-require `origin`. Also fixes a latent silent-abort in the same path: an unparseable remote previously tripped `set -e` at the owner/repo assignment before the "could not derive owner/repo" diagnostic could print. - **release-prep**: relax origin requirement in dry-run (#216) - **cut path**: add [skip ci] to bake-reset commit to suppress CI noise (#202)
chore: re-pin self-bootstrap to v0.17.0-rc.1 (#172)
All checks were successful
check-self-bootstrap / check (pull_request) Successful in 4s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
manifest-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (push) Successful in 3s
release / decide + act (push) Successful in 8s
release / release (push) Successful in 0s
dbe3211cbc
release-bot changed title from chore: re-pin self-bootstrap to v0.17.0-rc.1 (#172) to chore(release): v0.17.0 2026-06-28 14:52:26 +02:00
surveyor approved these changes 2026-06-28 15:04:47 +02:00
surveyor left a comment

APPROVED — re-pin @v0.17.0-rc.1 (second post-Phase-2 re-pin)

Clean, and the detached-bake invariant holds again — the mechanism is now proven on its second repin.sh exercise. FF onto main (cb321697).

Verified

  • Single-surface re-pin: release.yml + manifest-check.yml pin only uses:@v0.17.0-rc.1 — no toolkit_ref (the Phase-2 shape).
  • Detached-bake invariant: tag v0.17.0-rc.1 → commit e4c3dd31 — genuinely detached (≠ main HEAD cb321697) → BUILD_BAKED='v0.17.0-rc.1', while main HEAD stays 'main'. The bake lives on the tag, main stays clean. Same as #224, holding on the second exercise.
  • Version-consistent: v0.17.0-rc.1 is the right rc name — the batch's max bump is minor (from v0.16.0): #235 api_call + #237 dogfood-hook are feat/minor, #234 dry-run-relax is fix/patch (subsumed). So v0.17.0, and the rc name reflects the walk.

Note

The cumulative-batch-into-one-repin discipline (#234/#235/#237 → one re-pin) is the right call — minimizes the rc-churn that a per-PR re-pin would cause. And batching is exactly why the version walk lands on minor cleanly (the feats dominate).

Clean to merge (your gate). Once merged → main's check-self-bootstrap green → the rolling PR (75473c2a) ready for the v0.17.0 cut, carrying today's Phase-2-dogfood + api_call + dry-run-relax. Ping me for the §6 + cut when it fires — I'll run the standard close + watch the post-merge re-pin's check-green (the repin.sh self-bootstrap loop). 🎯

## APPROVED — re-pin @v0.17.0-rc.1 (second post-Phase-2 re-pin) Clean, and the detached-bake invariant holds again — the mechanism is now proven on its second repin.sh exercise. FF onto main (cb321697). ### Verified ✅ - **Single-surface re-pin**: `release.yml` + `manifest-check.yml` pin only `uses:@v0.17.0-rc.1` — no `toolkit_ref` (the Phase-2 shape). - **Detached-bake invariant**: tag v0.17.0-rc.1 → commit **e4c3dd31** — genuinely detached (≠ main HEAD cb321697) → `BUILD_BAKED='v0.17.0-rc.1'`, while main HEAD stays `'main'`. The bake lives on the tag, main stays clean. Same as #224, holding on the second exercise. - **Version-consistent**: v0.17.0-rc.1 is the right rc name — the batch's max bump is minor (from v0.16.0): #235 api_call + #237 dogfood-hook are `feat`/minor, #234 dry-run-relax is `fix`/patch (subsumed). So v0.17.0, and the rc name reflects the walk. ### Note The cumulative-batch-into-one-repin discipline (#234/#235/#237 → one re-pin) is the right call — minimizes the rc-churn that a per-PR re-pin would cause. And batching is exactly why the version walk lands on minor cleanly (the feats dominate). Clean to merge (your gate). Once merged → main's check-self-bootstrap green → the rolling PR (75473c2a) ready for the v0.17.0 cut, carrying today's Phase-2-dogfood + api_call + dry-run-relax. Ping me for the §6 + cut when it fires — I'll run the standard close + watch the post-merge re-pin's check-green (the repin.sh self-bootstrap loop). 🎯
Sign in to join this conversation.
No description provided.