From 7f9795f63032d7095d2c3e676af821fdb92faafa Mon Sep 17 00:00:00 2001 From: Olivier Debeuf De Rijcker Date: Sat, 3 Jan 2026 20:54:14 +0100 Subject: [PATCH] fix: Close MR beads after successful merge from queue (#52) The handleSuccessFromQueue function was missing critical steps that exist in the legacy handleSuccess function: 1. Fetch and update the MR bead with merge_commit SHA and close_reason 2. Close the MR bead with CloseWithReason("merged", mr.ID) Without these steps, the MR bead stayed "open" in beads even after the queue file was deleted. This caused Mayor (which queries beads for open merge-requests) to think there were pending MRs while Refinery (which uses the queue) reported completion. Fixes #46 --- internal/refinery/engineer.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/internal/refinery/engineer.go b/internal/refinery/engineer.go index 995642e3..69b06f4b 100644 --- a/internal/refinery/engineer.go +++ b/internal/refinery/engineer.go @@ -486,6 +486,34 @@ func (e *Engineer) handleSuccessFromQueue(mr *mrqueue.MR, result ProcessResult) fmt.Fprintf(e.output, "[Engineer] Released merge slot\n") } + // Update and close the MR bead (matches handleSuccess behavior) + if mr.ID != "" { + // Fetch the MR bead to update its fields + mrBead, err := e.beads.Show(mr.ID) + if err != nil { + fmt.Fprintf(e.output, "[Engineer] Warning: failed to fetch MR bead %s: %v\n", mr.ID, err) + } else { + // Update MR with merge_commit SHA and close_reason + mrFields := beads.ParseMRFields(mrBead) + if mrFields == nil { + mrFields = &beads.MRFields{} + } + mrFields.MergeCommit = result.MergeCommit + mrFields.CloseReason = "merged" + newDesc := beads.SetMRFields(mrBead, mrFields) + if err := e.beads.Update(mr.ID, beads.UpdateOptions{Description: &newDesc}); err != nil { + fmt.Fprintf(e.output, "[Engineer] Warning: failed to update MR %s with merge commit: %v\n", mr.ID, err) + } + } + + // Close MR bead with reason 'merged' + if err := e.beads.CloseWithReason("merged", mr.ID); err != nil { + fmt.Fprintf(e.output, "[Engineer] Warning: failed to close MR %s: %v\n", mr.ID, err) + } else { + fmt.Fprintf(e.output, "[Engineer] Closed MR bead: %s\n", mr.ID) + } + } + // 1. Close source issue with reference to MR if mr.SourceIssue != "" { closeReason := fmt.Sprintf("Merged in %s", mr.ID)