TaskRunService 문자열 정리 및 로드맵 검증 수치 동기화
Some checks failed
Release Gate / gate (push) Has been cancelled

- TaskRunService의 권한/도구/완료/오류 기본 요약 문자열에서 깨진 문자(인코딩 깨짐) 제거

- Permission/Hook/Tool 이벤트별 기본 타이틀·요약 문구를 일관된 표현으로 정리하여 replay/요약 가독성 개선

- StopRequested 기본 요약 문구가 잘못 치환되는 문제를 수정해 취소 흐름 의미를 복구

- AGENT_ROADMAP, NEXT_ROADMAP의 테스트 스냅샷을 최신 실측값(Parity 13/13, Replay 14/14, 전체 379/379)으로 동기화
This commit is contained in:
2026-04-03 21:44:13 +09:00
parent 0176754fa0
commit 9e37aad163
3 changed files with 23 additions and 22 deletions

View File

@@ -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 키:

View File

@@ -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 완료 기준)

View File

@@ -1,4 +1,4 @@
namespace AxCopilot.Services;
namespace AxCopilot.Services;
/// <summary>
/// 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