fix(hooks): commit-creating continuation forms dodge the commit steer — deny git merge/revert/cherry-pick/am --continue, WITH a sanctioned madt_* completion path landing first #19
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.
Dependencies
No dependencies set.
Reference
sixfold-space/madtea#19
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 happened (2026-07-10)
The commit steer hard-blocks
git commit(andgit add, steered to madt_add), but the continuation forms that also create commits pass through unmatched. One session created three raw-git commits this way:GIT_EDITOR=true git merge --continuein a foreign-repo linked worktree — aftermadt_commit dir=refused (foreign merge-in-progress, #14) and the rawgit add && git commitcompound was denied.GIT_EDITOR=true git merge --continuein the session's own repo — completing a hand-rolled base-into-head reconcile aftermadt_orchestrate reconcile=failed schema validation (#18).GIT_EDITOR=true git revert --continue— completing a conflictedmadt_prs action=revert, whose own error rail says "mark them with git add/rm ... then run git revert --continue" (the TOOL's rail points at the unguarded raw form!).No deliberate evasion — each use was the only executable exit the rails left — but the guard can't tell surfaced-and-documented use from quiet evasion. Every commit-creating raw-git form should route through the madt_* surface or be denied.
The gap
Unmatched today (all end in
git commitmachinery):git merge --continue,git revert --continue,git cherry-pick --continue,git am --continue/--resolved,git commitreached viaGIT_EDITOR=/env-var prefixes (verify the matcher strips leading env assignments — if not, that is a second, wider hole affecting EVERY guarded form including plaingit commit).Ordering constraint — capability BEFORE deny (ADR 0021's lesson)
Do NOT just add the deny: an agent mid-merge/mid-revert with conflicts resolved would then have NO exit at all (madt_commit currently refuses foreign merge-in-progress, and there is no madt_* revert-continue). A hard block with a capability gap trains hook-evasion (a prior incident; ADR 0021). Land in this order:
madt_commitcompletes an in-progress merge/revert/cherry-pick (creating the proper merge/revert commit) in every repo shape it accepts — own repo AND linked worktrees of foreign repos (the #14 refusal narrows to foreign PRIMARY checkouts only, which madtea already refuses everywhere).madt_prs action=revert's conflict rail then namesmadt_add+madt_commit, not raw git.Acceptance
madt_commitdemonstrably completes a conflicted merge and a conflicted revert in an own-repo checkout and a foreign linked worktree (hermetic tests).madt_prs action=revertconflict rail names only madt_* + still-allowed forms.