Refinery emits activity events for MQ lifecycle (gt-ytsxp)

Add merge queue activity events to the refinery:
- merge_started: When refinery begins processing an MR
- merged: When MR successfully merged to main
- merge_failed: When merge fails (conflict, tests, push, etc.)
- merge_skipped: When MR skipped (superseded)

Events include MR ID, worker, branch, and reason (for failures).
Implemented in both Manager.ProcessMR and Engineer.ProcessMRFromQueue.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-29 23:46:40 -08:00
parent e362be3c41
commit 65d4dbe222
3 changed files with 55 additions and 0 deletions
+23
View File
@@ -45,6 +45,12 @@ const (
TypeNudge = "nudge"
TypeBoot = "boot"
TypeHalt = "halt"
// Merge queue events (emitted by refinery)
TypeMergeStarted = "merge_started"
TypeMerged = "merged"
TypeMergeFailed = "merge_failed"
TypeMergeSkipped = "merge_skipped"
)
// EventsFile is the name of the raw events log.
@@ -172,3 +178,20 @@ func BootPayload(rig string, agents []string) map[string]interface{} {
"agents": agents,
}
}
// MergePayload creates a payload for merge queue events.
// mrID: merge request ID
// worker: polecat name that submitted the work
// branch: source branch being merged
// reason: failure reason (for merge_failed/merge_skipped events)
func MergePayload(mrID, worker, branch, reason string) map[string]interface{} {
p := map[string]interface{}{
"mr": mrID,
"worker": worker,
"branch": branch,
}
if reason != "" {
p["reason"] = reason
}
return p
}