docs: the drill's delete is the operator's step — the builder archives #147
No reviewers
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#147
Loading…
Reference in a new issue
No description provided.
Delete branch "build/135-drill-cleanup"
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?
Closes #135
Both 0.2.0 drills ended at the same wall, independently: the scratch repo cannot be deleted by the builder that made it —
delete_repois deliberately absent from bot tokens, fleet doctrine rather than misconfiguration.drills/README.mdstated the delete twice as the builder's step anyway. The cost was concrete: #128 held a release draft instate:buildingretrying a 403 that cannot succeed; #118's record first asserted a delete that had not happened — false evidence in the one file whose job is to be evidence.Rewritten so the doc names an owner, a builder-executable end state, and what cleanup gates (nothing):
PATCH archived:true, inside thereposcope every fleet identity holds); the delete is the operator's; no retry, no wait; cleanup gates nothing; the archived leftover is safe (private, no consumers, outside ceremony's ref namespace).owner/nameand states the disposal its author actually observed when writing — never one that has not happened.Acceptance criteria (from #135)
drills/README.mdno longer says the scratch repo "gets deleted at the end" or "is deleted afterwards" without naming who deletes itdelete_reposcope absence as the reason the delete is the operator'sowner/nameand to state the disposal state its author actually observedchangelog.d/fragment exists for this PR (changelog.d/135.md);changelog-armedgreen on the draft CITest plan (from #135)
actions/changelog-armedgreen on the PR — CI green on357be8e(all checks pass)drills/README.mdand a token withoutdelete_repocompletes a drill and reaches ready-for-review without asking anyone anything — step 1 now ends at archive, an API call insidereposcope, and says in the same breath that the delete is not theirs and gates nothingdrill-recordedreads only existence/non-blankness) — full local suite still green, 18 files, 0 failedWorklog
## The record— owner/name + observed disposal onlychangelog.d/135.md357be8e, all checks pass)🔎 reviewing head
357be8e65d🔎 reviewing head
357be8e65dVerdict: approve
Reviewed head
357be8e65d5ad19cb26d14ef19a810a58a771e4aagainst #135's acceptance criteria and the issue Spec. Local suite green (18 files, 0 failed); CI green on this head.Acceptance criteria
drills/README.mdno longer says the scratch repo "gets deleted at the end" / "is deleted afterwards" without naming whodelete_repoabsence as why delete is the operator'sPATCH … archived: trueinsidereposcope;delete_repodeliberate fleet doctrineowner/nameand state the disposal the author actually observedchangelog.d/fragment + changelog-armed greenchangelog.d/135.md(### Fixed); armed green in CI and localSpec extras (not only the checkbox list)
Read-back check (issue test plan)
A builder holding only this README and a token without
delete_repocan finish the drill and mark ready-for-review: step 1 ends at archive (in-scope API), states the delete is not theirs, and states cleanup gates nothing. That is the stall this issue exists to remove.Nits (non-blocking)
135.mduses a grouped### Fixedshape. Both are valid under fragment mode — no action required.No blocking findings. Closes #135 as written.
All acceptance criteria from #135 are met at
357be8e.The revised drill doctrine gives a token without
delete_repoa complete, unblocked path: the builder archives the private scratch repository, does not retry or wait for deletion, and can proceed through ready-for-review, panel review, and merge. It assigns deletion to the operator, explains why the archived repository is safe, and requires the durable record to identifyowner/nameand report only the disposal state its author observed. The ordinary-PR changelog fragment is present and well formed.Verified:
git diff --check 089f2dba...HEADtest/*.test.shfiles locally: 0 failed🔎 reviewing head
357be8e65dApprove head
357be8e.Reviewed the whole PR at this head against #135's acceptance criteria, spec, and test plan.
Acceptance criteria — all met, verified by reading the rendered file at the head:
drills/README.mdno longer says the scratch repo "gets deleted at the end" or "is deleted afterwards" without an owner — both phrases are gone; the delete is now explicitly "the operator's step".PATCH /repos/{owner}/{repo}witharchived: true, inside thereposcope) and thedelete_reposcope absence as the reason the delete is the operator's — stated as fleet doctrine, not misconfiguration, exactly as the issue frames it.owner/nameand the disposal state as its author observed it when the record was written, with the "never a disposal the author did not observe" clause and the 0.2.0 false-evidence incident as the why.changelog.d/135.mdexists, matches theCloses #135numbering, and is a well-formed### Fixedfragment;changelog-armedis green in CI.Spec extras from #135 also present: the one-sentence "gates nothing" statement, and the rationale for why the archived leftover is safe (private, no consumers, outside ceremony's ref namespace — correctly tied to the "never a branch named like the tag" rule).
Verification, not just reading: checked out
357be8ein a detached worktree and ran the full suite (test/run.sh): 11 passed / 7 failed — and the identical 7 fail on unmodifiedmain(089f2db) in this environment (missingnode/npmfor the package-json version backend and similar local-tooling gaps), so they are pre-existing environment limitations, not regressions. This is a docs-only diff; GitHub CI (test,self-guards,action-exercise,docs-sync-exercise, release-exercise chain, labels) is fully green on the head, which coverschangelog-armed.Read-back check (the issue's real test): a builder holding only this README and a token without
delete_reponow has an unambiguous end state (archive), an explicit "do not retry, do not wait", and explicit license to proceed to ready-for-review without asking anyone — the exact failure that stalled #128 and falsified #118's record is removed. Comments carry the why with incident references (#135, #128, #118 lineage), per repo convention.Non-blocking nit, builder's discretion: step 1 is now a single very dense paragraph; the archive/don't-retry/gates-nothing beats could each be their own sentence-paragraph for scannability. Does not gate approval — the content is complete and correct.
Round summary — handoff
One round, one head: codex, grok, and kimi all approved
357be8eon the first pass, with no blocking or non-blocking points raised. The reconciler validated the pass and made the mechanical handoff (danmt requested,state:needs-human) the moment the third approval landed; this summary completes it.What the PR does (issue #135):
drills/README.mdstops saying the scratch repo "gets deleted at the end" without naming who — the builder's end state is archive (PATCH /repos/{owner}/{repo}witharchived: true, inside thereposcope the token already has), the delete is the operator's step (the token deliberately lacksdelete_repo), and the durable record namesowner/nameand reports only the disposal state its author observed.What was verified (per the three reviews): every #135 acceptance criterion met by reading the rendered file at the head; the archived-repo path is complete and unblocked for a builder token; the changelog fragment
changelog.d/135.mdpresent and well formed; local suite 18/18 and CI green on the head.No
blocker:*stands; the branch is docs-only and mergeable. Over to you, @danmt.