<!-- task=m-control-plane-edge-wire-baseline/04_status_snapshot plan=1 tag=REVIEW_STATUS -->

# Control Plane-Edge Status Snapshot Review Follow-up Plan

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

`CODE_REVIEW-cloud-G08.md`의 구현 에이전트 소유 섹션을 채우는 것까지가 구현입니다. 구현 후 검증을 실행하고 실제 변경 내용, 검증 출력, 계획 대비 변경 사항을 review stub에 기록한 뒤 active 파일을 그대로 둔 채 리뷰 준비를 보고하세요. 최종 판정, 로그 rename, `complete.log`, archive 이동은 code-review 스킬 책임입니다.

구현 중 사용자만 결정할 수 있는 범위 변경, 사용자 소유 외부 환경/secret, 또는 현재 계획과 충돌하는 요구가 발견되면 `CODE_REVIEW-cloud-G08.md`의 `사용자 리뷰 요청` 섹션에 정확한 결정 항목과 근거를 기록하고 중단하세요. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해결할 수 있는 검증 증거 공백은 사용자 리뷰 요청이 아니라 일반 후속 작업입니다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/control-plane-portal-ops/milestones/control-plane-edge-wire-baseline.md`
- Task ids:
  - `edge-status`: Control Plane은 Edge에 상태 snapshot을 요청하고 Edge-owned 상태를 응답받을 수 있다.
- Completion mode: check-on-pass

## 이전 리뷰 결과

- Archived plan: `agent-task/m-control-plane-edge-wire-baseline/04_status_snapshot/plan_cloud_G08_0.log`
- Archived review: `agent-task/m-control-plane-edge-wire-baseline/04_status_snapshot/code_review_cloud_G08_0.log`
- Verdict: FAIL
- Required issue: `proto/gen/iop/control.pb.go`가 현재 repo `make proto` 출력과 idempotent하지 않습니다. 현재 `protoc --version`은 `libprotoc 29.3`인데 generated header는 `protoc v3.21.12`로 남아 있습니다.

## 범위 결정 근거

- 이번 follow-up은 generated proto artifact와 검증 기록 신뢰도만 회복합니다.
- `proto/iop/control.proto`, Control Plane request path, Edge status provider 로직의 의미 변경은 하지 않습니다.
- `node.pb.go`, `runtime.pb.go`, `job.pb.go`는 이번 status 계약 변경 대상이 아니므로 `make proto` 후 의미 없는 header churn이 생기면 남기지 않습니다.

## 구현 체크리스트

- [x] 현재 repo 툴체인으로 `make proto`를 실행해 `proto/gen/iop/control.pb.go`가 idempotent한 generated output이 되도록 맞춘다.
- [x] repo 밖 temp dir에 Makefile과 동일한 protoc 명령을 실행해 `proto/gen/iop/control.pb.go`와 temp generated file의 diff가 없는지 확인하고, `node.pb.go`/`runtime.pb.go`/`job.pb.go`에 불필요한 diff가 남지 않았음을 기록한다.
- [x] focused Go test와 Control Plane-Edge wire smoke를 재실행하고 실제 stdout/stderr를 review stub에 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## REVIEW_STATUS-1 Proto Generated Artifact Idempotence

### 문제

`code_review_cloud_G08_0.log`의 FAIL 판정에 따르면 `proto/gen/iop/control.pb.go:4`는 현재 repo에서 사용하는 `protoc v5.29.3` 출력과 다릅니다. 이 상태에서는 `make proto`를 다시 실행할 때 generated file이 또 바뀌므로, `make proto` 검증 기록을 신뢰할 수 없습니다.

### 해결 방법

현재 repo PATH의 `protoc`/`protoc-gen-go`를 확인한 뒤 `make proto`를 실행합니다. 생성 결과에서 status 계약 대상인 `control.pb.go`만 필요한 diff를 유지하고, `node.pb.go`/`runtime.pb.go`/`job.pb.go`에 불필요한 header-only diff가 남으면 되돌리지 말고 먼저 `git diff --name-only`와 `git diff`로 원인을 확인한 뒤 status 계약과 무관한 churn을 제거합니다.

### 수정 파일 및 체크리스트

- [x] `proto/gen/iop/control.pb.go`: 현재 repo `make proto` 출력과 idempotent하게 갱신.
- [x] `CODE_REVIEW-cloud-G08.md`: 실제 `protoc --version`, `protoc-gen-go --version`, `make proto`, temp generation diff, 테스트/smoke 출력 기록.

### 테스트 결정

- generated artifact 신뢰도 회복이 핵심이므로 temp dir generation 비교를 필수 중간 검증으로 둡니다.
- protobuf 계약과 양쪽 wire 경계가 포함되므로 focused Go test와 `make test-control-plane-edge-wire`를 다시 실행합니다.
- 전체 `go test ./...`는 이번 follow-up이 generated header/idempotence 수정에 한정되므로 필수는 아닙니다. 실행하면 결과를 추가 기록해도 됩니다.

### 중간 검증

```bash
protoc --version
protoc-gen-go --version
make proto
tmpdir=$(mktemp -d); protoc --go_out="$tmpdir" --go_opt=module=iop --proto_path=. proto/iop/runtime.proto proto/iop/node.proto proto/iop/control.proto proto/iop/job.proto && diff -u proto/gen/iop/control.pb.go "$tmpdir/proto/gen/iop/control.pb.go"; status=$?; rm -rf "$tmpdir"; exit $status
git diff --name-only -- proto/gen/iop/node.pb.go proto/gen/iop/runtime.pb.go proto/gen/iop/job.pb.go
```

기대 결과: temp generation diff는 출력 없이 exit 0이고, `node.pb.go`/`runtime.pb.go`/`job.pb.go` diff 확인 명령은 출력이 없습니다.

## 최종 검증

```bash
go test -count=1 ./apps/control-plane/internal/wire ./apps/edge/internal/controlplane ./apps/edge/internal/bootstrap ./proto/gen/...
make test-control-plane-edge-wire
```

기대 결과: 모든 명령이 성공하고, smoke 출력에 `CP: hello accepted`, `Edge: connected to control plane`, `CP: edge disconnected`, `Control Plane-Edge wire smoke PASSED.`가 포함됩니다.

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