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

# OpenAI auth/chat 테스트 시나리오 분해

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

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

## 배경

apps/edge/internal/openai/server_test.go는 8,135줄에 auth, models, chat, stream, tool 합성 테스트와 범용 fake가 함께 있다. 첫 단계에서 앞부분의 공통 support와 chat 계열을 기능 파일로 이동해 이후 Responses/provider 분해가 충돌 없이 이어지게 한다.

## 사용자 리뷰 요청 흐름

사용자 리뷰 요청은 선택된 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/edge-smoke.md
- agent-test/local/profiles/testing-smoke.md
- agent-spec/input/openai-compatible-surface.md
- apps/edge/internal/openai/server_test.go

### SDD 기준

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

### 테스트 환경 규칙

test_env=local. agent-test/local/rules.md와 edge-smoke/testing-smoke profile을 읽었다. 현재 checkout에서 GOCACHE=/tmp/iop-go-build-cache go test -count=1 ./apps/edge/internal/openai가 통과했다. 구조 리팩터링이므로 fresh package test와 Test 목록 수 226 보존을 계약으로 사용하며 cache 결과는 허용하지 않는다.

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

동작 변경은 없다. 기존 226개 top-level Test가 현재 계약을 덮고 있으며 이 단계는 이름·assertion을 그대로 이동한다. 신규 회귀 테스트는 필요하지 않다.

### 심볼 참조

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

### 분할 판단

공유 task group은 agent-task/m-agent-readable-repository-refactor다. 01_openai_auth_chat은 독립 시작점이고, 02+01_openai_responses_workspace와 03+02_openai_provider_tools가 순서대로 같은 원본 파일의 나머지를 소비한다.

### 범위 결정 근거

server_test.go의 1~3,193줄과 그 구간에서 직접 사용하는 test support만 이동한다. Responses, workspace, provider tunnel/pool, production 소스는 후속 sibling 범위다.

### 빌드 등급

local-G07: 한 package 안의 동작 보존 이동이지만 3,000줄 이상과 공유 fake/import 정리가 포함되어 높은 국소 문맥이 필요하다.

## 구현 체크리스트

- [ ] [TEST-1] auth/routes/models와 chat handler/stream 테스트를 책임별 파일로 옮기고 Test 목록 226개 및 package test 통과를 보존한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [TEST-1] auth/chat 시나리오 파일과 test double 분리

- 문제: apps/edge/internal/openai/server_test.go:618의 auth 테스트부터 3,193줄의 models/Ollama/chat 테스트까지 하나의 파일과 1~617줄의 범용 support에 결합되어 있다.
- 해결 방법:

~~~text
Before
apps/edge/internal/openai/server_test.go:618  func TestRoutesRequireBearerTokenWhenConfigured(...)
apps/edge/internal/openai/server_test.go:718  func TestChatCompletionsDispatchesConfiguredOllamaTarget(...)
apps/edge/internal/openai/server_test.go:2271 func TestChatCompletionsStreamsSSE(...)

After
server_test_support_test.go          공통 최소 fixture
openai_auth_routes_models_test.go       auth/routes/models/Ollama
chat_handler_test.go                    일반 chat handler
chat_tool_synthesis_test.go             tool 합성/검증 전반부
chat_stream_reasoning_test.go           stream/reasoning/strict output
~~~

- 수정 파일 및 체크리스트:
  - [ ] apps/edge/internal/openai/server_test.go: 해당 테스트/support를 제거하되 후속 구간은 유지한다.
  - [ ] apps/edge/internal/openai/server_test_support_test.go: 공유가 필요한 최소 함수 필드 double과 fixture만 둔다.
  - [ ] apps/edge/internal/openai/openai_auth_routes_models_test.go: auth/routes/models/Ollama 테스트를 옮긴다.
  - [ ] apps/edge/internal/openai/chat_handler_test.go: non-stream chat 테스트를 옮긴다.
  - [ ] apps/edge/internal/openai/chat_tool_synthesis_test.go: tool 합성 테스트를 옮긴다.
  - [ ] apps/edge/internal/openai/chat_stream_reasoning_test.go: stream/reasoning/strict output 테스트를 옮긴다.
- 테스트 작성: 추가 테스트는 작성하지 않는다. internal refactor이며 기존 테스트 이름, table case, assertion, fixture 값을 그대로 보존하고 aggregate 목록 수로 누락을 검출한다.
- 중간 검증:

~~~bash
gofmt -w apps/edge/internal/openai/*_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.go | TEST-1 |
| apps/edge/internal/openai/server_test_support_test.go | TEST-1 |
| apps/edge/internal/openai/openai_auth_routes_models_test.go | TEST-1 |
| apps/edge/internal/openai/chat_handler_test.go | TEST-1 |
| apps/edge/internal/openai/chat_tool_synthesis_test.go | TEST-1 |
| apps/edge/internal/openai/chat_stream_reasoning_test.go | 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개 보존.

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