<!-- task=m-vllm-provider-serving-validation/02+01_config_contract plan=1 tag=REVIEW_VLLM_CONFIG -->
# Plan: REVIEW_VLLM_CONFIG follow-up

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

이 plan은 이전 `VLLM_CONFIG` 리뷰의 Required 이슈만 해결한다. 사용자에게 직접 질문하지 말고, 새 결정이 필요하다고 판단되면 active `CODE_REVIEW-*-G??.md`의 `사용자 리뷰 요청` 섹션에만 기록한다. 환경/secret/서비스 준비, 검증 증거 공백, 일반 범위 조정은 사용자 리뷰 요청이 아니다.

## Roadmap Targets

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

## Spec Targets

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

## Archive Evidence Snapshot

- 이전 plan log: `agent-task/m-vllm-provider-serving-validation/02+01_config_contract/plan_local_G06_0.log`
- 이전 review log: `agent-task/m-vllm-provider-serving-validation/02+01_config_contract/code_review_local_G06_0.log`
- 이전 판정: FAIL
- Required 요약:
  - `configs/edge.yaml`의 vLLM 예시는 `provider: "vllm"`을 `openai.model_routes[]` 아래에 두지만, 실제 `OpenAIRouteEntry`에는 `provider` 필드가 없다.
  - SDD `S02`가 요구한 vLLM endpoint, served model, alias, auth/header, timeout, option passthrough 계약이 config example/test fixture로 충분히 검증되지 않았다.
  - 구현 기록은 plan의 고정 최종 검증 명령 출력을 남기지 않았다.
- 영향 파일:
  - `configs/edge.yaml`
  - `packages/go/config/config_test.go`
  - `apps/edge/internal/node/mapper_test.go`
  - `apps/node/internal/adapters/factory_internal_test.go` 또는 `apps/node/internal/adapters/adapters_blackbox_test.go`
- 리뷰 중 확인한 검증:
  - `go test ./packages/go/config ./apps/edge/internal/node ./apps/node/internal/adapters ./apps/node/internal/adapters/openai_compat` - PASS
  - `git diff --check` - PASS
  - `go build ./...` - PASS
- Roadmap carryover: `config-contract`
- Spec carryover: `S02`
- 필요한 경우에만 좁게 다시 읽을 수 있는 archive evidence: 위 이전 plan/review log 두 파일.

## 범위 결정 근거

- 포함: vLLM OpenAI-compatible config example을 실제 loader/mapper/factory 계약과 맞추고, vLLM 전용 fixture로 SDD `S02` evidence를 남긴다.
- 제외: 실제 DGX Spark endpoint 접근, `/v1/models`/chat smoke, streaming/field smoke. 해당 검증은 후속 `03+02_openai_vllm_smoke`, `04+03_field_smoke` 범위다.
- private endpoint/token/secret은 tracked 파일에 기록하지 않는다. 예시는 placeholder를 사용한다.

## 구현 항목

- [REVIEW_VLLM_CONFIG-1] vLLM config example contract 정정
- [REVIEW_VLLM_CONFIG-2] vLLM provider config/mapper/factory fixture 보강
- [REVIEW_VLLM_CONFIG-3] 고정 검증 출력 기록

## 구현 체크리스트

- [ ] `configs/edge.yaml`에서 unsupported route-level `provider` 예시를 제거하고, vLLM `provider: "vllm"`은 `nodes[].adapters.openai_compat_instances[]` 예시에 둔다.
- [ ] vLLM 예시는 alias `qwen3.6:35b`, served model `nvidia/Qwen3.6-35B-A3B-NVFP4`, private 값을 담지 않는 endpoint placeholder, headers 없음, timeout/queue/option passthrough 의도를 모두 드러낸다.
- [ ] `packages/go/config`에 vLLM OpenAI-compatible route + instance fixture를 추가해 alias/target/provider/endpoint/no-headers/timeout/queue가 loader에서 보존되는지 검증한다.
- [ ] `apps/edge/internal/node`와 `apps/node/internal/adapters`의 mapper/factory coverage에 provider `vllm` fixture를 추가하거나 기존 test를 확장해 typed proto payload와 factory conversion이 보존되는지 검증한다.
- [ ] 고정 검증 `go test ./packages/go/config ./apps/edge/internal/node ./apps/node/internal/adapters ./apps/node/internal/adapters/openai_compat`와 `git diff --check`를 실행하고 실제 stdout/stderr를 review stub에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 리뷰 포인트

- `openai.model_routes[]`에는 실제 `OpenAIRouteEntry` 필드만 사용되는가.
- vLLM `provider`, endpoint, headers 없음, timeout/queue 값은 `openai_compat_instances[]` 계약으로 검증되는가.
- route alias와 served model target이 `adapter + target` 경계를 유지하는가.
- 새 fixture가 SDD `S02` Evidence Map의 config examples/tests 요구를 만족하는가.

## 최종 검증

```bash
go test ./packages/go/config ./apps/edge/internal/node ./apps/node/internal/adapters ./apps/node/internal/adapters/openai_compat
git diff --check
```

예상 결과: vLLM provider config fixture가 통과하고 whitespace error가 없다.
