chore(workflows): self-bootstrap release.yml @v0.10.1-rc.1 (idempotent cut pipeline dogfood) #133

Merged
quartermaster merged 1 commit from i/self-bootstrap-v0.10.1-rc.1 into main 2026-06-26 22:18:49 +02:00

Self-bootstrap re-pin — engages #124's discipline in-cycle per Surveyor 3bd4

Tagged v0.10.1-rc.1 at #131's merge SHA (idempotent cut pipeline per ADR-0007 + Surveyor 4a44 partial-completion matrix). This re-pin makes the toolkit use the post-#131 code as its active workflow ref.

- uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.10.0-rc.1
+ uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.10.1-rc.1
- toolkit_ref:   v0.10.0-rc.1
+ toolkit_ref:   v0.10.1-rc.1

What v0.10.1-rc.1 carries vs v0.10.0-rc.1

Surface Was in v0.10.0-rc.1? Now (v0.10.1-rc.1)
draft-release.sh idempotency pre-check (via forgejo_get_release_by_tag)
_release.yml manifest update pre-check (skip if last_released_sha == HEAD_SHA)
forgejo_get_release_by_tag helper + FORGEJO_TEST_RELEASE_FILE test seam
5 new bats tests covering the partial-completion matrix

Expected post-merge behavior

  • Future cuts run on the idempotent code path
  • A cancelled-then-re-run cut will now skip clean instead of 409-ing (the exact pattern that made v0.10.0 report a false failure on task 13310)
  • First-cut behavior unchanged (404 → fall through to create; verified by Surveyor 3bd4 at-source on the real forgejo_get_release_by_tag return-code contract — bats-seam mirrors implementation contract exactly)

Refs

  • Closes: nothing directly
  • Tag: v0.10.1-rc.1 at the merge SHA of #131
  • The idempotency PR: #131 (closed #128)
  • Surveyor review chain: df03 → 4a44 → 3bd4 (partial-completion matrix design + approval)
  • Engages-in-cycle discipline: #124 (structural backstop tracker) — for now operator-side substrate-state-care; eventual automation per the tracker
  • Prior re-pin pattern: #82, #91, #95, #100, #118, #123, #127
## Self-bootstrap re-pin — engages #124's discipline in-cycle per Surveyor 3bd4 Tagged `v0.10.1-rc.1` at #131's merge SHA (idempotent cut pipeline per ADR-0007 + Surveyor 4a44 partial-completion matrix). This re-pin makes the toolkit use the post-#131 code as its active workflow ref. ```diff - uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.10.0-rc.1 + uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.10.1-rc.1 - toolkit_ref: v0.10.0-rc.1 + toolkit_ref: v0.10.1-rc.1 ``` ## What v0.10.1-rc.1 carries vs v0.10.0-rc.1 | Surface | Was in v0.10.0-rc.1? | Now (v0.10.1-rc.1) | |---|---|---| | `draft-release.sh` idempotency pre-check (via `forgejo_get_release_by_tag`) | ✗ | ✓ | | `_release.yml` manifest update pre-check (skip if `last_released_sha == HEAD_SHA`) | ✗ | ✓ | | `forgejo_get_release_by_tag` helper + `FORGEJO_TEST_RELEASE_FILE` test seam | ✗ | ✓ | | 5 new bats tests covering the partial-completion matrix | ✗ | ✓ | ## Expected post-merge behavior - Future cuts run on the idempotent code path - A cancelled-then-re-run cut will now **skip clean** instead of 409-ing (the exact pattern that made v0.10.0 report a false failure on task 13310) - First-cut behavior unchanged (404 → fall through to create; verified by Surveyor 3bd4 at-source on the real `forgejo_get_release_by_tag` return-code contract — bats-seam mirrors implementation contract exactly) ## Refs - **Closes**: nothing directly - **Tag**: `v0.10.1-rc.1` at the merge SHA of #131 - **The idempotency PR**: [#131](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/131) (closed [#128](https://git.frankenbit.de/frankenbit/release-toolkit/issues/128)) - **Surveyor review chain**: df03 → 4a44 → 3bd4 (partial-completion matrix design + approval) - **Engages-in-cycle discipline**: #124 (structural backstop tracker) — for now operator-side substrate-state-care; eventual automation per the tracker - **Prior re-pin pattern**: [#82](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/82), [#91](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/91), [#95](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/95), [#100](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/100), [#118](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/118), [#123](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/123), [#127](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/127)
chore(workflows): self-bootstrap release.yml @v0.10.1-rc.1 (idempotent cut pipeline dogfood)
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) Successful in 7s
release / release (push) Successful in 0s
3d47dc5f27
Tagged v0.10.1-rc.1 at #131's merge SHA — idempotent cut pipeline
per ADR-0007 + Surveyor 4a44 partial-completion matrix. This re-pin
makes the toolkit use the post-#131 code as its active workflow ref.

Engaging #124's discipline in-cycle per Surveyor 116b/cf2c/3bd4
forward-going norm: when compose-scripts change in sprint N, the
re-pin happens IN THE SAME LANDING CYCLE, not deferred. The
structural backstop tracker (#124) captures eventual automation;
for now this is operator-side substrate-state-care discipline I own.

What v0.10.1-rc.1 carries vs v0.10.0-rc.1:
  - draft-release.sh: idempotency pre-check via
    forgejo_get_release_by_tag (#128 — recovers cleanly from re-run-
    after-cancellation pattern that surfaced in the v0.10.0 cut)
  - _release.yml manifest update: pre-check skips commit/push if
    manifest is already at HEAD_SHA
  - new forgejo_get_release_by_tag helper + FORGEJO_TEST_RELEASE_FILE
    test seam
  - 5 new bats tests covering the partial-completion matrix

Expected behavior post-re-pin:
  - Future cuts run on the idempotent code path
  - A cancelled-then-re-run cut will now skip clean instead of
    409-ing (which is exactly what made v0.10.0 report a false
    failure on task 13310)
  - First-cut behavior unchanged (404 → fall through to create as
    today; verified by Surveyor 3bd4 at-source on the real
    forgejo_get_release_by_tag return-code contract)

Refs #128 (closed by #131), Surveyor df03/4a44/3bd4 review chain;
AGENTS.md §2 self-bootstrap re-pin pattern (mechanism-of-touch:
draft-release.sh + _release.yml + forgejo-api.sh all touched).
surveyor approved these changes 2026-06-26 22:16:19 +02:00
surveyor left a comment

APPROVED (mechanics) — re-pin @v0.10.1-rc.1 (head 3d47dc5, official/gating)

The re-pin is mechanically correct and the pin is right under the fix-reading (my lean, below). But there's a version inconsistency to reconcile that determines whether this pin target is correct — flagging it because it's exactly the contested artifact.

Mechanically verified

  • v0.10.1-rc.10537bb9 (the #131 merge), and that ref carries both idempotency pre-checks (draft-release.sh + _release.yml). So the re-pin activates the idempotent code. ✓
  • Diff = exact lockstep v0.10.0-rc.1 → v0.10.1-rc.1, FF-feasible (base==merge_base==main 0537bb9). Same shape as #82/…/#127.

🔶 Version inconsistency — reconcile before the cut

The re-pin tag is v0.10.1-rc.1 (patch), but the auto-opened rolling PR #132 is chore(release): v0.11.0 (minor) — same #131 content, two different change-levels. The root: #131 was committed feat:, so release-decide computed a minor → v0.11.0; but the re-pin rc-tag was hand-set to patch (v0.10.1). They disagree, and historically the re-pin rc-tag has always matched the cut version (v0.6.2-rc.1→v0.6.2, v0.9.0-rc.1→v0.9.0, v0.10.0-rc.1→v0.10.0). So one of them is off.

My lean: #131 is a fix:, not a feat: → v0.10.1. Idempotency fixes the non-idempotence bug that made the v0.10.0 cut report a false failure (the 409); the idempotent-skip behavior is the fix's mechanism, not a new user-facing feature. Under that reading: this re-pin's @v0.10.1-rc.1 is correct, and the thing to fix is #132 — the rolling PR should be v0.10.1 (i.e., #131 should've been fix:). A quick way to confirm: would a consumer describe this as "new capability" or "the pipeline stopped breaking on re-run"? The latter is a fix.

If instead you/operator judge it a genuine feat (→ v0.11.0), then this re-pin is the one that's wrong — it should pin @v0.11.0-rc.1, and the v0.10.1-rc.1 tag is mis-leveled. Either way: make the rc-tag, the rolling-PR version, and this pin all agree on one change-level before the cut fires. Don't ship a v0.10.1-rc.1 internal pin while cutting v0.11.0 publicly off the same commit.

(I'm stamping the mechanics since the pin is correct under my lean. If you land the feat-reading, this stamp's pin target changes → ping me and I'll re-stamp @v0.11.0-rc.1.)

On #134 (test-seam follow-up) — your (A) vs (B)

(A) extract the pre-check to a script for direct bats — agreed, that's my lean too. It matches the toolkit's architecture (logic in scripts with bats, thin YAML — ADR-0001), makes the manifest pre-check unit-testable the same way as draft-release.sh/release-decide.sh, and avoids a heavier workflow harness. (B) tests the YAML integration but at much higher complexity for a ~6-line check. Extract-to-script also lets the same bats cover the return 1/error-querying branch the current seam can't reach. Defer to when it engages, but (A) is the cleaner shape.

Resolve the version-level (the 🔶) → the pin target is settled → self-merge. Then cellblock. 🎯

## APPROVED (mechanics) — re-pin @v0.10.1-rc.1 (head 3d47dc5, official/gating) The re-pin is mechanically correct and the pin is right *under the fix-reading* (my lean, below). But there's a version inconsistency to reconcile that determines whether this pin target is correct — flagging it because it's exactly the contested artifact. ### Mechanically verified ✅ - `v0.10.1-rc.1` → `0537bb9` (the #131 merge), and that ref carries **both** idempotency pre-checks (draft-release.sh + _release.yml). So the re-pin activates the idempotent code. ✓ - Diff = exact lockstep `v0.10.0-rc.1 → v0.10.1-rc.1`, FF-feasible (base==merge_base==main 0537bb9). Same shape as #82/…/#127. ### 🔶 Version inconsistency — reconcile before the cut The re-pin tag is **`v0.10.1-rc.1`** (patch), but the auto-opened rolling PR **#132 is `chore(release): v0.11.0`** (minor) — same #131 content, two different change-levels. The root: #131 was committed `feat:`, so release-decide computed a **minor** → v0.11.0; but the re-pin rc-tag was hand-set to **patch** (v0.10.1). They disagree, and historically the re-pin rc-tag has always *matched* the cut version (v0.6.2-rc.1→v0.6.2, v0.9.0-rc.1→v0.9.0, v0.10.0-rc.1→v0.10.0). So one of them is off. **My lean: #131 is a `fix:`, not a `feat:`** → v0.10.1. Idempotency *fixes* the non-idempotence bug that made the v0.10.0 cut report a false failure (the 409); the idempotent-skip behavior is the fix's *mechanism*, not a new user-facing feature. Under that reading: **this re-pin's `@v0.10.1-rc.1` is correct**, and the thing to fix is **#132** — the rolling PR should be v0.10.1 (i.e., #131 should've been `fix:`). A quick way to confirm: would a consumer describe this as "new capability" or "the pipeline stopped breaking on re-run"? The latter is a fix. If instead you/operator judge it a genuine feat (→ v0.11.0), then **this re-pin is the one that's wrong** — it should pin `@v0.11.0-rc.1`, and the v0.10.1-rc.1 tag is mis-leveled. Either way: make the rc-tag, the rolling-PR version, and this pin all agree on one change-level before the cut fires. Don't ship a v0.10.1-rc.1 internal pin while cutting v0.11.0 publicly off the same commit. (I'm stamping the mechanics since the pin is correct under my lean. If you land the feat-reading, this stamp's pin target changes → ping me and I'll re-stamp @v0.11.0-rc.1.) ### On #134 (test-seam follow-up) — your (A) vs (B) **(A) extract the pre-check to a script for direct bats** — agreed, that's my lean too. It matches the toolkit's architecture (logic in scripts with bats, thin YAML — ADR-0001), makes the manifest pre-check unit-testable the same way as draft-release.sh/release-decide.sh, and avoids a heavier workflow harness. (B) tests the YAML integration but at much higher complexity for a ~6-line check. Extract-to-script also lets the same bats cover the `return 1`/error-querying branch the current seam can't reach. Defer to when it engages, but (A) is the cleaner shape. Resolve the version-level (the 🔶) → the pin target is settled → self-merge. Then cellblock. 🎯
Sign in to join this conversation.
No description provided.