<!-- task=m-vllm-provider-serving-validation/01_spark_container plan=1 tag=VLLM_CONTAINER -->
# Plan: DGX Spark vLLM container 기동 검증

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

이 plan은 `spark-container` Task를 구현/검증하기 위한 실행 계약이다. 구현 에이전트는 실제 변경과 검증 출력으로 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 반드시 채우고, 코드리뷰 전용 섹션이나 archive/complete.log 작성은 수행하지 않는다.

사용자 전용 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 충돌 없이는 안전하게 진행할 수 없는 경우 직접 질문하지 말고 review stub의 `사용자 리뷰 요청` 섹션에 정확한 결정 필요 사항, 증거, 실행 명령/출력, 재개 조건을 기록한 뒤 중단한다. 후속 에이전트가 명령 재실행이나 증거 수집으로 해소할 수 있는 공백은 사용자 리뷰 요청이 아니다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active `CODE_REVIEW-*-G??.md`의 `사용자 리뷰 요청` 섹션에만 기록한다. 구현 에이전트는 chat에서 사용자에게 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. code-review가 blocker 정당성을 검증하고 필요한 경우 `USER_REVIEW.md`를 작성한다.

## Roadmap Targets

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

## Spec Targets

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

## 분석 결과

### 읽은 파일

- `agent-roadmap/phase/inference-provider-extension/milestones/vllm-provider-serving-validation.md`
- `agent-roadmap/sdd/inference-provider-extension/vllm-provider-serving-validation/SDD.md`
- `agent-test/local/rules.md`
- `agent-test/local/edge-smoke.md`
- `agent-test/local/node-smoke.md`

### 테스트 환경 규칙

- local container 안에서 vLLM container를 실행하지 않는다.
- DGX Spark field host 접근 값과 private endpoint는 `agent-test/local/rules.md`의 local-only 값으로 주입한다.
- field 실행은 `DGX_SPARK_SSH`를 설정한 shell에서 수행한다. 이 값은 tracked 파일에 기록하지 않는다.

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

- 이 작업은 container 기동과 provider health 검증까지만 완료한다.
- Edge/Node config, chat, streaming, split-host smoke는 후속 plan에서 검증한다.

### 심볼 참조

- vLLM provider는 이후 `openai_compat` adapter 계열에서 호출될 endpoint를 제공한다.
- served model 기준값: `nvidia/Qwen3.6-35B-A3B-NVFP4`
- external alias 기준값: `qwen3.6:35b`

### 분할 판단

- DGX Spark container 준비는 외부 runtime과 model cache를 다루므로 config/code 변경 plan과 분리한다.
- 이 plan PASS 후 `02+01_config_contract`가 실제 endpoint/served model evidence를 사용한다.

### 범위 결정 근거

- 포함: image/tag/digest 후보 검증, model cache/volume, launch command, `/v1/models` health check.
- 제외: Edge/Node 설정 변경, smoke script 작성, split-host field smoke.

### 빌드 등급

- `cloud-G07`: 원격 field host와 container runtime이 필수인 외부 runtime 검증이다.

## 구현 체크리스트

- [ ] DGX Spark field host에서 ARM64/Blackwell용 vLLM OpenAI-compatible server image/tag와 digest 후보를 확인한다.
- [ ] model cache/volume 경로와 launch command를 정리하고, token/secret이 stdout 또는 tracked 파일에 남지 않게 실행한다.
- [ ] vLLM container를 기동하고 provider local health endpoint `http://127.0.0.1:8000/v1/models`가 served model을 반환하는지 검증한다.
- [ ] container 이름, image digest/tag, model cache/volume, launch command, health check 출력 요약을 review stub에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 구현 항목

- [VLLM_CONTAINER-1] vLLM image/tag/digest 후보 확인
- [VLLM_CONTAINER-2] DGX Spark launch command와 cache/volume 기준 정리
- [VLLM_CONTAINER-3] `/v1/models` health check 검증

## 수정 파일 요약

- 코드 변경은 기본적으로 없다.
- 필요한 경우 container launch note는 active review stub에 evidence로 기록하고, tracked 문서에는 private host/token을 남기지 않는다.

## 최종 검증

```bash
DGX_SPARK_SSH="${DGX_SPARK_SSH:?set DGX Spark ssh target from agent-test/local/rules.md}" ssh "$DGX_SPARK_SSH" 'set -eu; docker image inspect vllm/vllm-openai:nightly-aarch64 --format "{{json .RepoDigests}}"; docker ps --filter name=iop-vllm-qwen36 --format "{{.Names}} {{.Image}} {{.Status}}"; curl -fsS http://127.0.0.1:8000/v1/models'
```

예상 결과: image digest가 확인되고, `iop-vllm-qwen36` container가 running 상태이며, `/v1/models`가 `nvidia/Qwen3.6-35B-A3B-NVFP4`를 포함한 JSON을 반환한다.

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