diff --git a/internal/session/roles.go b/internal/session/roles.go index e639ae1..114e97c 100644 --- a/internal/session/roles.go +++ b/internal/session/roles.go @@ -357,28 +357,22 @@ func (c *Controller) RequestCoach(intent string) error { c.mu.Unlock() c.notify() - go func() { - ctx, cancel := context.WithTimeout(context.Background(), coachTimeout) - defer cancel() - prop, err := coach.Coach(ctx, intent, grounding) - - c.mu.Lock() - if gen != c.coachGen || c.runtimeState != domain.RuntimePlanning { - c.mu.Unlock() - return // stale or left planning: discard - } - if err != nil { - c.coachStatus = coachError - c.coachErr = coachErrorMessage(err) - c.coachProposal = nil - } else { - c.coachStatus = coachReady - c.coachProposal = &prop - c.coachErr = "" - } - c.mu.Unlock() - c.notify() - }() + var prop ai.Proposal + var err error + c.runFetchAsync(coachTimeout, + func(ctx context.Context) { prop, err = coach.Coach(ctx, intent, grounding) }, + func() bool { return gen != c.coachGen || c.runtimeState != domain.RuntimePlanning }, + func() { + if err != nil { + c.coachStatus = coachError + c.coachErr = coachErrorMessage(err) + c.coachProposal = nil + } else { + c.coachStatus = coachReady + c.coachProposal = &prop + c.coachErr = "" + } + }) return nil }