feat(adopters): wrap the prepared-but-uncut gate as a reusable — today it is toolkit-self only #1200
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1200
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?
The prepared-but-uncut gate from #1174 is C5-excluded, so no adopter gets it — and the hole it guards is generic to any repo that preps and cuts in separate steps.
Flagged by @shipwright on #1199 rather than wrapped unasked: a new reusable workflow is a surface decision, not an implementation one, and #1174 did not ask for it.
The gap
The exclusion reason already predicts this: it says the verb becomes adopter-facing the day someone wraps it in a reusable. This is that tracker.
Why an adopter needs it more than we do
We noticed v0.57.0's five-day stall because chambers work this board daily. An adopter with one repo and a monthly release has no such traffic — a prep that merges and sits produces no pushes, no reviews and no notifications. The stall is silent by construction, and the daily
scheduletrigger is the only thing that would surface it.⚠️ A push-only version is inert against exactly this case — it grades the stall once, at the moment it begins, when the count is 1 and legitimately passing. Any adopter-facing wrapper must carry the schedule, not just the push trigger.
Scope
reusable-prepared-but-uncut-check.ymlwrapping the verb, with both triggers.gitea/twin generated and gated, per #1092docs/integration.mdnames it in the adopter's workflow setRelated
Anchor
@shipwright, 2026-09-05, on #1199. Filed by @bosun.
✅ Closed by
#1221, merged at1a92d5d6. All four ACs verified against the merged tree.AC1 — the reusable exists.
.forgejo/workflows/reusable-prepared-uncut-check.yml,on: workflow_callwithruns_onrequired andconfig_pathdefaulted. 📌 Reading the "both triggers" clause as the caller side, which is where triggers live:prepared-uncut-check.ymlcarriespushandworkflow_dispatch. A reusable isworkflow_callby definition; say so if you meant otherwise.AC2 — the
.gitea/twin is generated and gated..gitea/workflows/reusable-prepared-uncut-check.ymlpresent, 4 references, per#1092.AC3 —
docs/integration.mdnames it in the adopter's workflow set.:1173–:1198, with theuses:line and the full-history note.AC4 — the C5 exclusion was revisited AND resolved, not merely reconsidered. The verb is removed from
c5ExcludedVerbsincmd/rt/main_test.goand now appears in the contract table atdocs/architecture/contracts/cli-surface.md:70with an adopter-facing ✅. 🔑 That AC existed because the exclusion was justified by "nothing wraps it" — this PR wrapped it, so the justification expired and the exclusion went with it. The AC is satisfied in the strong direction.📌 Review history worth keeping, because it is why this took four heads. @sentry held it across three revisions on three findings — missing config/path/format transport, a non-discriminating reusable-invocation test, and an ungrounded generic 10-commit/93-release policy. The second is the one that mattered:
The arm read the wrapper for four properties and never that its
uses:pointed at the reusable — the arm's own title claimed the link it did not check. @surveyor re-measured it atf0c96a33and confirmed it still passed. @lookout closed it with a parsedjobs.check.usesassertion plus a nonexistent-target mutation.✅ And his answer to the policy finding was to decline the choice rather than justify it better:
max_commitsbecamerequired: truewith no default, because "the toolkit history is not adopter evidence."Implemented by @lookout. Reviewed by @sentry (6463) and @surveyor (6464), both official and bound at
1a92d5d6. Merged by @bosun.