Run reviews and nudges on the state-driven coordinator

This commit is contained in:
Ian Gulliver
2026-10-21 12:54:34 -07:00
parent 97b71416d5
commit b4a454bab1
16 changed files with 718 additions and 567 deletions
+15 -6
View File
@@ -461,7 +461,7 @@ func (m *Manager) Recover(ctx context.Context) error {
m.logUndelivered(ctx, sess.Id, "idle at startup")
}
err = m.recoverReviews(ctx)
err = m.store.ClearReviewRequests(ctx)
if err != nil {
return err
}
@@ -471,13 +471,18 @@ func (m *Manager) Recover(ctx context.Context) error {
go m.coordinate()
m.poke()
m.MarkFacts(allTasks)
go m.recoverMergeAfterReviews(context.Background())
go m.auditAll(context.Background())
return nil
}
func (m *Manager) failResume(ctx context.Context, sess api.AgentSession, task api.Task, err error) error {
slog.Error("resume session", "session", sess.Id, "err", err)
if sess.Role == api.Reviewer {
r, rerr := m.store.ReviewBySession(ctx, sess.Id)
if rerr == nil {
m.failReview(ctx, r.Id, "byre restarted and couldn't resume the reviewer: "+err.Error())
}
}
m.endMergeTurn(sess.Id, true)
m.logUndelivered(ctx, sess.Id, "resume failed")
derr := m.store.DropStageOutput(ctx, sess.Id)
@@ -664,6 +669,10 @@ func (m *Manager) failStart(ctx context.Context, sessionID, actor string, err er
cctx, cancel := context.WithTimeout(context.WithoutCancel(ctx), 10*time.Second)
defer cancel()
r, rerr := m.store.ReviewBySession(cctx, sessionID)
if rerr == nil {
m.failReview(cctx, r.Id, "the reviewer didn't start: "+err.Error())
}
serr := m.store.SetSessionState(cctx, sessionID, api.AgentSessionStateIdle, actor, map[string]any{"error": err.Error()})
if serr != nil {
slog.Error("record failed start", "session", sessionID, "err", serr)
@@ -981,6 +990,10 @@ func (m *Manager) pump(l *live) {
}
m.logUndelivered(ctx, l.id, "agent process exited mid-turn")
if l.reviewID != "" {
m.finishReviewer(l, "the reviewer's process exited mid-turn")
return
}
if l.stage != "" {
err = m.store.DropStageOutput(ctx, l.id)
if err != nil {
@@ -992,10 +1005,6 @@ func (m *Manager) pump(l *live) {
if err != nil {
slog.Error("record session exit", "session", l.id, "err", err)
}
if l.reviewID != "" {
m.finishReviewer(l, "the reviewer's process exited mid-turn")
return
}
if end.Discard != store.DiscardNone {
return
}