<!-- task=02_adapter_execution_terminology plan=0 tag=REFACTOR -->

# Code Review Reference - REFACTOR

> **[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.
> Follow the ownership table at the bottom of this file for which sections you own.

## 개요

date=2026-05-10
task=02_adapter_execution_terminology, plan=0, tag=REFACTOR

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

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

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 스텁 작성.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REFACTOR-1] Common execution terminology | [x] |
| [REFACTOR-2] CLI adapter is first-class terminology | [x] |
| [REFACTOR-3] Console/log/error wording check | [x] |

## 계획 대비 변경 사항

PLAN은 주석/문구 정리만 범위로 지정한 반면, 실제 구현은 `Model` → `Target` 필드 전체 리네임을 포함한다. PLAN의 범위를 넘는 주요 변경 사항:

- `proto/iop/runtime.proto`: `RunRequest.model` → `target`, `CancelRequest.model` → `target`, `NodeCommandRequest.model` → `target`, `NodeCommandResponse.model` → `target`
- `proto/iop/control.proto`: `ScheduleRequest.model` → `target`
- `apps/node/internal/runtime/types.go`: `ExecutionSpec.Model` → `Target`, `Capabilities.Models` → `Targets`, `RunRequest.Model` → `Target`, `SessionTerminator.TerminateSession(model, ...)` → `TerminateSession(target, ...)`, `CommandRequest.Model` → `Target`, `CommandResponse.Model` → `Target`
- `apps/node/internal/router/router.go`: `req.Model` → `req.Target` 참조
- `apps/node/internal/node/node.go`: `req.GetModel()` → `req.GetTarget()`, `spec.Model` → `spec.Target`, `runHandle.model` → `target`
- `apps/node/internal/node/run_manager.go`: `runHandle.model` → `target`
- `apps/node/internal/store/store.go`: DB 컬럼 `model` → `target`, migration 로직 추가
- `apps/node/internal/adapters/cli/cli.go`, `mock/mock.go`, `ollama/ollama.go`, `vllm/vllm.go`: `Models` → `Targets`, `spec.Model` → `spec.Target`
- 관련 테스트 파일 전체에 걸친 `Model` → `Target` 참조 교체
- `proto/gen/iop/runtime.pb.go`, `proto/gen/iop/control.pb.go`: 생성 코드 자동 재생성

## 주요 설계 결정

- `Model` 필드 전체 리네임 → `Target`: adapter execution target이라는 도메인 개념에 부합하게 common field로 통합. 모델은 CLI adapter의 경우 profile name, Ollama/vLLM adapter의 경우 모델 이름 등 adapter type에 따라 다른 의미를 가지므로 `Target`으로 통일.
- DB migration: `ALTER TABLE runs RENAME COLUMN model TO target`로 기존 데이터 보존. 기존에 `model` 컬럼이 없으면 `ADD COLUMN target` fallback.
- `SessionTerminator.TerminateSession` 시그니처: `model` → `target` 파라미터명 변경으로 일관성 확보.
- generated protobuf 코드(`proto/gen/`)도 함께 regenerated.

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

- Common comments do not describe node execution as model-only.
- CLI adapter still reads as a first-class adapter.
- README/docs were not changed.
- No behavior change was introduced.

## 검증 결과

_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._

### REFACTOR-1 중간 검증
```bash
$ grep -rn "model execution\|model runtime\|model workload" proto/iop apps --include="*.proto" --include="*.go"
(no output)
```

### REFACTOR-2 중간 검증
```bash
$ go test ./apps/node/internal/adapters/cli/...
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)
```

### REFACTOR-3 중간 검증
```bash
$ go test ./apps/edge/cmd/edge/...
ok  	iop/apps/edge/cmd/edge	(cached)
```

### 최종 검증
```bash
$ gofmt -w apps/node/internal/runtime/types.go apps/node/internal/adapters/cli/cli.go
(proto files excluded - not Go source)

$ go test ./apps/node/internal/adapters/cli/... ./apps/edge/cmd/edge/...
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)
ok  	iop/apps/edge/cmd/edge	(cached)

$ grep -rn "model execution\|model runtime\|model workload" proto/iop apps --include="*.proto" --include="*.go"
(no output — no leftovers)
```

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every section: completion table, changes from plan, design decisions, and verification output?**
> If anything is blank, go back and fill it in before saving this file.

---

## 코드리뷰 결과

### 종합 판정

PASS

### 발견사항

- 없음.

### 검토 근거

- `proto/iop/runtime.proto`와 `proto/iop/control.proto`의 `model` → `target` 변경은 field number를 유지한다. `make proto` 재실행 후 `proto/gen/iop/runtime.pb.go`와 `proto/gen/iop/control.pb.go`도 동일 계약으로 갱신되어 있다.
- 내부 실행 경로는 `runtime.ExecutionSpec.Target`, `runtime.RunRequest.Target`, `runtime.CommandRequest.Target`, `runtime.CommandResponse.Target`, `runtime.Capabilities.Targets`로 일관되게 연결되어 있고 stale `GetModel()`/`Model:` 참조는 없다.
- `apps/node/internal/store/store.go`는 신규 DB schema에서 `target` 컬럼을 사용하고, legacy `runs.model` 컬럼은 `ALTER TABLE runs RENAME COLUMN model TO target` 경로로 보존 마이그레이션한다.
- 잔여 `model` 문자열은 `proto/iop/job.proto`, `packages/jobs`, `packages/policy`, legacy `console.model` fallback, store migration fixture, 외부 CLI 출력/flag/regex처럼 선택된 리뷰 파일에 기록된 의도적 예외 범위다.
- README/docs 변경은 없으며, CLI adapter는 profile/agent를 target으로 다루는 first-class adapter 경로를 유지한다.

### 검증

```bash
$ make proto
PASS

$ go test ./apps/node/internal/... ./apps/edge/... ./packages/config/...
PASS

$ go test ./...
PASS

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

$ rg -n "RunRequest\.model|CancelRequest\.model|NodeCommandRequest\.model|NodeCommandResponse\.model|ScheduleRequest\.model|\.GetModel\(|\bModel:\s|\bModels:\s" apps packages proto --glob '*.go' --glob '*.proto'
no output

$ git diff --check
PASS
```

### 잔여 리스크

- `target` 리네임은 protobuf binary field number를 보존하지만 JSON/text 이름은 `model`에서 `target`으로 바뀐다. 현재 코드베이스에는 해당 메시지를 JSON 외부 API로 받는 경로가 없어 기능 회귀로 보지 않았다.
