<!-- task=m-node-multi-target-serving-foundation/08+03,04,05,06,07_field_smoke plan=0 tag=TEST -->

# Plan - TEST

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

이 작업은 field smoke 증거 수집용이다. 코드 변경이 필요하면 최소 범위로 제한하고, `CODE_REVIEW-cloud-G07.md`에 실행 환경, 명령, 실제 출력, 실패 시 원인을 기록한다. 사용자 소유 원격 서버/노드/secret 준비가 필요하면 직접 묻지 말고 `사용자 리뷰 요청`에 재개 조건을 남긴다.

## 배경

첫 Epic의 최종 확인은 하나의 Edge-Node proto-socket 연결에서 최소 두 inference model target과 하나의 CLI target을 호출하는 것이다. 단위 테스트가 통과해도 split-host 연결, bootstrap, edge API, CLI target을 함께 확인해야 실제 목표가 닫힌다.

## 사용자 리뷰 요청 흐름

원격 서버, 노드, secret, 외부 모델 endpoint처럼 사용자 소유 prerequisite이 없으면 진행할 수 없는 경우 active review stub의 `사용자 리뷰 요청`에 기록한다. code-review가 user-review stop 여부를 결정한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/inference-provider-extension/milestones/node-multi-target-serving-foundation.md`
- Task ids:
  - `field-smoke`: split-host smoke에서 하나의 연결된 Node가 최소 두 개의 inference model target과 하나의 CLI target을 같은 Edge-Node 연결로 호출할 수 있음을 확인한다.
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-test/local/rules.md`
- `agent-test/local/edge-smoke.md`
- `agent-test/local/node-smoke.md`
- `docs`
- `configs/edge.yaml`
- `apps/edge/internal/openai/routes.go`
- `apps/edge/internal/service/service.go`
- `apps/node/internal/transport/client.go`
- `apps/node/internal/transport/session.go`

### 테스트 환경 규칙

- test_env: `local`
- field smoke는 local unit test가 아니라 split-host 실제 실행 증거가 핵심이다. 그래도 사전 회귀는 `go test -count=1 ./...` 또는 변경 범위별 테스트를 실행한다.
- 원격 endpoint, node token, 모델 endpoint secret은 사용자 소유 환경일 수 있으므로 없으면 `사용자 리뷰 요청` 사유가 된다.

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

- 단위 테스트는 하나의 연결에서 두 inference model target과 CLI target을 모두 호출하는 실제 split-host 경로를 증명하지 않는다.
- `/v1/models`, `/v1/chat/completions`, `/v1/responses`, CLI command path를 같은 Node connection으로 묶은 증거가 없다.

### 심볼 참조

- rename/remove 예정 심볼: 없음. smoke script나 docs를 추가할 경우 기존 command entrypoint와 config path를 확인한다.

### 분할 판단

- predecessor `03`: route catalog 완료 필요. 현재 active plan, complete 없음.
- predecessor `04`: engine profiles 완료 필요. 현재 active plan, complete 없음.
- predecessor `05`: edge-owned options 완료 필요. 현재 active plan, complete 없음.
- predecessor `06`: commands/caps 완료 필요. 현재 active plan, complete 없음.
- predecessor `07`: runtime concurrency 완료 필요. 현재 active plan, complete 없음.
- field smoke는 모든 기능 구현 후 실행해야 하므로 최종 dependent task로 둔다.

### 범위 결정 근거

- smoke 실패로 발견한 작은 config/docs 보정은 이 task에서 처리할 수 있다.
- 구조적 코드 결함은 새 follow-up plan으로 분리한다. 원격 secret이나 서버 준비는 repo가 해결하지 않는다.

### 빌드 등급

- build: `cloud-G07`, review: `cloud-G07`. 원격/터미널 실행 증거와 장시간 command 진단이 중심이다.

## 의존 관계 및 구현 순서

- `08+03,04,05,06,07_field_smoke`는 `03`, `04`, `05`, `06`, `07` predecessor subtask의 `complete.log`가 모두 생긴 뒤 실행한다.

## 구현 체크리스트

- [ ] split-host smoke 사전 조건과 실제 실행 config를 기록한다.
- [ ] Edge `/v1/models`가 두 inference model target을 노출하는 증거를 수집한다.
- [ ] 같은 연결된 Node를 통해 inference model target 두 개를 각각 호출하는 증거를 수집한다.
- [ ] 같은 연결된 Node를 통해 CLI target 하나를 호출하는 증거를 수집한다.
- [ ] 실패 시 repo-owned fix와 user-owned prerequisite을 구분해 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [TEST-1] Split Host Multi Target Smoke

- 문제: milestone 목표는 단위 테스트만으로 완료됐다고 볼 수 없다. 한 Node connection에서 multiple inference + CLI target을 함께 쓰는 실제 경로가 검증되어야 한다.
- 해결 방법: 빌드 산출물, Edge config, Node bootstrap config, node token, model route ids, CLI target id를 기록하고, `/healthz`, `/v1/models`, inference call 2개, CLI command/run 1개를 같은 Node id로 확인한다. 출력에는 request model, internal target/node id, status, 최소 응답 본문을 남긴다.
- 수정 파일 및 체크리스트:
  - [ ] 필요 시 `docs/` 또는 smoke 문서에 최신 명령을 보정한다.
  - [ ] 필요 시 `configs/edge.yaml` 예시를 실제 multi target smoke와 맞춘다.
  - [ ] 코드 변경은 smoke를 막는 작은 config/docs 보정으로 제한한다.
- 테스트 작성: 신규 단위 테스트는 이 task의 주목적이 아니다. 필요한 경우 smoke script/문서 검증 명령만 추가한다.
- 중간 검증:
  - `go test -count=1 ./...`
  - `curl -fsS http://<edge-openai>/healthz`
  - `curl -fsS http://<edge-openai>/v1/models`

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `docs/**` | TEST-1 |
| `configs/edge.yaml` | TEST-1 |
| `agent-task/m-node-multi-target-serving-foundation/08+03,04,05,06,07_field_smoke/CODE_REVIEW-cloud-G07.md` | TEST-1 |

## 최종 검증

```bash
go test -count=1 ./...
curl -fsS http://<edge-openai>/healthz
curl -fsS http://<edge-openai>/v1/models
curl -fsS http://<edge-openai>/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"<model-a>","messages":[{"role":"user","content":"ping"}]}'
curl -fsS http://<edge-openai>/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"<model-b>","messages":[{"role":"user","content":"ping"}]}'
```

CLI target 호출은 프로젝트의 최신 Edge command endpoint 또는 `iop-edge` command로 실행하고, 실제 명령과 출력을 `CODE_REVIEW-cloud-G07.md`에 기록한다.

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