<!-- task=m-vllm-provider-serving-validation/04+03_field_smoke plan=1 tag=VLLM_FIELD -->
# Plan: vLLM split-host field smoke

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

이 plan은 `field-smoke` Task를 구현/검증하기 위한 실행 계약이다. 선행 작업 `01_spark_container`와 `03+02_openai_vllm_smoke`의 PASS evidence 또는 동등한 container/script evidence를 확인한 뒤 진행한다. 구현 에이전트는 실제 변경과 검증 출력으로 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 반드시 채운다.

사용자 전용 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 충돌 없이는 안전하게 진행할 수 없는 경우 직접 질문하지 말고 review stub의 `사용자 리뷰 요청` 섹션에 기록한 뒤 중단한다. 단순 evidence 재수집 가능 상태는 사용자 리뷰 요청이 아니다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active `CODE_REVIEW-*-G??.md`의 `사용자 리뷰 요청` 섹션에만 기록한다. 구현 에이전트는 chat에서 사용자에게 선택지를 제시하거나 `request_user_input`을 호출하지 않는다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/inference-provider-extension/milestones/vllm-provider-serving-validation.md`
- Task: `field-smoke`

## Spec Targets

- SDD: `agent-roadmap/sdd/inference-provider-extension/vllm-provider-serving-validation/SDD.md`
- Scenario: `S05`

## 분석 결과

### 읽은 파일

- `agent-test/local/rules.md`
- `agent-test/local/edge-smoke.md`
- `agent-test/local/node-smoke.md`
- `agent-test/local/platform-common-smoke.md`
- `scripts/e2e-openai-lemonade.sh`
- `agent-roadmap/sdd/inference-provider-extension/vllm-provider-serving-validation/SDD.md`

### 테스트 환경 규칙

- 실제 DGX Spark field host 값은 local-only 규칙에서 읽고 tracked 파일에 기록하지 않는다.
- current container에서 vLLM container를 실행하지 않는다.
- split-host smoke는 real vLLM endpoint와 Edge/Node 경로를 함께 확인한다.

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

- fake-mode smoke만으로는 actual DGX Spark vLLM target/model path를 완료 증거로 삼을 수 없다.
- field endpoint 접근, model cache 상태, streaming latency/termination은 real-mode evidence가 필요하다.

### 심볼 참조

- `scripts/e2e-openai-vllm.sh`
- Edge OpenAI `/v1/models`
- Edge OpenAI `/v1/chat/completions`
- Node `openai_compat` adapter request path

### 분할 판단

- 이 plan은 code change보다 field evidence 수집이 중심이다.
- 실패 시 code/config 수정이 필요하면 이 active review stub에 원인과 다음 plan 필요 여부를 기록한다.

### 범위 결정 근거

- 포함: DGX Spark provider health, Edge/Node split-host real-mode smoke, target/model evidence, non-streaming/streaming 검증.
- 제외: container image 교체 실험, 장기 운영 스크립트, qualification report 제품화.

### 빌드 등급

- `cloud-G07`: 외부 field endpoint와 split-host runtime이 필수이다.

## 구현 체크리스트

- [ ] `01_spark_container`와 `03+02_openai_vllm_smoke`의 PASS evidence 또는 동등한 evidence를 확인한다.
- [ ] DGX Spark provider endpoint `http://<DGX_SPARK_HOST>:8000/v1`의 `/v1/models`가 real served model을 반환하는지 확인한다.
- [ ] `scripts/e2e-openai-vllm.sh` real mode로 Edge `/v1/models`, non-streaming chat, streaming SSE를 실행한다.
- [ ] output에 route alias `qwen3.6:35b`, target/served model `nvidia/Qwen3.6-35B-A3B-NVFP4`, finish reason, 종료 신호 evidence를 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 구현 항목

- [VLLM_FIELD-1] DGX Spark provider real health 확인
- [VLLM_FIELD-2] Edge/Node split-host non-streaming smoke
- [VLLM_FIELD-3] Edge/Node split-host streaming smoke

## 수정 파일 요약

- 일반적으로 코드 변경 없음.
- field smoke 실패가 code/config 결함으로 확인되면 최소 수정만 수행하고, 범위가 커지면 다음 plan 필요 여부를 review stub에 기록한다.

## 최종 검증

```bash
IOP_VLLM_MODE=real IOP_VLLM_ENDPOINT="${IOP_VLLM_ENDPOINT:?set http://<DGX_SPARK_HOST>:8000/v1 from agent-test/local/rules.md}" IOP_VLLM_MODEL="nvidia/Qwen3.6-35B-A3B-NVFP4" IOP_VLLM_ALIAS="qwen3.6:35b" bash ./scripts/e2e-openai-vllm.sh
git diff --check
```

예상 결과: real-mode smoke가 Edge `/v1/models`, non-streaming chat, streaming SSE 종료 신호를 검증하고 whitespace error가 없다.

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