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
+9 -57
View File
@@ -78,64 +78,16 @@ func (m *Manager) clearMergeAfterReview(ctx context.Context, taskID string) {
}
}
func (m *Manager) recoverMergeAfterReviews(ctx context.Context) {
ids, err := m.store.FinishedMergeAfterReviews(ctx)
if err != nil {
slog.Error("list merges after finished reviews", "err", err)
return
}
for _, id := range ids {
m.reviewFinished(id, false)
}
}
func (m *Manager) reviewFinished(reviewID string, deliver bool) {
ctx := context.Background()
r, err := m.store.GetReview(ctx, reviewID)
if err != nil {
slog.Error("load finished review", "review", reviewID, "err", err)
return
}
if m.advanceReviews(ctx, r) {
return
}
reviews, err := m.store.SnapshotReviews(ctx, r.TaskId, r.SnapshotN)
if err != nil {
slog.Error("list snapshot reviews", "task", r.TaskId, "err", err)
return
}
settled, err := m.reviewsSettled(ctx, reviews)
if err != nil {
slog.Error("check snapshot reviews settled", "task", r.TaskId, "err", err)
return
}
if !settled {
return
}
if deliver {
m.deliverFindings(ctx, r, reviews)
}
ids := []string{}
for _, sr := range reviews {
ids = append(ids, sr.Id)
}
mar, err := m.store.TakeMergeAfterReview(ctx, r.TaskId, ids)
if err != nil {
slog.Error("take merge after review", "task", r.TaskId, "err", err)
return
}
if mar.By == "" {
return
}
reason := m.startMergeAfterReview(ctx, r, reviews, mar)
func (m *Manager) mergeAfterReview(ctx context.Context, ref store.SnapshotRef, reviews []api.Review, mar store.MergeAfterReview) {
reason := m.startMergeAfterReview(ctx, ref, reviews, mar)
if reason == "" {
slog.Info("merge after review started", "task", r.TaskId, "review", r.Id, "by", mar.By)
slog.Info("merge after review started", "task", ref.TaskID, "snapshot", ref.N, "by", mar.By)
return
}
slog.Info("merge after review dropped", "task", r.TaskId, "review", r.Id, "reason", reason)
task, err := m.store.GetTask(ctx, r.TaskId)
slog.Info("merge after review dropped", "task", ref.TaskID, "snapshot", ref.N, "reason", reason)
task, err := m.store.GetTask(ctx, ref.TaskID)
if err != nil {
slog.Error("load task for dropped merge after review", "task", r.TaskId, "err", err)
slog.Error("load task for dropped merge after review", "task", ref.TaskID, "err", err)
return
}
err = m.store.AppendEvent(ctx, api.Event{Kind: "task.merge_after_review_dropped", ProjectId: &task.ProjectId, TaskId: &task.Id, Actor: "byre", Payload: map[string]any{"id": task.Id, "reason": reason}})
@@ -144,7 +96,7 @@ func (m *Manager) reviewFinished(reviewID string, deliver bool) {
}
}
func (m *Manager) startMergeAfterReview(ctx context.Context, r api.Review, reviews []api.Review, mar store.MergeAfterReview) string {
func (m *Manager) startMergeAfterReview(ctx context.Context, ref store.SnapshotRef, reviews []api.Review, mar store.MergeAfterReview) string {
findings := []any{}
for _, sr := range reviews {
switch {
@@ -165,7 +117,7 @@ func (m *Manager) startMergeAfterReview(ctx context.Context, r api.Review, revie
default:
return fmt.Sprintf("the review found %d findings", len(findings))
}
task, project, err := m.activeTask(ctx, r.TaskId)
task, project, err := m.activeTask(ctx, ref.TaskID)
if err != nil {
return err.Error()
}
@@ -176,7 +128,7 @@ func (m *Manager) startMergeAfterReview(ctx context.Context, r api.Review, revie
if err != nil {
return err.Error()
}
if latest.N != r.SnapshotN {
if latest.N != ref.N {
return "a newer snapshot was taken"
}
sess, found, err := m.liveSession(ctx, task.Id)