Don't call a Merge & continue a dismissal of the ready call

This commit is contained in:
Ian Gulliver
2026-10-20 15:01:26 -07:00
parent a95e0ddb29
commit cf9ee03284
7 changed files with 21 additions and 7 deletions
+5 -1
View File
@@ -352,7 +352,11 @@ func (m *Manager) Observe(events []api.Event) {
go m.promptReady(*ev.TaskId, nil)
}
switch ev.Kind {
case "inbox.created", "inbox.updated", "task.created", "task.merge_queued", "task.merge_after_review", "task.merge_after_review_cancelled", "task.merge_after_review_dropped", "task.merge_started", "task.merged", "task.discarded", "turn.ended", "task.workflow_stage", "task.workflow_finished", "review.started", "review.finished", "task.state", "task.ready", "task.discard_suggested", "task.ready_cleared":
case "inbox.created", "inbox.updated", "task.created", "task.merge_queued", "task.merge_after_review", "task.merge_after_review_cancelled", "task.merge_after_review_dropped", "task.merge_started", "task.merged", "task.discarded", "turn.ended", "task.workflow_stage", "task.workflow_finished", "review.started", "review.finished", "task.state", "task.ready", "task.discard_suggested":
case "task.ready_cleared":
if ev.Payload["reason"] == "merge" {
continue
}
case "user.message":
if ev.TaskId == nil || !humanActor(ev.Actor) {
continue
+1 -1
View File
@@ -230,7 +230,7 @@ func (m *Manager) MergeToMain(ctx context.Context, task api.Task, project api.Pr
return api.Task{}, err
}
err = m.store.ClearReady(ctx, task.Id, user.Login)
err = m.store.ClearReady(ctx, task.Id, user.Login, "merge")
if err != nil && !errors.Is(err, store.ErrNotFound) {
return api.Task{}, err
}
+1 -1
View File
@@ -118,7 +118,7 @@ func (m *Manager) cancelReadyTool(l *live) mcp.Tool {
"The human then no longer sees the task as ready to merge or as suggested for discard; call ready_for_merge or suggest_discard again once it holds.",
InputSchema: json.RawMessage(`{"type": "object", "properties": {}}`),
Handler: func(ctx context.Context, raw json.RawMessage) (string, error) {
err := m.store.ClearReady(ctx, l.taskID, agentActor)
err := m.store.ClearReady(ctx, l.taskID, agentActor, "")
if errors.Is(err, store.ErrNotFound) {
return "", fmt.Errorf("%w: this task has no standing ready_for_merge or suggest_discard", ErrConflict)
}
+1 -1
View File
@@ -601,7 +601,7 @@ func (s *Server) CancelMergeAfterReview(w http.ResponseWriter, r *http.Request,
}
func (s *Server) DismissReady(w http.ResponseWriter, r *http.Request, taskID string) {
err := s.store.ClearReady(r.Context(), taskID, actor(r))
err := s.store.ClearReady(r.Context(), taskID, actor(r), "")
if err != nil {
writeStoreError(w, err)
return
+6 -2
View File
@@ -789,7 +789,7 @@ func (s *Store) SuggestDiscard(ctx context.Context, id, reason, actor string) er
return s.setReady(ctx, id, actor, "discard", "task.discard_suggested", map[string]any{"id": id, "reason": reason})
}
func (s *Store) ClearReady(ctx context.Context, id, actor string) error {
func (s *Store) ClearReady(ctx context.Context, id, actor, reason string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET ready = '' WHERE id = ? AND status = ? AND ready != '' RETURNING project_id`, id, string(api.TaskStatusActive)).Scan(&projectID)
@@ -799,7 +799,11 @@ func (s *Store) ClearReady(ctx context.Context, id, actor string) error {
if err != nil {
return err
}
return emit(api.Event{Kind: "task.ready_cleared", ProjectId: &projectID, TaskId: &id, Actor: actor, Payload: map[string]any{"id": id}})
payload := map[string]any{"id": id}
if reason != "" {
payload["reason"] = reason
}
return emit(api.Event{Kind: "task.ready_cleared", ProjectId: &projectID, TaskId: &id, Actor: actor, Payload: payload})
})
}