<!-- task=m-stream-evidence-gate-core/21+14,19_filter_observation_contract plan=1 tag=FILTER_OBSERVATION_CONTRACT -->

# Plan - Core FilterObservation envelope와 sink contract

## 배경

Filter/coordinator decisions를 하나의 raw-free request timeline으로 emit하려면 lifecycle hook을 연결하기 전에 immutable envelope, request-local sequence와 sink 실패 격리 계약을 고정해야 한다.

## 분석 결과

- 읽은 파일(원본 분석): parallel evaluation/evaluation contract, arbiter, commit boundary, terminal, recovery/runtime seam과 SDD S08/S16.
- `test_env=local`; platform-common domain/test profile을 유지한다.
- 원본 PLAN의 OBS-CORE-1 범위와 OBS-CORE-4 중 envelope/sequence/safety fixture를 유지한다.
- `FilterObservation`은 correlation, generation, attempt/epoch, stable consumer/filter/rule, lifecycle, bounded cause와 sanitized evidence만 허용한다.
- raw prompt/output/tool/auth/preparer payload를 받을 field를 만들지 않고 request-local monotonic sequence와 best-effort sink failure isolation을 제공한다.
- evaluation/runtime hook은 `22`, recovery hook과 full timeline closure는 `23`이 이 contract를 소비한다. Edge sink adapter는 `24`가 contract 완료 뒤 구현할 수 있다.
- 기존 routing을 유지한다. build=`local-fit`, `PLAN-local-G08.md`; official review=`CODE_REVIEW-cloud-G08.md`.

## 구현 체크리스트

- [ ] OBS-CORE-1 immutable FilterObservation/sequence/sink contract와 raw-free validation을 구현한다.
- [ ] OBS-CORE-4 bounded cause/evidence, monotonic sequence와 sink-failure fixtures를 추가한다.
- [ ] OBS-CORE-5 streamgate unit/race/diff 검증을 수행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 구현 항목

### [OBS-CORE-1] envelope/sink

- 새 `packages/go/streamgate/filter_observation.go`: closed lifecycle kind, immutable snapshots/validator/accessors, sink/no-op sink와 request sequence owner를 정의한다.

### [OBS-CORE-4] contract tests

- 새 `filter_observation_test.go`: monotonic sequence, 최대 4개 cause, sanitized evidence only와 sink failure isolation을 검증한다.

## 의존 관계 및 구현 순서

`14`, `19` PASS → OBS-CORE-1 → OBS-CORE-4/5. `22`, `23`이 lifecycle hook을 이어서 구현하고 `24`가 Edge sink adapter를 붙인다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| 새 `packages/go/streamgate/filter_observation.go` | OBS-CORE-1 |
| 새 `packages/go/streamgate/filter_observation_test.go` | OBS-CORE-4 |

## 최종 검증

- `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 소유다.
