Agent-Logs-Url: https://github.com/microsoft/agent-framework/sessions/6fe88a80-2e05-40d5-9539-ca7c59b9022b Co-authored-by: lokitoth <6936551+lokitoth@users.noreply.github.com>
15 KiB
Magentic E2E Implementation Review
Review Scope
This document reviews the current Magentic E2E implementation against the original plan in MagenticE2E_TestPlan.md.
Reviewed files:
dotnet/tests/Microsoft.Agents.AI.Workflows.UnitTests/MagenticE2E_TestPlan.mddotnet/tests/Microsoft.Agents.AI.Workflows.UnitTests/MagenticOrchestrationTests.csdotnet/src/Microsoft.Agents.AI.Workflows/Specialized/Magentic/MagenticOrchestrator.csdotnet/src/Microsoft.Agents.AI.Workflows/Specialized/Magentic/MagenticTaskContext.csdotnet/src/Microsoft.Agents.AI.Workflows/MagenticPlanReviewRequest.cs
Executive Summary
The current implementation contains 14 Magentic end-to-end tests that build and run real workflows through MagenticWorkflowBuilder.Build(). This is a strong partial implementation of the original plan, which estimated roughly 31 tests.
The implementation now covers the main user-visible orchestration paths:
- Initial planning and final-answer completion.
- Plan signoff disabled path.
- Plan review approval with checkpoint/resume.
- Plan review revision with checkpoint/resume and replanning.
- Multi-round delegation through a participant.
- Progress ledger event emission.
- Empty next-speaker fallback warning.
- Invalid next-speaker warning and forced final answer.
- Round-limit termination.
- Reset-limit termination.
- Stall-triggered reset and replan.
- Stall-triggered replan when plan signoff is enabled.
- Instruction-bearing progress ledger path.
- Replanned event emission.
The implementation also includes a production fix in MagenticOrchestrator.ConfigureProtocol(): the protocol declares .YieldsOutput<List<ChatMessage>>(), matching the type yielded by PrepareFinalAnswerAsync().
The remaining gaps are mostly around deeper state assertions and error/retry behavior: progress-ledger retry/failure handling, direct checkpoint state inspection, direct selected-participant routing assertions, multiple plan revisions, and edge cases such as empty teams and post-termination handling.
Production Code Assessment
Output declaration
MagenticOrchestrator.ConfigureProtocol() now declares:
.YieldsOutput<List<ChatMessage>>()
Assessment:
- Correct and necessary.
PrepareFinalAnswerAsync()yieldsList<ChatMessage>viacontext.YieldOutputAsync(...).- Without this protocol declaration, fully-built workflows can fail at runtime when emitting the final answer output.
- This is a valid production fix discovered by the E2E tests.
Stall replan review request nuance
The original plan states that PlanReview_On_Stall_Replan should send a plan review request with IsStalled=true.
Current code path:
RunCoordinationRoundAsync()detects a stall.ResetAndReplanAsync()callstaskContext.Reset().MagenticTaskContext.Reset()clearsStallCountto0.UpdatePlanAndDelegateAsync()submits the new plan review request.SubmitPlanReviewRequestAsync()setsIsStalledfromtaskContext.IsStalled.
Because StallCount has already been reset, the replanned review request is not expected to have IsStalled=true with the current implementation. The current E2E test correctly verifies that a stall-triggered replan with signoff creates a second review request and can resume to completion, but it does not satisfy the original plan's exact IsStalled=true expectation.
Implemented Tests
| Test | Original Plan Area | What It Verifies | Assessment |
|---|---|---|---|
Task_Completes_When_RequestSatisfied |
Happy path | First coordination round reports satisfied; final answer is yielded and no review request remains pending. | Complete |
PlanReview_Approved_Proceeds |
Plan review / checkpoint-resume | Initial plan review pauses, approval resumes from checkpoint, and workflow completes. | Complete |
Initial_Plan_Emits_PlanCreatedEvent |
Event emission | Initial plan creation emits MagenticPlanCreatedEvent. |
Complete |
NextSpeaker_Invalid_Triggers_FinalAnswer |
Next speaker validation / warnings | Invalid next_speaker emits a warning and forces final answer generation. |
Complete |
ProgressLedger_Updated_Event_Emitted |
Progress ledger / event emission | Successful ledger update emits MagenticProgressLedgerUpdatedEvent. |
Complete |
PlanSignoff_Disabled_Proceeds_Immediately |
Happy path | RequirePlanSignoff(false) skips plan review and proceeds directly to completion. |
Complete |
NextSpeaker_Empty_Falls_Back_To_First |
Next speaker validation / warnings | Empty next speaker emits a warning, falls back to the first participant, and later completes. | Complete |
Task_Completes_After_Multiple_Rounds |
Happy path / delegation loop | One non-satisfied round delegates to a participant; a later round completes. | Complete |
PlanReview_Revised_Triggers_Replan |
Plan review / replanning / checkpoint-resume | Human revision triggers replanning, emits MagenticReplannedEvent, requests review again, and completes after approval. |
Complete |
MaxRoundLimit_Terminates_Workflow |
Limit enforcement | Round limit is checked before the next ledger update and yields the maximum round limit message. | Complete |
MaxStallCount_Triggers_Reset |
Stall detection / replanning | A stalled ledger reaches MaxStallCount, resets, replans, emits MagenticReplannedEvent, and completes. |
Complete |
Instruction_Message_Sent_When_Present |
Edge cases / delegation | A non-empty instruction_or_question path executes, delegation proceeds, and the workflow completes over two rounds. |
Partial |
PlanReview_On_Stall_Replan |
Plan review / stall / checkpoint-resume | Stall-triggered reset and replan with requirePlanSignoff=true creates another review request; approval resumes and completes. |
Mostly complete; does not assert IsStalled=true. |
MaxResetLimit_Terminates_Workflow |
Limit enforcement | After a stall-triggered reset, the next coordination round detects the reset limit and yields the maximum reset limit message. | Complete |
Coverage Against Original Plan
1. Happy Path Tests
| Planned Test | Status | Notes |
|---|---|---|
Task_Completes_When_RequestSatisfied |
Implemented | Covered directly. |
Task_Delegates_To_Correct_Agent |
Partially covered | Existing multi-round tests prove delegation happens, but no test directly asserts that a specific selected participant received the turn. |
Task_Completes_After_Multiple_Rounds |
Implemented | Covered directly with a participant response and second manager round. |
PlanSignoff_Disabled_Proceeds_Immediately |
Implemented | Covered directly; also asserts no plan review request/event is emitted. |
Summary: 3 complete, 1 partial.
2. Plan Review Tests
| Planned Test | Status | Notes |
|---|---|---|
PlanReview_Approved_Proceeds |
Implemented | Covered directly with checkpoint/resume. |
PlanReview_Revised_Triggers_Replan |
Implemented | Covered directly with one revision, replan event, second review request, approval, and completion. |
PlanReview_Multiple_Revisions |
Not implemented | Current revision coverage stops after one revision before approval. |
PlanReview_On_Stall_Replan |
Mostly implemented | Covers stall -> reset -> replan -> second plan review -> approval -> completion. Does not assert IsStalled=true, and current production flow resets stall state before submitting that review. |
Summary: 2 complete, 1 mostly complete, 1 remaining.
3. Limit Enforcement Tests
| Planned Test | Status | Notes |
|---|---|---|
MaxRoundLimit_Terminates_Workflow |
Implemented | Covered directly. |
MaxResetLimit_Terminates_Workflow |
Implemented | Covered directly. |
MaxStallCount_Triggers_Reset |
Implemented | Covered directly as stall-triggered reset/replan. |
Summary: 3 complete — all planned limit enforcement tests are implemented.
4. Stall Detection Tests
| Planned Test | Status | Notes |
|---|---|---|
Stall_IsInLoop_Increments_StallCount |
Partially covered | MaxStallCount_Triggers_Reset uses IsInLoop=true; the test verifies reset/replan rather than directly inspecting StallCount. |
Stall_NoProgress_Increments_StallCount |
Not implemented | No test currently uses IsProgressBeingMade=false as the stall trigger. |
Progress_Made_Decrements_StallCount |
Not implemented | No direct coverage for decrementing stall count after progress resumes. |
Consecutive_Stalls_Trigger_Reset |
Partially covered | Covered only in the simplified MaxStallCount=1 case, not with multiple consecutive stalls. |
Summary: 2 partial, 2 remaining.
5. Progress Ledger Validation Tests
| Planned Test | Status | Notes |
|---|---|---|
ProgressLedger_Retry_On_Parse_Failure |
Not implemented | Retry after invalid JSON remains uncovered. |
ProgressLedger_Max_Retries_Triggers_Reset |
Not implemented | Failure after all retry attempts and reset/replan behavior remains uncovered. |
ProgressLedger_Updated_Event_Emitted |
Implemented | Covered directly. |
Summary: 1 complete, 2 remaining.
6. Next Speaker Validation Tests
| Planned Test | Status | Notes |
|---|---|---|
NextSpeaker_Empty_Falls_Back_To_First |
Implemented | Covered directly. |
NextSpeaker_Invalid_Triggers_FinalAnswer |
Implemented | Covered directly. |
NextSpeaker_Valid_Delegates_Correctly |
Partially covered | Valid delegation happens in multi-round tests, but the selected executor is not directly asserted. |
Summary: 2 complete, 1 partial.
7. Event Emission Tests
| Planned Test | Status | Notes |
|---|---|---|
Initial_Plan_Emits_PlanCreatedEvent |
Implemented | Covered directly. |
Replan_Emits_ReplannedEvent |
Implemented | Covered by plan revision, stall reset, and stall-with-plan-review tests. |
Warning_Events_On_Errors |
Partially covered | Empty and invalid next-speaker warnings are covered; progress-ledger failure warnings are not. |
Summary: 2 complete, 1 partial.
8. Checkpoint/Resume Tests
| Planned Test | Status | Notes |
|---|---|---|
Checkpoint_Saves_TaskContext |
Not implemented | No direct assertion on serialized MagenticTaskContext state. |
Checkpoint_Resume_Continues_Correctly |
Partially covered | Resume is exercised through plan approval, plan revision, and stall-with-plan-review flows. |
Checkpoint_Preserves_ProgressLedger |
Not implemented | No direct assertion that progress ledger state is preserved across checkpoint/resume. |
Summary: 1 partial, 2 remaining.
9. Edge Cases
| Planned Test | Status | Notes |
|---|---|---|
Empty_Team_Handling |
Not implemented | No coverage for zero participants. |
Single_Agent_Team |
Not implemented | Many tests use one participant, but there is no dedicated edge-case test. |
Instruction_Message_Sent_When_Present |
Partially implemented | The test exercises the instruction path and verifies successful two-round completion, but it does not directly observe the sent instruction message or persisted chat history. |
Terminated_Context_Rejects_New_Messages |
Not implemented | No coverage for post-termination message handling. |
Summary: 1 partial, 3 remaining.
Success Criteria Assessment
| Success Criterion | Status | Assessment |
|---|---|---|
All logical forks in MagenticOrchestrator are covered by at least one test |
Mostly met | Covered: signoff/no-signoff, approved/revised plan review, satisfied completion, empty/invalid speaker, round limit, reset limit, stall reset, stall-with-plan-review, instruction path. Remaining: progress-ledger retry/failure, post-termination behavior, and some direct state transitions. |
Tests use the same patterns as HandoffOrchestrationTests |
Met | Tests use fully-built workflows, StreamingRun, checkpointing, pending requests, events, and output collection. |
| Tests run against fully-built workflows | Met | Every test builds through MagenticWorkflowBuilder(...).Build(). |
| Each test verifies specific event emissions and state changes | Mostly met | Event and output assertions are present, but some tests verify behavior indirectly rather than asserting internal counters, target executor routing, or persisted state. |
Tests cover both requirePlanSignoff=true and false paths |
Met | Plan review tests use true; happy path, next speaker, limit, stall, and instruction tests use false. |
| Checkpoint/resume functionality is verified | Partially met | Resume is exercised through human plan review flows, but direct checkpoint state preservation remains untested. |
Key Observations
- The tests are genuine E2E tests for the workflow builder path, not isolated unit tests of orchestrator internals.
TestReplayAgentresponse ordering is central to these tests because each re-entry toTakeTurnAsync()may consume another facts response and plan response before the next ledger response.- The implementation now fully covers the planned limit enforcement category: round, reset, and stall limits.
- The current
PlanReview_On_Stall_Replantest covers the user-visible stall-with-signoff flow, but the original plan'sIsStalled=trueexpectation is not currently satisfied by production code afterReset()clearsStallCount. - The instruction test exercises the instruction branch but does not directly prove the exact instruction
ChatMessagewas delivered to a participant. - Remaining gaps are concentrated in progress-ledger failure paths, direct checkpoint state inspection, and direct participant-routing assertions.
Recommended Next Tests
Continue one test at a time in this order:
ProgressLedger_Retry_On_Parse_Failure— return invalid ledger JSON once, then valid JSON, and assert retry warning plus successful completion.ProgressLedger_Max_Retries_Triggers_Reset— return invalid ledger JSON for all attempts and assert warning/reset/replan behavior.Task_Delegates_To_Correct_Agent/NextSpeaker_Valid_Delegates_Correctly— use multiple participants and assert only the selected participant receives the turn.PlanReview_Multiple_Revisions— exercise multiple human revision responses before final approval.- Direct checkpoint state tests — inspect persisted
MagenticTaskContextand progress ledger state where possible. - Dedicated edge cases — empty team behavior, single-agent team behavior, and post-termination rejection.
- Strengthen
Instruction_Message_Sent_When_Presentif a stable event or test hook is available to directly observe the sent instruction message. - Clarify or fix the
PlanReview_On_Stall_ReplanIsStalledexpectation: either adjust production behavior to preserve stall context in the review request or update the original plan expectation.
Overall Conclusion
The current implementation is a valuable and correct partial completion of the original Magentic E2E plan. It covers 14 tests and most major user-visible orchestration decisions, including all planned limit enforcement scenarios and the important human-in-the-loop flows.
The next highest-value work is progress-ledger failure/retry coverage, followed by direct routing and checkpoint-state assertions. Two areas deserve special attention before calling the plan complete: the current inability to assert IsStalled=true on stall-triggered plan review requests after reset, and the indirect nature of the instruction-message test.