<!-- task=m-node-multi-target-serving-foundation/01_config_topology plan=1 tag=REVIEW_API -->

# Plan - REVIEW_API

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

`CODE_REVIEW-cloud-G08.md`의 구현 에이전트 소유 섹션 작성까지가 구현의 일부다. 코드 변경 후 검증을 실행하고 실제 변경 내용, 검증 출력, 계획 대비 변경 사항을 채운 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 사용자 결정, 사용자 소유 외부 환경, 또는 범위 충돌 없이는 진행할 수 없으면 review stub의 `사용자 리뷰 요청`에 근거를 남기고 중단한다. 구현 중 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`, `USER_REVIEW.md`, archive log, `complete.log`를 만들지 않는다.

## 배경

1차 구현은 Edge config와 `NodeConfigPayload`가 multi adapter/profile topology를 표현하도록 확장했다. 코드리뷰 결과, 핵심 contract 자체는 judgeable하지만 `iop-edge config check`의 adapter 활성 판정과 vLLM endpoint 검증에 빈틈이 있어 후속 보강이 필요하다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active `CODE_REVIEW-cloud-G08.md`의 `사용자 리뷰 요청` 섹션에 기록한다. 구현 에이전트는 직접 사용자 프롬프트를 만들지 않으며, code-review가 요청 타당성과 실제 `USER_REVIEW.md` 작성 여부를 판단한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/inference-provider-extension/milestones/node-multi-target-serving-foundation.md`
- Task ids:
  - `config-topology`: Edge `nodes[]` 설정과 `NodeConfigPayload`가 하나의 Node 안에 여러 CLI profile, terminal gateway, 추론 engine/profile instance, model target route를 표현한다.
- Completion mode: check-on-pass

## 분석 결과

### 이전 루프

- Archived plan: `agent-task/m-node-multi-target-serving-foundation/01_config_topology/plan_local_G08_0.log`
- Archived review: `agent-task/m-node-multi-target-serving-foundation/01_config_topology/code_review_cloud_G08_0.log`
- Verdict: `WARN`

### 리뷰 발견 사항

- `apps/edge/internal/edgecmd/config.go:143`의 `hasOllama`/`hasVllm` 판정이 instance slice 길이만 확인한다. 모든 instance가 `enabled: false`여도 adapter가 있다고 판단할 수 있다.
- `apps/edge/internal/edgecmd/config.go:151` 주변 검증은 `ollama_instances[].base_url`만 확인한다. `enabled: true`인 legacy `vllm.endpoint` 및 `vllm_instances[].endpoint`가 빈 값인 경우를 거부하지 않는다.

### 범위 결정 근거

- 기존 multi topology contract, proto field, mapper 구조는 유지한다.
- 후속 범위는 `config check` 검증 보강과 관련 edgecmd 테스트 추가에 한정한다.
- Node runtime routing, OpenAI route catalog, adapter registry 구현은 sibling task 범위이므로 다루지 않는다.

### 빌드 등급

- build: `local-G08`, review: `cloud-G08`. 수정 범위는 deterministic config validation과 테스트에 한정되지만, milestone-linked API foundation의 후속 검토라 기존 review route를 유지한다.

## 구현 체크리스트

- [ ] `validateEdgeConfig`가 legacy adapter와 multi-instance adapter 모두 실제 enabled 상태 기준으로 "at least one adapter"를 판단한다.
- [ ] `validateEdgeConfig`가 enabled vLLM legacy/instance endpoint 빈 값을 거부하고 edgecmd 테스트가 이를 검증한다.
- [ ] 최종 검증 명령을 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_API-1] Edge Config Validation Follow-Up

- 문제: 비활성 instance만 존재하는 node가 `config check`에서 통과할 수 있고, enabled vLLM endpoint 빈 값이 검증되지 않는다.
- 해결 방법: `validateEdgeConfig`에서 enabled instance 존재 여부를 helper 또는 명확한 loop로 계산한다. legacy `vllm.enabled`와 `vllm_instances[].enabled`가 true이면 endpoint가 비어 있지 않아야 한다. 기존 Ollama 검증은 유지하되 multi-instance 판정도 enabled 기준으로 정리한다.
- 수정 파일 및 체크리스트:
  - [ ] `apps/edge/internal/edgecmd/config.go`: enabled adapter 판정과 vLLM endpoint 검증 보강.
  - [ ] `apps/edge/internal/edgecmd/edgecmd_test.go`: 비활성 instance-only node 거부, enabled vLLM endpoint 빈 값 거부 테스트 추가.
- 테스트 작성: 추가한다. `edgecmd` 테스트에서 `config check` command를 실행해 실제 사용자-facing validation 결과를 고정한다.
- 중간 검증:
  - `go test -count=1 ./apps/edge/internal/edgecmd/...`

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/edge/internal/edgecmd/config.go` | REVIEW_API-1 |
| `apps/edge/internal/edgecmd/edgecmd_test.go` | REVIEW_API-1 |

## 최종 검증

```bash
go test -count=1 ./packages/go/... ./proto/gen/... ./apps/edge/internal/node/... ./apps/edge/internal/edgecmd/...
```

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