<!-- task=m-agent-readable-repository-refactor/04_core_config_tests plan=0 tag=TEST -->

# Core config 테스트 책임별 분해

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

> 구현 후 검증을 실행하고 CODE_REVIEW 파일의 구현 에이전트 소유 섹션에 실제 메모와 출력을 채운 뒤 active 파일을 유지한 채 리뷰 준비 완료를 보고한다. 종결 판정, log rename, complete.log, archive 이동은 code-review 전용이다. 선택된 Milestone의 미해결 구현 잠금 결정이 실제 구현을 차단할 때만 CODE_REVIEW의 사용자 리뷰 요청에 연결 근거를 기록하고 중단한다. 구현 중 사용자에게 직접 질문하거나 선택지를 제시하거나 request_user_input을 호출하거나 USER_REVIEW.md/complete.log를 만들지 않는다. 환경·secret·service, 일반 범위 조정, 후속 에이전트가 보완 가능한 증거 공백은 사용자 리뷰 사유가 아니다.

## 배경

packages/go/config/config_test.go는 3,802줄에서 Edge와 Node, OpenAI, CLI profile, provider catalog 검증을 함께 담고 있다. config type의 기존 package 경계를 유지하면서 책임별 test 파일로 재배치한다.

## 사용자 리뷰 요청 흐름

사용자 리뷰 요청은 선택된 Milestone의 구현 잠금 결정만 active review stub의 사용자 리뷰 요청 섹션에 기록한다. 섹션 형식은 agent-ops/skills/common/_templates/implementation-user-review-request-section.md를 따른다. 구현 중 직접 사용자 prompt는 금지하며, 요청의 타당성 검증과 USER_REVIEW.md 작성은 code-review가 소유한다.


## 분석 결과

### 읽은 파일

- agent-roadmap/phase/automation-runtime-bridge/milestones/agent-readable-repository-refactor.md
- agent-test/local/rules.md
- agent-test/local/profiles/platform-common-smoke.md
- agent-spec/runtime/provider-pool-config-refresh.md
- packages/go/config/config_test.go

### SDD 기준

선택 Milestone은 SDD: 불필요다. 외부 API/proto/config schema와 runtime 책임 경계를 바꾸지 않는 동작 보존형 테스트 재배치라는 기록 사유를 적용한다.

### 테스트 환경 규칙

test_env=local. local rules와 platform-common-smoke profile을 읽었다. 현재 checkout에서 GOCACHE=/tmp/iop-go-build-cache go test -count=1 ./packages/go/config가 통과했다. fresh package test와 Test 목록 107개를 계약으로 사용한다.

### 테스트 커버리지 공백

config 동작 변경은 없다. 기존 107개 top-level Test의 YAML fixture와 assertion을 그대로 이동한다.

### 심볼 참조

운영 심볼의 rename/remove는 없다. 기존 Test* 이름과 package 경계를 그대로 유지한다.

### 분할 판단

공유 task group 아래 독립 04_core_config_tests다. 05_core_node_tests도 독립이며 06+04,05_core_edge_tests가 두 predecessor 완료 뒤 core-tests를 최종 완료한다.

### 범위 결정 근거

packages/go/config/config_test.go와 test-only helper만 수정한다. config.go 및 외부 config schema는 바꾸지 않는다.

### 빌드 등급

local-G06: 단일 package의 대형 테스트 이동이며 영역별 import/fixture 정리가 필요하지만 동작은 완전 고정이다.

## 구현 체크리스트

- [ ] [TEST-1] config_test.go를 Edge/OpenAI/CLI/provider/Node 영역별 파일로 옮기고 Test 107개, 원본 제거, package test 통과를 보존한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [TEST-1] config 영역별 test 파일 분리

- 문제: packages/go/config/config_test.go:14부터 3,802줄까지 Edge identity/OpenAI/CLI/provider/Node config가 한 파일에 결합되어 있다.
- 해결 방법:

~~~text
Before
packages/go/config/config_test.go:14  func TestLoadEdge_EdgeIdentity(...)
packages/go/config/config_test.go:722 func TestLoadEdge_CodexProfile(...)
packages/go/config/config_test.go:1474 func TestLoadEdge_MultiOllamaInstances(...)

After
config_test_helpers_test.go       YAML/temp helper
edge_openai_config_test.go        Edge identity/OpenAI
edge_cli_config_test.go           console/CLI profiles
edge_runtime_config_test.go       refresh/control-plane/A2A
provider_catalog_config_test.go   provider instances/routes
node_config_test.go               Node config
~~~

- 수정 파일 및 체크리스트:
  - [ ] packages/go/config/config_test.go: 모든 테스트를 이동한 뒤 삭제한다.
  - [ ] packages/go/config/config_test_helpers_test.go: 반복 YAML/temp helper를 둔다.
  - [ ] packages/go/config/edge_openai_config_test.go: Edge/OpenAI 설정 테스트를 둔다.
  - [ ] packages/go/config/edge_cli_config_test.go: console/CLI profile 테스트를 둔다.
  - [ ] packages/go/config/edge_runtime_config_test.go: runtime/refresh/control-plane 테스트를 둔다.
  - [ ] packages/go/config/provider_catalog_config_test.go: provider/catalog/route 테스트를 둔다.
  - [ ] packages/go/config/node_config_test.go: Node 설정 테스트를 둔다.
- 테스트 작성: 추가 테스트는 작성하지 않는다. config schema를 바꾸지 않는 internal test topology refactor이고 기존 Test 107개를 보존한다.
- 중간 검증:

~~~bash
gofmt -w packages/go/config/*_test.go
test ! -e packages/go/config/config_test.go
[ "$(GOCACHE=/tmp/iop-go-build-cache go test -list '^Test' ./packages/go/config | sed '/^ok[[:space:]]/d' | wc -l)" -eq 107 ]
~~~

기대 결과: 원본 삭제, gofmt 성공, Test 107개.


## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| packages/go/config/config_test.go | TEST-1 |
| packages/go/config/config_test_helpers_test.go | TEST-1 |
| packages/go/config/edge_openai_config_test.go | TEST-1 |
| packages/go/config/edge_cli_config_test.go | TEST-1 |
| packages/go/config/edge_runtime_config_test.go | TEST-1 |
| packages/go/config/provider_catalog_config_test.go | TEST-1 |
| packages/go/config/node_config_test.go | TEST-1 |

## 최종 검증

~~~bash
GOCACHE=/tmp/iop-go-build-cache go test -count=1 ./packages/go/config
[ "$(GOCACHE=/tmp/iop-go-build-cache go test -list '^Test' ./packages/go/config | sed '/^ok[[:space:]]/d' | wc -l)" -eq 107 ]
python3 -c "from pathlib import Path; p=Path('packages/go/config'); bad=sorted((sum(1 for _ in f.open()),str(f)) for f in p.glob('*_test.go') if sum(1 for _ in f.open())>1000); print(bad); raise SystemExit(bool(bad))"
~~~

기대 결과: fresh config test PASS, Test 107개, 1,000줄 초과 test 없음.

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