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

# Plan - TEST

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

`CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 채우는 것이 구현의 마지막 단계다. 검증을 실행하고 실제 출력, 계획 대비 변경, 주요 설계 결정을 기록한 뒤 active 파일을 유지한 채 리뷰 준비를 보고한다. 사용자 결정, 사용자 소유 환경, scope 충돌이 막으면 사용자에게 직접 묻지 말고 `사용자 리뷰 요청` 섹션에 근거와 재개 조건을 채운다. finalization, `complete.log`, archive 이동은 code-review 전용이다.

## 배경

`performance-stability-routing` 에픽의 낮 시간 quick 후보는 classifier에서 바로 닫혔지만, `nightly-heavy-routing`과 `periodic-full-routing`은 `run_full_test.sh`, classifier 출력, 결과 보고 계약이 함께 움직인다. 장시간/대용량 row를 낮 시간 PASS 근거로 오인하지 않게 하려면 nightly 후보의 command, 시간 조건, record 상태가 runner 출력에 명시되어야 한다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. 구현 에이전트는 chat에서 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. code-review가 사용자 리뷰 요청의 타당성을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.

## 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

## 분석 결과

### 읽은 파일

- `agent-roadmap/current.md`
- `agent-roadmap/milestones/change-aware-test-routing.md`
- `agent-test/local/rules.md`
- `agent-test/local/proto-socket-full-matrix.md`
- `agent-test/local/proto-socket-performance-baseline.md`
- `agent-ops/rules/common/philosophy.md`
- `agent-ops/skills/project/run-proto-socket-test-matrix/SKILL.md`
- `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh`
- `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_full_test.sh`
- `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_performance.sh`
- `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh`

### 테스트 환경 규칙

- test_env: `local`
- `agent-test/local/rules.md` 존재 및 읽음.
- 적용 profile: `agent-test/local/proto-socket-full-matrix.md`, `agent-test/local/proto-socket-performance-baseline.md`.
- 적용 명령: `bash -n .../run_test_by_change.sh .../run_full_test.sh`, `bash .../run_test_by_change.sh --route full --dry-run`, temp repo focused smoke for route rows.
- fallback: 없음.

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

- nightly 후보 command/time/report 계약은 전용 test file이 없다. focused temp repo smoke로 classifier/full runner 출력 행을 검증한다.
- 실제 long-running `run_performance.sh --full`과 `run_stress.sh --full` 실행은 이 plan의 필수 검증에서 제외한다. 이 plan은 실행 후보와 PASS 오인 방지 계약만 닫는다.

### 심볼 참조

- renamed/removed symbol: none.

### 분할 판단

- split decision policy를 평가했다.
- shared task group: `agent-task/m-change-aware-test-routing`.
- 이 plan은 `03_nightly_periodic_contract` 단일 subtask다.
- `nightly-heavy-routing`과 `periodic-full-routing`은 모두 classifier/full runner의 nightly-pending 계약에 걸려 있고 같은 smoke 검증으로 판단된다. 별도 subtask로 나누면 command/status 문구가 서로 어긋날 위험이 커서 단일 계획이 더 안전하다.
- dependent predecessor: 없음. 디렉터리명이 `03_...`라 runtime predecessor는 없다.

### 범위 결정 근거

- 새 `run_speed_test.sh`/`run_stability_test.sh` 생성은 `user-entrypoints`와 `skill-and-runner-contract` Epic 범위라 제외한다.
- 실제 야간 baseline 수집과 성능 최적화는 `nightly-large-payload-baseline` 및 `large-payload-followup-optimization` 마일스톤 범위라 제외한다.
- full matrix 실행 자체의 내부 동작은 유지하고, nightly 후보 표시와 결과 계약만 보강한다.

### 빌드 등급

- build: `cloud-G07`; review: `cloud-G07`. Shell runner orchestration, stdout parsing, exit-status/report contract가 핵심이라 terminal workflow 판단 비용이 높다.

## 구현 체크리스트

- [ ] [TEST-1] `run_full_test.sh`가 classifier의 `nightly-pending` rows를 별도 섹션으로 출력하고 실행하지 않은 항목을 PASS로 보고하지 않는다.
- [ ] [TEST-2] `run_test_by_change.sh`와 docs가 `performance-full`/`stability-full` nightly 후보의 20:00 이후 조건과 command 후보를 같은 용어로 설명한다.
- [ ] [TEST-3] focused smoke로 full route가 functional recommended와 nightly-pending 후보를 분리하고, auto/speed/stability route의 quick 후보와 충돌하지 않음을 검증한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [TEST-1] Full Runner Nightly Pending Report

`문제`: [run_full_test.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_full_test.sh:66)는 dry-run에서 functional 여부만 말하고, [run_full_test.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_full_test.sh:82)는 matrix 실행만 수행한다. `nightly-pending` rows가 있어도 command 후보와 PASS 제외 상태가 사용자-facing 출력에 남지 않는다.

Before:

```bash
66	if [ "$dry_run" -eq 1 ]; then
67	  echo "### Dry-run 완료"
68	  if [ "$has_recommended" -eq 1 ]; then
69	    echo "full functional recommended — 실제 실행하려면 --dry-run 옵션을 제거하라."
70	  else
71	    echo "full functional 미권장 — 실행하지 않음."
72	  fi
73	  exit 0
```

`해결 방법`: classifier output에서 `| nightly-pending | ... | ... | ... |` rows를 파싱해 `## Nightly pending` 섹션을 출력한다. `performance-full`은 `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_performance.sh --full`, `stability-full`은 `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --full --profile sustained,parallel,payload` 후보로 표시한다. dry-run과 실제 matrix 실행 후 모두 “미실행, PASS 아님” 문구를 남긴다.

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

- [ ] `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_full_test.sh`에 nightly row parser와 reporter를 추가한다.
- [ ] reporter가 unknown nightly kind를 `manual follow-up required`로 표시한다.
- [ ] full functional matrix exit code는 기존 그대로 보존한다.

`테스트 작성`: 별도 test file은 만들지 않는다. 이 repo의 shell runner는 focused temp repo smoke로 검증한다.

`중간 검증`:

```bash
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
```

### [TEST-2] Nightly Contract In Classifier And Docs

`문제`: [run_test_by_change.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh:445)는 nightly-pending 후보를 출력하지만 command 후보나 낮 시간 PASS 제외 계약은 runner/docs에 충분히 연결되어 있지 않다. [proto-socket-full-matrix.md](/config/workspace/proto-socket/agent-test/local/proto-socket-full-matrix.md:229)는 상태 의미를 설명하지만 실행 후보 command까지는 고정하지 않는다.

Before:

```bash
445	    # periodic full에서 장시간 측정은 낮 시간 PASS 근거가 아니라 야간 후보로 분리한다.
446	    add_recommendation "nightly-pending" "performance-full" "performance baseline" "full periodic: performance full은 20:00 이후 야간 후보로 분리"
447	    add_recommendation "nightly-pending" "stability-full" "queue/gateway/transport" "full periodic: stability full/long-run은 20:00 이후 야간 후보로 분리"
```

`해결 방법`: classifier reason, skill doc, local test docs에 nightly 후보의 command mapping과 “20:00 이후 시작한 record만 baseline 후보” 기준을 같은 표현으로 맞춘다. `run_test_by_change.sh` 출력 schema는 유지한다.

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

- [ ] `run_test_by_change.sh` reason을 runner report와 같은 command 용어로 정리한다.
- [ ] `agent-ops/skills/project/run-proto-socket-test-matrix/SKILL.md`에 full runner nightly command 후보를 추가한다.
- [ ] `agent-test/local/proto-socket-full-matrix.md`와 `agent-test/local/proto-socket-performance-baseline.md`의 nightly/pass 제외 문구를 맞춘다.

`테스트 작성`: 문서-only assertion은 `rg --sort path`로 검증한다.

`중간 검증`:

```bash
rg --sort path -n "performance-full|stability-full|20:00|PASS" agent-ops/skills/project/run-proto-socket-test-matrix agent-test/local
```

### [TEST-3] Focused Routing Smoke

`문제`: [run_test_by_change.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh:537)는 quick performance를 추천하고 [run_test_by_change.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh:548)는 nightly stability를 추천한다. full route 보강이 auto/speed/stability quick 후보를 깨지 않는지 focused smoke가 필요하다.

`해결 방법`: `/tmp`에 최소 git repo를 만들고 patched classifier를 복사한다. `go/transport/server.go` 변경으로 `auto`, `speed`, `stability`, `full` route output을 확인한다.

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

- [ ] temp repo smoke command를 CODE_REVIEW 검증 결과에 실제 출력으로 남긴다.
- [ ] `auto`: `performance-quick`과 `stability-quick`이 recommended.
- [ ] `speed`: `performance-quick`만 recommended.
- [ ] `stability`: `stability-quick`만 recommended.
- [ ] `full`: `functional-full` recommended, `performance-full`/`stability-full` nightly-pending, `performance-quick` skipped.

`테스트 작성`: 별도 repository test file은 만들지 않는다. 이 검증은 shell classifier contract smoke다.

`중간 검증`:

```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
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
for route in auto speed stability full; do
  bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh --route "$route" --dry-run
done
```

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_full_test.sh` | TEST-1 |
| `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh` | TEST-2, TEST-3 |
| `agent-ops/skills/project/run-proto-socket-test-matrix/SKILL.md` | TEST-2 |
| `agent-test/local/proto-socket-full-matrix.md` | TEST-2 |
| `agent-test/local/proto-socket-performance-baseline.md` | TEST-2 |

## 최종 검증

```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" agent-ops/skills/project/run-proto-socket-test-matrix agent-test/local
git diff --check
```

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