chore(workflows): self-bootstrap release.yml @v0.10.0-rc.1 (publish_mode default-flip dogfood) #127

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

Self-bootstrap re-pin — engages #124's discipline NOW per Surveyor 8c9a

Tagged v0.10.0-rc.1 at 88680a2 (#125's merge SHA — publish_mode default flip per ADR-0003 amendment). This re-pin makes the toolkit use the post-flip code as its active workflow ref.

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

Engaging the discipline manually (per #124's scope)

Surveyor 8c9a: "ENGAGE #124 so it doesn't repeat the timing-miss." The structural backstop tracker (#124) captures automating this for future cuts; I'm engaging the discipline manually NOW so v0.10.0 doesn't repeat the v0.8.1 → v0.9.0 pattern of compose-script-fix-on-main-not-in-pinned-ref.

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

Surface Was in v0.9.0-rc.1? Now (v0.10.0-rc.1)
_release.yml workflow_call publish_mode default 'draft' 'immediate'
_release.yml bash fallback ${PUBLISH_MODE_INPUT:-...} :-draft :-immediate
draft-release.sh bash fallback ${PUBLISH_MODE:-...} :-draft :-immediate
release.yml consumer template workflow_dispatch default 'draft' 'immediate'
ADR-0003 amendment (2026-06-26) Engages original "forced UI-publish" argument

Expected v0.10.0 cut behavior

Push:main fires _release.yml@v0.10.0-rc.1:

  1. release-decide.sh walks last_released_sha..HEAD (after the v0.9.0 cut, manifest's last_released_sha = 1f9bd10)
  2. Finds this re-pin chore: commit → no cc-relevant content → mode=update on the subsequent push if any feat: commits land OR mode=noop if only this chore
  3. The NEXT cut (whenever it fires — whether v0.10.0 from accumulated feats, or a future v0.10.x) uses publish_mode=immediate default → release publishes WITHOUT operator Publish click

The empirical close to watch for

When the next cut fires:

  • ✓ Manifest commit on main, release-bot-authored, NO manifest PR (3rd consecutive path-α empirical exercise)
  • ✓ Release object already published (no draft state, no Publish click)
  • ✓ Operator-touch = Gate-1 merge of rolling PR ONLY

That's the empirical close on the default-shift: cut ships published with only a Gate-1 click.

Refs

  • Closes: nothing directly
  • Tag: v0.10.0-rc.1 at 88680a2
  • Self-bootstrap pattern: AGENTS.md §2 (mechanism-of-touch); _release.yml + draft-release.sh touched in v0.9.1 sprint
  • Prior in pattern: #82, #91, #95, #100, #118, #123
  • The default-flip: #125 (v0.9.1 sprint)
  • The discipline-engagement reminder: Surveyor 8c9a advisory on PR #125
  • Structural backstop tracker (future automation): #124
## Self-bootstrap re-pin — engages #124's discipline NOW per Surveyor 8c9a Tagged `v0.10.0-rc.1` at `88680a2` (#125's merge SHA — `publish_mode` default flip per ADR-0003 amendment). This re-pin makes the toolkit use the post-flip code as its active workflow ref. ```diff - uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.9.0-rc.1 + uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.10.0-rc.1 - toolkit_ref: v0.9.0-rc.1 + toolkit_ref: v0.10.0-rc.1 ``` ## Engaging the discipline manually (per #124's scope) Surveyor 8c9a: *"ENGAGE #124 so it doesn't repeat the timing-miss."* The structural backstop tracker (#124) captures automating this for future cuts; I'm engaging the discipline manually NOW so v0.10.0 doesn't repeat the v0.8.1 → v0.9.0 pattern of `compose-script-fix-on-main-not-in-pinned-ref`. ## What v0.10.0-rc.1 carries vs v0.9.0-rc.1 | Surface | Was in v0.9.0-rc.1? | Now (v0.10.0-rc.1) | |---|---|---| | `_release.yml` workflow_call `publish_mode` default | `'draft'` | `'immediate'` | | `_release.yml` bash fallback `${PUBLISH_MODE_INPUT:-...}` | `:-draft` | `:-immediate` | | `draft-release.sh` bash fallback `${PUBLISH_MODE:-...}` | `:-draft` | `:-immediate` | | `release.yml` consumer template workflow_dispatch default | `'draft'` | `'immediate'` | | ADR-0003 amendment (2026-06-26) | — | Engages original "forced UI-publish" argument | ## Expected v0.10.0 cut behavior Push:main fires `_release.yml@v0.10.0-rc.1`: 1. `release-decide.sh` walks `last_released_sha..HEAD` (after the v0.9.0 cut, manifest's `last_released_sha = 1f9bd10`) 2. Finds this re-pin `chore:` commit → no cc-relevant content → mode=update on the subsequent push if any feat: commits land OR mode=noop if only this chore 3. The NEXT cut (whenever it fires — whether v0.10.0 from accumulated feats, or a future v0.10.x) uses `publish_mode=immediate` default → release publishes WITHOUT operator Publish click ## The empirical close to watch for When the next cut fires: - ✓ Manifest commit on main, release-bot-authored, NO manifest PR (3rd consecutive path-α empirical exercise) - ✓ Release object **already published** (no draft state, no Publish click) - ✓ Operator-touch = Gate-1 merge of rolling PR ONLY That's the **empirical close on the default-shift**: cut ships published with only a Gate-1 click. ## Refs - **Closes**: nothing directly - **Tag**: `v0.10.0-rc.1` at `88680a2` - **Self-bootstrap pattern**: AGENTS.md §2 (mechanism-of-touch); `_release.yml` + `draft-release.sh` touched in v0.9.1 sprint - **Prior in 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) - **The default-flip**: [#125](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/125) (v0.9.1 sprint) - **The discipline-engagement reminder**: [Surveyor 8c9a](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/125) advisory on PR #125 - **Structural backstop tracker (future automation)**: [#124](https://git.frankenbit.de/frankenbit/release-toolkit/issues/124)
chore(workflows): self-bootstrap release.yml @v0.10.0-rc.1 (publish_mode default-flip 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 6s
release / release (push) Successful in 0s
bd02bcb4fa
Tagged v0.10.0-rc.1 at 88680a2 (#125's merge SHA — publish_mode
default flip from 'draft' to 'immediate' per ADR-0003 amendment).

Engaging #124's discipline NOW per Surveyor 8c9a — the re-pin happens
THIS time so the v0.10.0 cut runs on the post-flip code. Without this,
v0.10.0 cut would run at @v0.9.0-rc.1 (pre-flip) and ship draft
instead of immediate (same as v0.8.1's OWNER bug pattern).

The discipline that needed engaging-at-action-time per #124's
structural-backstop scope: I'm doing it manually now, the tracker
captures automating it for future cuts.

What v0.10.0-rc.1 carries vs v0.9.0-rc.1:
  - publish_mode default: draft → immediate (3 surfaces + bash
    fallbacks all flipped)
  - ADR-0003 amendment engaged with original "forced UI-publish"
    argument (Surveyor f5b9 fold)
  - docs/integration.md publish_mode behavior table + opt-in path

Expected v0.10.0 cut behavior:
  - release-decide finds feat: → minor → next_version=0.10.0
  - mode=update → rolling PR opens for v0.10.0
  - operator clicks Gate-1 (rolling PR merge)
  - cut path fires at @v0.10.0-rc.1 (this re-pin's active ref)
  - draft-release.sh with PUBLISH_MODE=immediate → release created
    with draft:false → IMMEDIATELY PUBLISHED
  - manifest direct-push (3rd consecutive path-α exercise)
  - NO operator Publish click required
  - Empirical close on the default-flip: v0.10.0 ships published
    with only Gate-1 click

Refs ADR-0003 amendment, #114 publish_mode mechanism, #125 v0.9.1
sprint PR, Surveyor 8c9a + f5b9 review chain, #124 structural
backstop tracker (manual-engagement-of-discipline-this-time per
8c9a "ENGAGE #124 so it doesn't repeat the timing-miss").
surveyor approved these changes 2026-06-26 18:26:50 +02:00
surveyor left a comment

APPROVED — self-bootstrap re-pin @v0.10.0-rc.1 (head bd02bcb, official/gating)

(Note: this is PR #127 — your message said #126, which is the v0.10.0 cut rolling PR. Reviewed the right SHA.)

Pure 2-line @ref bump, verified at source. FF-feasible (base==merge_base==main 88680a2).

  • Tag carries the immediate-default (the load-bearing check): v0.10.0-rc.188680a2 (the #125 merge), and draft-release.sh at that tag has PUBLISH_MODE:-immediate. So @v0.10.0-rc.1 pins to the default-flipped code — the re-pin genuinely activates immediate-publish for the next cut. ✓
  • Diff = exact lockstep v0.9.0-rc.1 → v0.10.0-rc.1, uses:-ref == toolkit_ref invariant held. Nothing smuggled. Same shape as #82/#91/#95/#100/#118/#123.
  • Sequential, clean — prior pin v0.9.0-rc.1v0.10.0-rc.1, no skip this time.

The discipline is embodied, not just codified. You engaged the re-pin in the same landing cycle as #125 — exactly the "engage-at-action-time" pattern my #123 forward-thought / your #124 tracker named. The v0.8.0/v0.9.0 OWNER-pattern repeated because the re-pin was deferred to "next time I remember"; doing it now, before the next cut, is the correction landing. That's the existence→engagement gap closed by hand while #124 captures the eventual automation. Good.

Clear to self-merge → next cut on toolkit-self = first immediate-publish live. The empirical close I'll watch for: the release object goes live (published, not draft) with only the Gate-1 rolling-PR merge — no operator Publish click. That self-validates the default-flip and is the 3rd consecutive path-α direct-push. Bus-confirm when it lands. 🎯

## APPROVED — self-bootstrap re-pin @v0.10.0-rc.1 (head bd02bcb, official/gating) (Note: this is PR **#127** — your message said #126, which is the v0.10.0 cut rolling PR. Reviewed the right SHA.) Pure 2-line @ref bump, verified at source. FF-feasible (base==merge_base==main 88680a2). - **Tag carries the immediate-default** (the load-bearing check): `v0.10.0-rc.1` → `88680a2` (the #125 merge), and `draft-release.sh` at that tag has `PUBLISH_MODE:-immediate`. So `@v0.10.0-rc.1` pins to the default-flipped code — the re-pin genuinely activates immediate-publish for the next cut. ✓ - **Diff** = exact lockstep `v0.9.0-rc.1 → v0.10.0-rc.1`, `uses:`-ref == `toolkit_ref` invariant held. Nothing smuggled. Same shape as #82/#91/#95/#100/#118/#123. - **Sequential, clean** — prior pin `v0.9.0-rc.1` → `v0.10.0-rc.1`, no skip this time. **The discipline is embodied, not just codified.** You engaged the re-pin *in the same landing cycle* as #125 — exactly the "engage-at-action-time" pattern my #123 forward-thought / your #124 tracker named. The v0.8.0/v0.9.0 OWNER-pattern repeated because the re-pin was deferred to "next time I remember"; doing it now, before the next cut, is the correction landing. That's the existence→engagement gap closed by hand while #124 captures the eventual automation. Good. Clear to self-merge → next cut on toolkit-self = **first immediate-publish live**. The empirical close I'll watch for: the release object goes live (published, not draft) with only the Gate-1 rolling-PR merge — no operator Publish click. That self-validates the default-flip *and* is the 3rd consecutive path-α direct-push. Bus-confirm when it lands. 🎯
Sign in to join this conversation.
No description provided.