From 2992f872f0cf8f46683c13ec367e02207c8e84d5 Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 22 Mar 2026 07:56:28 +0000 Subject: [PATCH] revert(agentic): remove pipeline chaining from dispatch MCP SDK doesn't support nested struct slices in schema generation. Pipeline orchestration will be handled at a higher level. Co-Authored-By: Virgil --- pkg/mcp/agentic/dispatch.go | 82 +++---------------------------------- pkg/mcp/agentic/status.go | 1 - 2 files changed, 6 insertions(+), 77 deletions(-) diff --git a/pkg/mcp/agentic/dispatch.go b/pkg/mcp/agentic/dispatch.go index 52e1837..ce01daf 100644 --- a/pkg/mcp/agentic/dispatch.go +++ b/pkg/mcp/agentic/dispatch.go @@ -17,14 +17,6 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" ) -// PipelineStep defines a follow-up dispatch that runs after the current agent completes. -// The task can contain {{.Findings}} which gets replaced with the previous agent's output. -type PipelineStep struct { - Task string `json:"task"` // Task description ({{.Findings}} = previous output) - Agent string `json:"agent,omitempty"` // Agent type (default: same as parent) - Template string `json:"template,omitempty"` // Template (default: coding) -} - // DispatchInput is the input for agentic_dispatch. type DispatchInput struct { Repo string `json:"repo"` // Target repo (e.g. "go-io") @@ -37,7 +29,6 @@ type DispatchInput struct { Persona string `json:"persona,omitempty"` // Persona: engineering/backend-architect, testing/api-tester, etc. Issue int `json:"issue,omitempty"` // Forge issue to work from DryRun bool `json:"dry_run,omitempty"` // Preview without executing - Pipeline []PipelineStep `json:"pipeline,omitempty"` // Follow-up steps: review → fix → verify } // DispatchOutput is the output for agentic_dispatch. @@ -236,33 +227,17 @@ func (s *PrepSubsystem) dispatch(ctx context.Context, req *mcp.CallToolRequest, Runs: 1, }) - // Store pipeline steps in status for the completion handler - if len(input.Pipeline) > 0 { - if st, err := readStatus(wsDir); err == nil { - st.NextSteps = input.Pipeline - writeStatus(wsDir, st) - } - } - // Background goroutine: close file handle when process exits, - // update status, run pipeline next step, then drain queue. + // update status, then drain queue if a slot opened up. go func() { cmd.Wait() outFile.Close() - st, err := readStatus(wsDir) - if err != nil { - s.drainQueue() - return - } - - st.Status = "completed" - st.PID = 0 - writeStatus(wsDir, st) - - // Pipeline: if there are next steps, dispatch the next one - if len(st.NextSteps) > 0 { - s.runNextPipelineStep(ctx, req, wsDir, st) + // Update status to completed + if st, err := readStatus(wsDir); err == nil { + st.Status = "completed" + st.PID = 0 + writeStatus(wsDir, st) } // Ingest scan findings as issues @@ -282,48 +257,3 @@ func (s *PrepSubsystem) dispatch(ctx context.Context, req *mcp.CallToolRequest, }, nil } -// runNextPipelineStep reads the completed agent's output, injects findings -// into the next step's task, and dispatches it. For coding→verify loops, -// it re-dispatches the fix step if verify finds non-exception findings. -func (s *PrepSubsystem) runNextPipelineStep(ctx context.Context, req *mcp.CallToolRequest, wsDir string, st *WorkspaceStatus) { - // Read the agent's output log for findings - logFiles, _ := filepath.Glob(filepath.Join(wsDir, "agent-*.log")) - findings := "" - if len(logFiles) > 0 { - if data, err := coreio.Local.Read(logFiles[len(logFiles)-1]); err == nil { - // Extract last 2000 chars as findings summary - if len(data) > 2000 { - findings = data[len(data)-2000:] - } else { - findings = data - } - } - } - - // Pop the next step - step := st.NextSteps[0] - remaining := st.NextSteps[1:] - - // Default agent/template from parent - agent := step.Agent - if agent == "" { - agent = st.Agent - } - template := step.Template - if template == "" { - template = "coding" - } - - // Replace {{.Findings}} in task with actual findings - task := strings.ReplaceAll(step.Task, "{{.Findings}}", findings) - - // Dispatch next step with remaining pipeline - s.dispatch(ctx, req, DispatchInput{ - Repo: st.Repo, - Org: st.Org, - Task: task, - Agent: agent, - Template: template, - Pipeline: remaining, - }) -} diff --git a/pkg/mcp/agentic/status.go b/pkg/mcp/agentic/status.go index 028f04b..980c2f0 100644 --- a/pkg/mcp/agentic/status.go +++ b/pkg/mcp/agentic/status.go @@ -42,7 +42,6 @@ type WorkspaceStatus struct { Question string `json:"question,omitempty"` // from BLOCKED.md Runs int `json:"runs"` // how many times dispatched/resumed PRURL string `json:"pr_url,omitempty"` // pull request URL (after PR created) - NextSteps []PipelineStep `json:"next_steps,omitempty"` // remaining pipeline steps } func writeStatus(wsDir string, status *WorkspaceStatus) error {