Repository navigation
feat(autopilot): each ticket runs as a Microsoft Agent Framework workflow - #270
Merged
Merged
Conversation
…flow
The Autopilot Orchestrator agent decides which ticket starts; a MAF Workflow (TicketWorkflow) then runs that ticket's
whole agent flow — Coding → checks → Reviewer → Testing → merge — with conditional edges back to the Coding agent for
red checks, conflicts, requested changes and failed acceptance (the rules' 3 rounds), and a branch behind its base
updated in place. Each step is an existing agent (ITicketSteps → BoardTicketSteps over BoardTaskService), so scoped
autonomy, Insights metrics and evidence on the PR are unchanged.
- TicketWorkflowRunner hosts one workflow per ticket; while it runs, Autopilot counts the task as a running slot and
leaves it alone. Its trail goes to the Autopilot log ("#41 · MAF workflow: merged (coded → checks green → …)").
Out of rounds → the changes are blocked for a person (the Orchestrator agent may retry or ask); an agent that
couldn't run, or a flow a restart cut short → the step-by-step path continues from where the task stands.
- BoardTaskService.Begin{Start,Review,Test}Async return the running work; one acceptance run at a time is now held
by the Testing step itself, for both paths.
- Settings › Autopilot › "Each ticket runs as": MAF workflow (default) / Step by step.
- Also fixes code-scanning #337 (nullable ticket numbers read via patterns in the Orchestrator code).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018WAdQ7Rm24xss5QDSvXtJB
Comment on lines
+193
to
+196
| foreach (var r in repos[s.Id].Where(r => r.Status is not "Failed")) | ||
| { | ||
| if (PrNumber(r.PrUrl) is { } pr) { current.TryAdd((r.Owner, r.Repo, issue), (pr, r)); } | ||
| } |
| var openTickets = planTickets.Where(t => t.Open).Select(t => t.Number).ToHashSet(); | ||
| var titles = tickets.Where(t => t.Number is not null).GroupBy(t => t.Number!.Value).ToDictionary(g => g.Key, g => g.First().Title); | ||
| var titles = new Dictionary<int, string>(); | ||
| foreach (var t in tickets) { if (t.Number is { } number) { titles.TryAdd(number, t.Title); } } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
"MAF controls the agents" — for real now, on the path that builds VNChessAcademy.
The Autopilot Orchestrator agent decides which ticket starts; a Microsoft Agent Framework Workflow (
TicketWorkflow, MAF 1.25WorkflowBuilder+ conditional edges,InProcessExecution) then runs that ticket's whole flow:ITicketSteps→BoardTicketStepsoverBoardTaskService): scoped autonomy, Insights metrics, PR evidence unchanged.TicketWorkflowRunner: one workflow per ticket; while it runs Autopilot counts it as a running slot and leaves it alone; its trail goes to the Autopilot log. Out of rounds → blocked for a person (Orchestrator may retry/ask); agent couldn't run or restart → step-by-step path continues.BoardTaskService.Begin{Start,Review,Test}Asyncreturn the running work; the one-acceptance-run-at-a-time slot is held by the Testing step for both paths.Test plan
TicketWorkflowTests(9) run the real MAF engine against scripted steps: green path, red checks, conflicts, behind base, requested changes + failed acceptance, 3-round cap → needs a person, coding couldn't finish, checks timeout, no auto-merge → ready for a person.🤖 Generated with Claude Code
https://claude.ai/code/session_018WAdQ7Rm24xss5QDSvXtJB