<!-- task=m-node-provider-first-config-surface/03+01_legacy_compat plan=1 tag=REVIEW_COMPAT -->

# Plan - REVIEW_COMPAT

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

이 계획은 이전 리뷰의 Required finding만 해결한다. 직접 사용자에게 묻지 않는다. 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 `CODE_REVIEW-local-G04.md`의 `사용자 리뷰 요청` 섹션에 근거를 기록하고 멈춘다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operational-observability-provider-management/milestones/node-provider-first-config-surface.md`
- Task ids:
  - `legacy-compat`: legacy adapters config compatibility and mixed config rules
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- Previous plan log: `agent-task/m-node-provider-first-config-surface/03+01_legacy_compat/plan_local_G05_0.log`
- Previous review log: `agent-task/m-node-provider-first-config-surface/03+01_legacy_compat/code_review_local_G05_0.log`
- Previous verdict: FAIL
- Required summary:
  - `packages/go/config/config.go:882` skips capacity comparison when provider capacity is `0`, so same-key provider-first + legacy adapter configs can silently accept a legacy `capacity > 0` mismatch even though provider capacity `0` means not dispatchable.
- Affected files:
  - `packages/go/config/config.go`
  - `packages/go/config/config_test.go`
  - `apps/edge/internal/edgevalidate/validate_test.go`
- Verification evidence from previous review:
  - `go test ./packages/go/config ./apps/edge/internal/edgevalidate` passed.
  - `go test ./...` passed.
- Narrow reread allowed:
  - Read the previous plan/review logs listed above only if this snapshot is insufficient.

## 범위 결정 근거

이 follow-up은 SDD S03의 mixed config conflict rule 중 capacity mismatch 누락만 보완한다. Provider-first schema 확장, routing/status/refresh, docs, dev-runtime smoke는 sibling task 범위이므로 건드리지 않는다.

## 구현 체크리스트

- [x] `CheckProviderLegacyConflict`가 같은 key의 provider-first/legacy capacity mismatch를 provider capacity `0`인 경우에도 validation error로 거부하도록 수정한다.
- [x] `packages/go/config/config_test.go`에 legacy capacity `2`와 provider capacity `0` 또는 생략 상태의 같은 key mixed config가 `LoadEdge`에서 거부되는 테스트를 추가한다.
- [x] `apps/edge/internal/edgevalidate/validate_test.go`에 같은 capacity mismatch가 `ValidateEdgeConfig` 경로에서도 거부되는 테스트를 추가한다.
- [x] `go test ./packages/go/config ./apps/edge/internal/edgevalidate`를 실행한다.
- [x] `go test ./...`를 실행한다.
- [x] `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_COMPAT-1] Same-Key Capacity Mismatch Rejection

#### 문제

현재 `CheckProviderLegacyConflict`는 capacity 비교를 `p.Capacity != 0 && p.Capacity != legacy.Capacity`로 제한한다. 하지만 provider capacity `0`은 provider-pool 계약에서 not-dispatchable 의미를 가지므로, legacy adapter capacity가 양수인 동일 key mixed config를 조용히 허용하면 silent precedence가 남는다.

#### 해결 방법

같은 key의 provider-first resource와 legacy adapter instance가 같은 runtime type으로 매칭되면 capacity를 직접 비교한다. mismatch면 기존 `conflicts with adapters... capacity mismatch` 계열 error를 반환한다. 테스트는 `LoadEdge`와 `ValidateEdgeConfig` 양쪽 진입점에서 같은 형태의 conflict를 검증한다.

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

- [x] `packages/go/config/config.go`: capacity mismatch 비교 조건 수정.
- [x] `packages/go/config/config_test.go`: same-key legacy capacity positive/provider capacity zero conflict test 추가.
- [x] `apps/edge/internal/edgevalidate/validate_test.go`: `ValidateEdgeConfig` capacity conflict test 추가.

#### 테스트 작성

테스트는 error substring으로 `conflicts with adapters`와 `capacity mismatch`를 확인한다. provider capacity가 `0`인 경우를 반드시 포함한다.

#### 중간 검증

```bash
go test ./packages/go/config ./apps/edge/internal/edgevalidate
```

## 최종 검증

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