chore(release): v0.3.4 #53

Merged
quartermaster merged 2 commits from release-prep/v0.3.4 into main 2026-06-25 01:17:35 +02:00

Fixed

  • .forgejo/workflows/release-draft.yml + docs/integration.md template: drop the pull_request: types: [closed] auto-fire trigger entirely; release-draft is now operator-dispatched only via workflow_dispatch with an explicit tag input. Closes #41 substrate-honestly — Forgejo Actions' expression engine cannot reliably resolve github.* / forgejo.* accesses pulling from the pull_request event payload on .closed events (n=3 falsifications: PRs #48 + #49 + #50; the engine fail-opens on if: guards AND evaluates head-ref-shaped expressions to empty strings). The auto-fire mechanic was empirically broken since release-toolkit#41 was filed; every release cut to date used the manual scripts/draft-release.sh fallback. This change formalizes the working reality. A release-please-shaped redesign (push: branches: [main] trigger + state-file manifest + shell git-log walk — zero pull_request expression-engine exposure) is planned to reinstate auto-fire in the next architectural arc.

  • .forgejo/workflows/debug-event-payload.yml: removed entirely. The temporary probe never produced a log artifact (separate finding #47 — top-level event-triggered inline-steps workflows do not log in this Forgejo/act_runner). Probe lifecycle constraint met: #41's real root cause was captured via the _release-draft.yml reusable's failure-path log, not via the probe.

  • .forgejo/workflows/release-draft.yml (consumer-side, the toolkit's own copy): replace nested github.event.pull_request.head.ref accesses with the top-level github.head_ref convenience field at both the job's if: guard AND the version: input. Drop the .merged == true check entirely — same nested-access trap and dropping it is harmless (cancelled unmerged-closed release-prep/* PRs now fire the reusable, which fails-loud at the "CHANGELOG section missing" guard in draft-release.sh BEFORE creating any draft/tag — no spurious side-effect). Root-cause of #41: Forgejo's expression engine fail-opens on ANY github.event.pull_request.* nested access on pull_request.closed events (n=2 empirical from release-toolkit's own PRs #48 + #49 both firing despite non-release-prep head.refs + producing empty inputs.version downstream). Consumer integration docs updated to match.

  • release-draft: drop broken auto-fire — operator-dispatch only (closes #41)

  • release-draft: use github.head_ref convenience field — closes #41

Internal

  • .forgejo/workflows/debug-event-payload.yml (consumer-side, temporary): radical-minimization per Surveyor 894e structural-differentiator framing. Drop permissions: block, dotted step + job names, set -euo pipefail, all ${{ github.* }} expressions, all ::group:: markers. Keep ONLY name, both triggers, runs-on: go, a simple hello job with a single run: echo hello step. Bisect logic: if log appears → re-add elements one-by-one to find the breaker (suspects: job-level permissions:, dotted job name, inline-steps top-level handling). If still no log → it's a runner-registration/config substrate issue (#47 deeper finding). Probe still TEMPORARY; removed once #41 right-layer fix lands.

  • .forgejo/workflows/debug-event-payload.yml (consumer-side, temporary): drop the env: EVENT_JSON: ${{ toJSON(github.event) }} line + the full-JSON dump group. Hypothesis under test: toJSON(github.event) may fail to render on workflow_dispatch where the payload shape differs from pull_request, causing Forgejo Actions to silently reject the job before scheduling (n=2 vacuous-success at both triggers per #47). Individual field echoes survive — they return empty strings on missing-payload-fields, which the expression engine tolerates. Probe still TEMPORARY; removed once #41 right-layer fix lands.

  • .forgejo/workflows/debug-event-payload.yml (consumer-side, temporary): add workflow_dispatch trigger alongside the existing pull_request.closed trigger. The v0.3.3 cycle's autonomous probe fire produced NO task log despite Forgejo's workflow_runs API reporting success — substrate-data itself. workflow_dispatch lets the probe fire on-demand + verify it actually executes + captures the github.event payload for #41 root-causing. Probe still TEMPORARY; removed once #41's right-layer fix lands.

### Fixed - **`.forgejo/workflows/release-draft.yml`** + **`docs/integration.md`** template: drop the `pull_request: types: [closed]` auto-fire trigger entirely; `release-draft` is now **operator-dispatched only** via `workflow_dispatch` with an explicit `tag` input. Closes [#41](https://git.frankenbit.de/frankenbit/release-toolkit/issues/41) substrate-honestly — Forgejo Actions' expression engine cannot reliably resolve `github.*` / `forgejo.*` accesses pulling from the `pull_request` event payload on `.closed` events (n=3 falsifications: PRs #48 + #49 + #50; the engine fail-opens on `if:` guards AND evaluates head-ref-shaped expressions to empty strings). The auto-fire mechanic was empirically broken since release-toolkit#41 was filed; every release cut to date used the manual `scripts/draft-release.sh` fallback. This change formalizes the working reality. A release-please-shaped redesign (`push: branches: [main]` trigger + state-file manifest + shell git-log walk — zero `pull_request` expression-engine exposure) is planned to reinstate auto-fire in the next architectural arc. - **`.forgejo/workflows/debug-event-payload.yml`**: removed entirely. The temporary probe never produced a log artifact (separate finding [#47](https://git.frankenbit.de/frankenbit/release-toolkit/issues/47) — top-level event-triggered inline-steps workflows do not log in this Forgejo/act_runner). Probe lifecycle constraint met: #41's real root cause was captured via the `_release-draft.yml` reusable's failure-path log, not via the probe. - **`.forgejo/workflows/release-draft.yml`** (consumer-side, the toolkit's own copy): replace nested `github.event.pull_request.head.ref` accesses with the top-level `github.head_ref` convenience field at both the job's `if:` guard AND the `version:` input. Drop the `.merged == true` check entirely — same nested-access trap and dropping it is harmless (cancelled unmerged-closed release-prep/* PRs now fire the reusable, which fails-loud at the "CHANGELOG section missing" guard in `draft-release.sh` BEFORE creating any draft/tag — no spurious side-effect). Root-cause of [#41](https://git.frankenbit.de/frankenbit/release-toolkit/issues/41): Forgejo's expression engine fail-opens on ANY `github.event.pull_request.*` nested access on `pull_request.closed` events (n=2 empirical from release-toolkit's own PRs #48 + #49 both firing despite non-release-prep head.refs + producing empty inputs.version downstream). Consumer integration docs updated to match. - **release-draft**: drop broken auto-fire — operator-dispatch only (closes #41) - **release-draft**: use github.head_ref convenience field — closes #41 ### Internal - **`.forgejo/workflows/debug-event-payload.yml`** (consumer-side, temporary): radical-minimization per Surveyor 894e structural-differentiator framing. Drop `permissions:` block, dotted step + job names, `set -euo pipefail`, all `${{ github.* }}` expressions, all `::group::` markers. Keep ONLY `name`, both triggers, `runs-on: go`, a simple `hello` job with a single `run: echo hello` step. Bisect logic: if log appears → re-add elements one-by-one to find the breaker (suspects: job-level `permissions:`, dotted job name, inline-steps top-level handling). If still no log → it's a runner-registration/config substrate issue ([#47](https://git.frankenbit.de/frankenbit/release-toolkit/issues/47) deeper finding). Probe still TEMPORARY; removed once [#41](https://git.frankenbit.de/frankenbit/release-toolkit/issues/41) right-layer fix lands. - **`.forgejo/workflows/debug-event-payload.yml`** (consumer-side, temporary): drop the `env: EVENT_JSON: ${{ toJSON(github.event) }}` line + the full-JSON dump group. Hypothesis under test: `toJSON(github.event)` may fail to render on `workflow_dispatch` where the payload shape differs from `pull_request`, causing Forgejo Actions to silently reject the job before scheduling (n=2 vacuous-success at both triggers per [#47](https://git.frankenbit.de/frankenbit/release-toolkit/issues/47)). Individual field echoes survive — they return empty strings on missing-payload-fields, which the expression engine tolerates. Probe still TEMPORARY; removed once [#41](https://git.frankenbit.de/frankenbit/release-toolkit/issues/41) right-layer fix lands. - **`.forgejo/workflows/debug-event-payload.yml`** (consumer-side, temporary): add `workflow_dispatch` trigger alongside the existing `pull_request.closed` trigger. The v0.3.3 cycle's autonomous probe fire produced NO task log despite Forgejo's `workflow_runs` API reporting success — substrate-data itself. `workflow_dispatch` lets the probe fire on-demand + verify it actually executes + captures the `github.event` payload for [#41](https://git.frankenbit.de/frankenbit/release-toolkit/issues/41) root-causing. Probe still TEMPORARY; removed once #41's right-layer fix lands.
Generated by release-toolkit release-prep.sh.

Tracker: frankenbit/release-toolkit#1
docs(CHANGELOG): consolidate v0.3.4 section per Surveyor 208a cut-fold
All checks were successful
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
manifest-check / check (pull_request) Successful in 0s
16c1868ef8
Per Surveyor 208a: changelog.d held 5 #41 fragments (3 probe-internal
iterations + falsified head_ref fix + drop-auto-fire) — that's the
DEBUGGING ARC, not 5 user-facing changes. The probe net-zero'd (added
in v0.3.3, removed in v0.3.4) and the head_ref fix was falsified +
superseded by drop-auto-fire. None of the bisect-arc detail is
user-facing.

Consolidate to:
- Two-paragraph framing intro explaining what changed for consumers +
  pointing at the v0.4.0 redesign arc (#52)
- ONE ### Fixed bullet for the user-facing change (auto-fire dropped)
- Drop the entire ### Internal section (probe iterations are net-zero
  + belong in git history)
- Drop the two stale commit-subject bullets that release-prep grabbed

Same dedup-at-cut discipline applied at v0.3.0/v0.3.1/v0.3.2/v0.3.3.
Arc-detail lives in git log + #41/#47.
Sign in to join this conversation.
No description provided.