chore(release): v0.10.1 #132
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
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!132
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "release-prep/rolling"
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?
Added
Idempotent cut pipeline (#128) — closes the partial-completion gap surfaced by Surveyor's df03/4a44 reconciliation of the v0.10.0 cut.
The artifact this closes
The v0.10.0 cut's task 13307 substantively completed the cut (manifest direct-pushed, release published) but got cancelled mid-flight when its own manifest push fired a new push:main event. The operator's manual re-run (task 13310) called Forgejo's release-create API, which returned 409 Conflict because v0.10.0 already existed — the workflow exit code reported failure even though the substrate was correct.
Partial-completion matrix
Per Surveyor 4a44 design point: the design handles the partial-completion case, not just full-completion. The cut path has two mutation surfaces — release creation + manifest update — and either can have completed independently when a workflow gets cancelled.
Each mutation surface decides independently. The re-run after a cancellation completes whatever remains; nothing fires a 409 against work already done.
What changed
scripts/lib/forgejo-api.sh: newforgejo_get_release_by_taghelper. Returns the release JSON on stdout if found, empty stdout if 404, exit 1 on other errors. Test seamFORGEJO_TEST_RELEASE_FILEmirrors theFORGEJO_TEST_PR_LOOKUP_FILEpattern from the Layer-2 test seam (line-consumed canned responses).scripts/draft-release.sh: new pre-check beforeforgejo_create_release_draftqueries existing release state. Decides between idempotent skip + machine-readable outputs (with newidempotent=1marker), fail-loud on state mismatch, or fall through to create..forgejo/workflows/_release.ymlcut path: new pre-check before the manifest write reads existing manifest'slast_released_sha+ compares withHEAD_SHA. If equal, skip the write/commit/push entirely.tests/draft-release.bats: 5 new tests covering the matrix — no release (normal create), exists+matches-immediate (skip), exists+matches-draft (skip), exists+draft-mismatch (fail), exists+target_commitish-mismatch (fail).Test count
326/326 bats green (was 321; +5 new idempotency tests).
What this does NOT do
_release.ymlmanifest pre-check — workflow-level test seam is its own substrate change. The pre-check is small (~6 lines), usesjq -r '.last_released_sha // empty'(same pattern as the existing write block), and the failure mode is "skip the commit/push," which is benign if buggy (the workflow would re-do the commit, which is the prior behavior). Surveyor 4a44 design point on partial-completion still mutation-verified for the release-create surface, which is the load-bearing one.Refs
Closes: #128
Empirical artifact: v0.10.0 cut run 253 (task 13310) failure 2026-06-26
Surveyor df03 + 4a44 reconciliation chain surfaced the partial-completion design requirement
Operator engagement 2026-06-26: "are the pipelines idempotent? Would it be possible to become them idempotent, if not already so?" — confirmed scope + sequencing
idempotent cut pipeline — pre-check existing release + manifest state (closes #128)
chore(release): v0.11.0to chore(release): v0.10.1952f9b3bf53a97fea3c9