From 9e37aad163fe6bc16e0b04a1a3bb52277a609733 Mon Sep 17 00:00:00 2001 From: lacvet Date: Fri, 3 Apr 2026 21:44:13 +0900 Subject: [PATCH] =?UTF-8?q?TaskRunService=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20=EB=B0=8F=20=EB=A1=9C=EB=93=9C=EB=A7=B5=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EC=88=98=EC=B9=98=20=EB=8F=99=EA=B8=B0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TaskRunService의 권한/도구/완료/오류 기본 요약 문자열에서 깨진 문자(인코딩 깨짐) 제거 - Permission/Hook/Tool 이벤트별 기본 타이틀·요약 문구를 일관된 표현으로 정리하여 replay/요약 가독성 개선 - StopRequested 기본 요약 문구가 잘못 치환되는 문제를 수정해 취소 흐름 의미를 복구 - AGENT_ROADMAP, NEXT_ROADMAP의 테스트 스냅샷을 최신 실측값(Parity 13/13, Replay 14/14, 전체 379/379)으로 동기화 --- docs/AGENT_ROADMAP.md | 6 ++-- docs/NEXT_ROADMAP.md | 4 +-- src/AxCopilot/Services/TaskRunService.cs | 35 ++++++++++++------------ 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/docs/AGENT_ROADMAP.md b/docs/AGENT_ROADMAP.md index 9b64f45..e147a4b 100644 --- a/docs/AGENT_ROADMAP.md +++ b/docs/AGENT_ROADMAP.md @@ -34,9 +34,9 @@ 3. 패리티 수치(테스트 통과 수/게이트 상태)를 로드맵 문서 간 동일 문구로 유지. ## 6. 최신 검증 스냅샷 (2026-04-03) -- `dotnet test --filter "Suite=ParityBenchmark"`: 12/12 통과. -- `dotnet test --filter "Suite=ReplayStability"`: 12/12 통과. -- `dotnet test`: 374/374 통과. +- `dotnet test --filter "Suite=ParityBenchmark"`: 13/13 통과. +- `dotnet test --filter "Suite=ReplayStability"`: 14/14 통과. +- `dotnet test`: 379/379 통과. ## 7. 권한 Hook 계약 (P2 마감 기준) - lifecycle hook 키: diff --git a/docs/NEXT_ROADMAP.md b/docs/NEXT_ROADMAP.md index 5c45b2e..a727d90 100644 --- a/docs/NEXT_ROADMAP.md +++ b/docs/NEXT_ROADMAP.md @@ -36,7 +36,7 @@ ## 7. 2026-04-03 실행 증적 동기화 (M4 포함) - 기준 시점: 2026-04-03. -- 테스트: `dotnet test` 374/374 통과. +- 테스트: `dotnet test` 379/379 통과. - M1 증적: Hook 계약 필드(`updatedInput`, `updatedPermissions`, `additionalContext`) 반영 경로 구현 완료. - M2 증적: run 복원/이력 재구성(`RestoreRecentFromExecutionEvents`, `RestoreCurrentAgentRun`, plan 이력 조회) 구현 및 테스트 존재. - M3 증적: unknown-tool 복구 루프/결정 이벤트 처리 경로 구현 및 테스트 존재. @@ -56,7 +56,7 @@ - 기준 문서: `docs/CLAW_CODE_PARITY_PLAN.md` 13절. - 테스트 태그: `Suite=ReplayStability`. - 운영 기준: 릴리즈 전 `ReplayStability` 시나리오 전건 통과 시 replay 불일치 0건으로 판정. -- 최신 실행 증적(2026-04-03): `ParityBenchmark 12/12`, `ReplayStability 12/12`, 전체 `374/374`. +- 최신 실행 증적(2026-04-03): `ParityBenchmark 13/13`, `ReplayStability 14/14`, 전체 `379/379`. - 실행 자동화: `scripts/release-gate.ps1`로 빌드/벤치마크/리플레이/전체 테스트를 일괄 점검. ## 11. 권한 Hook 계약 고정 (M1 완료 기준) diff --git a/src/AxCopilot/Services/TaskRunService.cs b/src/AxCopilot/Services/TaskRunService.cs index b2ef969..0a54d0f 100644 --- a/src/AxCopilot/Services/TaskRunService.cs +++ b/src/AxCopilot/Services/TaskRunService.cs @@ -1,4 +1,4 @@ -namespace AxCopilot.Services; +namespace AxCopilot.Services; /// /// Executes task-state tracking behind a single service boundary. @@ -89,7 +89,7 @@ public sealed class TaskRunService StartOrUpdate( GetPermissionTaskKey(evt), "permission", - string.IsNullOrWhiteSpace(toolName) ? "권한 요청" : $"{toolName} 권한", + string.IsNullOrWhiteSpace(toolName) ? "permission request" : $"{toolName} permission", summary, "waiting", filePath); @@ -239,28 +239,28 @@ public sealed class TaskRunService StartPermissionRequest( evt.RunId, evt.ToolName, - string.IsNullOrWhiteSpace(evt.Summary) ? "권한 확인 대기" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "waiting for permission" : evt.Summary, evt.FilePath); break; case Agent.AgentEventType.PermissionGranted: CompletePermissionRequest( evt.RunId, evt.ToolName, - string.IsNullOrWhiteSpace(evt.Summary) ? "권한 확인됨" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "permission granted" : evt.Summary, true); break; case Agent.AgentEventType.PermissionDenied: CompletePermissionRequest( evt.RunId, evt.ToolName, - string.IsNullOrWhiteSpace(evt.Summary) ? "권한 거부됨" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "permission denied" : evt.Summary, false); break; case Agent.AgentEventType.ToolCall: StartToolRun( evt.RunId, evt.ToolName, - string.IsNullOrWhiteSpace(evt.Summary) ? $"{evt.ToolName} 실행 중" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? $"{evt.ToolName} running" : evt.Summary, evt.FilePath); break; case Agent.AgentEventType.ToolResult: @@ -274,7 +274,7 @@ public sealed class TaskRunService StartToolRun( evt.RunId, evt.ToolName, - string.IsNullOrWhiteSpace(evt.Summary) ? $"{evt.ToolName} 실행 중" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? $"{evt.ToolName} running" : evt.Summary, evt.FilePath, skill: true); break; @@ -282,7 +282,7 @@ public sealed class TaskRunService RecordHookResult( evt.RunId, evt.ToolName, - string.IsNullOrWhiteSpace(evt.Summary) ? "hook 실행" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "hook running" : evt.Summary, evt.Success, evt.FilePath); break; @@ -311,19 +311,19 @@ public sealed class TaskRunService case Agent.AgentEventType.Complete: CompleteAgentRun( evt.RunId, - string.IsNullOrWhiteSpace(evt.Summary) ? "작업 완료" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "task completed" : evt.Summary, true); CompleteByPrefix( string.IsNullOrWhiteSpace(evt.RunId) ? "tool:" : $"tool:{evt.RunId}:", - string.IsNullOrWhiteSpace(evt.Summary) ? "작업 완료" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "task completed" : evt.Summary, "completed"); CompleteByPrefix( string.IsNullOrWhiteSpace(evt.RunId) ? "permission:" : $"permission:{evt.RunId}:", - string.IsNullOrWhiteSpace(evt.Summary) ? "작업 완료" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "task completed" : evt.Summary, "completed"); CompleteByPrefix( string.IsNullOrWhiteSpace(evt.RunId) ? "hook:" : $"hook:{evt.RunId}:", - string.IsNullOrWhiteSpace(evt.Summary) ? "작업 완료" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "task completed" : evt.Summary, "completed"); break; case Agent.AgentEventType.StopRequested: @@ -364,15 +364,15 @@ public sealed class TaskRunService { CompleteAgentRun( evt.RunId, - string.IsNullOrWhiteSpace(evt.Summary) ? "오류 발생" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "error occurred" : evt.Summary, false); CompleteByPrefix( string.IsNullOrWhiteSpace(evt.RunId) ? "permission:" : $"permission:{evt.RunId}:", - string.IsNullOrWhiteSpace(evt.Summary) ? "오류 발생" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "error occurred" : evt.Summary, "failed"); CompleteByPrefix( string.IsNullOrWhiteSpace(evt.RunId) ? "hook:" : $"hook:{evt.RunId}:", - string.IsNullOrWhiteSpace(evt.Summary) ? "오류 발생" : evt.Summary, + string.IsNullOrWhiteSpace(evt.Summary) ? "error occurred" : evt.Summary, "failed"); } break; @@ -456,7 +456,7 @@ public sealed class TaskRunService { Id = BuildScopedId("permission", item), Kind = "permission", - Title = string.IsNullOrWhiteSpace(item.ToolName) ? "권한" : $"{item.ToolName} 권한", + Title = string.IsNullOrWhiteSpace(item.ToolName) ? "permission" : $"{item.ToolName} permission", Summary = item.Summary, Status = string.Equals(item.Type, nameof(Agent.AgentEventType.PermissionDenied), StringComparison.OrdinalIgnoreCase) ? "failed" : "completed", StartedAt = item.Timestamp, @@ -531,7 +531,7 @@ public sealed class TaskRunService { Id = BuildScopedId("permission", item), Kind = "permission", - Title = string.IsNullOrWhiteSpace(item.ToolName) ? "권한 요청" : $"{item.ToolName} 권한", + Title = string.IsNullOrWhiteSpace(item.ToolName) ? "permission request" : $"{item.ToolName} permission", Summary = item.Summary, Status = "waiting", StartedAt = item.Timestamp, @@ -776,3 +776,4 @@ public sealed class TaskRunService +