<!-- task=04_refactor_validation_checklist plan=4 tag=REVIEW_REVIEW_REVIEW_REVIEW_TEST -->

# Code Review Reference - REVIEW_REVIEW_REVIEW_REVIEW_TEST

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every section below is filled in.

## 개요

date=2026-05-10
task=04_refactor_validation_checklist, plan=4, tag=REVIEW_REVIEW_REVIEW_REVIEW_TEST

## 이 파일을 읽는 리뷰 에이전트에게

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
리뷰 완료 후 반드시 아래 순서로 아카이브하세요.

1. `CODE_REVIEW-local-G03.md` -> `code_review_local_G03_N.log` (N = 기존 code_review_*.log 수)
2. `PLAN-local-G03.md` -> `plan_local_G03_M.log` (M = 기존 plan_*.log 수)
3. PASS인 경우 `complete.log` 작성 후 종료. WARN/FAIL인 경우 새 routed plan + review 스텁 작성.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REVIEW_REVIEW_REVIEW_REVIEW_TEST-1] rg 검색 출력 안정화 | PASS |
| [REVIEW_REVIEW_REVIEW_REVIEW_TEST-2] 최종 검증 stdout 재기록 | PASS |

## 계획 대비 변경 사항

없음. PLAN-local-G03.md에서 지정한 `rg --sort path` 안정화 검증 명령 그대로 실행.

## 주요 설계 결정

없음. 이 루프는 검증 출력 기록 전용.

## 리뷰어를 위한 체크포인트

- 검색 검증 명령이 `rg --sort path`를 사용해 안정화되었는지
- 정렬된 검색 출력이 실제 stdout과 일치하는지
- 잔류 `model/Model` 항목 분류가 완료 여부 및 종합 판단과 모순되지 않는지
- 최종 검증 출력이 같은 세션에서 재실행한 결과와 일치하는지

## 검증 결과

### REVIEW_REVIEW_REVIEW_REVIEW_TEST-1 중간 검증

```bash
$ rg --sort path -n "\bmodel\b|\bModel\b" proto/iop apps packages configs --glob '!**/README.md'
proto/iop/job.proto:21:  string    model       = 5;
apps/node/internal/adapters/cli/lifecycle_blackbox_test.go:77:	for _, model := range []string{"ok-profile", "fail-profile"} {
apps/node/internal/adapters/cli/lifecycle_blackbox_test.go:81:			Target:      model,
apps/node/internal/adapters/cli/lifecycle_blackbox_test.go:85:			t.Fatalf("expected Execute for %q to fail after cleanup (require-existing), got nil", model)
apps/node/internal/adapters/cli/lifecycle_blackbox_test.go:124:	for _, model := range []string{"Z-alive", "Z-fail"} {
apps/node/internal/adapters/cli/lifecycle_blackbox_test.go:128:			Target:      model,
apps/node/internal/adapters/cli/lifecycle_blackbox_test.go:132:			t.Fatalf("expected Execute for %q to fail after cleanup (require-existing), got nil", model)
apps/node/internal/adapters/cli/oneshot_blackbox_test.go:210:{"type":"error","sessionID":"ses_1","error":{"name":"UnknownError","data":{"message":"Model not found: definitely-invalid-provider/does-not-exist"}}}
apps/node/internal/adapters/cli/oneshot_blackbox_test.go:235:	want := "Model not found: definitely-invalid-provider/does-not-exist"
apps/node/internal/adapters/cli/oneshot_blackbox_test.go:361:{"ts":1777860858965,"type":"ask","ask":"api_req_failed","text":"model unavailable"}
apps/node/internal/adapters/cli/oneshot_blackbox_test.go:390:	if got != "model unavailable" {
apps/node/internal/adapters/cli/status/codex.go:86:	readyRegex := regexp.MustCompile(`(Tip:|model:)`)
apps/node/internal/store/store.go:82:		if cols["model"] {
apps/node/internal/store/store.go:83:			// Local DB rename: copy model into target.
apps/node/internal/store/store.go:84:			if _, err := db.Exec(`ALTER TABLE runs RENAME COLUMN model TO target`); err != nil {
apps/node/internal/store/store_test.go:21:    model        TEXT     NOT NULL,
packages/config/config.go:51:	Model      string `mapstructure:"model"       yaml:"model"`
packages/config/config.go:61:	return c.Model
packages/config/config.go:163:	if !v.InConfig("console.agent") && v.InConfig("console.model") {
packages/config/config.go:164:		cfg.Console.Agent = cfg.Console.Model
packages/config/config_test.go:125:	yaml := "server:\n  listen: \"0.0.0.0:9090\"\nconsole:\n  model: \"codex\"\n"
packages/config/config_test.go:135:		t.Fatalf("expected legacy console.model fallback to resolve to %q, got %q", "codex", cfg.Console.ResolveAgent())
packages/jobs/jobs.go:21:	Model      string            `json:"model"`
packages/policy/engine.go:11:	Apply(ctx context.Context, adapter, model string, policy Spec) (Spec, error)
packages/policy/engine.go:13:	Validate(ctx context.Context, adapter, model string, policy Spec) error
configs/edge.yaml:91:              - "--model"

$ rg --sort path -n "model execution|model runtime|model workload" proto/iop apps packages --glob '!**/README.md'
```

분류:
- `proto/iop/job.proto:21` — proto 필드명: 의도적 예외 (proto 필드)
- `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go:77~132` — 테스트變수명 `model`: 의도적 예외 (테스트 루프변수)
- `apps/node/internal/adapters/cli/oneshot_blackbox_test.go:210~390` — 에러 메시지/검증 문자열: 의도적 예외 (테스트용 고정 문자열)
- `apps/node/internal/adapters/cli/status/codex.go:86` — regex 패턴: 의도적 예외 (CLI stdout 파싱)
- `apps/node/internal/store/store.go:82~84` — DB 마이그레이션 열이름: 의도적 예외 (기존 열 이름 참조)
- `apps/node/internal/store/store_test.go:21` — 테스트 테이블 스키마: 의도적 예외 (테스트용 DDL)
- `packages/config/config.go:51~164` — 설정 구조체 필드명 + 레거시 fallback: 의도적 예외 (설정 필드)
- `packages/config/config_test.go:125~135` — 테스트용 설정 YAML: 의도적 예외
- `packages/jobs/jobs.go:21` — JSON 태그 필드명: 의도적 예외 (API 구조체)
- `packages/policy/engine.go:11~13` — 함수 파라미터명: 의도적 예외
- `configs/edge.yaml:91` — 설정 파일 CLI 인자: 의도적 예외

두 번째 검색 `model execution|model runtime|model workload`: 출력 없음. 예상 결과 일치.

### REVIEW_REVIEW_REVIEW_REVIEW_TEST-2 최종 검증

```bash
$ make proto
protoc \
	--go_out=. \
	--go_opt=module=iop \
	--proto_path=. \
	proto/iop/runtime.proto \
	proto/iop/node.proto \
	proto/iop/control.proto \
	proto/iop/job.proto

$ go test ./packages/config ./apps/edge/cmd/edge/... ./apps/edge/internal/node/... ./apps/edge/internal/transport/... ./apps/node/internal/...
ok  	iop/packages/config	(cached)
ok  	iop/apps/edge/cmd/edge	(cached)
ok  	iop/apps/edge/internal/node	(cached)
ok  	iop/apps/edge/internal/transport	(cached)
ok  	iop/apps/node/internal/adapters	(cached)
ok  	iop/apps/node/internal/adapters/cli	(cached)
?   	iop/apps/node/internal/adapters/cli/internal/testutil	[no test files]
ok  	iop/apps/node/internal/adapters/cli/status	(cached)
?   	iop/apps/node/internal/adapters/mock	[no test files]
?   	iop/apps/node/internal/adapters/ollama	[no test files]
?   	iop/apps/node/internal/adapters/vllm	[no test files]
ok  	iop/apps/node/internal/bootstrap	(cached)
ok  	iop/apps/node/internal/node	(cached)
ok  	iop/apps/node/internal/router	(cached)
?   	iop/apps/node/internal/runtime	[no test files]
ok  	iop/apps/node/internal/store	(cached)
ok  	iop/apps/node/internal/transport	(cached)

$ go test ./...
?   	iop/apps/control-plane/cmd/control-plane	[no test files]
ok  	iop/apps/edge/cmd/edge	(cached)
?   	iop/apps/edge/internal/bootstrap	[no test files]
ok  	iop/apps/edge/internal/node	(cached)
ok  	iop/apps/edge/internal/transport	(cached)
?   	iop/apps/node/cmd/node	[no test files]
ok  	iop/apps/node/internal/adapters	(cached)
ok  	iop/apps/node/internal/adapters/cli	(cached)
?   	iop/apps/node/internal/adapters/cli/internal/testutil	[no test files]
ok  	iop/apps/node/internal/adapters/cli/status	(cached)
?   	iop/apps/node/internal/adapters/mock	[no test files]
?   	iop/apps/node/internal/adapters/ollama	[no test files]
?   	iop/apps/node/internal/adapters/vllm	[no test files]
ok  	iop/apps/node/internal/bootstrap	(cached)
ok  	iop/apps/node/internal/node	(cached)
ok  	iop/apps/node/internal/router	(cached)
?   	iop/apps/node/internal/runtime	[no test files]
ok  	iop/apps/node/internal/store	(cached)
ok  	iop/apps/node/internal/transport	(cached)
?   	iop/apps/worker/cmd/worker	[no test files]
?   	iop/packages/auth	[no test files]
ok  	iop/packages/config	(cached)
?   	iop/packages/jobs	[no test files]
?   	iop/packages/metadata	[no test files]
?   	iop/packages/observability	[no test files]
?   	iop/packages/policy	[no test files]
?   	iop/packages/version	[no test files]
?   	iop/proto/gen/iop	[no test files]

$ git diff --name-only -- README.md 'apps/**/README.md' 'docs/**' apps/control-plane apps/worker
```

all tests pass, scope exclusion 유지 (README.md, docs/**, apps/control-plane, apps/worker 변경 없음).

## 코드리뷰 결과

- 종합 판정: PASS

- 차원별 평가:
  - correctness: Pass
  - completeness: Pass
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - plan deviation: Pass
  - verification trust: Pass

- 발견된 문제:
  - 없음.

- 검증 확인:
  - `rg --sort path -n "\bmodel\b|\bModel\b" proto/iop apps packages configs --glob '!**/README.md'` 출력이 문서와 일치합니다.
  - `rg --sort path -n "model execution|model runtime|model workload" proto/iop apps packages --glob '!**/README.md'`는 출력 없음으로 확인했습니다.
  - `make proto`, 대상 패키지 `go test`, `go test ./...`, scope guard 모두 문서와 일치합니다.

- 잔여 리스크:
  - 테스트 결과는 대부분 Go test cache 기반입니다. 이번 루프는 코드 변경이 아니라 검증 문서 안정화라 추가 강제 재실행은 요구하지 않습니다.
