lacvet
8c0aa98408
에이전트 루프 수명주기와 tool_result 복원 품질을 마감한다
목적:
- AgentLoopService 시작/종료 책임을 분리해 루프 본체를 더 얇은 orchestration 구조로 정리한다.
- 장기 세션과 분기 대화에서 tool_result preview가 다른 tool_use_id로 재등장해도 안정적으로 복원되도록 replacement state를 보강한다.
- DOCX/PPTX/XLSX 반환 경로까지 문서 품질 출력 formatter를 통일해 포맷별 quality summary와 repair guide 표현을 일관되게 맞춘다.
핵심 수정:
- AgentLoopRunLifecycle.cs를 추가해 BeginRun/BootstrapRunAsync/FinalizeRun/ResetRunTransientState를 분리하고, AgentLoopService는 해당 helper를 사용하도록 정리했다.
- run 종료 metric에 빈 run id가 기록되던 흐름을 수정해 실제 run id가 유지되도록 고쳤다.
- AgentMessageInvariantHelper에 persisted preview map, fingerprint preview map, tool_use_id 재바인딩 로직을 추가해 저장/재개/분기 이후 preview 복원 품질을 높였다.
- ArtifactQualityOutputFormatter를 DocxSkill, PptxSkill, ExcelSkill 멀티시트 출력 경로까지 연결해 quality summary/repair guide 문자열 조립을 공통 helper로 통일했다.
- AgentMessageInvariantHelperTests에 fingerprint 재바인딩 회귀를 추가했다.
- README.md, docs/DEVELOPMENT.md, docs/NEXT_ROADMAP.md에 2026-04-15 10:05 (KST) 기준 변경 이력을 반영했다.
검증 결과:
- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_run_finalize\\ -p:IntermediateOutputPath=obj\\verify_run_finalize\\ : 경고 0 / 오류 0
- dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter AgentCommandQueueTests|AgentQueuedCommandProjectorTests|AgentMessageInvariantHelperTests|AgentQueryContextBuilderTests|ChatStorageServiceTests|PptxSkillGoldenDeckTests|ExcelSkillGoldenWorkbookTests|DocxSkillGoldenDocumentTests|HtmlSkillGoldenReportTests -p:OutputPath=bin\\verify_run_finalize_tests2\\ -p:IntermediateOutputPath=obj\\verify_run_finalize_tests2\\ : 통과 18
2026-04-15 10:07:01 +09:00
..
2026-04-15 07:01:45 +09:00
2026-04-14 17:52:46 +09:00
2026-04-12 21:50:22 +09:00
2026-04-15 09:21:55 +09:00
2026-04-14 17:52:46 +09:00
2026-04-12 22:02:14 +09:00
2026-04-14 17:52:46 +09:00
2026-04-12 22:02:14 +09:00
2026-04-15 10:07:01 +09:00
2026-04-09 00:16:54 +09:00
2026-04-15 10:07:01 +09:00
2026-04-12 22:02:14 +09:00
2026-04-12 22:49:33 +09:00
2026-04-14 17:52:46 +09:00
2026-04-14 17:52:46 +09:00
2026-04-15 10:07:01 +09:00
2026-04-15 08:34:24 +09:00
2026-04-15 08:58:19 +09:00
2026-04-05 17:55:01 +09:00
2026-04-14 18:23:18 +09:00
2026-04-15 08:34:24 +09:00
2026-04-14 17:52:46 +09:00
2026-04-15 10:07:01 +09:00
2026-04-15 08:58:19 +09:00
2026-04-15 08:58:19 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-12 22:02:14 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-15 08:34:24 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-03 20:16:23 +09:00
2026-04-03 20:16:23 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 23:16:00 +09:00
2026-04-15 08:58:19 +09:00
2026-04-15 08:58:19 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 23:59:09 +09:00
2026-04-14 22:15:50 +09:00
2026-04-12 22:02:14 +09:00
2026-04-09 14:27:59 +09:00
2026-04-15 10:07:01 +09:00
2026-04-12 22:02:14 +09:00
2026-04-09 14:27:59 +09:00
2026-04-03 20:16:23 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-15 10:07:01 +09:00
2026-04-14 17:52:46 +09:00
2026-04-03 20:16:23 +09:00
2026-04-03 20:16:23 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-12 22:02:14 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:27:59 +09:00
2026-04-15 09:52:36 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 17:52:46 +09:00
2026-04-12 22:02:14 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 17:52:46 +09:00
2026-04-14 17:52:46 +09:00
2026-04-12 22:02:14 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-15 08:34:24 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 19:15:12 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-12 22:49:33 +09:00
2026-04-14 17:52:46 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-06 09:44:53 +09:00
2026-04-04 23:03:42 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:49:53 +09:00
2026-04-09 14:27:59 +09:00
2026-04-15 10:07:01 +09:00
2026-04-14 22:54:24 +09:00
2026-04-12 22:02:14 +09:00
2026-04-09 14:27:59 +09:00
2026-04-03 18:22:19 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 17:52:46 +09:00
2026-04-14 17:52:46 +09:00
2026-04-14 19:15:12 +09:00
2026-04-14 19:15:12 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 21:07:49 +09:00
2026-04-14 17:52:46 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:27:59 +09:00
2026-04-03 20:16:23 +09:00
2026-04-09 14:27:59 +09:00
2026-04-03 18:22:19 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-12 22:47:21 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-03 20:16:23 +09:00
2026-04-12 22:02:14 +09:00
2026-04-14 17:52:46 +09:00
2026-04-09 14:27:59 +09:00
2026-04-03 18:22:19 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-14 19:15:12 +09:00
2026-04-09 14:49:53 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00
2026-04-15 09:52:36 +09:00
2026-04-03 20:16:23 +09:00
2026-04-12 22:02:14 +09:00
2026-04-09 14:27:59 +09:00
2026-04-09 14:27:59 +09:00