feat(recovery): a reusable workflow for the (B) cut-recovery, so adopters need no local rt #1135
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 project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1135
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
An adopter whose cut was interrupted can only recover by cloning the repo, obtaining
rtthroughfetch-rt.sh, runningrt recover-pending-cut, committing and pushing. That is the local-tooling burden the toolkit exists to remove, and it lands on them at their worst moment.What to build
reusable-recover-pending-cut.yml— a consumer-callable workflow that runs the verb (#1130) and opens a PR with the folded CHANGELOG.Shape, and the constraints are the substance
workflow_dispatchonly. Neverpush, neverschedule.release-cut.yml's own comment states the reason: a push trigger claims the concurrency group before any decision is made.main.reusable-release.yml'srt manifest-prstep is the pattern.rt recover-pending-cutalready refuses unless the tree is in exactly the state recovery (B) repairs; the workflow inherits that.🔴 It must never run automatically
docs/integration.md § Cut-cancellation recovery (#417)states that release-toolkit fails closed rather than auto-heals, because the choice between (A) and (B) is destructive in one direction: (B) applied to a published release orphans it. An automatic recovery always picks (B).The tool reports which recovery applies. A human still chooses. This workflow automates the execution of (B), never the decision to use it. (A) stays entirely manual.
AC
pending_cutwithout a local checkout or a localrt— scope, stated because this is a state claim: verified STRUCTURALLY. The workflow now bootstrapsrton the runner (composite/bootstrap-rt, the same artifact the four PR-CI gates use), so nothing local is required. It has NOT been exercised end-to-end against the live stuck cut — that run is the operator's per the dispatch, and no arm here substitutes for it.workflow_dispatchonly — an arm reddens if any other trigger is addedmainis not written directly.giteatwin set and passes the drift gate🔴 AC1 was FALSE when this PR was first pushed, and every arm was green
Dispositioning these boxes is what caught it. The reusable called
rtbare with no acquisition step, so on an adopter's runner every invocation is a command-not-found — the exact condition AC1 denies. It survived four mutation-verified arms,gitea-twin --check,register-checkand 98 bats because every arm greps the run block's TEXT. A gate that grades the form of a step cannot grade whether its program exists.Fixed in
63f3337with the three-step bootstrap, plus two arms mutated separately (drop the bootstrap → one red;git add -uback to-A→ a different red).📌 The staging was a second defect the first would have hidden: the toolkit checkout lands in
.release-toolkit/inside the consumer's tree, andgit add -Awould have committed it into their repository. It is nowgit add -u, which also makes the staging read the same population as thegit diff --quietgate above it — tracked-only.Depends on
#1094 — the split credential pair. This writes to the consumer's repo and opens a PR there, so it needs the git credential and the API token, tiered as
reusable-release.ymlalready does (RELEASE_TOOLKIT_GIT_TOKEN/RELEASE_TOOLKIT_API_TOKEN/RELEASE_TOKEN_OVERRIDE).Related
38a2b73decideroutes toupdateand re-preparesgit add -uis safe, not merely consistent #1137