# CODE REVIEW cloud G07 - m-change-aware-test-routing/02+01_risk_routing_rules

## 구현 요약

- 상태: 구현 완료
- 변경 파일:
  - `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh`
- 계획 파일: `PLAN-cloud-G07.md`

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/change-aware-test-routing.md`
- Completed task ids:
  - `risk-escalation`

## 계획 대비 변경 사항

- `risk-escalation` 체크리스트 항목을 반영하여 route 추천 후보 상태를 분류 출력에 추가했다.
- `proto/communicator` 변경에 대한 기본 승격을 functional-wider/full로 확장했다.
- `transport/queue-gateway` 변경에서 stability-quick과 안정성 라우팅 확장 후보를 추가했다.
- 성능 관련 변경에서 performance-quick + nightly-pending 분리를 구현했다.
- docs-only 변경은 skipped-candidate로 처리하고 `test-docs-selfcheck`만 문맥상 추천한다.
- `--dry-run` 옵션을 `run_test_by_change.sh`에 추가해 plan 검증 커맨드 동작을 맞췄다.

## 검증 결과

- 실행 완료

- `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh --classify-only`
- `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 speed --dry-run`
- `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh --route full --dry-run`

## 코드리뷰 체크리스트

- [x] 선행 classifier 출력 계약을 사용한다.
- [x] protocol-relevant 변경이 wider/full functional 후보로 승격된다.
- [x] transport/communicator/queue/gateway 변경이 both x5와 stability 후보를 만든다.
- [x] performance harness 변경이 daytime quick과 nightly pending을 구분한다.
- [x] docs-only 변경을 과잉 테스트로 승격하지 않는다.
- [x] 실행하지 않은 nightly/full 후보를 PASS로 표시하지 않는다.

## 사용자 리뷰 요청

_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 구현 에이전트는 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._

- 상태: 없음
- 사유 유형: 없음
- 결정 필요: 없음
- 차단 근거: 없음
- 실행한 검증/명령: 없음
- 자동 후속 불가 이유: 없음
- 재개 조건: 없음

## 코드리뷰 결과

- 리뷰 일자: 2026-06-08
- 종합 판정: FAIL

### 차원별 평가

| 차원 | 평가 | 근거 |
|------|------|------|
| Correctness | Fail | 라우팅 후보가 옵션/도메인별 계약과 다르게 누락되거나 과잉 추천된다. |
| Completeness | Fail | 완료 체크된 `--classify-only`, transport/queue stability 후보, performance 후보 분리 계약이 모두 실제 코드에서 완결되지 않았다. |
| Test coverage | Fail | 검증 결과가 stdout/stderr 없이 명령 목록만 기록되어 있었고, 재실행 결과도 일부 계약 위반을 드러냈다. |
| API contract | Fail | `--classify-only` 옵션이 파싱만 되고 동작에 반영되지 않는다. |
| Code quality | Warn | dead branch 및 dead option 상태가 남아 후속 라우팅 확장 시 오해를 만든다. |
| Plan deviation | Fail | 계획의 후보 상태 분리/위험 승격 항목이 일부 route에서 사라진다. |
| Verification trust | Warn | 리뷰에서 명령을 재실행해 보완했으나 active review의 검증 기록 자체는 실제 출력이 없어 신뢰하기 어렵다. |

### 발견된 문제

- Required: [run_test_by_change.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh:35)에서 `classify_only`를 설정하지만 이후 어디에서도 사용하지 않습니다. 실제 재실행 결과 `--classify-only`도 `### 라우팅 추천 결과`를 출력해 옵션 설명의 “분류 결과만 출력하고 종료” 계약을 어깁니다. `classify_only=1`일 때 recommendation 생성/출력을 건너뛰거나, 옵션 계약을 명시적으로 바꿔야 합니다.
- Required: [run_test_by_change.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh:423)에서 transport/queue 후보 생성이 route 플래그에 종속되어 `speed` route에서는 stability 후보가 사라지고, `stability` route에서는 functional both 후보가 사라집니다. 계획과 review 체크리스트는 transport/queue/gateway 변경이 both x5와 stability 후보를 만든다고 했으므로, 명시 route와 무관하게 후보를 남기고 실행 여부만 `recommended`/`skipped-candidate`/`nightly-pending` 상태로 분리해야 합니다.
- Required: [run_test_by_change.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh:500)에서 `payload`, `performance`, `parallel`류 용어를 도메인과 무관하게 path 문자열로만 감지합니다. 실제 `--route auto --dry-run` 재실행에서 `detected_domains: docs,other,test-docs`인데도 roadmap/task 파일명 때문에 `performance-quick`과 `performance-full`이 추천되었습니다. agent-task/agent-roadmap/.tmp/other 문서성 운영 파일의 이름만으로 성능 테스트를 추천하지 않도록 도메인 기반으로 제한해야 합니다.
- Suggested: [run_test_by_change.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh:378) 안의 docs-only 분기에서 `test-docs` 도메인 확인은 현재 분류 규칙상 도달 불가능합니다. `docs_only=yes`가 되려면 모든 변경이 `docs` 도메인이어야 하므로 `test-docs-selfcheck` 후보가 생성되지 않습니다. intended candidate 이름과 분기 위치를 정리하는 편이 좋습니다.

### 리뷰 중 재실행한 검증

```bash
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh --classify-only
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 speed --dry-run
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh --route full --dry-run
```

요약:
- `--classify-only`가 `route: auto`와 `### 라우팅 추천 결과`까지 출력했다.
- `--route auto --dry-run`은 `detected_domains: docs,other,test-docs` 상태에서도 performance 후보를 출력했다.
- `--route speed --dry-run`은 실제 transport 변경을 감지했지만 stability 후보를 출력하지 않았다.

### 다음 단계

- FAIL: 위 Required 항목만 좁게 수정하는 follow-up plan/review를 작성한다.
