From 375356f7654c6a1874715c0c77ff8cf39987202f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 13 May 2026 22:44:17 +0000 Subject: [PATCH] Add ProgressLedger_Retry_On_Parse_Failure E2E test Agent-Logs-Url: https://github.com/microsoft/agent-framework/sessions/125f6628-6b3b-4c51-9a51-ae84baece6bb Co-authored-by: lokitoth <6936551+lokitoth@users.noreply.github.com> --- .../MagenticOrchestrationTests.cs | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/dotnet/tests/Microsoft.Agents.AI.Workflows.UnitTests/MagenticOrchestrationTests.cs b/dotnet/tests/Microsoft.Agents.AI.Workflows.UnitTests/MagenticOrchestrationTests.cs index f1d0f248d9..4d0a5e9b7c 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Workflows.UnitTests/MagenticOrchestrationTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.Workflows.UnitTests/MagenticOrchestrationTests.cs @@ -720,6 +720,49 @@ public class MagenticOrchestrationTests runResult.Result![0].Text.Should().Contain("maximum reset count limit"); } + [Fact] + public async Task ProgressLedger_Retry_On_Parse_Failure() + { + // Arrange: First progress ledger attempt returns invalid JSON (triggers parse failure + warning), + // second attempt returns valid JSON (satisfied=true). + // Manager turn sequence: facts, plan, INVALID_JSON, VALID_LEDGER(satisfied), finalAnswer + // MagenticManager.UpdateProgressLedgerAsync retries internally: attempt 0 fails, attempt 1 succeeds. + List factsResponse = CreatePlanResponse("Facts about the task"); + List planResponse = CreatePlanResponse("Step 1: Execute"); + List invalidLedgerResponse = CreatePlanResponse("This is not valid JSON for a progress ledger"); + List validLedgerResponse = CreateProgressLedgerResponse( + isRequestSatisfied: true, + isInLoop: false, + isProgressBeingMade: true, + nextSpeaker: "Worker", + instructionOrQuestion: "Done after retry"); + List finalAnswerResponse = CreateFinalAnswerResponse("Completed after ledger retry"); + + TestReplayAgent manager = new( + [factsResponse, planResponse, invalidLedgerResponse, validLedgerResponse, finalAnswerResponse], + name: "Manager"); + TestEchoAgent worker = new(name: "Worker"); + + List collectedEvents = []; + + Workflow workflow = new MagenticWorkflowBuilder(manager) + .AddParticipants(worker) + .RequirePlanSignoff(false) + .Build(); + + // Act + WorkflowRunResult runResult = await RunMagenticWorkflowAsync( + workflow, + [new ChatMessage(ChatRole.User, "Do task")], + eventCollector: collectedEvents); + + // Assert: Warning emitted for parse failure, but workflow completes successfully + collectedEvents.OfType() + .Should().Contain(e => e.Data != null && e.Data.ToString()!.Contains("Progress ledger JSON parse failed")); + runResult.Result.Should().NotBeNull(); + runResult.Result![0].Text.Should().Contain("Completed after ledger retry"); + } + #region Helper Methods private sealed record WorkflowRunResult(