<!-- task=m-agent-readable-repository-refactor/01_openai_auth_chat plan=1 tag=REVIEW_TEST -->

# OpenAI 테스트 공용 support 책임 경계 보완

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

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

## 배경

첫 리뷰에서 테스트 본문, 226개 Test 이름, package 동작은 보존됐지만 공용 test double 구현 일부가 auth/routes/models 파일에 남은 것이 확인됐다. 이 후속 작업은 공용 fixture의 실제 위치만 바로잡아 chat/stream/provider 테스트의 직접 read set에서 무관한 auth 파일 의존을 제거한다.

## 사용자 리뷰 요청 흐름

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

## Archive Evidence Snapshot

- Previous task: `agent-task/m-agent-readable-repository-refactor/01_openai_auth_chat`
- Archived plan: `agent-task/m-agent-readable-repository-refactor/01_openai_auth_chat/plan_local_G07_0.log`
- Archived review: `agent-task/m-agent-readable-repository-refactor/01_openai_auth_chat/code_review_local_G07_0.log`
- Verdict: FAIL
- Findings: Required 1, Suggested 0, Nit 0. 공용 `SubmitRun`/`OllamaAPI` 구현과 `bufferedRunEvents`가 `openai_auth_routes_models_test.go`에 남아 계획의 support 책임 경계를 위반했다.
- Affected files: `apps/edge/internal/openai/server_test_support_test.go`, `apps/edge/internal/openai/openai_auth_routes_models_test.go`
- Verification evidence: `gofmt -l apps/edge/internal/openai/*_test.go` PASS, Test 목록 226개, `GOCACHE=/tmp/iop-go-build-cache go test -count=1 ./apps/edge/internal/openai` PASS(6.730s), `GOCACHE=/tmp/iop-go-build-cache go test -count=1 ./apps/edge/...` PASS.
- Roadmap carryover: 원 계획에 `Roadmap Targets`가 없어 Milestone Task completion은 주장하지 않는다. 선택 Milestone의 SDD는 불필요다.
- Allowed archive reread: 위 `plan_local_G07_0.log`, `code_review_local_G07_0.log`만 필요할 때 좁게 읽는다.

## 분석 결과

### 읽은 파일

- `agent-task/m-agent-readable-repository-refactor/01_openai_auth_chat/plan_local_G07_0.log`
- `agent-task/m-agent-readable-repository-refactor/01_openai_auth_chat/code_review_local_G07_0.log`
- `agent-roadmap/phase/automation-runtime-bridge/milestones/agent-readable-repository-refactor.md`
- `agent-ops/rules/project/domain/edge/rules.md`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-test/local/rules.md`
- `agent-test/local/edge-smoke.md`
- `agent-test/local/testing-smoke.md`
- `agent-spec/input/openai-compatible-surface.md`
- `agent-contract/outer/openai-compatible-api.md`
- `apps/edge/internal/openai/server.go`
- `apps/edge/internal/openai/server_test_support_test.go`
- `apps/edge/internal/openai/openai_auth_routes_models_test.go`

### SDD 기준

선택 Milestone은 `SDD: 불필요`다. 외부 API/proto/config schema나 runtime 책임 경계를 바꾸지 않는 동일 package 테스트 재배치라는 기록 사유를 그대로 적용한다.

### 테스트 환경 규칙

`test_env=local`. `agent-test/local/rules.md`, `agent-test/local/edge-smoke.md`, `agent-test/local/testing-smoke.md`를 읽었다. 테스트 선언 위치와 import만 바꾸므로 변경 package의 fresh test와 Test 목록 226개 보존을 필수 검증으로 적용한다. production 실행 경로를 바꾸지 않아 외부 provider, smoke, full-cycle 검증은 생략하며 남은 runtime 위험은 없다.

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

동작 변경은 없다. 기존 226개 Test의 본문과 이름을 바꾸지 않고 선언 위치만 이동하므로 신규 테스트는 필요하지 않다. package compile과 fresh test가 interface 구현 및 import 정합성을 검증한다.

### 심볼 참조

rename/remove는 없다. `bufferedRunEvents` 참조는 `chat_handler_test.go`, `chat_stream_reasoning_test.go`, `server_test.go`, `usage_metrics_test.go`에 있고, `fakeRunService.SubmitRun`/`OllamaAPI`는 `server.go`의 `runService` 구현을 구성한다. 선언만 같은 package의 support 파일로 이동한다.

### 분할 판단

기존 split subtask `01_openai_auth_chat` 안의 단일 후속 계획으로 유지한다. 두 테스트 파일 사이의 세 선언 이동과 import 정리만 포함해 독립 API·도메인·검증 경계가 없고, 더 나누면 동일 package compile 상태를 불필요하게 중간 분할한다.

### 범위 결정 근거

테스트 함수 본문, fake 동작, production 소스, `server_test.go`, 다른 sibling task, roadmap/spec/contract는 수정하지 않는다. 첫 리뷰의 유일한 Required finding만 해결한다.

### 빌드 등급

`local-G04`: 두 테스트 파일의 기계적 선언 이동이며 Test 목록과 fresh package test로 결정적으로 검증할 수 있다.

## 구현 체크리스트

- [ ] [REVIEW_TEST-1] 공용 `SubmitRun`/`OllamaAPI`/`bufferedRunEvents`를 support 파일로 옮기고 import를 정리하며 Test 목록 226개와 fresh package test 통과를 보존한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_TEST-1] 공용 test double과 fixture 위치 정리

- 문제: `apps/edge/internal/openai/openai_auth_routes_models_test.go:59`, `:100`, `:108`에 package 전반이 의존하는 `fakeRunService` interface method와 `bufferedRunEvents`가 남아 있어 chat/stream/provider 테스트가 auth 파일을 간접적으로 읽어야 한다.
- 해결 방법:

~~~text
Before
openai_auth_routes_models_test.go  SubmitRun, OllamaAPI, bufferedRunEvents + auth/routes/models/Ollama tests
server_test_support_test.go        fakeRunService type + 나머지 interface method/helper

After
openai_auth_routes_models_test.go  auth/routes/models/Ollama tests only
server_test_support_test.go        fakeRunService type + 모든 interface method + shared bufferedRunEvents
~~~

- 수정 파일 및 체크리스트:
  - [ ] `apps/edge/internal/openai/server_test_support_test.go`: 세 선언을 본문 변경 없이 `fakeRunService` support와 함께 이동하고 `fmt` import를 추가한다.
  - [ ] `apps/edge/internal/openai/openai_auth_routes_models_test.go`: 세 선언을 제거하고 불필요해진 `context`, `fmt`, `iop` import를 제거하되 auth/routes/models/Ollama 테스트 본문은 바꾸지 않는다.
- 테스트 작성: 추가하지 않는다. 동작 변경 없는 선언 이동이며 기존 226개 Test와 package compile이 누락·중복·interface/import 오류를 검출한다.
- 중간 검증:

~~~bash
gofmt -w apps/edge/internal/openai/server_test_support_test.go apps/edge/internal/openai/openai_auth_routes_models_test.go
[ "$(GOCACHE=/tmp/iop-go-build-cache go test -list '^Test' ./apps/edge/internal/openai | sed '/^ok[[:space:]]/d' | wc -l)" -eq 226 ]
~~~

기대 결과: gofmt 성공, top-level Test 226개.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `apps/edge/internal/openai/server_test_support_test.go` | REVIEW_TEST-1 |
| `apps/edge/internal/openai/openai_auth_routes_models_test.go` | REVIEW_TEST-1 |

## 최종 검증

~~~bash
GOCACHE=/tmp/iop-go-build-cache go test -count=1 ./apps/edge/internal/openai
[ "$(GOCACHE=/tmp/iop-go-build-cache go test -list '^Test' ./apps/edge/internal/openai | sed '/^ok[[:space:]]/d' | wc -l)" -eq 226 ]
~~~

기대 결과: fresh package test PASS와 Test 226개 보존. Go test cache 결과는 허용하지 않는다.

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