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

# Plan - REVIEW_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

- Current archived plan log: `agent-task/m-node-provider-first-config-surface/03+01_legacy_compat/plan_local_G04_1.log`
- Current archived review log: `agent-task/m-node-provider-first-config-surface/03+01_legacy_compat/code_review_local_G04_1.log`
- 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`
- Current verdict: FAIL
- Required summary:
  - `packages/go/config/config_test.go:2652` added the new capacity mismatch tests by replacing the previous pure legacy-only regression test. The prior COMPAT plan/review used `TestLoadEdge_LegacyOnlyConfigRegression` as SDD S03 evidence, and this follow-up was scoped only to the capacity mismatch Required finding.
- Affected files:
  - `packages/go/config/config_test.go`
  - `agent-task/m-node-provider-first-config-surface/03+01_legacy_compat/CODE_REVIEW-local-G04.md`
- Verification evidence from current review:
  - `go test ./packages/go/config ./apps/edge/internal/edgevalidate` passed.
  - `go test ./...` passed.
- Narrow reread allowed:
  - Read the archived plan/review logs listed above only if this snapshot is insufficient.

## 범위 결정 근거

이 follow-up은 SDD S03의 legacy/mixed config compatibility evidence 복원만 다룬다. `CheckProviderLegacyConflict` production logic, capacity mismatch behavior, provider-first schema, routing/status/refresh, docs, dev-runtime smoke는 수정하지 않는다.

## 구현 체크리스트

- [x] `packages/go/config/config_test.go`에 pure legacy-only `LoadEdge` regression test를 복원한다. 기존 이름 `TestLoadEdge_LegacyOnlyConfigRegression`를 우선 사용하고, 동등한 이름을 쓰면 테스트 목적이 명확해야 한다.
- [x] 복원한 테스트가 `nodes[].providers[]` 없이 legacy `adapters.ollama` 설정만으로 `LoadEdge`가 성공하고 provider list가 비어 있음을 검증한다.
- [x] 기존 same-key capacity mismatch 테스트들은 유지하고 의미를 약화하지 않는다.
- [x] `go test -count=1 ./packages/go/config ./apps/edge/internal/edgevalidate`를 실행한다.
- [x] `go test ./...`를 실행한다.
- [x] `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_COMPAT-1] Restore Pure Legacy Regression Evidence

#### 문제

직전 follow-up에서 provider capacity `0` mismatch 테스트를 추가하는 과정에 이전 루프가 SDD S03 evidence로 남긴 `TestLoadEdge_LegacyOnlyConfigRegression`가 사라졌다. 현재 production fix 자체는 맞지만, `legacy-compat` 완료 근거에는 legacy-only config가 회귀 없이 통과한다는 명시 테스트가 함께 남아야 한다.

#### 해결 방법

`packages/go/config/config_test.go`에 pure legacy-only `LoadEdge` 테스트를 새 mismatch 테스트와 별도로 다시 추가한다. 테스트는 legacy `adapters.ollama`만 선언한 config를 로드하고, 노드가 1개이며 `Providers`가 비어 있음을 확인한다.

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

- [x] `packages/go/config/config_test.go`: `TestLoadEdge_LegacyOnlyConfigRegression` 또는 동등한 pure legacy-only regression test 복원.
- [x] `packages/go/config/config_test.go`: 기존 `TestLoadEdge_ProviderFirstLegacyCapacityMismatch*` 테스트 보존 확인.

#### 테스트 작성

테스트는 pure legacy adapter path만 다룬다. provider-first나 mixed config를 함께 넣지 않는다.

#### 중간 검증

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

## 최종 검증

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