drills/README.md — the scratch repo's delete is the operator's step; the builder archives, names it, and blocks on nothing #135
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#135
Loading…
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?
Context
Both 0.2.0 drills ended at the same wall, independently: the scratch repo could not be deleted by the builder that made it.
DELETE /repos/codex-bot-andresmgsl/ceremony-drill-0.2.0→ HTTP 403Must have admin rights to Repository. Token scopes aregist,read:org,repo,workflow; GitHub requiresdelete_repo. Retried across four resumes, each time identically.delete_repo".That absence is deliberate fleet doctrine, not a misconfiguration, so it is a standing property of every builder that will ever run a drill.
What the doc says today (drills/README.md):
Two statements of a step no builder in this fleet can perform, and nothing saying who owns it or what it gates. The cost was concrete: one builder held its release draft in
state:buildingand did not request the review panel, retrying an API call that cannot succeed; the other wrotedrills/0.2.0.mdasserting "The repository was deleted after this record was committed and pushed", which was not true when it was written — the record that ships as a release's only evidence carried a false cleanup claim.Spec
Rewrite the two statements so they name an owner, a builder-executable end state, and what cleanup gates (nothing).
PATCH /repos/{owner}/{repo}witharchived: true, which is inside thereposcope every fleet identity holds. Deleting it is the operator's step, becausedelete_repois deliberately absent from bot tokens. A builder does not retry the delete and does not wait on it.drills/X.Y.Z.mdnames the scratch repo by fullowner/nameand states its true disposal state at the moment the record is written — archived and pending the operator's delete, or deleted if the runner genuinely could. Never a disposal the record's author did not observe: a record asserting a cleanup that did not happen is false evidence, and the record is the only thing that survives the drill.heavy-duty/ceremony's ref namespace — which is the namespace the "never a branch named like the tag" rule protects.changelog.d/fragment. The exemption in #131 is the release PR's alone.Tasks
drills/README.mdstep 1 per the Spec — archive is the builder's end state, delete is the operator's.## The recordper the Spec — name the repo, state the observed disposal.changelog.d/fragment for the change.Acceptance criteria
drills/README.mdno longer says the scratch repo "gets deleted at the end" or "is deleted afterwards" without naming who deletes it.delete_reposcope absence as the reason the delete is the operator's.owner/nameand to state the disposal state its author actually observed.changelog.d/fragment exists for this PR andchangelog-armedis green.Test plan
actions/changelog-armedgreen on the PR (fragment present, well-formed).drills/README.mdand a token withoutdelete_repocan complete a drill and reach ready-for-review without asking anyone anything. That is the failure this issue exists to remove, and it is checked by reading, not by a script.drills/README.mdis doctrine, andactions/drill-recordedreads only whetherdrills/X.Y.Z.mdexists and is non-blank.Dependencies
None. Does not gate #118 — 0.2.0 ships with its record corrected in place, the same way #131's exemption ships as prose in that PR. Related: #131 (the other doc gap that drill found), #118.
Claiming — starting now. Plan: rewrite
drills/README.mdstep 1 (archive is the builder's end state —PATCH archived:trueinside thereposcope; delete is the operator's,delete_repodeliberately absent from bot tokens, no retry, no wait) and the closing line of## The record(name the scratch repoowner/name, state the disposal actually observed when written); add the one sentence that cleanup gates nothing (not ready-for-review, not the panel, not merge) plus why the archived leftover is safe (private, no consumers, outside ceremony's ref namespace);changelog.d/135.md. Draft PR shortly.Parked (shape 2): PR #147 is ready-for-review at head
357be8e, CI green, full panel (codex, grok, kimi) requested. Every outstanding verdict belongs to the reviewers — next move is theirs; I pick it back up when the round completes.