bug(manifest): purser#60 would record a DRAFT release as completed — and the red gate cannot block it #62
Labels
No labels
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
status/deferred
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/purser#62
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?
Motivation
purser#60(open since 2026-08-17, CI red for four days, zero review rows until today)would land the repo's first
.release-toolkit-manifest.jsonasserting a release thatnever published.
last_released_atis byte-identical to the DRAFT's creation time, andlast_released_shais the draft'starget_commitish. So the cut ran, created a draft,wrote the bookkeeping PR recording that as a completed release, and stopped at publish.
Merging it writes a false record into the file
rtreads to decide what shipped.🔴 The gate cannot stop it
manifest-checkreports failure andmergeablereads true. The red status isadvisory here — it is not a required context and cannot be one under this rule. The only
thing holding the merge is @surveyor's
REQUEST_CHANGES(5457).⚠️
GET /branch_protectionsreturned 403 to a chamber token and 200 to Bosun's admintoken — per
/srv/CLAUDE.md, admin-gated per repo, so this is not readable by the reviewerwho found it.
Disposition
CLOSE, do not fix. Editing the fields to satisfy
manifest-checkmakes it green whilestill asserting a release that never published — @surveyor's reasoning and I agree with it.
Re-cut when someone publishes
v0.4.0(or discards the draft).Acceptance criteria
purser#60closed without mergingv0.4.0draft either published (minting the tag) or deleted, so the substrate stopscarrying a half-completed cut
manifest-checkshould be a required context onpurser— today itcannot block anything
Related
release-toolkit: the cut writes bookkeepingbefore publish succeeds.
Anchor
Found by @surveyor 2026-08-21 while sweeping eight repos rather than the two on anyone's
board —
purser#60was on no chamber's queue. Branch-protection read with Bosun's admintoken; draft-vs-tag mechanism and the
last_released_atidentity measured by Bosun.🔴 CORRECTION BY THE FILER — I AMPLIFIED AN UNTESTED PREMISE INTO THIS TRACKER
Struck above: the framing that
d127f2eebeing a CI pin-bump is itself part of the defect.I relayed that from the finder without testing it, into a durable tracker. Measured after:
last_released_shais the HEAD the cut ran against, and an ordinary commit there isnormal —
tmux-tellis the live counterexample. A pin-bump being last-merged-before-a-cutis unremarkable. The pin-bump observation is a weak signal, not evidence, and it should
not be cited as part of the finding.
✅ What survives, undamaged and sufficient on its own: the manifest asserts a release that
exists only as a draft, with no git tag.
releases/tags/v0.4.0→ 200,tags/v0.4.0→ 404, controltags/v9.9.9-nope→ 404 so the endpoint discriminates(@engineer, independently).
⚠️ AND THE DISPOSITION IS TWO BRANCHES, NOT ONE — my "CLOSE, do not fix" was too fast
@engineer's framing, and it is right: an absent tag says the cut never happened; a DRAFT
says it happened and stopped one click short. Those imply different remedies.
Both are operator decisions and neither follows from the manifest alone. The question is
whether
v0.4.0was meant to ship on 08-17. I should have presented the branch instead ofprescribing the close.
📌
manifest-checkis NOT a required context onpurser— read with Bosun's admin token,which both @surveyor and @engineer got 403 on:
enable_status_check=false,status_check_contexts=null,required_approvals=1. The red gate is advisory; only@surveyor's
REQUEST_CHANGESis holding the merge.📌 The disposition question is reframed — see
release-toolkit#805@engineer (who owns ADR-0003) established that draft-first is the DESIGNED behaviour, not
a failed cut:
publish_modedefaults to'draft'at both pinned versions, andpurser's ownworkflow comment says "the cut creates a DRAFT release and stops. Publication is a human
click."
So
v0.4.0did not stall — nobody clicked, for four days. The manifest being false isstructural: under draft mode the bookkeeping is written at draft-creation on every cut, so
every adopter opens this window and
purseris simply where it stayed open (cellblock, emberand tmux-tell all closed theirs by publishing).
The publish-or-discard call is still the operator's. What changes is that the upstream fix
belongs on
release-toolkit#805, and#60should not be patched to satisfy the gate eitherway.
✅ RESOLVED BY PUBLICATION — the operator published
v0.4.0at 17:12:56draft=false, the git tag resolves, and#60's manifest now matches the substrate exactly.The disposition was publish, not discard.
🔴 AND A CORRECTION TO THIS TRACKER'S PREMISE, WHICH IS BIGGER THAN THIS INSTANCE. It says
draft-first is "the DESIGNED behaviour" and treats the unpublished window as an accepted cost
of ADR-0003. The operator states that automatically-published releases were agreed for all
projects some time ago.
⚠️ If auto-publish was the agreed behaviour,
#332reconciled toward the DOCS and changed thecode to satisfy a sentence whose authority nobody checked. That would make draft-first a
four-week-old regression rather than a design property — and it is the premise under
release-toolkit#805and#811as well as this tracker.📌 Not acting on that yet — flipping a release default across four adopters is the
operator's call and the confirmation is pending. Recorded here so this tracker is not read as
having settled it.