<!-- task=m-node-provider-first-config-surface/01_schema_source plan=2 tag=REVIEW_REVIEW_CONFIG -->

# Plan - REVIEW_REVIEW_CONFIG

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

`CODE_REVIEW-local-G04.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것까지가 구현이다. 최종 판정, log rename, `complete.log`, task archive는 code-review 전용이다. 선택된 Milestone의 `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 review stub의 `사용자 리뷰 요청` 섹션을 채우고 멈춘다. 직접 사용자에게 묻거나 `USER_REVIEW.md`를 만들지 않는다.

## 배경

두 번째 리뷰도 FAIL이다. 구현 로직과 재실행 검증은 통과했지만, 이전 follow-up plan이 최소 테스트 케이스로 지정한 provider type alias와 unknown type validation coverage가 빠져 있다. SDD S01은 config schema/validation unit tests를 완료 evidence로 요구하므로, 누락된 table cases를 추가해야 `schema-source` Roadmap Completion을 신뢰할 수 있다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operational-observability-provider-management/milestones/node-provider-first-config-surface.md`
- Task ids:
  - `schema-source`: provider-first Node config schema
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- Archived plan: `agent-task/m-node-provider-first-config-surface/01_schema_source/plan_local_G06_1.log`
- Archived review: `agent-task/m-node-provider-first-config-surface/01_schema_source/code_review_local_G06_1.log`
- Verdict: FAIL
- Required summary:
  - `apps/edge/internal/edgevalidate/validate_test.go:254` does not include the required `openai_api` and `sglang` supported alias happy-path cases or an unknown provider type rejection case.
- Affected files:
  - `apps/edge/internal/edgevalidate/validate_test.go`
- Verification evidence from review rerun:
  - `go test -count=1 ./packages/go/config ./apps/edge/internal/edgevalidate` passed.
  - `go run ./apps/edge/cmd/edge --config configs/edge.yaml config check` passed.
  - `git diff --check` produced no output.
  - `go test ./...` passed.
- Roadmap carryover:
  - SDD S01 still applies: config schema/validation unit tests and `configs/edge.yaml` provider-first example diff.
- Narrow archive reread allowed if needed:
  - `agent-task/m-node-provider-first-config-surface/01_schema_source/plan_local_G06_1.log`
  - `agent-task/m-node-provider-first-config-surface/01_schema_source/code_review_local_G06_1.log`

## 구현 체크리스트

- [ ] `TestValidateEdgeConfig_ProviderFirstRejectsMissingTypeFields` 또는 동등한 table test에 `openai_api` + `endpoint` valid case, `sglang` + `endpoint` valid case, unknown provider `type` invalid case를 추가한다.
- [ ] 추가한 cases가 `NormalizeProviderType` alias normalization과 unknown type rejection을 실제 `ValidateEdgeConfig` 경로로 검증하는지 확인한다.
- [ ] `go test -count=1 ./packages/go/config ./apps/edge/internal/edgevalidate`를 실행한다.
- [ ] `go run ./apps/edge/cmd/edge --config configs/edge.yaml config check`와 `git diff --check`를 실행한다.
- [ ] `go test ./...`를 실행하거나, 실행하지 못하면 정확한 차단 사유를 `CODE_REVIEW-local-G04.md`에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

### [REVIEW_REVIEW_CONFIG-1] Alias And Unknown Type Validation Coverage

#### 문제

`ValidateEdgeConfig`는 `openai_api`/`sglang`을 `openai_compat` 계열로 normalize하고 unknown type을 거부하지만, 현재 edgevalidate 테스트는 이 요구를 직접 검증하지 않는다. 이전 follow-up plan은 supported aliases(`vllm`, `lemonade`, `sglang`, `openai_api`) + `endpoint` valid와 unknown/whitespace rejection을 최소 케이스로 요구했다.

#### 해결 방법

`apps/edge/internal/edgevalidate/validate_test.go`의 provider-first validation table에 아래 케이스를 추가한다.

- `type: "openai_api"` + `endpoint` -> valid
- `type: "sglang"` + `endpoint` -> valid
- `type: "unknown_provider"` + `endpoint` -> error containing `unknown provider type`

기존 `vllm`, `lemonade`, whitespace, wrong-field cases는 유지한다.

#### 수정 파일 및 체크리스트

- [ ] `apps/edge/internal/edgevalidate/validate_test.go`: 누락된 table cases 추가.

#### 테스트 작성

작성한다. 이번 follow-up은 테스트 coverage 보강만 다루며, production validation 로직은 새 실패가 드러난 경우에만 최소 수정한다.

## 최종 검증

```bash
go test -count=1 ./packages/go/config ./apps/edge/internal/edgevalidate
```

```bash
go run ./apps/edge/cmd/edge --config configs/edge.yaml config check
```

```bash
git diff --check
```

```bash
go test ./...
```
