From 895ad342c79e88f401814e85f44b4a867c80e380 Mon Sep 17 00:00:00 2001 From: Felix Martin Date: Mon, 1 Jun 2026 18:12:10 -0400 Subject: [PATCH] Migrate the reflection fetch onto runFetchAsync Co-Authored-By: Claude Opus 4.8 (1M context) --- internal/session/roles.go | 40 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/internal/session/roles.go b/internal/session/roles.go index 114e97c..f9127d7 100644 --- a/internal/session/roles.go +++ b/internal/session/roles.go @@ -243,29 +243,23 @@ func (c *Controller) startReflectionFetchLocked() { // bounded to reflectionHistoryN summaries and runs once per Review entry, not // on any hot path. history := buildReflectionHistory(c.auditPath) - go func() { - ctx, cancel := context.WithTimeout(context.Background(), reflectionTimeout) - defer cancel() - refl, err := reviewer.Review(ctx, finished, history) - - c.mu.Lock() - if gen != c.reflectionGen { - c.mu.Unlock() - return // superseded review: discard - } - if err != nil || strings.TrimSpace(refl.Recap) == "" { - c.reflectionStatus = reflectionAbsent - c.reflectionRecap = "" - c.carryForward = "" - } else { - c.reflectionStatus = reflectionReady - c.reflectionRecap = refl.Recap - c.carryForward = refl.CarryForward - } - _ = c.persistLocked() - c.mu.Unlock() - c.notify() - }() + var refl ai.Reflection + var err error + c.runFetchAsync(reflectionTimeout, + func(ctx context.Context) { refl, err = reviewer.Review(ctx, finished, history) }, + func() bool { return gen != c.reflectionGen }, + func() { + if err != nil || strings.TrimSpace(refl.Recap) == "" { + c.reflectionStatus = reflectionAbsent + c.reflectionRecap = "" + c.carryForward = "" + } else { + c.reflectionStatus = reflectionReady + c.reflectionRecap = refl.Recap + c.carryForward = refl.CarryForward + } + _ = c.persistLocked() + }) } // buildReflectionFinishedLocked renders the just-finished session as a compact