<!-- task=m-stream-evidence-gate-core/15+12_ingress_snapshot_ledger plan=1 tag=INGRESS_SNAPSHOT_LEDGER -->

# Plan - Bounded lossless ingress snapshot ledger

## 배경

RequestRebuilder가 caller unknown field를 보존할 때 canonical/typed backing을 하나의 request-local 상한 아래 계상할 immutable snapshot ledger가 필요하다. Temporary rebuild allocation lifecycle은 후속 child에 맡기고 snapshot ownership과 accounting 기반만 구현한다.

## 분석 결과

- 읽은 파일(원본 분석): `filter_contract.go`, `terminal.go`, `stream_release.go`, 승인된 SDD S11/S12/S18, OpenAI API contract와 config plan 경계.
- `test_env=local`; platform-common domain/test profile을 유지한다.
- 원본 PLAN의 `IngressSnapshotBuilder`, immutable snapshot/lease, builder-issued backing handle과 retained/current peak accounting 범위를 유지한다.
- `retained_bytes`는 request-owned backing byte/string의 conservative logical 합이며 같은 builder-issued handle의 backing은 한 번만 센다. pointer/`unsafe`/heap introspection은 사용하지 않는다.
- constructor는 canonical source와 typed semantic view 추가 직후 상한을 검사하고 canonical full copy 둘 이상을 허용하지 않는다.
- rebuild temporary reserve/commit과 release concurrency는 `16` child가 이 ledger를 소비해 구현한다. HTTP limit+1과 Chat/Responses patch는 재인덱싱된 `17`이 소유한다.
- 기존 routing을 유지한다. build=`local-fit`, `PLAN-local-G08.md`; official review=`CODE_REVIEW-cloud-G08.md`.

## 구현 체크리스트

- [ ] SNAPSHOT-1 canonical/typed backing을 logical byte로 계상하는 immutable request-local snapshot builder를 구현한다.
- [ ] SNAPSHOT-3 limit boundary, exact limit+typed overflow, shared backing, canonical single-copy fixtures를 추가한다.
- [ ] SNAPSHOT-4 streamgate unit/race/diff 검증을 수행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 구현 항목

### [SNAPSHOT-1] snapshot/ledger

- 새 `packages/go/streamgate/ingress_snapshot.go`: `IngressSnapshotBuilder`, immutable snapshot/lease, builder-issued backing handle과 retained/current peak accounting을 정의한다.
- constructor는 `max_bytes`와 canonical source를 먼저 검증하고 typed semantic value를 붙인 직후 다시 검사한다. canonical full copy 둘 이상을 동시에 유지하는 API는 제공하지 않는다.

### [SNAPSHOT-3] ledger tests

- 새 `ingress_snapshot_test.go`: limit-1/limit/limit+1, raw exact limit+typed overflow, shared backing once와 canonical duplicate 금지를 검증한다.

## 의존 관계 및 구현 순서

`12` PASS → SNAPSHOT-1 → SNAPSHOT-3/4. `16`이 rebuild allocation guard와 release lifecycle을 이어서 구현한다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| 새 `packages/go/streamgate/ingress_snapshot.go` | SNAPSHOT-1 |
| 새 `packages/go/streamgate/ingress_snapshot_test.go` | SNAPSHOT-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 소유다.
