From 261defa3b487c4e2df7350e67c7c54acc4ac097d Mon Sep 17 00:00:00 2001 From: gastown/polecats/furiosa Date: Thu, 1 Jan 2026 18:16:33 -0800 Subject: [PATCH] fix(witness): Add worktree cleanup to HandleMerged (gt-7uuye) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DefaultWitnessHandler.HandleMerged was only logging a message but not actually cleaning up the polecat worktree. This left worktrees behind after merges, even though sessions were killed. Fixed by calling witness.AutoNukeIfClean which: - Verifies cleanup_status before nuking (prevents work loss) - Calls NukePolecat to kill session, remove worktree, and cleanup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- internal/protocol/witness_handlers.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/internal/protocol/witness_handlers.go b/internal/protocol/witness_handlers.go index 4599675d..415ca865 100644 --- a/internal/protocol/witness_handlers.go +++ b/internal/protocol/witness_handlers.go @@ -6,6 +6,7 @@ import ( "os" "github.com/steveyegge/gastown/internal/mail" + "github.com/steveyegge/gastown/internal/witness" ) // DefaultWitnessHandler provides the default implementation for Witness protocol handlers. @@ -59,10 +60,18 @@ func (h *DefaultWitnessHandler) HandleMerged(payload *MergedPayload) error { // Continue - notification is best-effort } - // Initiate polecat cleanup - // Note: Actual cleanup is done by a separate process/molecule - // This handler just records that cleanup is needed - fmt.Fprintf(h.Output, "[Witness] ✓ Polecat %s work merged, cleanup can proceed\n", payload.Polecat) + // Initiate polecat cleanup using AutoNukeIfClean + // This verifies cleanup_status before nuking to prevent work loss. + nukeResult := witness.AutoNukeIfClean(h.WorkDir, h.Rig, payload.Polecat) + if nukeResult.Nuked { + fmt.Fprintf(h.Output, "[Witness] ✓ Auto-nuked polecat %s: %s\n", payload.Polecat, nukeResult.Reason) + } else if nukeResult.Skipped { + fmt.Fprintf(h.Output, "[Witness] ⚠ Cleanup skipped for %s: %s\n", payload.Polecat, nukeResult.Reason) + } else if nukeResult.Error != nil { + fmt.Fprintf(h.Output, "[Witness] ✗ Cleanup failed for %s: %v\n", payload.Polecat, nukeResult.Error) + } else { + fmt.Fprintf(h.Output, "[Witness] ✓ Polecat %s work merged, cleanup can proceed\n", payload.Polecat) + } return nil }