chore(release): v0.6.0 #90

Merged
alex merged 1 commit from release-prep/rolling into main 2026-06-26 09:12:20 +02:00

Added

v0.5.1 substrate-correction sprint — bundles the operator-actions hygiene catches surfaced during the v0.5.0 cut + the docs accuracy gap from v0.5.0's slice 5. Closes #86, #87, #64.

scripts/release-decide.sh: Layer 2 cut-safeguard now retries with backoff (closes #86). The v0.5.0 cut empirically falsified the Layer 2 timing assumption — forgejo_find_pr_by_merge_sha lookup lagged ~8s behind a fresh merge, causing the protective fall-through to fire even though the merge had actually landed. Default retry budget is 3 retries × 5s = 15s wait; configurable via LAYER2_RETRY_COUNT / LAYER2_RETRY_DELAY env vars. After budget exhausted, falls back to "fail" (substrate-honest protective default preserved).

.forgejo/workflows/_release.yml + scripts/lib/forgejo-api.sh: cut path now auto-closes any stale rolling PR after cut success (closes #87). When a Layer 2 fall-through opens a precautionary rolling PR + the cut later succeeds (manually-dispatched or via retry-resolution), the fall-through-opened PR was previously left open as confusing stale state (operator framing: "first step on the stairway to version hell"). The cleanup uses the new forgejo_close_pr helper + leaves an explanatory comment linking #87.

tests/release-decide.bats: 5 new tests covering Layer-2 PASS/FAIL paths + #86 retry mechanics (closes #64). The deferred FAIL-path coverage from slice 1b is now in place — exercised via the new LAYER2_BYPASS_DRY_RUN + FORGEJO_TEST_PR_LOOKUP_FILE test hooks. Empirically validates the retry-then-success path matches the v0.5.0 cut's surfaced race-condition shape.

.forgejo/workflows/_release.yml: new optional release_token secret input enables path (α) autonomous cuts (#88). Consumers can wire a non-admin bot user's PAT (e.g., release-bot added to main's push_whitelist_usernames) and the workflow uses it for all Forgejo API calls — manifest PR auto-merges via the bot's whitelist privilege; operator sees a single PR per cut. Unset → falls back to secrets.GITHUB_TOKEN (graceful-degradation, the pre-v0.5.1 behavior).

docs/integration.md §Branch protection compatibility: rewritten to reflect path (α) reality + retire the (a)-was-fictional whitelist-forgejo-actions claim. The forgejo-actions identity is synthetic (uid: -2), not a real registered user — Forgejo's push_whitelist_usernames rejects it. Three paths now documented: (α) non-admin bot + token override (recommended), (β) admin-scope token (heavier), (γ) graceful-degradation default (no setup). AGENTS.md §8 gains a 4th empirical instance documenting the meta-lesson: verify external-system claims against the actual API/UI, not just by checking field names against documented behavior.

Consumer-side release.yml (toolkit's own): updated to pass secrets.RELEASE_TOOLKIT_TOKEN as release_token. Operator-action prerequisite for the toolkit's autonomous-cut transition: (1) provision release-bot PAT, (2) store as RELEASE_TOOLKIT_TOKEN repo secret, (3) add release-bot to main's push_whitelist_usernames.

Closes #86 + #87 + #64.

### Added **v0.5.1 substrate-correction sprint** — bundles the operator-actions hygiene catches surfaced during the v0.5.0 cut + the docs accuracy gap from v0.5.0's slice 5. Closes [#86](https://git.frankenbit.de/frankenbit/release-toolkit/issues/86), [#87](https://git.frankenbit.de/frankenbit/release-toolkit/issues/87), [#64](https://git.frankenbit.de/frankenbit/release-toolkit/issues/64). **`scripts/release-decide.sh`**: Layer 2 cut-safeguard now retries with backoff (closes [#86](https://git.frankenbit.de/frankenbit/release-toolkit/issues/86)). The v0.5.0 cut empirically falsified the Layer 2 timing assumption — `forgejo_find_pr_by_merge_sha` lookup lagged ~8s behind a fresh merge, causing the protective fall-through to fire even though the merge had actually landed. Default retry budget is 3 retries × 5s = 15s wait; configurable via `LAYER2_RETRY_COUNT` / `LAYER2_RETRY_DELAY` env vars. After budget exhausted, falls back to "fail" (substrate-honest protective default preserved). **`.forgejo/workflows/_release.yml` + `scripts/lib/forgejo-api.sh`**: cut path now auto-closes any stale rolling PR after cut success (closes [#87](https://git.frankenbit.de/frankenbit/release-toolkit/issues/87)). When a Layer 2 fall-through opens a precautionary rolling PR + the cut later succeeds (manually-dispatched or via retry-resolution), the fall-through-opened PR was previously left open as confusing stale state (operator framing: "first step on the stairway to version hell"). The cleanup uses the new `forgejo_close_pr` helper + leaves an explanatory comment linking #87. **`tests/release-decide.bats`**: 5 new tests covering Layer-2 PASS/FAIL paths + #86 retry mechanics (closes [#64](https://git.frankenbit.de/frankenbit/release-toolkit/issues/64)). The deferred FAIL-path coverage from slice 1b is now in place — exercised via the new `LAYER2_BYPASS_DRY_RUN` + `FORGEJO_TEST_PR_LOOKUP_FILE` test hooks. Empirically validates the retry-then-success path matches the v0.5.0 cut's surfaced race-condition shape. **`.forgejo/workflows/_release.yml`**: new optional `release_token` secret input enables **path (α) autonomous cuts** ([#88](https://git.frankenbit.de/frankenbit/release-toolkit/issues/88)). Consumers can wire a non-admin bot user's PAT (e.g., `release-bot` added to `main`'s `push_whitelist_usernames`) and the workflow uses it for all Forgejo API calls — manifest PR auto-merges via the bot's whitelist privilege; operator sees a single PR per cut. Unset → falls back to `secrets.GITHUB_TOKEN` (graceful-degradation, the pre-v0.5.1 behavior). **`docs/integration.md` §Branch protection compatibility**: rewritten to reflect path (α) reality + retire the (a)-was-fictional whitelist-forgejo-actions claim. The `forgejo-actions` identity is synthetic (uid: -2), not a real registered user — Forgejo's `push_whitelist_usernames` rejects it. Three paths now documented: (α) non-admin bot + token override (recommended), (β) admin-scope token (heavier), (γ) graceful-degradation default (no setup). `AGENTS.md` §8 gains a 4th empirical instance documenting the meta-lesson: verify external-system claims against the actual API/UI, not just by checking field names against documented behavior. **Consumer-side `release.yml` (toolkit's own)**: updated to pass `secrets.RELEASE_TOOLKIT_TOKEN` as `release_token`. Operator-action prerequisite for the toolkit's autonomous-cut transition: (1) provision `release-bot` PAT, (2) store as `RELEASE_TOOLKIT_TOKEN` repo secret, (3) add `release-bot` to `main`'s `push_whitelist_usernames`. Closes [#86](https://git.frankenbit.de/frankenbit/release-toolkit/issues/86) + [#87](https://git.frankenbit.de/frankenbit/release-toolkit/issues/87) + [#64](https://git.frankenbit.de/frankenbit/release-toolkit/issues/64).
forgejo-actions force-pushed release-prep/rolling from 372cb9a2bf to ba10f67cad
All checks were successful
release / decide + act (push) Successful in 4s
release / release (push) Successful in 0s
2026-06-26 01:48:34 +02:00
Compare
alex merged commit ba10f67cad into main 2026-06-26 09:12:20 +02:00
alex deleted branch release-prep/rolling 2026-06-26 09:12:20 +02:00
Sign in to join this conversation.
No description provided.