<!-- task=m-change-aware-test-routing/01_dart_web_coverage plan=2 tag=REVIEW_RWD -->

# Plan: RWD 리뷰 FAIL 보완

## 이 파일을 읽는 구현 에이전트에게

이 계획은 `code_review_local_G01_0.log`의 Required 이슈만 좁게 보완한다. 구현이 끝나면 실행한 명령, 실제 stdout/stderr, 판단 근거를 active `CODE_REVIEW-local-G02.md`의 구현 에이전트 소유 섹션에 채우고 active 파일을 그대로 둔 채 리뷰 준비를 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review 스킬 전용이므로 구현 에이전트가 수행하지 않는다. 사용자만 결정할 수 있는 범위 충돌, 사용자 소유 외부 환경, secret, 서비스 준비가 필요하면 직접 질문하지 말고 `CODE_REVIEW-local-G02.md`의 `사용자 리뷰 요청` 섹션에 정확한 증거와 재개 조건을 남긴 뒤 중단한다.

## 배경

G01 리뷰에서 direction routing 구현 증거와 명시 라우팅 skipped 후보 계약이 불충분한 것이 확인되었다. 현재 작업트리 기준 `run_test_by_change.sh`에는 direction aggregation diff가 남아 있지 않으므로 원래 RWD 요구사항을 다시 구현해야 한다. 또한 구현 증거가 잘못된 source tree 위치에 생성되었고, active review stub은 비어 있어 loop artifact가 판단 불가능한 상태였다.

## 사용자 리뷰 요청 흐름

구현 중 사용자 판단이 필요한 사항은 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. 구현 에이전트는 사용자에게 직접 질문하거나 chat 선택지를 만들지 않으며, code-review 스킬이 user-review 필요성을 검증하고 `USER_REVIEW.md` 작성 여부를 결정한다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 공백은 사용자 리뷰 요청이 아니라 검증 결과 또는 계획 대비 변경 사항으로 기록한다.

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/change-aware-test-routing.md`
- Task ids:
  - `dart-web-coverage`: Dart.web/Dart.web(WSS) 필수 coverage 유지 항목의 기능 라우팅 보완
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-task/m-change-aware-test-routing/01_dart_web_coverage/plan_local_G01_0.log`
- `agent-task/m-change-aware-test-routing/01_dart_web_coverage/code_review_local_G01_0.log`
- `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh`
- `agent-roadmap/milestones/change-aware-test-routing.md`
- `agent-test/local/rules.md`

### 테스트 환경 규칙

- test_env: `local`
- `agent-test/local/rules.md` 존재 및 읽음.
- 이번 변경은 shell routing classifier 보완이므로 검증은 runner 자체의 deterministic `--dry-run`/`--classify-only` 출력과 임시 worktree 기반 filename hint smoke로 판단한다.

### 테스트 커버리지 공백

- 기존 자동 테스트는 filename hint별 server/client/both 및 명시 라우팅 skipped 후보 계약을 직접 고정하지 않는다.
- 따라서 follow-up은 실제 stdout/stderr가 포함된 focused smoke를 `CODE_REVIEW-local-G02.md`에 남겨야 한다.

### 심볼 참조

- renamed/removed symbol 없음.
- public API 변경 없음.

### 분할 판단

- split policy를 재검토했다. 이번 follow-up은 이미 split subtask `01_dart_web_coverage` 내부의 review fix이며, 동작 수정과 artifact 정리는 같은 G01 Required 묶음을 해소하는 단일 단위다.
- 별도 subtask로 나누면 동일 active review artifact를 두 경로에서 소유하게 되므로 현재 디렉터리의 G02 follow-up으로 유지한다.

### 범위 결정 근거

- `run_test_by_change.sh`의 언어 direction aggregation, auto route direction-specific recommendation, 명시 라우팅 skipped 후보 계약, 잘못 생성된 source tree review artifact, roadmap 직접 완료 체크 diff 정리만 포함한다.
- `02_full_functional_periodic`의 full functional periodic 설계, runner 신규 작성, roadmap archive/status 전환은 범위 밖이다.

### 빌드 등급

- lane: local, GNN: 02
- 근거: G01에서 놓친 issue가 명확하고 재현 가능한 shell 출력 계약에 한정되며, 후속 검증도 local에서 deterministic하게 가능하다.

## 구현 체크리스트

- [ ] [REVIEW_RWD-1] `run_test_by_change.sh`에 언어별 direction aggregation을 추가하고, `auto`의 recommended 경로에서만 `functional-server-x5`/`functional-client-x5`/`functional-both-x5` direction 분기를 적용한다. `functional_status != recommended`인 명시 라우팅(`speed`, `stability` 등)의 언어 변경 skipped 후보는 기존 계약대로 `functional-both-x5`로 유지한다.
- [ ] [REVIEW_RWD-2] `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/CODE_REVIEW-local-G01.md`처럼 source script 디렉터리에 잘못 생성된 리뷰 산출물을 제거하고, 필요한 구현/검증 증거는 active task artifact인 `CODE_REVIEW-local-G02.md`에 남긴다.
- [ ] [REVIEW_RWD-3] `agent-roadmap/milestones/change-aware-test-routing.md`의 완료 체크 diff가 이번 task 산출물이면 되돌린다. 사용자 또는 별도 task 소유 변경으로 판단해 보존해야 하면, 해당 판단 근거와 `git diff -- agent-roadmap/milestones/change-aware-test-routing.md` 확인 결과를 `CODE_REVIEW-local-G02.md`의 `계획 대비 변경 사항`에 기록한다.
- [ ] [REVIEW_RWD-4] 검증 명령을 실행하고 실제 stdout/stderr를 `CODE_REVIEW-local-G02.md`에 붙인다. 최소 검증은 `--route auto --dry-run`, `--route auto --classify-only`, 그리고 임시 worktree 기반 server-only/client-only/mixed `auto` 및 server-only `speed` 또는 `stability` 명시 라우팅 확인을 포함한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_RWD-1] direction routing 구현 및 명시 라우팅 skipped 후보 계약 유지

- `문제`: 현재 `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh`는 언어 변경을 `functional-both-x5`로만 추천하므로 server-only/client-only filename hint를 반영하지 못한다. 단, 명시 라우팅 skipped 후보는 기존 `functional-both-x5` 계약을 유지해야 한다.
- `해결 방법`: 파일 경로의 server/client hint를 언어별 direction map으로 집계하고, `functional_status = recommended`인 auto/full functional 경로에서만 direction-specific 추천을 낸다. `functional_status != recommended` branch는 direction map을 쓰지 않고 `functional-both-x5` skipped 후보를 유지한다.
- `수정 파일 및 체크리스트`: `run_test_by_change.sh`에 direction aggregation helper와 `build_recommendations()` 인자/분기를 추가하되, explicit route skipped branch는 `functional-both-x5`로 둔다.
- `테스트 작성`: 별도 파일 테스트는 작성하지 않는다. shell route output 계약을 focused smoke로 검증한다.
- `중간 검증`: 임시 worktree에서 server-only/client-only/mixed filename hint + `--route auto --dry-run` 출력이 각각 server/client/both x5를 내고, server-only filename hint + `--route speed --dry-run` 출력은 skipped `functional-both-x5`여야 한다.

### [REVIEW_RWD-2] source tree review artifact 제거

- `문제`: `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/CODE_REVIEW-local-G01.md`가 source script 디렉터리에 생성되어 classifier 변경 파일 목록에 섞인다.
- `해결 방법`: 잘못 생성된 파일을 제거하고, 필요한 증거는 active task artifact인 `CODE_REVIEW-local-G02.md`에 기록한다.
- `수정 파일 및 체크리스트`: source tree의 잘못된 `CODE_REVIEW-local-G01.md` 제거 여부를 `git status --short`로 확인한다.
- `테스트 작성`: 테스트 파일 없음. artifact 위치 정리이므로 git status와 classifier output으로 확인한다.
- `중간 검증`: `git ls-files --others --exclude-standard | rg --sort path 'scripts/CODE_REVIEW-local-G01.md'`가 결과를 내지 않아야 한다.

### [REVIEW_RWD-3] roadmap 직접 완료 체크 diff 정리

- `문제`: `agent-roadmap/milestones/change-aware-test-routing.md`에 PASS 이벤트 전 완료 체크 diff가 남아 있다.
- `해결 방법`: 이번 task 산출물이라면 되돌린다. 사용자 또는 별도 task 소유 변경이면 보존 근거와 diff를 review stub에 기록한다.
- `수정 파일 및 체크리스트`: `agent-roadmap/milestones/change-aware-test-routing.md`의 diff를 확인하고 범위 내 처리한다.
- `테스트 작성`: 문서 상태 정리라 별도 테스트 없음.
- `중간 검증`: `git diff -- agent-roadmap/milestones/change-aware-test-routing.md`를 기록한다.

### [REVIEW_RWD-4] 검증 증거 기록

- `문제`: G01 review artifact는 필수 검증 stdout/stderr가 active task 위치에 남아 있지 않았다.
- `해결 방법`: 최종 검증 명령을 실제 실행하고 `CODE_REVIEW-local-G02.md`에 stdout/stderr를 붙인다.
- `수정 파일 및 체크리스트`: `CODE_REVIEW-local-G02.md`의 구현 항목별 완료 여부, 구현 체크리스트, 계획 대비 변경 사항, 주요 설계 결정, 검증 결과를 채운다.
- `테스트 작성`: 별도 테스트 파일 없음. 검증 output을 review artifact에 남긴다.
- `중간 검증`: `--route auto --dry-run`, `--route auto --classify-only`, 임시 worktree smoke 출력이 계획 기대와 일치해야 한다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh` | REVIEW_RWD-1 |
| `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/CODE_REVIEW-local-G01.md` | REVIEW_RWD-2 |
| `agent-roadmap/milestones/change-aware-test-routing.md` | REVIEW_RWD-3 |
| `agent-task/m-change-aware-test-routing/01_dart_web_coverage/CODE_REVIEW-local-G02.md` | REVIEW_RWD-4 |

## 최종 검증

- `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh --route auto --dry-run`
- `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh --route auto --classify-only`
- 임시 worktree에서 현재 script 변경을 복사한 뒤 server-only, client-only, mixed filename hint에 대해 `--route auto --dry-run`을 확인한다.
- 임시 worktree에서 server-only filename hint에 대해 `--route speed --dry-run` 또는 `--route stability --dry-run`이 skipped `functional-both-x5`를 출력하는지 확인한다.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
