destructive.md is generated from a hardcoded string, so it cannot track the surface it describes #570
Labels
No labels
breaking
bug
documentation
enhancement
epic
good first issue
help wanted
refactoring
resolution/duplicate
resolution/invalid
resolution/wontfix
security
severity/critical
severity/high
severity/low
severity/medium
status/abandoned
status/blocked
status/needs-decision
status/needs-info
status/needs-verification
testing
upstream
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Blocks
#563 Epic: the destructive surface has outgrown ADR 0029's classification table
sixfold-space/madtea
Reference
sixfold-space/madtea#570
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?
Part of #563. Split out of #569, which covers classifying the operations. This one covers the mechanism that let the page go stale unnoticed.
The defect
docs/reference/destructive.mdcarries the standard banner:The banner is accurate about the file and misleading about the content. The whole page body is one string literal, the
Introfield atinternal/docs/domain.go:187-193. That domain entry declares noCLIPrefixesand noMCPPrefixeson purpose, so it matches zero commands and zero tools, andgenerate.go:90carries a special case to render it anyway.Every other reference page lists operations gathered from the live command and tool sets, so it moves when the surface moves. This page derives from nothing. Regenerating cannot change a word of it. Only retyping the literal can.
The page is also the one that makes a claim about the whole surface rather than about one domain, so it is the single page where the gap matters most.
What it cost
The literal says the irreversible forge-data deletes are "repository, issue, release, tag, wiki page". Two irreversible deletes ship outside that list:
release delete-asset(internal/mcp/tools_releases.go:103,internal/cmd/release/release_assets.go:108) andpackages delete(internal/mcp/tools_packages.go:44-45,111). Neither refuses, and the release-delete refusal in the same package names a release's attached assets as exactly the unrecoverable thing it will not touch.The page also never mentions the no-force rule for worktree removal, which is the case that produced ADR 0029.
Nothing in the build could catch either gap.
internal/parity/destructive_remote_pin_test.gopins MCP operations against the older gated policy and never reads the doc.Options
internal/cmdutil/deleterefusal.go), so the set is discoverable in code today.My lean is option 1 with option 2 behind it, because a derived page plus a test that the derivation is complete is the only combination where the page cannot lie. Option 3 alone leaves the drift and only stops it being disguised.
Acceptance criteria