<!-- task=m-change-aware-test-routing/03_nightly_periodic_contract plan=1 tag=REVIEW_TEST -->

# Plan - REVIEW_TEST

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

이 plan은 이전 리뷰의 Required 이슈만 닫는다. `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 채우는 것이 마지막 단계다. 검증은 실제 stdout/stderr를 생략 없이 기록하고, 사용자 결정/외부 환경/scope 충돌이 있으면 chat에서 묻지 말고 review stub의 `사용자 리뷰 요청` 섹션에 근거와 재개 조건을 남긴다.

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/change-aware-test-routing.md`
- Task ids:
  - `nightly-heavy-routing`: sustained, high parallel, 1MB payload, 장시간 leak 확인은 20:00 이후 full/nightly 후보로 분리한다.
  - `periodic-full-routing`: 정기 full test는 functional full 5x5와 performance/stability nightly full을 구분해 실행 후보를 만든다.
- Completion mode: check-on-pass

## 리뷰 실패 요약

- `run_test_by_change.sh --route full --dry-run`에서 `test-docs` 변경이 포함되면 `runner-docs-selfcheck/test-docs`가 `recommended`와 `skipped-candidate`로 동시에 출력된다.
- 기존 `CODE_REVIEW`의 검증 결과가 실제 stdout/stderr가 아니라 `...`, `(주요 라인 발췌)`, `(동일)` 같은 요약으로 채워져 있어 contradictory row를 review evidence에서 확인할 수 없었다.

## 범위 결정 근거

- nightly-pending command mapping 자체는 유지한다.
- full matrix 실행, performance/stability full 실행, roadmap 상태 수정은 이 follow-up 범위가 아니다.
- 현재 worktree의 다른 roadmap diff는 이 plan에서 수정하지 않는다. 이 follow-up은 runner script와 검증 증빙만 다룬다.

## 구현 체크리스트

- [ ] [REVIEW_TEST-1] `run_test_by_change.sh`가 full route + `test-docs`에서 `runner-docs-selfcheck`를 단일 상태로만 출력하게 한다.
- [ ] [REVIEW_TEST-2] focused smoke와 `run_full_test.sh --dry-run`으로 contradictory `runner-docs-selfcheck` 행이 사라지고 nightly-pending 행이 유지됨을 실제 stdout/stderr로 검증한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_TEST-1] runner-docs-selfcheck 상태 모순 제거

`문제`: full route에서 `full_activate` 블록은 `runner-docs-selfcheck/test-docs`를 `recommended`로 추가한다. 이후 공통 test-docs 블록이 route가 `auto`가 아니라는 이유로 같은 후보를 `skipped-candidate`로 다시 추가한다. 중복 key에 status가 포함되어 있어 두 행이 모두 출력된다.

`해결 방법`: 후단 test-docs 블록이 full route를 recommended로 취급해 기존 recommended row와 dedup되게 하거나, full route에서는 후단 row를 추가하지 않는다. 같은 `테스트 후보 + 대상`에 서로 다른 상태가 동시에 출력되지 않아야 한다.

`수정 파일 및 체크리스트`:

- [ ] `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh`의 `runner-docs-selfcheck` status 결정을 full route aware로 수정한다.
- [ ] auto route의 `runner-docs-selfcheck` recommended 동작은 유지한다.
- [ ] full route의 `functional-full`, `performance-full` nightly-pending, `stability-full` nightly-pending 출력은 유지한다.

`중간 검증`:

```bash
bash -n agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh
```

### [REVIEW_TEST-2] 검증 증빙 복구

`문제`: 이전 review stub의 검증 결과가 실제 stdout/stderr가 아니어서 review trust가 깨졌다. 후속 구현은 출력 전체를 기록하거나, 긴 출력이면 명령 자체가 필터링한 실제 stdout/stderr를 기록해야 한다. `...`, `(동일)`, `(주요 라인 발췌)` 같은 재구성 문구는 사용하지 않는다.

`해결 방법`: focused temp repo smoke에서 transport 변경과 test-docs 변경을 함께 만들어 full route row를 확인한다. `runner-docs-selfcheck`는 한 번만 나오고 `skipped-candidate | runner-docs-selfcheck`는 없어야 한다. `run_full_test.sh --dry-run`도 재실행해 nightly pending report가 유지되는지 확인한다.

`수정 파일 및 체크리스트`:

- [ ] focused temp repo smoke를 실행하고 `auto`, `speed`, `stability`, `full` route의 routing table stdout을 실제 출력으로 남긴다.
- [ ] full route smoke에 `test-docs` 변경을 포함해 `runner-docs-selfcheck` 상태 모순이 사라졌음을 확인한다.
- [ ] `run_full_test.sh --dry-run` 출력에서 nightly pending 섹션과 PASS 제외 문구를 실제 stdout으로 남긴다.

`중간 검증`:

```bash
tmp="$(mktemp -d /tmp/proto-routing-smoke.XXXXXX)"
repo="$tmp/repo"
mkdir -p "$repo/agent-ops/skills/project/run-proto-socket-test-matrix/scripts" "$repo/agent-test/runs" "$repo/go/transport"
cp agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh "$repo/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh"
cd "$repo"
git init -q
git config user.email smoke@example.com
git config user.name Smoke
printf 'package transport\n' > go/transport/server.go
printf 'baseline docs\n' > agent-ops/skills/project/run-proto-socket-test-matrix/SKILL.md
git add .
git commit -q -m baseline
base_ref="$(git rev-parse --short HEAD)"
record="agent-test/runs/$(date -u +%Y%m%d-%H%M%S)-proto-socket-full-matrix.md"
printf '%s\n' '---' 'overall_result: PASS' '---' '' "- git ref: $base_ref" > "$record"
git add "$record"
git commit -q -m record
printf 'package transport // queue backlog 1mb latency\n' > go/transport/server.go
printf 'changed docs performance-full stability-full nightly-pending\n' > agent-ops/skills/project/run-proto-socket-test-matrix/SKILL.md
for route in auto speed stability full; do
  printf '\n=== route: %s ===\n' "$route"
  bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh --route "$route" --dry-run | sed -n '/### 라우팅 추천 결과/,$p'
done
```

## 최종 검증

```bash
bash -n agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh && bash -n agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_full_test.sh
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_full_test.sh --dry-run
rg --sort path -n "performance-full|stability-full|20:00|nightly-pending|runner-docs-selfcheck" agent-ops/skills/project/run-proto-socket-test-matrix agent-test/local
git diff --check
```

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