<!-- task=m-stream-evidence-gate-core/20+17,19_edge_vertical_slice plan=0 tag=EDGE_VERTICAL_SLICE -->

# Plan - OpenAI host vertical slice

## 배경

Core runtime과 bounded OpenAI rebuilder를 실제 Edge response lifecycle에 연결한다. 이 plan은 Core state machine을 재구현하지 않고 codec/event source, ReleaseSink, runtime enablement와 legacy retry handoff만 소유한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/knowledge-tool-optimization-extension/milestones/stream-evidence-gate-core.md`
- Task ids: `vertical-slice`
- Completion mode: check-on-pass

## 분석 결과

- 읽은 파일: OpenAI Chat/Responses handlers/types/decoders, provider tunnel/model rewrite, dispatch context/server, normalized/buffered streaming paths와 service tunnel, Core contracts와 SDD S15/S16.
- Edge codec adapter만 provider/Run frames를 normalized events로 바꾸고 Core에는 raw bytes/proto를 넘기지 않는다.
- response status/header/opening role을 Edge `ReleaseSink`에 stage하고 first safe Core release 전 `WriteHeader`, role chunk, flush를 금지한다.
- runtime disabled는 기존 passthrough, enabled Noop은 body order/identity를 보존한다. recovery binding이 normalized↔tunnel로 바뀌어도 같은 downstream sink와 single terminal contract를 유지한다.
- runtime-enabled path에서는 legacy tool-validation retry closure를 비활성화해 RecoveryCoordinator와 중복 dispatch하지 않는다.
- `test_env=local`, platform-common+edge profiles와 mock smoke. build/review closure true; build=`grade-boundary`, scores=`2/2/2/1/2`, loop-risk=`temporal_state,concurrent_consistency,boundary_contract,variant_product`, `PLAN-cloud-G09.md`; official review=`CODE_REVIEW-cloud-G09.md`, Codex `gpt-5.6-sol` xhigh.

## 구현 체크리스트

- [ ] EDGE-SLICE-1 OpenAI normalized event source와 HTTP/SSE ReleaseSink adapter를 구현한다.
- [ ] EDGE-SLICE-2 handlers/provider/normalized paths를 request-local Core runtime에 연결하고 eager commit을 제거한다.
- [ ] EDGE-SLICE-3 recovery rebinding과 legacy retry single-owner handoff를 구현한다.
- [ ] EDGE-SLICE-4 disabled/pass/retry/preparer/path-switch/backpressure/exhausted integration fixtures를 추가한다.
- [ ] EDGE-SLICE-5 package unit/race, mock smoke, diff 검증을 수행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 구현 항목

### [EDGE-SLICE-1] host adapters

- 새 `apps/edge/internal/openai/stream_gate_runtime.go`, `stream_gate_release_sink.go`: request runtime 생성, codec event feed, endpoint별 single external terminal serialization.
- provider tunnel과 normalized RunEvent parser는 Edge에 남기고 Core event constructors만 호출한다.

### [EDGE-SLICE-2] staged response

- `provider_tunnel.go:133`, `normalized_sse.go`, `chat_stream_session.go`의 enabled path에서 response-start/role/body를 sink staging/release로 이동한다.
- `chat_handler.go`, `responses_handler.go`, `dispatch_context.go`가 `17`의 snapshot/dispatcher와 `19` runtime을 연결한다.

### [EDGE-SLICE-3] single recovery owner

- `buffered_sse.go`, `chat_completion.go`의 legacy retry는 runtime-disabled 호환 path에만 남긴다. enabled path는 semantic intent를 Core에 넘기고 재dispatch하지 않는다.

### [EDGE-SLICE-4] integration tests

- disabled passthrough, enabled Noop pass, eager header/role 없음, test-only injected violation one retry, prepare success/failure, two violations single retry, normalized↔tunnel switch, failure policy, backpressure, exhausted single terminal을 검증한다.

## 의존 관계 및 구현 순서

`17`, `19` PASS → EDGE-SLICE-1 → EDGE-SLICE-2/3 → EDGE-SLICE-4/5. PASS가 `vertical-slice` Task를 완료한다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| 새 Edge runtime/sink adapters | EDGE-SLICE-1 |
| provider/normalized/handler/dispatch/legacy retry callsites | EDGE-SLICE-2/3 |
| 새 focused Edge integration tests | EDGE-SLICE-4 |

## 최종 검증

- `command -v go && readlink -f "$(command -v go)" && go version && go env GOROOT`
- `go test -count=1 ./packages/go/streamgate ./apps/edge/internal/openai ./apps/edge/internal/service`
- `go test -race -count=1 ./packages/go/streamgate ./apps/edge/internal/openai`
- `IOP_E2E_BIND_TIMEOUT=60 IOP_E2E_PROFILE=mock ./scripts/e2e-smoke.sh`
- `git diff --check`

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다.

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

구현/test/evidence만 소유하고 active pair를 유지한다. user-review/finalization/roadmap은 official reviewer/runtime 소유다.
