<!-- task=11_full_e2e_validation plan=1 tag=REVIEW_FEV -->

# 11 Full E2E Validation Follow-up Plan - REVIEW_FEV

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

**현재 확인: `agent-task/07_node_command_ops_surface/complete.log`가 존재하고 07번 active plan/review 파일은 없다.** 구현 시작 시점에도 FEV-1 게이트를 다시 확인하고, 새 active task가 생겼다면 검증을 시작하지 말고 `CODE_REVIEW-cloud-G09.md`에 blocker로 기록한다.

구현 마지막에는 반드시 `CODE_REVIEW-cloud-G09.md`의 구현 에이전트 소유 섹션을 실제 검증 내용과 명령 출력으로 채운다. 이 작업은 검증 전용이다. 검증 실패를 고치는 코드 변경은 이 task에 섞지 말고, 실패 로그와 재현 명령을 기록한 뒤 후속 task로 넘긴다.

## 배경

plan=0은 FEV-1에서 07번 task 미완료를 발견하고 올바르게 중단했다. 이후 07번 REVIEW_NCO 후속 작업은 `complete.log` 상태로 전환되었으므로, 11번 full E2E validation은 이제 전체 검증을 처음부터 다시 수행할 수 있다.

## 분석 결과

### 읽은 파일

- `agent-task/11_full_e2e_validation/plan_cloud_G09_0.log`
- `agent-task/11_full_e2e_validation/code_review_cloud_G09_0.log`
- `agent-task/07_node_command_ops_surface/complete.log`
- `agent-task/07_node_command_ops_surface/plan_cloud_G09_1.log`
- `agent-task/07_node_command_ops_surface/code_review_cloud_G09_1.log`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-ops/skills/project/e2e-smoke/SKILL.md`
- `agent-ops/skills/common/code-review/SKILL.md`

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

- FEV-2 전체 Go 테스트와 proto/generated 정합성: 미실행.
- FEV-3 공식 `make test-e2e` entrypoint와 실제 `bin/edge.sh`/`bin/node.sh` 사용 증거: 미실행.
- FEV-4 full-cycle 실제 구동: 미실행.
- FEV-5 real CLI profile과 10분 idle transport regression: 미실행.
- FEV-6 roadmap/docs 방향성 더블체크: 미실행.
- FEV-7 dirty state/충돌 리스크는 plan=0에서 일부 확인했지만, 07번 후속 작업 이후 stale evidence가 되므로 재캡처가 필요하다.

### 심볼 참조

- none. 이 plan은 코드 심볼 변경이 아니라 검증 재시도 계획이다.

### 범위 결정 근거

- 이 task는 검증 전용이므로 앱 코드, proto, config, docs를 직접 수정하지 않는다.
- 07번 task는 현재 complete 상태이지만, 구현 시작 시점에 01-10 완료 게이트를 다시 확인한다. active task가 새로 생겼거나 `complete.log`가 빠진 task가 있으면 FEV-2 ~ FEV-7을 실행하지 않는다.
- `configs/*.yaml`은 오염시키지 않고 임시 config 또는 환경 변수 override만 사용한다.
- real CLI profile을 mock으로 대체하지 않는다. 실행 불가나 실패는 profile별 blocker/fail로 기록한다.

### 빌드 등급

- Build `cloud-G09`: bin script orchestration, full-cycle 실제 구동, external CLI, 10분 idle monitor, multi-task completion gate가 포함된다.
- Review `cloud-G09`: 검증 출력 신뢰성, 실제 bin 사용 여부, real CLI blocker 처리, docs/roadmap 정합성 재검토가 필요하다.

## 구현 체크리스트

- [ ] [REVIEW_FEV-1] 01-10 완료 게이트를 재확인하고 07번 task가 complete 상태인지 검증한다.
- [ ] [REVIEW_FEV-2] 전체 Go 테스트와 proto/generated 정합성을 확인한다.
- [ ] [REVIEW_FEV-3] 공식 E2E smoke entrypoint가 실제 `bin/edge.sh`와 `bin/node.sh`를 쓰는지 확인하고 실행한다.
- [ ] [REVIEW_FEV-4] full-cycle 실제 구동을 수행하고 cycle별 결과를 기록한다.
- [ ] [REVIEW_FEV-5] real CLI profile 검증과 10분 idle transport regression을 수행하거나 profile별 blocker를 기록한다.
- [ ] [REVIEW_FEV-6] roadmap/docs 방향성과 기본 config 오염 여부를 재확인한다.
- [ ] [REVIEW_FEV-7] 작업 중 충돌/사전 반영 리스크를 현재 상태로 재캡처한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 의존 관계 및 구현 순서

1. FEV-1에서 01-10 전체가 complete 상태인지, active `PLAN-*.md`/`CODE_REVIEW-*.md`가 남아 있지 않은지 재확인한다.
2. 게이트가 통과하면 FEV-2부터 FEV-7까지 순서대로 수행한다.
3. 어떤 단계든 FAIL이면 코드를 고치지 말고 `CODE_REVIEW-cloud-G09.md`에 실패 출력, 재현 명령, 후속 필요 범위를 기록한다.

### [REVIEW_FEV-1] 01-10 완료 게이트 재확인

#### 문제

plan=0에서는 `agent-task/07_node_command_ops_surface`가 complete되지 않아 full E2E 검증을 시작할 수 없었다. 현재 07번은 complete 상태지만, 검증 신뢰성을 위해 구현 시작 시점에 01-10 전체 게이트를 다시 캡처해야 한다.

#### 해결 방법

01-10 task가 모두 `complete.log`를 가지고 active `PLAN-*.md`/`CODE_REVIEW-*.md`가 없는지 확인한다.

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

- [ ] `agent-task/11_full_e2e_validation/CODE_REVIEW-cloud-G09.md`에 완료 게이트 출력 기록

#### 테스트 작성

테스트 코드는 작성하지 않는다. 파일 상태 확인 출력이 evidence다.

#### 중간 검증

```bash
for d in agent-task/01+edge_runtime_common agent-task/02+edge_opsconsole_package agent-task/03+service_source_metadata agent-task/04_edge_operation_contract agent-task/05_event_bus_replay agent-task/06+run_event_node_label agent-task/07_node_command_ops_surface agent-task/08+cli_target_terminology agent-task/09_ops_console_docs agent-task/10_bin_e2e_smoke; do test -f "$d/complete.log" || { echo "missing complete.log: $d"; exit 1; }; done
for d in agent-task/01+edge_runtime_common agent-task/02+edge_opsconsole_package agent-task/03+service_source_metadata agent-task/04_edge_operation_contract agent-task/05_event_bus_replay agent-task/06+run_event_node_label agent-task/07_node_command_ops_surface agent-task/08+cli_target_terminology agent-task/09_ops_console_docs agent-task/10_bin_e2e_smoke; do find "$d" -maxdepth 1 \( -name 'PLAN-*.md' -o -name 'CODE_REVIEW-*.md' \) -print; done
```

Expected: first command exits 0. Second command prints nothing.

### [REVIEW_FEV-2] 전체 Go 테스트와 proto/generated 정합성

#### 문제

01-10 후속 작업은 edge service/event/transport, node command/adapter, proto, docs, E2E script를 건드릴 수 있다. 07번 후속 작업 이후 전체 조합을 다시 확인해야 한다.

#### 해결 방법

Fresh 전체 테스트를 실행하고 proto source/generated diff를 확인한다.

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

- [ ] `CODE_REVIEW-cloud-G09.md`에 실제 stdout/stderr 또는 저장 로그 path 기록
- [ ] proto diff가 있으면 원인과 `make proto` 증거 여부 기록

#### 테스트 작성

테스트 코드는 작성하지 않는다. 전체 test run이 검증이다.

#### 중간 검증

```bash
go test -count=1 ./...
git diff --name-only -- proto/iop proto/gen/iop
```

Expected: Go tests pass. Proto diff가 있으면 source/generated 정합성을 설명한다.

### [REVIEW_FEV-3] 공식 E2E smoke entrypoint 검증

#### 문제

full validation은 실제 사용자 entrypoint인 `bin/edge.sh`와 `bin/node.sh` 기반 smoke를 요구한다.

#### 해결 방법

`make test-e2e` target과 smoke script가 실제 bin script를 호출하는지 확인한 뒤 실행한다. 기본 config 파일 diff가 없어야 한다.

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

- [ ] `CODE_REVIEW-cloud-G09.md`에 dry-run/search/실행 출력 기록
- [ ] 기본 `configs/*.yaml` diff 확인 기록

#### 테스트 작성

테스트 코드는 작성하지 않는다. `make test-e2e`가 검증이다.

#### 중간 검증

```bash
make -n test-e2e
rg --sort path -n "bin/edge\\.sh|bin/node\\.sh|IOP_EDGE_CONFIG|IOP_NODE_CONFIG|mktemp|configs/edge\\.yaml|configs/node\\.yaml" Makefile scripts README.md apps/edge/README.md
make test-e2e
git diff -- configs/edge.yaml configs/node.yaml
```

Expected: dry-run/search가 실제 bin usage와 임시 config 전략을 보여주고, `make test-e2e`가 pass하며, config diff는 없다.

### [REVIEW_FEV-4] Full-cycle 실제 구동 검증

#### 문제

Mock smoke만으로 session/background/terminate/status/lifecycle/routing 흐름을 충분히 보장할 수 없다.

#### 해결 방법

`agent-ops/skills/project/e2e-smoke/SKILL.md`의 full-cycle 기준을 실제 `bin/edge.sh` + `bin/node.sh`로 수행한다. `make test-e2e`가 full-cycle을 포함하면 그 증거를 기록하고, 포함하지 않으면 수동 절차 또는 FAIL을 기록한다.

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

- [ ] 사용한 temp config path와 port 기록
- [ ] startup/register, `/nodes`, foreground message x2, `/session`, `/background on/off`, `/terminate-session`, `/status`, lifecycle event 결과 기록
- [ ] 가능한 경우 multi-node ambiguous routing과 `/node <id|alias>` 결과 기록

#### 테스트 작성

테스트 코드는 작성하지 않는다. 실제 구동 출력이 검증이다.

#### 중간 검증

```bash
make test-e2e
```

Expected: full-cycle 항목이 포함되어 있거나, 포함되지 않았다면 수동 full-cycle 출력과 이유가 기록된다.

### [REVIEW_FEV-5] Real CLI profile과 idle transport regression

#### 문제

실제 external CLI profile에서 idle 중 `transport_closed`류 문제가 재발할 수 있다. mock 결과로 대체하면 안 된다.

#### 해결 방법

`claude`, `gemini`, `codex`, `opencode` command availability를 확인한다. 실행 가능한 real profile은 실제 메시지 왕복과 `/status`를 기록한다. Gemini 또는 사용 가능한 profile 하나는 message complete 후 10분 idle monitor를 수행한다.

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

- [ ] profile별 command availability 기록
- [ ] profile별 pass/fail/blocker 기록
- [ ] 10분 idle monitor 중 transport close 관련 marker 부재 기록

#### 테스트 작성

테스트 코드는 작성하지 않는다. 실제 external CLI output이 검증이다.

#### 중간 검증

```bash
for c in claude gemini codex opencode; do command -v "$c" || true; done
IOP_E2E_PROFILE=gemini make test-e2e
```

Expected: Gemini가 가능하면 real run과 idle monitor가 pass한다. 불가능하면 profile별 blocker와 대체 available profile 결과를 기록한다.

### [REVIEW_FEV-6] 로드맵/문서 방향성 더블체크

#### 문제

Edge ops console은 임시 UI가 아니라 유지 대상 진단 표면이어야 하며, Control Plane/Portal은 이를 대체하지 않는 경계가 문서에 반영되어야 한다.

#### 해결 방법

문서 검색으로 temporary-only 표현 제거, Control Plane 경계, roadmap 반영, node CLI adapter/edge-local console 구분을 확인한다.

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

- [ ] `README.md`, `docs/architecture.md`, `apps/edge/README.md`, `apps/control-plane/README.md`, `apps/node/README.md` 검색 결과 기록

#### 테스트 작성

테스트 코드는 작성하지 않는다. 문서 검색 결과가 evidence다.

#### 중간 검증

```bash
rg --sort path -n "임시 디버그|임시 수동|temporary|debug UI|ops console|Control Plane|Portal|NodeCommand|event replay|test-e2e|edge-local" README.md docs apps
```

Expected: temporary-only console 표현이 없거나, 남아 있다면 FAIL/WARN 근거로 기록한다.

### [REVIEW_FEV-7] 충돌/사전 반영 리스크 재캡처

#### 문제

plan=0의 git status와 문서/코드 상태는 07번 후속 작업 이후 stale evidence가 된다.

#### 해결 방법

현재 `git status --short`와 active task 파일 상태를 다시 캡처한다. repo 산출물이나 unrelated dirty state는 정리하지 않고 별도 리스크로만 기록한다.

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

- [ ] `CODE_REVIEW-cloud-G09.md`에 현재 dirty state와 active plan/review 상태 기록

#### 테스트 작성

테스트 코드는 작성하지 않는다. 상태 출력이 evidence다.

#### 중간 검증

```bash
git status --short
find agent-task -mindepth 1 -maxdepth 2 \( -name 'PLAN-*.md' -o -name 'CODE_REVIEW-*.md' \) -print | sort
```

Expected: 11번 자신 외 active task가 없거나, 남아 있다면 결과 신뢰성 리스크로 기록한다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `agent-task/11_full_e2e_validation/CODE_REVIEW-cloud-G09.md` | REVIEW_FEV-1 ~ REVIEW_FEV-7 |

## 최종 검증

```bash
go test -count=1 ./...
make -n test-e2e
rg --sort path -n "bin/edge\\.sh|bin/node\\.sh|IOP_EDGE_CONFIG|IOP_NODE_CONFIG|mktemp|configs/edge\\.yaml|configs/node\\.yaml" Makefile scripts README.md apps/edge/README.md
make test-e2e
for c in claude gemini codex opencode; do command -v "$c" || true; done
IOP_E2E_PROFILE=gemini make test-e2e
git diff -- configs/edge.yaml configs/node.yaml
git diff --name-only -- proto/iop proto/gen/iop
git status --short
```

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