<!-- task=m-stream-evidence-gate-core/24+20,21_edge_observation_sink plan=1 tag=EDGE_FILTER_OBSERVATION_SINK -->

# Plan - Edge FilterObservation sink adapter

## 배경

Core observation envelope를 existing Edge zap observability 경계에 raw-free allowlist mapping으로 연결할 adapter를 구현한다. Request/attempt correlation과 full timeline integration은 후속 child가 소유한다.

## 분석 결과

- 읽은 파일(원본 분석): Edge OpenAI server/dispatch/provider logging, usage observation, `packages/go/observability/observability.go`, Core observation/runtime contract와 SDD S08/S16.
- `test_env=local`; platform-common+edge domain/test profile을 유지한다.
- 원본 PLAN의 OBS-EDGE-1 중 sink adapter와 OBS-EDGE-3/4 중 focused mapping/log-safety fixture를 유지한다.
- 새 adapter는 existing zap logger에 stable fields만 기록하고 raw prompt/output/tool args/result/auth/preparer content를 받거나 저장하지 않는다.
- sink/storage failure는 response correctness를 바꾸지 않으며 metrics/public OpenAI field와 retention policy는 변경하지 않는다.
- runtime factory injection, request/attempt rebinding correlation과 full timeline은 `25` child가 이 adapter를 소비해 구현한다.
- 기존 routing을 유지한다. build=`local-fit`, `PLAN-local-G07.md`; official review=`CODE_REVIEW-cloud-G07.md`.

## 구현 체크리스트

- [x] OBS-EDGE-1 existing zap 기반 FilterObservationSink adapter와 stable field mapping을 구현한다.
- [x] OBS-EDGE-3 observation field allowlist, raw sentinel 부재와 sink failure fixtures를 추가한다.
- [x] OBS-EDGE-4 observability/OpenAI unit·race·log-safety/diff 검증을 수행한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 구현 항목

### [OBS-EDGE-1] sink adapter

- 새 `apps/edge/internal/openai/filter_observation_sink.go`: Core envelope를 allowlisted zap fields로 매핑한다.

### [OBS-EDGE-3] adapter tests

- 새 `filter_observation_sink_test.go`: stable field mapping, cause/evidence allowlist, raw prompt/output/tool/auth/preparer sentinel 부재와 sink failure isolation을 검증한다.

## 의존 관계 및 구현 순서

`20`, `21` PASS → OBS-EDGE-1 → OBS-EDGE-3/4. `25`가 request/attempt correlation과 full timeline을 연결한다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| 새 `apps/edge/internal/openai/filter_observation_sink.go` | OBS-EDGE-1 |
| 새 `apps/edge/internal/openai/filter_observation_sink_test.go` | OBS-EDGE-3 |

## 최종 검증

- `command -v go && readlink -f "$(command -v go)" && go version && go env GOROOT`
- `go test -count=1 ./packages/go/streamgate ./packages/go/observability ./apps/edge/internal/openai`
- `go test -race -count=1 ./apps/edge/internal/openai`
- `go test -count=1 ./apps/edge/internal/openai -run 'FilterObservation|LogSafety'`
- `git diff --check`

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

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

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