<!-- task=m-stream-evidence-gate-core/17+14,15_core_runtime plan=0 tag=CORE_RUNTIME -->

# Plan - Transport-agnostic Stream Gate runtime

## 배경

완성된 evidence/arbiter/recovery primitives를 Edge와 분리된 request-local owner loop로 먼저 조립한다. production `NoopFilter`와 fake host fixtures로 Core state machine을 닫고 HTTP/SSE integration은 후속 plan에 맡긴다.

## 분석 결과

- 읽은 파일: filter registry, evidence tail, parallel evaluation, arbiter, commit boundary, release/recovery contracts와 관련 SDD S01-S08/S13-S16.
- 새 `StreamGateRuntime`은 request snapshot → host dispatch → attempt filter resolve → normalized event → evidence epoch → all-complete arbitration → release 또는 recovery를 직렬화한다.
- `NoopFilter`는 stable id/applicability/hold/pass만 제공하며 enablement와 failure policy는 registry snapshot이 소유한다. violation filter는 `_test.go`에만 둔다.
- Core는 raw codec, provider selection/auth, HTTP writer를 import하지 않고 `AttemptDispatcher`, event source, `ReleaseSink`만 호출한다.
- replace recovery는 tail/attempt state를 reset하고 continuation은 safe prefix/look-behind/cursor를 보존한다. cycle당 plan/dispatch/terminal은 하나다.
- `test_env=local`, platform-common profile. build/review closure true; build=`local-fit`, scores=`2/2/1/1/2`, loop-risk=`temporal_state,concurrent_consistency,boundary_contract,variant_product`, `PLAN-local-G08.md`; official review=`CODE_REVIEW-cloud-G08.md`, Codex `gpt-5.6-sol` xhigh.

## 구현 체크리스트

- [ ] RUNTIME-1 production NoopFilter와 immutable runtime options/request snapshot을 구현한다.
- [ ] RUNTIME-2 dispatch/event/evidence/evaluation/arbitration/release-recovery owner loop를 구현한다.
- [ ] RUNTIME-3 fake host로 pass, one recovery, conflict, backpressure, cancel, exhausted single terminal fixtures를 추가한다.
- [ ] RUNTIME-4 streamgate unit/race/diff 검증을 수행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 구현 항목

### [RUNTIME-1] filter/runtime contract

- 새 `packages/go/streamgate/noop_filter.go`: `FilterBase` 기반 stable production filter.
- 새 `packages/go/streamgate/runtime.go`: registry/evidence/gate/boundary/recovery와 host seams를 request-local single owner로 묶는다.

### [RUNTIME-2] lifecycle

- first dispatch와 recovery binding을 같은 path로 설치하고 attempt/epoch/cursor 상태를 immutable handoff한다.
- response-start는 staged 상태로 두고 safe release 전 sink commit을 호출하지 않는다. terminal/cancel/error는 한 경로로 수렴한다.

### [RUNTIME-3] Core fixtures

- 새 `runtime_test.go`: disabled/no active filter, enabled Noop pass, injected violation one retry, simultaneous violation single plan, prepare success/failure, binding switch, failure policy, backpressure, cap exhausted를 fake host로 검증한다.

## 의존 관계 및 구현 순서

`14`, `15` PASS → RUNTIME-1 → RUNTIME-2 → RUNTIME-3/4. `18`이 OpenAI host에 연결하고 `19`가 observer seam을 부착한다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| 새 `packages/go/streamgate/noop_filter.go`, `runtime.go` | RUNTIME-1/2 |
| 새 `packages/go/streamgate/runtime_test.go` | RUNTIME-3 |

## 최종 검증

- `command -v go && readlink -f "$(command -v go)" && go version && go env GOROOT`
- `go test -count=1 ./packages/go/streamgate`
- `go test -race -count=1 ./packages/go/streamgate`
- `git diff --check`

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

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

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