Agent-Logs-Url: https://github.com/microsoft/agent-framework/sessions/21f3b1ae-183e-4fea-99ad-14efc19f084d 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/MagenticManager.csdotnet/src/Microsoft.Agents.AI.Workflows/Specialized/Magentic/MagenticTaskContext.csdotnet/src/Microsoft.Agents.AI.Workflows/MagenticPlanReviewRequest.cs
Executive Summary
The current implementation contains 18 Magentic end-to-end tests in MagenticOrchestrationTests.cs. Each test builds and executes a real workflow through MagenticWorkflowBuilder.Build(), so the test suite exercises the workflow protocol, checkpoint/resume path, orchestrator, manager, event stream, and output path together rather than testing isolated helpers only.
The original plan estimated approximately 31 tests. The current implementation is a strong partial completion and now covers most high-value user-visible orchestration behavior, including:
- Initial planning and final answer generation.
- Plan signoff disabled flow.
- Plan review approval flow.
- Single and multiple plan revision flows.
- Multi-round coordination.
- Round, reset, and stall limit enforcement.
- Progress ledger success, parse retry, and max-retry-failure reset behavior.
- Stall detection through both
IsInLoop=trueandIsProgressBeingMade=false. - Empty and invalid next-speaker warning paths.
- Replanned event emission.
- Basic instruction-bearing progress ledger flow.
- Checkpoint/resume through human review scenarios.
The largest remaining gaps are direct participant-routing assertions, direct checkpoint-state assertions, the progress-made stall decrement path, and dedicated edge cases.
Production Code Assessment
Output protocol declaration
MagenticOrchestrator.ConfigureProtocol() declares .YieldsOutput<List<ChatMessage>>(), matching the List<ChatMessage> emitted by PrepareFinalAnswerAsync().
Assessment:
- Correct and necessary for fully-built workflow execution.
- Covered indirectly by every E2E test that completes with a final answer.
- No additional production change is currently required for this area.
Progress ledger retry and reset behavior
MagenticManager.UpdateProgressLedgerAsync() retries invalid progress ledger responses up to TaskLimits.MaxProgressLedgerRetryCount and emits a WorkflowWarningEvent for each parse/update failure. If every retry fails, the last exception is rethrown. MagenticOrchestrator.RunCoordinationRoundAsync() catches non-cancellation exceptions from progress ledger creation, emits a reset warning, and calls ResetAndReplanAsync().
Assessment:
ProgressLedger_Retry_On_Parse_Failurenow covers retry recovery.ProgressLedger_Max_Retries_Triggers_Resetnow covers max-retry failure and reset/replan recovery.- The planned progress ledger validation category is now complete.
Stall replan review request nuance
The original plan expected PlanReview_On_Stall_Replan to submit a review request with IsStalled=true.
Current behavior:
RunCoordinationRoundAsync()detects the stall.ResetAndReplanAsync()callstaskContext.Reset().MagenticTaskContext.Reset()clearsStallCountto0.UpdatePlanAndDelegateAsync()submits the replanned plan review request.SubmitPlanReviewRequestAsync()derivesIsStalledfrom the reset task context.
Because the reset clears the stall count before the new review request is created, the current behavior does not preserve IsStalled=true on the replanned review request. The existing E2E test verifies the user-visible stall-with-signoff flow, but not the original IsStalled=true expectation.
Changing this would affect behavior, so it should not be changed without an explicit product decision.
Implemented E2E Tests
| Test | Plan Area | What It Verifies | Status |
|---|---|---|---|
Task_Completes_When_RequestSatisfied |
Happy path | First coordination round reports satisfied and final answer is yielded. | Complete |
PlanReview_Approved_Proceeds |
Plan review / checkpoint-resume | Initial plan review pauses; approval resumes and completes. | Complete |
Initial_Plan_Emits_PlanCreatedEvent |
Event emission | Initial plan creation emits MagenticPlanCreatedEvent. |
Complete |
NextSpeaker_Invalid_Triggers_FinalAnswer |
Next speaker validation | Invalid next speaker emits warning and forces final answer. | Complete |
ProgressLedger_Updated_Event_Emitted |
Progress ledger / events | Valid ledger update emits MagenticProgressLedgerUpdatedEvent. |
Complete |
PlanSignoff_Disabled_Proceeds_Immediately |
Happy path | RequirePlanSignoff(false) skips plan review. |
Complete |
NextSpeaker_Empty_Falls_Back_To_First |
Next speaker validation | Empty next speaker emits warning and falls back to first participant. | Complete |
Task_Completes_After_Multiple_Rounds |
Happy path / delegation loop | Non-satisfied round delegates; later round completes. | Complete |
PlanReview_Revised_Triggers_Replan |
Plan review | One human revision triggers replan and second review. | Complete |
MaxRoundLimit_Terminates_Workflow |
Limits | Round limit yields maximum round count message. | Complete |
MaxStallCount_Triggers_Reset |
Stall detection / limits | IsInLoop=true reaches stall limit and triggers reset/replan. |
Complete |
Instruction_Message_Sent_When_Present |
Edge case / delegation | Non-empty instruction path executes and completes over two rounds. | Partial: does not directly inspect delivered instruction message. |
PlanReview_On_Stall_Replan |
Plan review / stall | Stall with signoff creates a second review request and completes after approval. | Mostly complete: does not assert IsStalled=true. |
MaxResetLimit_Terminates_Workflow |
Limits | Reset limit yields maximum reset count message. | Complete |
ProgressLedger_Retry_On_Parse_Failure |
Progress ledger validation | Invalid ledger JSON warns, retry succeeds, workflow completes. | Complete |
ProgressLedger_Max_Retries_Triggers_Reset |
Progress ledger validation | All retry attempts fail, reset/replan occurs, workflow completes. | Complete |
Stall_NoProgress_Increments_StallCount |
Stall detection | IsProgressBeingMade=false triggers stall reset/replan. |
Complete |
PlanReview_Multiple_Revisions |
Plan review | Two revisions occur before final approval and completion. | Complete |
Coverage Against Original Plan
1. Happy Path Tests
| Planned Test | Current Status | Notes |
|---|---|---|
Task_Completes_When_RequestSatisfied |
Implemented | Covered directly. |
Task_Delegates_To_Correct_Agent |
Partially covered | Delegation occurs in multi-round tests, but no test directly proves that only the selected participant received the turn. |
Task_Completes_After_Multiple_Rounds |
Implemented | Covered directly. |
PlanSignoff_Disabled_Proceeds_Immediately |
Implemented | Covered directly. |
Summary: 3 complete, 1 partial.
2. Plan Review Tests
| Planned Test | Current Status | Notes |
|---|---|---|
PlanReview_Approved_Proceeds |
Implemented | Covered directly with checkpoint/resume. |
PlanReview_Revised_Triggers_Replan |
Implemented | Covered directly with one revision. |
PlanReview_Multiple_Revisions |
Implemented | Covered with two revisions before final approval. |
PlanReview_On_Stall_Replan |
Mostly implemented | Covers stall → reset → replan → second review → approval. Does not meet the original IsStalled=true expectation because current production behavior resets stall state first. |
Summary: 3 complete, 1 mostly complete.
3. Limit Enforcement Tests
| Planned Test | Current Status | Notes |
|---|---|---|
MaxRoundLimit_Terminates_Workflow |
Implemented | Covered directly. |
MaxResetLimit_Terminates_Workflow |
Implemented | Covered directly. |
MaxStallCount_Triggers_Reset |
Implemented | Covered directly. |
Summary: 3 complete — all planned limit enforcement tests are implemented.
4. Stall Detection Tests
| Planned Test | Current Status | Notes |
|---|---|---|
Stall_IsInLoop_Increments_StallCount |
Partially covered | Covered via reset behavior when IsInLoop=true; internal counter is not directly inspected. |
Stall_NoProgress_Increments_StallCount |
Implemented | Covered via IsProgressBeingMade=false reset/replan behavior. |
Progress_Made_Decrements_StallCount |
Not implemented | No test verifies a stalled count decreasing after a progress-making ledger. |
Consecutive_Stalls_Trigger_Reset |
Partially covered | Covered only in the MaxStallCount=1 case, not multiple consecutive stalls. |
Summary: 1 complete, 2 partial, 1 remaining.
5. Progress Ledger Validation Tests
| Planned Test | Current Status | Notes |
|---|---|---|
ProgressLedger_Retry_On_Parse_Failure |
Implemented | Covered directly. |
ProgressLedger_Max_Retries_Triggers_Reset |
Implemented | Covered directly. |
ProgressLedger_Updated_Event_Emitted |
Implemented | Covered directly. |
Summary: 3 complete — all planned progress ledger validation tests are implemented.
6. Next Speaker Validation Tests
| Planned Test | Current 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 is exercised, but selected participant routing is not directly asserted. |
Summary: 2 complete, 1 partial.
7. Event Emission Tests
| Planned Test | Current Status | Notes |
|---|---|---|
Initial_Plan_Emits_PlanCreatedEvent |
Implemented | Covered directly. |
Replan_Emits_ReplannedEvent |
Implemented | Covered by revision, multiple revision, stall reset, no-progress stall, and max-retry reset scenarios. |
Warning_Events_On_Errors |
Mostly implemented | Empty/invalid next speaker warnings and progress ledger parse/reset warnings are covered. |
Summary: 2 complete, 1 mostly complete.
8. Checkpoint/Resume Tests
| Planned Test | Current Status | Notes |
|---|---|---|
Checkpoint_Saves_TaskContext |
Not implemented | No direct assertion on serialized MagenticTaskContext. |
Checkpoint_Resume_Continues_Correctly |
Partially covered | Resume is exercised through approval, revision, multiple revisions, and stall-with-signoff. |
Checkpoint_Preserves_ProgressLedger |
Not implemented | No direct assertion that progress ledger state survives checkpoint/resume. |
Summary: 1 partial, 2 remaining.
9. Edge Cases
| Planned Test | Current Status | Notes |
|---|---|---|
Empty_Team_Handling |
Not implemented | No zero-participant coverage. |
Single_Agent_Team |
Partially covered | Many tests use one participant successfully, but there is no dedicated edge-case test. |
Instruction_Message_Sent_When_Present |
Partially implemented | Instruction path executes, but exact message delivery is not directly observed. |
Terminated_Context_Rejects_New_Messages |
Not implemented | No post-termination input coverage. |
Summary: 2 partial, 2 remaining.
Success Criteria Assessment
| Success Criterion | Assessment |
|---|---|
All logical forks in MagenticOrchestrator are covered by at least one test |
Substantially met. Major user-visible branches are covered: signoff/no-signoff, approval/revision/multiple revision, satisfied completion, round/reset/stall limits, progress-ledger retry/failure, empty/invalid speaker, instruction path, and stall detection through both main stall conditions. Remaining gaps are mostly direct state/routing assertions and post-termination behavior. |
Tests use the same patterns as HandoffOrchestrationTests |
Met. Tests use fully-built workflows, streaming runs, checkpointing, pending requests, events, and output collection. |
| Tests run against fully-built workflows | Met. Every E2E test builds through MagenticWorkflowBuilder(...).Build(). |
| Each test verifies specific event emissions and state changes | Mostly met. Event/output assertions are present, but internal counters, selected executor routing, and serialized checkpoint state are not directly asserted. |
Tests cover both requirePlanSignoff=true and false paths |
Met. Plan review scenarios use signoff; happy path, limit, stall, next-speaker, instruction, and ledger retry scenarios use no-signoff. |
| Checkpoint/resume functionality is verified | Partially met. Resume is exercised through human-review workflows, but direct checkpoint state inspection is still missing. |
Remaining Gaps and Recommended Next Tests
Continue one test at a time in this order:
Task_Delegates_To_Correct_Agent/NextSpeaker_Valid_Delegates_Correctly— use multiple participants and directly assert that the selected participant receives the turn while non-selected participants do not.Progress_Made_Decrements_StallCount— construct a scenario withMaxStallCount > 1, one stalled ledger, then one progress-making ledger, and prove reset is avoided because stall count decreased.Consecutive_Stalls_Trigger_Reset— cover a multi-stall threshold rather than only the simplifiedMaxStallCount=1case.- Direct checkpoint-state tests — inspect serialized
MagenticTaskContextand progress ledger state if the test infrastructure exposes a stable way to do so. - Dedicated edge-case tests — zero participants, explicit single-agent behavior, and post-termination rejection.
- Strengthen
Instruction_Message_Sent_When_Presentif a stable observable hook exists for the exact instructionChatMessagesent to the participant. - Resolve the
PlanReview_On_Stall_ReplanIsStalledexpectation by making an explicit behavior decision: either preserve stalled context for review requests or update the original expectation to match current reset-first behavior.
Overall Conclusion
The current Magentic E2E implementation is a strong partial completion of the original plan. It now covers 18 tests and fully implements the planned limit enforcement and progress ledger validation categories. Plan review coverage is also substantially complete, including approval, single revision, multiple revisions, and stall-triggered review after replan.
The next highest-value work is to improve observability of routing and state rather than adding more broad happy-path coverage. Direct participant-routing assertions and checkpoint-state assertions would close the most important remaining verification gaps. Any change to the stall-review IsStalled behavior should be confirmed before implementation because it would alter product behavior.