Refuse turns, discard and subtasks while a merge is finalizing

This commit is contained in:
Ian Gulliver
2026-10-16 12:46:28 -07:00
parent 0e52253d07
commit ecfae97d97
11 changed files with 287 additions and 233 deletions
+13 -7
View File
@@ -283,6 +283,11 @@ func (m *Manager) Recover(ctx context.Context) error {
return err
}
err = m.recoverFinalizing(ctx)
if err != nil {
return err
}
staged, err := m.recoverStages(ctx)
if err != nil {
return err
@@ -365,7 +370,7 @@ func (m *Manager) failResume(ctx context.Context, sess api.AgentSession, task ap
if derr != nil {
return derr
}
next, serr := m.store.EndTurn(ctx, sess.Id, "byre", map[string]any{"error": err.Error()}, nil, false)
next, _, serr := m.store.EndTurn(ctx, sess.Id, "byre", map[string]any{"error": err.Error()}, nil, false, false)
if serr != nil {
return serr
}
@@ -694,7 +699,7 @@ func (m *Manager) pump(l *live) {
slog.Error("drop stage output", "session", l.id, "err", err)
}
}
next, err := m.store.EndTurn(ctx, l.id, agentActor, map[string]any{"error": "agent process exited mid-turn"}, nil, false)
next, _, err := m.store.EndTurn(ctx, l.id, agentActor, map[string]any{"error": "agent process exited mid-turn"}, nil, false, false)
if err != nil {
slog.Error("record session exit", "session", l.id, "err", err)
}
@@ -930,7 +935,7 @@ func (m *Manager) turnEnded(ctx context.Context, l *live, res endResult) error {
}
turn := m.event(l, agentActor, "turn.ended", payload)
next, err := m.store.EndTurn(ctx, l.id, agentActor, nil, &turn, review)
next, finalizeBy, err := m.store.EndTurn(ctx, l.id, agentActor, nil, &turn, review, finished && !handoff)
if err != nil {
return err
}
@@ -957,12 +962,13 @@ func (m *Manager) turnEnded(ctx context.Context, l *live, res endResult) error {
go m.continueFromHandoff(l.id, res.result)
return nil
}
if finalizeBy != "" {
m.logUndelivered(ctx, l.id, "turn ended in merge")
go m.finishMerge(l, finalizeBy)
return nil
}
mergeBy := m.takeMerge(l.taskID)
switch {
case mergeBy != "" && finished:
m.logUndelivered(ctx, l.id, "turn ended in merge")
go m.finishMerge(l, mergeBy)
return nil
case mergeBy != "":
go m.releaseMerge(l.projectID, l.taskID)
if !res.isError || interrupted {