<!-- task=m-ollama-field-validation-follow-up/01_split_host_smoke plan=1 tag=REVIEW_TEST -->

# Plan - REVIEW_TEST

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

구현 완료 전 `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 반드시 채운다.
검증 명령은 실제로 실행하고 stdout/stderr를 기록하며, active 파일은 그대로 둔 채 리뷰 준비 상태를 보고한다.
최종 archive, `complete.log`, 코드리뷰 판정은 code-review 스킬 전용이다.

## 배경

첫 리뷰에서 split-host smoke 자체의 `/tmp` 산출물은 확인됐지만, 계획이 요구한 registration/process evidence와 원 최종 검증 출력이 `CODE_REVIEW-cloud-G07.md`에 충분히 남지 않았다.
이번 follow-up은 repo source를 고치지 않고, 검증 계약을 복구해 리뷰 가능한 증거를 새 review 파일에 기록하는 좁은 작업이다.

## 분석 결과

### 읽은 파일

- `agent-task/m-ollama-field-validation-follow-up/01_split_host_smoke/plan_cloud_G07_0.log`
- `agent-task/m-ollama-field-validation-follow-up/01_split_host_smoke/code_review_cloud_G07_0.log`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-ops/rules/project/domain/edge/rules.md`
- `agent-ops/rules/project/domain/node/rules.md`
- `agent-ops/rules/project/domain/platform-common/rules.md`
- `agent-ops/skills/common/code-review/SKILL.md`
- `agent-ops/skills/common/plan/SKILL.md`
- `/tmp/iop-edge-split-host.yaml`
- `/tmp/iop-node-split-host.yaml`
- `/tmp/iop-split-host-models.json`
- `/tmp/iop-split-host-chat.json`
- `/tmp/iop-split-host-stream.txt`

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

- 코드 동작 변경은 없다. 공백은 automated test coverage가 아니라 field-smoke evidence completeness다.
- TEST-2 registration은 Edge/Node stdout/stderr가 review 파일에 없어 검증 신뢰도가 부족하다.
- 최종 `go test -count=1 ./...`는 리뷰 중 실제 통과했지만 구현 에이전트 출력으로 기록되지 않았다.
- Streaming smoke는 `[DONE]`만 기록되어 SSE chunks와 reasoning/content 분리 관찰이 부족하다.

### 심볼 참조

- none. 심볼 rename/remove가 없는 증거 보강 작업이다.

### 분할 판단

- split decision policy를 평가했다.
- 같은 subtask의 review evidence 보강만 수행하므로 새 sibling subtask로 나누지 않는다.
- Edge/Node 재실행, Go test, OpenAI smoke output 기록은 같은 검증 문서 완성 단위라 별도 archive 가능한 산출물로 쪼개면 중복 프로세스 orchestration이 생긴다.

### 범위 결정 근거

- repo source, 기본 `configs/*.yaml`, roadmap 문서는 수정하지 않는다.
- 기존 archived `plan_cloud_G07_0.log`와 `code_review_cloud_G07_0.log`는 이 follow-up의 근거로만 읽고 수정하지 않는다.
- `/tmp/edge_field.out`처럼 다른 task/config에서 나온 로그는 registration 증거로 쓰지 않는다.
- 새 evidence는 current split-host 임시 config와 새 active `CODE_REVIEW-cloud-G07.md`에만 기록한다.

### 빌드 등급

- `cloud-G07`: prior review가 verification trust failure를 냈고, process orchestration/stdout capture/host-container split smoke가 성공 조건이다.

## 구현 체크리스트

- [ ] [REVIEW_TEST-1] current split-host Edge/Node registration process evidence를 새 review 파일에 기록한다. 검증: Edge/Node 로그에서 node registration과 Node의 edge registration을 확인한다.
- [ ] [REVIEW_TEST-2] 계획의 원 최종 검증 `go test -count=1 ./...`을 그대로 실행하고 stdout/stderr를 새 review 파일에 기록한다.
- [ ] [REVIEW_TEST-3] OpenAI-compatible smoke 산출물의 full evidence와 reasoning/content 분리 관찰을 새 review 파일에 기록한다. 검증: 모델 조회, non-streaming token, streaming SSE chunk와 `data: [DONE]`가 확인된다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_TEST-1] Edge/Node Registration Evidence

#### 문제

`code_review_cloud_G07_0.log:44`는 TEST-2를 완료로 체크했지만, `code_review_cloud_G07_0.log:93`-`104`에는 TCP reachability만 있고 registration stdout/stderr가 없다.
원 계획은 `plan_cloud_G07_0.log:198`-`203`에서 Edge process output, Node process output, Edge registration output을 review 파일에 남기도록 요구했다.

#### 해결 방법

현재 split-host 임시 config 기준으로 Edge와 Node의 stdout/stderr를 `/tmp/iop-split-host-edge.out`, `/tmp/iop-split-host-node.out`에 캡처한다.
이미 실행 중인 task-owned 프로세스의 stdout/stderr를 파일로 확인할 수 없으면, 기존 split-host 프로세스 명령을 기록한 뒤 task-owned 프로세스만 정리하고 같은 config로 재실행한다.
새 review 파일에는 실행 명령, 로그 파일 경로, Edge의 `node registered`/`node.connected reason="registered"` 줄, Node의 `registered with edge` 줄을 붙인다.

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

- [ ] repo source files are not modified.
- [ ] `/tmp/iop-split-host-edge.out` has current split-host Edge stdout/stderr.
- [ ] `/tmp/iop-split-host-node.out` has current split-host Node stdout/stderr.
- [ ] `CODE_REVIEW-cloud-G07.md` records exact commands and registration evidence.

#### 테스트 작성

테스트 파일은 추가하지 않는다. 이 항목은 field-smoke process evidence recovery다.

#### 중간 검증

```bash
rg --sort path -n 'node registered|node.connected|registered with edge|node-container-host-ollama|container-host-ollama' /tmp/iop-split-host-edge.out /tmp/iop-split-host-node.out
```

Expected: current split-host node id/alias and registration lines are present.

### [REVIEW_TEST-2] Full Go Test Contract

#### 문제

`code_review_cloud_G07_0.log:119`-`144` records `go list ./... | grep -v 'adapters/cli' | xargs go test -count=1`, but `plan_cloud_G07_0.log:311`-`317` requires `go test -count=1 ./...`.
Review rerun showed the full command passes within 90 seconds, so the exclusion is not justified evidence for this task.

#### 해결 방법

Run the exact command from the original plan and paste actual stdout/stderr into the new review file.
Do not substitute a package-excluding command. If the exact command unexpectedly fails, record the exact failure output and classify it in `계획 대비 변경 사항`.

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

- [ ] `CODE_REVIEW-cloud-G07.md` records `go test -count=1 ./...` output.
- [ ] No package exclusion is used for the final Go test contract.

#### 테스트 작성

테스트 파일은 추가하지 않는다. 기존 전체 Go test command를 증거로 복구한다.

#### 중간 검증

```bash
go test -count=1 ./...
```

Expected: all Go packages pass without using cache.

### [REVIEW_TEST-3] OpenAI Smoke Evidence And Classification

#### 문제

`code_review_cloud_G07_0.log:106`-`110` and `:162`-`164` only record `data: [DONE]` for the streaming output.
`plan_cloud_G07_0.log:246`-`252` requires the smoke output files to contain SSE `data:` chunks, `[DONE]`, and a note about reasoning/content separation if the model emits reasoning.

#### 해결 방법

Use current split-host output artifacts only if they were produced by the current Edge/Node run; otherwise rerun the three original curl commands and overwrite the `/tmp/iop-split-host-*.json|txt` artifacts.
Record the exact curl commands, saved output paths, representative `/v1/models` output, non-streaming response with `IOP_OLLAMA_E2E_OK`, representative streaming `reasoning_content` and `content` chunks, and `data: [DONE]`.
Classify the result explicitly: keep `config/docs` for SSH reverse tunnel guidance if still applicable, and record whether reasoning stream is separated, mixed, missing, or no follow-up needed.

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

- [ ] `/tmp/iop-split-host-models.json` contains `gemma4:26b`.
- [ ] `/tmp/iop-split-host-chat.json` contains `IOP_OLLAMA_E2E_OK`.
- [ ] `/tmp/iop-split-host-stream.txt` contains SSE `data:` chunks and `data: [DONE]`.
- [ ] `CODE_REVIEW-cloud-G07.md` records reasoning/content separation classification.

#### 테스트 작성

테스트 파일은 추가하지 않는다. This is an external field smoke evidence task.

#### 중간 검증

```bash
test -s /tmp/iop-split-host-models.json -a -s /tmp/iop-split-host-chat.json -a -s /tmp/iop-split-host-stream.txt
grep -F 'gemma4:26b' /tmp/iop-split-host-models.json
grep -F 'IOP_OLLAMA_E2E_OK' /tmp/iop-split-host-chat.json
rg -n '"reasoning_content"|"content"|data: \[DONE\]' /tmp/iop-split-host-stream.txt
```

Expected: all files are non-empty, model/chat evidence is present, and streaming output includes reasoning/content or content chunks plus `[DONE]`.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-task/m-ollama-field-validation-follow-up/01_split_host_smoke/CODE_REVIEW-cloud-G07.md` | REVIEW_TEST-1, REVIEW_TEST-2, REVIEW_TEST-3 |
| `/tmp/iop-split-host-edge.out` | REVIEW_TEST-1 temporary evidence |
| `/tmp/iop-split-host-node.out` | REVIEW_TEST-1 temporary evidence |
| `/tmp/iop-split-host-models.json` | REVIEW_TEST-3 temporary evidence |
| `/tmp/iop-split-host-chat.json` | REVIEW_TEST-3 temporary evidence |
| `/tmp/iop-split-host-stream.txt` | REVIEW_TEST-3 temporary evidence |

## 최종 검증

```bash
rg --sort path -n 'node registered|node.connected|registered with edge|node-container-host-ollama|container-host-ollama' /tmp/iop-split-host-edge.out /tmp/iop-split-host-node.out
```

Expected: current split-host registration evidence is present.

```bash
go test -count=1 ./...
```

Expected: all Go packages pass without using cache.

```bash
grep -F 'gemma4:26b' /tmp/iop-split-host-models.json
```

Expected: model entry is present.

```bash
grep -F 'IOP_OLLAMA_E2E_OK' /tmp/iop-split-host-chat.json
```

Expected: the non-streaming response includes the requested token.

```bash
rg -n '"reasoning_content"|"content"|data: \[DONE\]' /tmp/iop-split-host-stream.txt
```

Expected: streaming response includes data chunks and terminates with `[DONE]`.

```bash
git diff --check
```

Expected: no whitespace errors.

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