<!-- task=m-stream-evidence-gate-core/06+01_evidence_tail plan=2 tag=REVIEW_REVIEW_API -->

# Stream Gate Evidence Tail release 불변조건 폐쇄 계획

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

- 구현 체크리스트와 검증 명령을 완료하고 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션에 실제 변경 내용과 stdout/stderr를 기록한다.
- active PLAN/CODE_REVIEW 파일은 유지하고 review-ready만 보고한다. 판정, 로그 rename, `complete.log`, task archive는 code-review 책임이다.
- 막히면 정확한 차단 원인, 시도한 명령과 출력, 재개 조건만 구현 소유 evidence에 기록한다.
- 사용자에게 질문하거나 선택지를 제시하거나 user-input 도구·control-plane stop 파일을 만들거나 다음 상태를 분류하지 않는다.

## 배경

현재 구현은 green package test와 별개로 release 권한을 ready epoch에 고정하지 않아 sub-threshold·stale pending을 준비할 수 있다. Fragment completion은 준비 가능한 epoch를 만들지 않고 필수 테스트가 skip되며, rolling look-behind와 mixed requirement 합성도 계획·SDD의 exact bound/applicability를 충족하지 않는다. 이 follow-up은 두 streamgate 파일 안에서 네 불변조건과 결정적 회귀를 함께 폐쇄한다.

## Archive Evidence Snapshot

- 이전 plan: `agent-task/m-stream-evidence-gate-core/06+01_evidence_tail/plan_local_G06_1.log`
- 이전 review: `agent-task/m-stream-evidence-gate-core/06+01_evidence_tail/code_review_local_G07_1.log`
- 판정: `FAIL`
- Required:
  - ready epoch가 channel+exact safe-prefix snapshot을 소유하게 하고 비구독/overflow/stale epoch와 post-snapshot append를 release에서 제외한다.
  - fragment completion이 contiguous completed safe-prefix epoch를 만들게 하고 skip/비구독 terminal 우회 없는 interleave·bound 회귀를 완성한다.
  - rolling committed look-behind를 effective `evidence_runes`로 exact trim하고 public accessor를 defensive copy로 만든다.
  - mixed blocking requirement의 mode/trigger/subscription/hard bound와 observe-only applicability를 결정적으로 합성한다.
- Suggested: 없음
- Nit: 없음
- 영향 파일: `packages/go/streamgate/evidence_tail.go`, `packages/go/streamgate/evidence_tail_test.go`, active review stub.
- 현재 검증 evidence:
  - fresh focused package, 전체 package race, vet, gofmt, diff hygiene는 PASS했다.
  - 필수 `TestEvidenceTailFragmentsReleaseOnlyCompletedSafePrefix`는 `no epoch to prepare`로 SKIP한다.
  - 공개 API 재현은 stale threshold epoch가 2 events, 비구독 event epoch가 sub-threshold 1 event를 준비하고, 2-rune evidence 설정의 look-behind가 10 rune을 보존하며 fragment completion 뒤 준비할 epoch가 없음을 확인했다.
- 환경 evidence: host `go`는 `/config/opt/go/bin/go`의 `go1.26.2`; Edge/Node transport unit은 host GOROOT의 `crypto/internal/fips140cache` 누락으로 setup failure다.
- Roadmap carryover: 이 subtask는 S01/S02 core와 S19 tail overflow signal만 준비한다. attempt cancel→terminal/no-release 통합과 `evidence-tail` Roadmap Task 완료는 dependent `07+01,06_commit_boundary`가 소유하므로 `Roadmap Targets`를 두지 않는다.
- 구현자는 위 두 task log와 명시된 predecessor `agent-task/archive/2026/07/m-stream-evidence-gate-core/01_event_contract_types/complete.log` 외의 `agent-task/archive/**`를 탐색하지 않는다.

## 분석 결과

### 읽은 파일

- `packages/go/streamgate/evidence_tail.go`
- `packages/go/streamgate/evidence_tail_test.go`
- `packages/go/streamgate/event.go`
- `packages/go/streamgate/filter_contract.go`
- `go.mod`
- `.gitignore`
- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/project/domain/platform-common/rules.md`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-ops/rules/common/rules-roadmap.md`
- `agent-ops/rules/common/rules-agent-spec.md`
- `agent-test/local/rules.md`
- `agent-test/local/platform-common-smoke.md`
- `agent-spec/index.md`
- `agent-contract/index.md`
- `agent-roadmap/current.md`
- `agent-roadmap/phase/knowledge-tool-optimization-extension/PHASE.md`
- `agent-roadmap/phase/knowledge-tool-optimization-extension/milestones/stream-evidence-gate-core.md`
- `agent-roadmap/sdd/knowledge-tool-optimization-extension/stream-evidence-gate-core/SDD.md`
- `agent-task/m-stream-evidence-gate-core/06+01_evidence_tail/plan_local_G06_1.log`
- `agent-task/m-stream-evidence-gate-core/06+01_evidence_tail/code_review_local_G07_1.log`
- `agent-task/archive/2026/07/m-stream-evidence-gate-core/01_event_contract_types/complete.log`
- `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/PLAN-local-G06.md`
- `agent-task/m-stream-evidence-gate-core/WORK_LOG.md`

### SDD 기준

- SDD: `agent-roadmap/sdd/knowledge-tool-optimization-extension/stream-evidence-gate-core/SDD.md`
- 상태: `[승인됨]`, SDD 잠금 `해제`, 사용자 리뷰 `없음`
- 대상:
  - S01 / `evidence-tail`: 200/500-rune pending+committed look-behind, replace reset, continuation cursor preserve.
  - S02 / `evidence-tail`: 한국어 UTF-8 Unicode rune 경계.
  - S19 / `evidence-tail`: hard bound overflow의 tail-side fail-closed/no-release signal.
- Evidence Map의 S01/S02 exact window와 recovery-mode assertion을 `REVIEW_REVIEW_API-2/4`에, S19 no-release epoch assertion을 `REVIEW_REVIEW_API-2/3`에 반영한다. attempt cancel·terminal integration과 Roadmap completion evidence는 dependent `07+01,06_commit_boundary`에 남긴다.

### 테스트 환경 규칙

- `test_env`: local
- `agent-test/local/rules.md`: 존재, 전체 확인.
- matching profile: `agent-test/local/platform-common-smoke.md`.
- 적용 명령: PATH host Go 확인, `make proto`, streamgate focused/race/vet/gofmt, Edge/Node transport unit, deterministic diff/symbol search.
- 프리플라이트:
  - runner/workdir: 현재 local checkout `/config/workspace/iop`
  - HEAD: `41e06e87`
  - source sync: 현재 checkout의 untracked streamgate 두 파일이 이 task의 source of truth다.
  - dirty/shared state: 다른 task/review가 공존하므로 구현 write-set은 이 두 파일과 task-local review evidence뿐이다.
  - host Go: `/config/.local/bin/go` → `/config/opt/go/bin/go`, `go1.26.2 linux/arm64`, `GOROOT=/config/opt/go`
  - external host/service/credential/port: 없음
- decisive verification은 streamgate focused/race/vet이다. Edge/Node transport unit은 host GOROOT의 `crypto/internal/fips140cache` 누락으로 setup failure이며 별도 toolchain으로 우회하지 않고 실제 출력과 host Go 복구 조건을 기록한다.
- proto/config/wire와 사용자 실행 entrypoint를 바꾸지 않으므로 full-cycle 실제 구동은 적용하지 않는다.

### 테스트 커버리지 공백

- mixed mode reversal은 strongest mode만 확인하고 blocking subscription union, cross-mode min hard bound, incompatible terminal trigger를 검증하지 않는다.
- observe-only kind가 blocking pending에 들어가지 않는지와 non-ready epoch가 prepare 불가인지 검증하지 않는다.
- epoch test는 최신 epoch만 골라 호출 시점 pending 전체를 기대하므로 stale epoch·partial reprepare·post-snapshot append 격리를 놓친다.
- fragment safe-prefix 필수 테스트는 첫 prepare 오류에서 skip하고, 다른 fragment test는 비구독 terminal epoch를 우회 사용한다.
- look-behind test는 `evidence_runes`가 아니라 `max_buffer_runes` 상한을 assert하며 accessor mutation isolation을 검증하지 않는다.
- overflow test는 반환 epoch가 prepare 불가인지 확인하지 않고 per-ID test는 최초 limit+1이 아닌 여섯 번째 signal만 본다.

### 심볼 참조

- production call site: 없음.
- `CompleteFragment`, `PrepareRelease`, `ConfirmRelease`, `EffectiveLookBehind`의 현재 직접 call site는 `packages/go/streamgate/evidence_tail_test.go`와 dependent `07+01,06_commit_boundary` plan뿐이다.
- `RegisterFragment`, `tokenToChannel` production reference는 없고 token format 문자열만 남아 있다.
- 공개 `CompleteFragment` 반환 계약은 completion epoch/signal을 포함하도록 갱신하며 테스트 call site를 전부 함께 수정한다.
- 새 dependency와 `go.mod` 변경은 없다. 매칭되는 active agent-spec/agent-contract 구현 문서는 없다.

### 분할 판단

- split decision policy를 라우팅 전에 적용했다.
- shared task group: `m-stream-evidence-gate-core`
- 현재 subtask: `06+01_evidence_tail`
- predecessor `01`은 `agent-task/archive/2026/07/m-stream-evidence-gate-core/01_event_contract_types/complete.log`로 충족됐다.
- 네 Required는 같은 channel pending entry, epoch record, fragment completion, committed look-behind representation을 함께 바꾼다. 분리하면 같은 두 파일과 동일 상태 전이를 경쟁적으로 수정하므로 독립 review 단위가 아니다.
- dependent `07+01,06_commit_boundary`와 `08+02,05,06_filter_registry`의 sink/registry 소유권은 확장하지 않는다.

### 범위 결정 근거

- 수정 write-set: `packages/go/streamgate/evidence_tail.go`, `packages/go/streamgate/evidence_tail_test.go`, active review evidence.
- `ReleaseSink`, `CommitBoundary`, attempt cancel, terminal codec, filter registry/policy, Edge/Node adoption은 sibling 책임이므로 수정하지 않는다.
- roadmap, SDD, agent-spec, agent-contract, proto/config, sibling task와 dispatcher-owned `WORK_LOG.md`는 수정하지 않는다.

### 최종 라우팅

- evaluation_mode: `isolated-reassessment`
- build:
  - closures: scope/context/verification/evidence/ownership/decision 모두 `true`
  - 근거: 네 불변조건과 두 파일 write-set, 공개 API 재현, 결정적 회귀 명령, sibling 책임이 닫혔고 사용자 결정이 없다.
  - scores: scope coupling 1, state/concurrency 2, blast/irreversibility 1, evidence diagnosis 1, verification complexity 1
  - result: `local`, `G06`, `PLAN-local-G06.md`
- review:
  - closures: scope/context/verification/evidence/ownership/decision 모두 `true`
  - 근거: exact public reproducer와 skip 제거·table regression으로 green-but-wrong evidence를 독립 판정할 수 있다.
  - scores: scope coupling 1, state/concurrency 2, blast/irreversibility 1, evidence diagnosis 2, verification complexity 1
  - result: `local`, `G07`, `CODE_REVIEW-local-G07.md`

## 구현 체크리스트

- [ ] `REVIEW_REVIEW_API-1` mixed blocking requirement의 strongest mode, compatible trigger, blocking-kind union, global min hard bound와 observe-only applicability를 결정적으로 합성하고 역순·충돌·event-only 회귀를 통과시킨다.
- [ ] `REVIEW_REVIEW_API-2` release 가능한 ready epoch에 exact safe-prefix sequence를 고정하고 non-ready/overflow/stale epoch, post-snapshot append, partial reprepare와 over-confirm을 폐쇄한다.
- [ ] `REVIEW_REVIEW_API-3` `CompleteFragment`가 contiguous completed safe-prefix epoch/signal을 반환하게 하고 interleaved ID, partial/full confirm, duplicate completion, exact bound+1을 skip/우회 없이 검증한다.
- [ ] `REVIEW_REVIEW_API-4` rolling committed look-behind를 effective `evidence_runes` 이하의 Unicode suffix로 유지하고 accessor deep-copy, replace reset, continuation cursor/look-behind preserve를 검증한다.
- [ ] 호스트 `go` 기준 fresh focused/race/vet, proto/diff hygiene와 transport setup 결과를 실제 출력으로 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

### [REVIEW_REVIEW_API-1] Requirement 합성과 applicability 분리

- 문제:
  - `packages/go/streamgate/evidence_tail.go:484-490`은 mode가 다르면 stronger requirement를 그대로 반환해 blocking kind union과 cross-mode min hard bound를 잃는다.
  - `packages/go/streamgate/evidence_tail.go:514-520`은 같은 terminal mode의 서로 다른 trigger를 기존 입력으로 선택한다.
  - `packages/go/streamgate/evidence_tail.go:870`은 observe-only kind까지 포함한 `allKinds`를 blocking pending applicability에 사용한다.
- 해결 방법:
  - compiled channel plan에 blocking-kind union과 all-kind union을 분리한다.
  - mode priority는 유지하되 모든 blocking requirement의 positive hard bound는 min으로 합성하고, same-mode terminal trigger가 다르면 compile error로 거부한다.
  - blocking requirement accessor는 합성된 mode/trigger/bound와 blocking kinds의 defensive copy를 반환한다.
  - `Append`는 fail-closed UTF-8 검증 뒤 blocking kinds에만 pending을 추가하고 observe-only/non-blocking kind에는 ready/not-held 결과를 반환한다.
- Before (`evidence_tail.go:484-490`):

```go
if existing.Mode() != next.Mode() {
	if strongerMode(next.Mode(), existing.Mode()) {
		return next, nil
	}
	return existing, nil
}
```

- After:

```go
merged := strongestRequirement(existing, next)
merged.subscribedKinds = mergeKinds(existing.SubscribedKinds(), next.SubscribedKinds())
merged.maxBufferRunes = minPositive(existing.MaxBufferRunes(), next.MaxBufferRunes())
if err := validateCompatibleTrigger(existing, next); err != nil {
	return FilterHoldRequirement{}, err
}
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/evidence_tail.go`: mixed-mode deterministic composition, compatible trigger validation, blocking/all subscription accessors
  - [ ] `packages/go/streamgate/evidence_tail_test.go`: mixed reversal, min-bound, trigger conflict, observe-only event no-hold
- 테스트 작성:
  - `TestEvidencePlanComposesMixedRequirementsDeterministically`: rolling/fragment/terminal 순열의 mode/kinds/bound와 terminal trigger conflict를 검증한다.
  - `TestEvidenceTailSeparatesBlockingAndObserveSubscriptions`: observe-only event가 pending/ready epoch를 만들지 않고 blocking event만 threshold에 기여함을 검증한다.
- 중간 검증:
  - `go test -count=1 -v ./packages/go/streamgate -run '^Test(EvidencePlanComposesMixedRequirementsDeterministically|EvidenceTailSeparatesBlockingAndObserveSubscriptions)$'`
  - 기대 결과: PASS, skip 없음, cached output 불허

### [REVIEW_REVIEW_API-2] Ready epoch exact snapshot

- 문제:
  - `packages/go/streamgate/evidence_tail.go:786-793`의 epoch record는 channel과 snapshot size만 기억하고 ready 시점 sequence를 보존하지 않는다.
  - `packages/go/streamgate/evidence_tail.go:873-877`, `900-904`는 비구독/overflow에도 release에 사용할 수 있는 epoch를 만든다.
  - `packages/go/streamgate/evidence_tail.go:1096-1128`은 epoch 시점이 아니라 prepare 시점의 mutable pending을 snapshot으로 삼는다.
- 해결 방법:
  - channel마다 append 후에도 재사용되지 않는 monotonic entry sequence를 둔다.
  - threshold/terminal/fragment completion의 ready transition에서만 epoch record를 만들고 exact safe-prefix sequence 범위를 고정한다. non-ready와 overflow는 zero epoch/no release capability를 반환한다.
  - prepared record는 epoch snapshot sequence와 confirmed offset을 소유한다. `ConfirmRelease`는 current pending prefix가 prepared sequence와 정확히 일치할 때만 sink progress를 반영한다.
  - partial/zero confirm은 token을 one-shot 소비하되 같은 epoch의 최초 snapshot 미확인 suffix만 재준비한다. post-snapshot append와 overlapping/stale epoch는 포함하지 않는다.
- Before (`evidence_tail.go:1096-1105`):

```go
cs, ok := t.channelState[channel]
if !ok || len(cs.pendingEntries) == 0 {
	return PreparedRelease{}, errors.New("streamgate: prepare release no pending entries for epoch channel")
}
maxIndex := len(cs.pendingEntries)
```

- After:

```go
record, ok := t.readyEpochs[epochID]
if !ok || record.consumed || record.invalidated {
	return PreparedRelease{}, errInvalidPreparedEpoch
}
entries, err := record.remainingSnapshot(cs.pendingEntries)
if err != nil {
	return PreparedRelease{}, err
}
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/evidence_tail.go`: monotonic sequence, ready-only epoch, immutable snapshot/offset, exact confirm and invalidation
  - [ ] `packages/go/streamgate/evidence_tail_test.go`: sub-threshold/unsubscribed/overflow reject, stale epoch, post-prepare append, zero/partial/full reprepare, over-confirm
- 테스트 작성:
  - `TestEvidenceTailBindsOnlyReadyEpochSnapshots`: public API table로 non-ready rejection과 exact stale/post-append snapshot을 검증한다.
  - `TestEvidenceTailRepreparesOnlyUnconfirmedSnapshotSuffix`: zero/partial confirm 뒤 original suffix만 반환하고 새 append는 제외함을 검증한다.
- 중간 검증:
  - `go test -race -count=1 -v ./packages/go/streamgate -run '^TestEvidenceTail(BindsOnlyReadyEpochSnapshots|RepreparesOnlyUnconfirmedSnapshotSuffix)$'`
  - 기대 결과: PASS, race/skip 없음, cached output 불허

### [REVIEW_REVIEW_API-3] Fragment completion epoch와 safe prefix

- 문제:
  - `packages/go/streamgate/evidence_tail.go:977`의 `CompleteFragment`는 bool만 반환해 fragment-only 정상 경로가 준비할 epoch가 없다.
  - `packages/go/streamgate/evidence_tail_test.go:1958-1962`는 필수 safe-prefix 검사를 skip하고, `2014-2023`은 비구독 terminal epoch를 우회 사용한다.
  - overflow 회귀는 최초 bound+1 transition과 no-epoch/no-release를 정확히 assert하지 않는다.
- 해결 방법:
  - `CompleteFragment(channel, toolCallID)` 반환을 `(EvidenceEpoch, EvidenceTailSignal, bool, error)`로 바꾸고 새로 생긴 contiguous completed prefix가 있을 때만 fragment ready epoch/trigger를 반환한다.
  - epoch은 completion 시점 safe prefix sequence에 고정한다. A completion 뒤 B incomplete 전 prefix를 confirm하고, B completion 뒤 남은 contiguous prefix를 별도 epoch로 준비한다.
  - duplicate/unknown completion은 zero epoch/no signal이며 state를 바꾸지 않는다. channel/per-ID exact bound와 limit+1 overflow는 epoch/token을 만들지 않는다.
- Before (`evidence_tail.go:977`):

```go
func (t *EvidenceTail) CompleteFragment(channel, toolCallID string) (bool, error) {
```

- After:

```go
func (t *EvidenceTail) CompleteFragment(
	channel, toolCallID string,
) (EvidenceEpoch, EvidenceTailSignal, bool, error) {
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/evidence_tail.go`: completion-triggered exact safe-prefix epoch, duplicate/overflow no-release state
  - [ ] `packages/go/streamgate/evidence_tail_test.go`: 모든 `CompleteFragment` call site 갱신, skip/terminal 우회 제거, A/B confirm 순서와 bound+1
- 테스트 작성:
  - `TestEvidenceTailFragmentCompletionCreatesSafePrefixEpoch`: A/B interleave, A prefix confirm, B remaining prefix, duplicate/unknown completion을 검증한다.
  - `TestEvidenceTailFragmentBoundNeverCreatesReleaseEpoch`: exact bound와 최초 limit+1 overflow의 state/token 부재를 검증한다.
- 중간 검증:
  - `go test -race -count=1 -v ./packages/go/streamgate -run '^TestEvidenceTail(FragmentCompletionCreatesSafePrefixEpoch|FragmentBoundNeverCreatesReleaseEpoch)$'`
  - 기대 결과: PASS, skip/race 없음, cached output 불허

### [REVIEW_REVIEW_API-4] Effective rune look-behind와 defensive accessor

- 문제:
  - `packages/go/streamgate/evidence_tail.go:1219-1220`은 rolling look-behind를 `maxBufferRunes`로 trim한다.
  - `packages/go/streamgate/evidence_tail.go:1380-1385`는 내부 slice를 그대로 반환한다.
  - `packages/go/streamgate/evidence_tail_test.go:1809`는 effective evidence가 아닌 15-rune buffer만 검증한다.
- 해결 방법:
  - channel state에 compiled rolling `evidence_runes`를 별도 고정하고 confirm마다 그 수 이하의 Unicode suffix로 trim한다.
  - oversized 단일 text/reasoning/tool fragment는 rune 경계에서 trailing suffix만 clone한다.
  - `EffectiveLookBehind`는 slice와 event payload를 deep-copy한다. replace는 cursor/look-behind를 지우고 continuation은 둘을 보존한다.
- Before (`evidence_tail.go:1219-1220`):

```go
// Trim look-behind to bounded size (keep last maxBufferRunes worth of events).
cs.committedLookBehind = trimLookBehind(cs.committedLookBehind, cs.maxBufferRunes)
```

- After:

```go
cs.committedLookBehind = trimLookBehind(
	cs.committedLookBehind,
	cs.effectiveEvidenceRunes,
)
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/evidence_tail.go`: effective window state, exact Unicode trim, defensive accessor
  - [ ] `packages/go/streamgate/evidence_tail_test.go`: 2/200/500 rune suffix, oversized Korean event, accessor mutation, replace/continuation
- 테스트 작성:
  - `TestEvidenceTailBoundsAndCopiesEffectiveLookBehind`: exact rune count/content와 caller mutation isolation을 검증한다.
  - 기존 cursor recovery test는 shared tail을 재사용하지 않는 독립 fixture로 정리한다.
- 중간 검증:
  - `go test -race -count=1 -v ./packages/go/streamgate -run '^TestEvidenceTailBoundsAndCopiesEffectiveLookBehind$'`
  - 기대 결과: PASS, race/skip 없음, cached output 불허

## 의존 관계 및 구현 순서

1. predecessor `01_event_contract_types`는 명시된 archived `complete.log`로 충족됐다.
2. `REVIEW_REVIEW_API-1`로 immutable compiled requirement와 applicability를 확정한다.
3. `REVIEW_REVIEW_API-2`의 sequence/epoch record를 도입한 뒤 `REVIEW_REVIEW_API-3` completion epoch를 같은 snapshot 모델에 연결한다.
4. `REVIEW_REVIEW_API-4`를 confirm/recovery 전이에 결속하고 전체 회귀를 실행한다.
5. 이 subtask가 PASS된 뒤 dependent `07+01,06_commit_boundary`가 sink progress와 cancel→terminal을 소비한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `packages/go/streamgate/evidence_tail.go` | REVIEW_REVIEW_API-1, REVIEW_REVIEW_API-2, REVIEW_REVIEW_API-3, REVIEW_REVIEW_API-4 |
| `packages/go/streamgate/evidence_tail_test.go` | REVIEW_REVIEW_API-1, REVIEW_REVIEW_API-2, REVIEW_REVIEW_API-3, REVIEW_REVIEW_API-4 |
| `agent-task/m-stream-evidence-gate-core/06+01_evidence_tail/CODE_REVIEW-local-G07.md` | 구현 결과와 실제 검증 출력 |

## 최종 검증

1. `command -v go && readlink -f "$(command -v go)" && go version && go env GOROOT`
   - 기대 결과: PATH host Go, 실제 경로, version, GOROOT 기록
2. `gofmt -d packages/go/streamgate/evidence_tail.go packages/go/streamgate/evidence_tail_test.go`
   - 기대 결과: stdout 없음
3. `go test -count=1 -v ./packages/go/streamgate -run '^Test(EvidencePlanComposesMixedRequirementsDeterministically|EvidenceTailSeparatesBlockingAndObserveSubscriptions|EvidenceTailBindsOnlyReadyEpochSnapshots|EvidenceTailRepreparesOnlyUnconfirmedSnapshotSuffix|EvidenceTailFragmentCompletionCreatesSafePrefixEpoch|EvidenceTailFragmentBoundNeverCreatesReleaseEpoch|EvidenceTailBoundsAndCopiesEffectiveLookBehind)$'`
   - 기대 결과: 신규 회귀 전부 PASS, SKIP 없음, cached output 불허
4. `go test -count=1 ./packages/go/streamgate -run '^Test(FilterHoldRequirement|EvidencePlan|EvidenceTail)'`
   - 기대 결과: 기존+신규 evidence-tail 회귀 PASS, cached output 불허
5. `go test -race -count=1 ./packages/go/streamgate`
   - 기대 결과: 전체 package PASS, race 없음, cached output 불허
6. `go vet ./packages/go/streamgate`
   - 기대 결과: stdout 없음
7. `make proto`
   - 기대 결과: 성공, proto 생성물 추가 diff 없음
8. `go test -count=1 ./apps/edge/internal/transport ./apps/node/internal/transport`
   - 기대 결과: host Go가 복구됐으면 PASS. `crypto/internal/fips140cache is not in std`가 계속되면 우회하지 않고 실제 출력과 host Go 설치 복구 조건을 기록
9. `git diff --check -- packages/go/streamgate proto/gen/iop`
   - 기대 결과: stdout 없음
10. `git status --short -- proto/gen/iop`
    - 기대 결과: stdout 없음
11. `rg -n --sort path 't\\.Skip|RegisterFragment|tokenToChannel|prepared-[%]d' packages/go/streamgate/evidence_tail.go packages/go/streamgate/evidence_tail_test.go`
    - 기대 결과: mandatory regression skip와 legacy state symbol 없음. intentional opaque token format만 위치/사유 기록

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