Epic: the destructive surface has outgrown ADR 0029's classification table #563
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.
Depends on
#564 prune force-deletes a branch whose content is not in the default branch
sixfold-space/madtea
#566 prune deletes the remote twin on a proof computed only from local refs
sixfold-space/madtea
#567 the orchestrate dangerous-verify refusal ends by naming the surface that still allows it
sixfold-space/madtea
#568 branches-remote delete drops an unmerged remote ref with no containment proof
sixfold-space/madtea
#569 classify the destructive operations ADR 0029's table never named
sixfold-space/madtea
#570 destructive.md is generated from a hardcoded string, so it cannot track the surface it describes
sixfold-space/madtea
#572 the destructive surface has no enumerable source of truth
sixfold-space/madtea
#573 scope the destructive audit tool to hypotheses, and stop using it for coverage
sixfold-space/madtea
Reference
sixfold-space/madtea#563
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?
What I found
I audited the codebase against ADR 0029 (
docs/decisions/0029-strict-omission-destruction-model.md), which says no madtea surface carries an operation that destroys unrecoverable work, with one carve-out for destruction madtea can machine-prove is safe.Two of its three clauses hold. The #208 worktree force-remove and #209
madt_deleteconvergence work landed for real:forceis absent from theremoveaction spec (internal/mcp/tools_worktrees.go:83-87) and rejected pre-dispatch,tools_delete.godoes not exist, thedestructivedomain is not registered, andgateForcedWorktreeRemoveis gone.push --forcerides a bare--force-with-leaseat the one force construction in the tree (internal/service/git/push.go:131).The rest of the audit found four concrete defects and one structural problem underneath them.
The structural problem
ADR 0029's per-operation table classifies nine operations. A second, older policy governs the surface that actually ships:
internal/parity/destructive_remote_pin_test.gopins roughly fifty delete-shaped MCP operations under the #120 rule "irreversible means gated". ADR 0029 clause 1 rejects that rule by name, because a gate degrades per client andmadt_enableis a plain agent-callable tool with no consent step.Both policies are green in CI. Neither knows the other exists. That is the "three models coexisting, documented but unreconciled" state ADR 0029 was written to end, reappearing one layer down.
docs/reference/destructive.mdreads as an exhaustive list of the omitted deletes and is not one. Seven code comments still cite the pre-migration pathdocs/adr/0029-....The children
Two prune defects break a decided machine-proof carve-out. Both are reproduced, not theorised.
Two more are surface and refusal defects. The last child settles the classification question the other four keep running into.
Exit criterion
Every destructive-capable operation on either surface is classified, the carve-outs prove what the ADR says they prove, and
destructive.mdmatches the shipped behaviour.Relates to #554, which asks the neighbouring scope question: whether the omission rule reaches raw git forms that re-enable an omitted operation.