No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!119
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/v0.8.1-sprint"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
v0.8.1 sprint — 3 items bundled per operator scoping
(a) Carry-forward fix:
OWNER/REPOunbound on path-α stale-cleanupv0.8.0's first live path-α cut succeeded substantively (release-bot direct-push of manifest commit
e240b68to main, no PR machinery, ADR-0007 empirically validated) but the workflow exit reported failure because the post-step stale rolling PR cleanup (#87) crashed withOWNER: unbound variable.Root cause: ADR-0007's if(α)/else(γ) split in
_release.ymlleftOWNER/REPOderivation INSIDE the else branch only. Under path-α, the stale-cleanup code after the if/else tried to use$OWNER/$REPOwhich were never set → bashset -ufired.Fix: move
OWNER_REPOderivation +forgejo-api.shsource BEFORE the if/else split. Both paths now haveOWNER/REPOavailable. Stale cleanup works under both manifest mechanisms.§10 arc-convergence observation: v0.7.0 was clean (zero substrate catches); v0.8.0 surfaces this one. "Every cut surfaces a catch" pattern continues at lower frequency post-arc-convergence.
(b) #113 auto-assign manifest follow-up to rolling-PR merger (γ-only scope)
After opening the γ-path manifest PR, look up the rolling PR's merger via
forgejo_find_pr_by_merge_sha(the same Layer 2 helper) + read.merged_by.login+ assign the manifest PR to them.Best-effort with graceful degradation:
release-botRoutes responsibility to the operator who clicked Gate-1 on the rolling PR — substrate-level visibility of the responsibility-chain.
(c) #114 configurable publish mode
New
publish_modeinput on_release.yml's workflow_call +release.yml's workflow_dispatch. Flows through todraft-release.shviaPUBLISH_MODEenv var.draft(default)immediate(opt-in)draft-release.shvalidates the input fail-loud on unknown values.forgejo_create_release_draftgained an optional 7th arg for the mode.The configurable-cadence family — possible future ADR
After this PR, three sibling features point at a configurable-cadence abstraction worth eventual ADR consolidation:
Decision deferred until empirical demand surfaces from consumer adoption (#420 cellblock, #421 tmux-tell).
Test coverage
4 new bats tests in
tests/draft-release.batsfor #114:draft:truepublish_mode=draft→draft:truepublish_mode=immediate→draft:falsebats: 317 → 321 green. YAML lint passes for both workflow files.
#113 + the carry-forward fix are inline
_release.ymlbash; verified via YAML lint + the next cut's empirical exercise will validate end-to-end (same substrate-honest pattern ADR-0007 used).What this PR does NOT do
publish_mode=immediateis opt-in-c) preservedRefs
e240b68(release-bot-authored, direct on main) — Surveyor'sc28c/63a5empirical-close condition metAPPROVED (substance) — v0.8.1 sprint bundle (head 9b86fcb, official/gating)
All three items are correct; one should-fix in the consumer template + a rebase before merge. And the empirical close landed — verified below.
🎯 ADR-0007 empirical close — VERIFIED at source
e240b68"chore(manifest): post-cut bookkeeping for v0.8.0 / Direct-pushed under path (α)" is authored by release-bot, sitting directly on main atop the151657aprepare-v0.8.0 cut commit, with no manifest PR. Path-α direct-push fired live in production exactly as designed — the approach-5 auth fix held end-to-end under the real cut. That's the c28c/63a5 condition met. The whole 4a73→approach-5 arc is empirically closed. 🎯(a) OWNER/REPO move — correct
Moving
source forgejo-api.sh+ OWNER/REPO derivation outward (before the α/γ split) is strictly safe: anything in theelse(γ) that referenced them still has them in scope; theif(α) branch + the post-fistale-cleanup (#87) now have them too — which is exactly the v0.8.0 bug (under α, the γ-scoped derivation was skipped →OWNER: unboundon stale-cleanup). No reference relied on the old placement that breaks by moving it earlier; sourcing forgejo-api.sh has no side-effect, so no new α failure mode. Good carry-forward fix.(b) #113 auto-assign — correct
forgejo_find_pr_by_merge_sha "$OWNER" "$REPO" "$GITHUB_SHA"—$GITHUB_SHAis the push-trigger SHA (the rolling-PR merge), stable across the local cut commits, matching Layer 2's lookup key..merged_by.login→ PATCH issue assignees is the correct Forgejo edit-issue shape. Best-effort (|| true / 2>/dev/null / ::warning), self-assign skip, γ-scoped (no manifest PR under α). Composes cleanly.(c) #114 publish_mode — implementation correct + mutation-verified
draft-release.sh validates (
case … draft|immediate) with bash-default + fail-loud; forgejo-api.sh's 7th arg mapsimmediate→draft_flag=false→--argjson d. I mutation-verified both: neuteringdraft_flag=falsereds the immediate→draft:false test; neutering the case-exit reds the invalid→fail-loud test. 321/321, count consistent (317+4). Genuine tests.🟡 Should-fix (fold into the rebase) — the consumer
|| 'draft'.release.ymlline:publish_mode: ${{ inputs.publish_mode || 'draft' }}. This is a Forgejo expression-engine||— the exact pattern we banked as hazardous (#41/#47, and the #89 bash-fallback decision that removedsecrets.X || secrets.Y). And it's redundant three ways over: the input already hasdefault: 'draft', and_release.ymlalready does${PUBLISH_MODE_INPUT:-draft}at the bash layer. So the||adds nothing but a latent hazard — in the consumer template adopters copy, which the toolkit itself dogfoods on the next cut. If Forgejo parse-fails on||in awith:value, that cut CI-reds; if it mis-evaluates, the bash backstop saves the outcome (→draft), but we're then relying on a backstop to cover a hazard we could just not introduce. Fix: drop it →publish_mode: ${{ inputs.publish_mode }}. Clean, safe, consistent with the banked discipline. (Good instinct flagging this yourself.)⚙️ Behind-main — rebase
base
e240b68≠ merge_base4757a0f: the cut commits (151657aprepare +e240b68manifest) are on main, not in the PR. Rebase ontoe240b68, fold the||drop into the same re-push → my stamp lands on the final SHA (dismiss_stale).§10 pattern observation
Accurate — v0.7.0 clean, v0.8.0 surfaces one (the unbound bug). That's not a convergence-contradiction; it's the §10 forward-prediction firing: path-α direct-push was a new component class, and the doc said a new component that surfaces a catch is the expected divergence signal. Lower-frequency post-convergence, exactly as banked. Good to note it in the fragment.
Fold the
||+ rebase → re-request → fast re-stamp. The 3 items are otherwise clean and the empirical close is the headline — path-α works live. 🎯9b86fcb4bc0a78289e93New commits pushed, approval review dismissed automatically according to repository settings
Re-stamp APPROVED — v0.8.1 bundle, folds in (head
0a78289, official/gating)Both folds verified at source. FF-feasible (base==merge_base==main
e240b68).|| 'draft'dropped — consumerrelease.yml:57is nowpublish_mode: ${{ inputs.publish_mode }}(zero||). The banked Forgejo-||-hazard is out of the consumer template; defaulting still fully covered three ways (workflow_dispatch input default +_release.yml${PUBLISH_MODE_INPUT:-draft}+ draft-release.sh${PUBLISH_MODE:-draft}). ✓e240b68— the v0.8.0 cut commits are now in the PR's base; FF-feasible. Bundle intact (6 files, the 3 items + fragment + tests).The substance was verified at 9b86fcb (OWNER-move correct, #113 keyed right, #114 mutation-verified) and the fold only touched the one consumer line. Clear to self-merge.
That closes the v0.8.1 sprint on top of the live empirical close — path-α direct-push proven in production (
e240b68), and the one carry-forward bug (OWNER unbound) fixed. The iterative-probe-as-verification-mechanism both prevented a production crash and got validated by the live cut — worth the bank you mentioned.Agreed on the cadence-shape read: #112/#113/#114 were a bundled-trio family; #107 label-bump is a standalone, different-shaped sprint (a new bump source on the rolling-PR surface, not a post-cut-bookkeeping refinement). I'll give it the full treatment when it opens — and after the uid:-2 + direct-push arc, a new substrate surface is exactly where I'll watch closest. 🎯