From 2f70b2cb3350e4b18dee90c7c92193adbbec7724 Mon Sep 17 00:00:00 2001 From: John Sell Date: Fri, 6 Mar 2026 14:07:44 -0500 Subject: [PATCH] Fix broadcast model switching: skip /model commands when model names are empty The callers of BroadcastCheckIn and SingleAgentCheckIn always pass empty strings for checkModel and workModel, causing '/model ' (with no model name) to be sent to agents. This resulted in broken model switch attempts that would time out or fail. Now when checkModel/workModel are empty, the model switch steps are skipped entirely and the check-in runs on whatever model the agent is already using. Model economy still works if actual model names are passed. --- internal/coordinator/tmux.go | 53 ++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/internal/coordinator/tmux.go b/internal/coordinator/tmux.go index 531df5a..46e99a4 100644 --- a/internal/coordinator/tmux.go +++ b/internal/coordinator/tmux.go @@ -336,22 +336,26 @@ func (s *Server) runAgentCheckIn(spaceName, canonical, tmuxSession, checkModel, s.broadcastProgress(spaceName, canonical+": "+msg) } - progress("switching to " + checkModel) - if err := tmuxSendKeys(tmuxSession, "/model "+checkModel); err != nil { - result.addError(canonical + ": model switch failed: " + err.Error()) - return - } + // Model economy: switch to a lightweight model for check-ins if configured. + // If checkModel is empty, skip model switching entirely. + if checkModel != "" { + progress("switching to " + checkModel) + if err := tmuxSendKeys(tmuxSession, "/model "+checkModel); err != nil { + result.addError(canonical + ": model switch failed: " + err.Error()) + return + } - progress("waiting for model switch...") - if err := waitForIdle(tmuxSession, idlePollTimeout); err != nil { - result.addError(canonical + ": model switch did not complete: " + err.Error()) - return + progress("waiting for model switch...") + if err := waitForIdle(tmuxSession, idlePollTimeout); err != nil { + result.addError(canonical + ": model switch did not complete: " + err.Error()) + return + } } boardTimeBefore := s.agentUpdatedAt(spaceName, canonical) - progress("sending /boss-check prompt") - if err := tmuxSendKeys(tmuxSession, "/boss-check "+canonical+" "+spaceName); err != nil { + progress("sending /boss.check prompt") + if err := tmuxSendKeys(tmuxSession, "/boss.check "+canonical+" "+spaceName); err != nil { result.addError(canonical + ": check-in send failed: " + err.Error()) return } @@ -364,20 +368,23 @@ func (s *Server) runAgentCheckIn(spaceName, canonical, tmuxSession, checkModel, result.addSent(canonical) progress("board post received") - progress("waiting for idle before model restore...") - if err := waitForIdle(tmuxSession, idlePollTimeout); err != nil { - result.addError(canonical + ": post-checkin idle wait failed: " + err.Error()) - } + // Restore the working model if one was specified + if workModel != "" { + progress("waiting for idle before model restore...") + if err := waitForIdle(tmuxSession, idlePollTimeout); err != nil { + result.addError(canonical + ": post-checkin idle wait failed: " + err.Error()) + } - progress("restoring " + workModel) - if err := tmuxSendKeys(tmuxSession, "/model "+workModel); err != nil { - result.addError(canonical + ": model restore failed: " + err.Error()) - return - } + progress("restoring " + workModel) + if err := tmuxSendKeys(tmuxSession, "/model "+workModel); err != nil { + result.addError(canonical + ": model restore failed: " + err.Error()) + return + } - progress("waiting for model restore...") - if err := waitForIdle(tmuxSession, idlePollTimeout); err != nil { - result.addError(canonical + ": model restore did not complete: " + err.Error()) + progress("waiting for model restore...") + if err := waitForIdle(tmuxSession, idlePollTimeout); err != nil { + result.addError(canonical + ": model restore did not complete: " + err.Error()) + } } progress("complete")