<!-- task=m-stream-evidence-gate-core/07+01,06_commit_boundary plan=4 tag=REVIEW_API -->

# Stream Gate 비가역 Sink 결과와 Terminal Gate 증거 폐쇄 계획

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

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

## 배경

현재 named 회귀와 package race는 통과하지만 sink가 forward state와 error를 함께 반환하는 비가역 경로, `PrepareRelease` 실패의 success-terminal 억제, callback re-entry와 discard→cancel→terminal 순서를 실제로 검증하지 않는다. `CommitBoundary`의 callback 결과 적용을 단일 reservation finish 경로로 수렴시키고 `StreamReleaser`가 clean full confirmation만 success-terminal 근거로 인정하도록 보완한다. SDD S03/S04/S05/S17/S19의 single visible start/terminal과 fail-closed ordering을 deterministic fixture로 폐쇄한다.

## Archive Evidence Snapshot

- 현재 계획 로그: `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/plan_local_G07_3.log`
- 현재 리뷰 로그: `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/code_review_local_G08_3.log`
- 판정: `FAIL`
- Required:
  - response-start/terminal callback의 forward state+error가 버려져 이미 보낸 start/terminal을 다시 보낼 수 있고 exact missing-attempt replacement가 허용된다.
  - success `ReleaseTerminalEpoch`이 known-complete와 실제 `PrepareRelease` 실패를 구분하지 않고 terminal을 commit한다.
  - concurrency/re-entry/order named 테스트가 실제 callback barrier, conflict, suffix와 호출 순서를 단언하지 않아 false-green이다.
- Suggested: 없음
- Nit: 없음
- 영향 파일: `packages/go/streamgate/commit_boundary.go`, `commit_boundary_test.go`, `stream_release.go`, `stream_release_test.go`, 현재 task evidence.
- 실제 검증:
  - PATH Go는 `/config/.local/bin/go`에서 `/config/opt/go/bin/go`로 해석되며 `go1.26.2 linux/arm64`, `GOROOT=/config/opt/go`다.
  - named inventory 8개, named `-race -count=20`, focused/fresh/package race/vet은 PASS했지만 위 테스트 경로와 단언 공백 때문에 성공 증거로 충분하지 않다.
  - `make proto`, gofmt, skip/diff/generated hygiene는 PASS했다.
  - Edge/Node transport unit은 `/config/opt/go/src/crypto/internal/fips140cache` 누락으로 setup 전에 실패했다. 우회하지 않으며 호스트 Go 설치 복구가 재개 조건이다.
- 선행 완료:
  - `agent-task/archive/2026/07/m-stream-evidence-gate-core/01_event_contract_types/complete.log`
  - `agent-task/archive/2026/07/m-stream-evidence-gate-core/06+01_evidence_tail/complete.log`
- 구현자는 위 특정 로그 외의 `agent-task/archive/**`를 넓게 탐색하지 않는다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/knowledge-tool-optimization-extension/milestones/stream-evidence-gate-core.md`
- Milestone link: [Milestone 문서](agent-roadmap/phase/knowledge-tool-optimization-extension/milestones/stream-evidence-gate-core.md)
- Task ids:
  - `evidence-tail`: S19 overflow discard/cancel/terminal 통합 evidence
  - `commit-boundary`: S03/S04/S05/S17 staged start, irreversible state와 single terminal
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `packages/go/streamgate/commit_boundary.go`
- `packages/go/streamgate/commit_boundary_test.go`
- `packages/go/streamgate/stream_release.go`
- `packages/go/streamgate/stream_release_test.go`
- `packages/go/streamgate/terminal.go`
- `packages/go/streamgate/evidence_tail.go`
- `agent-ops/rules/project/domain/platform-common/rules.md`
- `agent-ops/rules/project/domain/testing/rules.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/07+01,06_commit_boundary/plan_local_G07_3.log`
- `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/code_review_local_G08_3.log`
- `go.mod`
- `.gitignore`

### SDD 기준

- SDD: `agent-roadmap/sdd/knowledge-tool-optimization-extension/stream-evidence-gate-core/SDD.md`
- 상태: `[승인됨]`; SDD/Milestone 잠금 `해제`, 결정 필요 `없음`.
- `S03`/`commit-boundary`: terminal-before-evidence는 staged start를 eager commit하지 않고 outcome 하나만 commit한다.
- `S04`/`commit-boundary`: idle은 pending release 없이 error terminal만 commit한다.
- `S05`/`commit-boundary`: `stream_open` 뒤 rollback/exact/schema replacement를 금지한다.
- `S17`/`commit-boundary`: original attempt start를 숨기고 selected attempt start/output만 한 번 노출한다.
- `S19`/`evidence-tail`: overflow는 partial/start release 없이 discard와 cancel 뒤 terminal error로 끝낸다.
- Evidence Map의 forward commit 보존, selected-attempt-only, pending-tail no-release와 single terminal을 REVIEW_API-1/2의 state gate와 REVIEW_API-3의 barrier/order/suffix 검증으로 역산했다.

### 테스트 환경 규칙

- `test_env`: local.
- `agent-test/local/rules.md`와 매칭 profile `agent-test/local/platform-common-smoke.md`를 읽었다. 빈 값이나 `<확인 필요>`는 없다.
- host Go 확인, fresh `-count=1`, named concurrency `-race -count=20`, focused/fresh/race/vet, `make proto`, transport unit, gofmt, skip/diff/generated hygiene를 적용한다.
- transport unit은 현재 호스트 GOROOT의 `crypto/internal/fips140cache` 누락으로 차단된다. 별도 toolchain으로 우회하지 않고 원문과 exit code, `/config/opt/go` 복구 조건을 기록한다.
- public production consumer/proto/config를 바꾸지 않으므로 Edge-Node full-cycle과 외부 service는 적용하지 않는다. test-rule 유지보수도 필요 없다.

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

- response-start와 terminal callback의 forward state+error, 성공 callback의 empty/unknown state, regression state를 함께 검증하지 않는다.
- stage/release/terminal/replace 전체의 missing/wrong attempt와 reservation generation finish를 검증하지 않는다.
- success terminal의 unknown/outstanding/invalidated prepare failure와 confirm failure를 검증하지 않는다.
- partial confirmation 뒤 remaining suffix reprepare/token 해제와 clean full completion 표식을 함께 검증하지 않는다.
- concurrency 테스트에 callback barrier와 exactly-once count가 없고 re-entry 테스트는 sink callback 전에 실패할 수 있으며 conflict error를 단언하지 않는다.
- idle/overflow 테스트는 discard가 cancel 전에 끝났는지와 cancel→terminal 호출 순서를 단언하지 않는다.

### 심볼 참조

- rename/remove 없음.
- `CommitBoundary`, `StreamReleaser`, `ReplaceUncommittedAttempt`의 production call site는 없고 현재 `packages/go/streamgate` source/test만 참조한다.
- 새 dependency는 없으며 Go 표준 라이브러리만 사용한다.
- 매칭되는 active agent-spec/agent-contract 문서는 없고 외부 API/wire/config/event schema는 변경하지 않는다.

### 분할 판단

- split decision policy를 파일명 선택 전에 평가했다.
- boundary callback outcome과 releaser confirmation ledger는 같은 sink progress/attempt ownership을 공유하며 어느 한쪽만 수정하면 duplicate terminal 또는 잘못된 cursor를 허용하는 unsafe 중간 상태가 된다.
- source와 테스트를 분리하면 deterministic fixture 없이 비가역 상태 변경을 먼저 완료하게 되므로 독립 PASS 단위가 아니다.
- public consumer rollout, config/proto와 transport adapter는 별도 소유 범위로 제외한다.
- predecessor `01`과 `06`은 위 archived `complete.log`로 충족됐다. 기존 `07+01,06_commit_boundary` 단일 pair를 유지한다.

### 범위 결정 근거

- 수정 범위는 네 source/test 파일과 현재 review evidence다.
- `terminal.go`, `evidence_tail.go`, event/filter 계약은 변경하지 않고 소비한다. typed prepare 상태가 필요하면 `StreamReleaser`의 request-local completed epoch ledger로 닫는다.
- Edge/OpenAI handler, production `ReleaseSink`/`AttemptCanceller`, coordinator/arbiter/recovery budget, config/proto/API는 후속 consumer adoption 범위다.
- host Go 설치와 unrelated `agent-ops/skills/project/orchestrate-agent-task-loop/**` dirty 변경은 현재 write-set 밖이다.

### 최종 라우팅

- evaluation_mode: `isolated-reassessment`
- build:
  - closures: `scope_closed=true`, `context_closed=true`, `verification_closed=true`, `evidence_trusted=true`, `ownership_closed=true`, `decision_closed=true`
  - closure basis: 네 source/test와 SDD 다섯 scenario로 수정 범위가 닫히고 package-local API에는 production caller가 없으며 barrier/state/order 명령으로 판정할 수 있다. 호스트 transport blocker는 별도 원문으로 식별 가능하다.
  - scores: `scope_coupling=2`, `state_concurrency=2`, `blast_irreversibility=1`, `evidence_diagnosis=1`, `verification_complexity=1`
  - result: lane `local`, grade `G07`, filename `PLAN-local-G07.md`
- review:
  - closures: `scope_closed=true`, `context_closed=true`, `verification_closed=true`, `evidence_trusted=true`, `ownership_closed=true`, `decision_closed=true`
  - closure basis: callback outcome, attempt generation, tail cursor/token과 테스트가 실제 barrier를 지나는지를 함께 대조해야 하지만 관련 코드·SDD·명령이 bounded하고 재현 가능하다.
  - scores: `scope_coupling=2`, `state_concurrency=2`, `blast_irreversibility=1`, `evidence_diagnosis=2`, `verification_complexity=1`
  - result: lane `local`, grade `G08`, filename `CODE_REVIEW-local-G08.md`

## 구현 체크리스트

- [ ] `REVIEW_API-1` 모든 sink callback의 state/error를 reservation attempt/generation에 맞춰 validate·단조 반영하고 exact current attempt replacement와 visible start/terminal exactly-once를 구현·테스트한다.
- [ ] `REVIEW_API-2` clean full confirmation을 request-local로 추적하고 prepare/release/confirm 실패에서는 success terminal을 억제하며 partial suffix와 callback re-entry 안전성을 구현·테스트한다.
- [ ] `REVIEW_API-3` 명시된 8개 회귀를 table/barrier/ordered spy로 보강하고 false-green 금지, no-skip, fresh/race/profile 검증을 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

### [REVIEW_API-1] Reservation finish와 exact attempt ownership

- 문제:
  - `commit_boundary.go:256-269`은 response-start가 forward state와 error를 함께 반환하면 state를 버리고 staged start를 남긴다.
  - `378-383`은 terminal forward state+error도 버려 같은 terminal을 재시도할 수 있다.
  - `119-131`은 nil error의 empty state를 허용하고 callback별 validation/apply 방식이 다르며 `422-429`는 current attempt가 없어도 replacement를 허용한다.
- 해결 방법:
  - reservation에 operation, exact attempt, generation과 시작 state를 고정한다. callback 뒤 mutex 아래 `finishLocked` 하나에서 active reservation identity와 current attempt/generation을 검증한 뒤 반환 state를 오류 여부와 무관하게 단조 반영한다.
  - nil error에는 known non-empty state를 요구한다. error와 함께 empty state면 기존 state를 보존하고 원 오류를 반환하며, non-empty forward state면 먼저 반영한 뒤 오류를 반환한다. unknown/regression은 `ErrInvalidStateTransition`으로 합성하되 이미 관찰된 forward state는 되돌리지 않는다.
  - response-start가 `stream_open`으로 전진했으면 오류가 있어도 staged start를 제거하고, terminal이 `terminal_committed`로 전진했으면 재호출을 거부한다.
  - replacement는 non-empty exact old/current attempt 일치와 `transport_uncommitted`, no active reservation을 한 transition에서 검증하고 new attempt/generation을 확정한다.
- Before (`packages/go/streamgate/commit_boundary.go:256-262`):

```go
st, sErr := b.sink.CommitResponseStart(ctx, *rsToCommit)
if sErr != nil {
	b.mu.Lock()
	b.releaseReservationLocked(res)
	b.mu.Unlock()
	return ReleaseProgress{}, sErr
}
```

- After (`packages/go/streamgate/commit_boundary.go`):

```go
returnedState, sinkErr := b.sink.CommitResponseStart(ctx, *rsToCommit)
b.mu.Lock()
finishErr := b.finishLocked(res, returnedState, sinkErr)
b.mu.Unlock()
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/commit_boundary.go`: reservation identity/generation finish, unified state validation, forward state+error application, exact replacement
  - [ ] `packages/go/streamgate/commit_boundary_test.go`: callback outcome table, all mutator attempt cases, deterministic reservation barrier와 exactly-once counts
- 테스트 작성:
  - `TestCommitBoundaryPreservesReturnedStateAcrossSinkErrors`: start/release/terminal의 forward+error, success empty/unknown/regression table과 재호출 억제
  - `TestCommitBoundaryRejectsWrongOrMissingAttempt`: stage/release/terminal/replace의 missing/wrong old/current attempt
  - `TestCommitBoundarySerializesConcurrentStartAndTerminal`: callback barrier 중 re-entry conflict, start/terminal call count와 final state
  - `TestCommitBoundaryRejectsPostOpenReplacement`: actual replacement 호출과 selected attempt 보존
- 중간 검증:
  - `go test -race -count=20 ./packages/go/streamgate -run '^TestCommitBoundary(PreservesReturnedStateAcrossSinkErrors|RejectsWrongOrMissingAttempt|SerializesConcurrentStartAndTerminal|RejectsPostOpenReplacement)$'`
  - 기대 결과: 4개 test가 실제 callback barrier/table을 통과하고 duplicate start/terminal, stale finish, race/deadlock이 없다.

### [REVIEW_API-2] Clean confirmation terminal gate와 suffix 보존

- 문제:
  - `stream_release.go:112-137`은 `PrepareRelease`의 모든 오류를 fully completed epoch처럼 취급해 success terminal을 commit한다.
  - `ReleaseEpoch`은 clean full confirmation을 별도 기록하지 않아 consumed와 unknown/outstanding/invalidated prepare failure를 구분할 수 없다.
  - 현재 re-entry 테스트는 sink callback 전에 prepared-token 오류로 끝날 수 있어 busy reservation 경계를 증명하지 않는다.
- 해결 방법:
  - `StreamReleaser`에 serializer가 소유하는 completed epoch set을 두고 prepared snapshot 전체가 sink에 release되고 `ConfirmRelease`까지 성공한 경우에만 epoch를 완료로 표시한다.
  - `ReleaseTerminalEpoch`은 known-complete epoch면 바로 terminal을 허용하고, 그 외에는 prepare→release→confirm이 clean full success한 뒤에만 terminal을 commit한다. prepare/release/confirm 오류는 terminal 호출 없이 원 오류와 confirmed progress를 반환한다.
  - zero/partial 오류도 confirm해 token을 닫고 cursor를 전진시키며 remaining suffix를 새 token으로 reprepare할 수 있게 한다.
  - sink/canceller hook 동안 releaser mutex는 잡지 않고 busy reservation만 유지해 re-entry가 즉시 `ErrReleaserSerializerConflict`로 끝나게 한다.
- Before (`packages/go/streamgate/stream_release.go:112-137`):

```go
prepared, err := r.tail.PrepareRelease(epochID)
if err == nil {
	// release and confirm
}
return ReleaseProgress{}, r.boundary.CommitTerminal(ctx, attemptID, result)
```

- After (`packages/go/streamgate/stream_release.go`):

```go
if r.isCompletedEpoch(epochID) {
	return ReleaseProgress{}, r.boundary.CommitTerminal(ctx, attemptID, result)
}
prog, err := r.releaseAndConfirm(ctx, attemptID, epochID)
if err != nil {
	return prog, err
}
return prog, r.boundary.CommitTerminal(ctx, attemptID, result)
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/stream_release.go`: completed epoch ledger, shared release+confirm helper, success-terminal gate, serializer callback boundary
  - [ ] `packages/go/streamgate/stream_release_test.go`: zero/partial/full suffix/token, prepare/release/confirm failure, known-complete positive path와 callback re-entry
- 테스트 작성:
  - `TestStreamReleaserConfirmsProgressEvenWhenSinkFails`: zero/partial/full table, cursor와 remaining suffix/token reprepare
  - `TestStreamReleaserSuppressesSuccessTerminalUntilConfirmation`: unknown/outstanding/invalidated prepare, release, confirm failure에서 terminal 0; clean completed epoch에서 terminal 1
  - `TestStreamReleaserRejectsReentrantCallbackWithoutDeadlock`: sink callback이 releaser를 재호출하고 bounded timeout 안에 exact serializer conflict 반환
  - `TestStreamReleaserFailPendingOrdersDiscardCancelTerminal`: canceller 시점 pending discard 확인과 ordered `cancel`, `terminal` trace
- 중간 검증:
  - `go test -race -count=20 ./packages/go/streamgate -run '^TestStreamReleaser(ConfirmsProgressEvenWhenSinkFails|SuppressesSuccessTerminalUntilConfirmation|RejectsReentrantCallbackWithoutDeadlock|FailPendingOrdersDiscardCancelTerminal)$'`
  - 기대 결과: 4개 test가 cursor/suffix/terminal count, exact conflict와 discard→cancel→terminal 순서를 deterministic하게 단언하고 PASS한다.

### [REVIEW_API-3] False-green 방지와 SDD evidence

- 문제:
  - `commit_boundary_test.go:489-518`은 callback barrier와 exact call count가 없어 순차 실행도 통과한다.
  - `stream_release_test.go:514-549`는 사전 prepared token 때문에 sink callback을 실행하지 않을 수 있고 `reentrantErr`를 단언하지 않는다.
  - `551-577`은 호출 수만 확인하며 discard/cancel/terminal 순서를 기록하지 않는다.
- 해결 방법:
  - programmable outcome sink, entered/release barrier, re-entry hook, ordered canceller/sink를 사용하고 timeout은 hang을 FAIL로 처리한다.
  - named 테스트마다 목표 callback이 실제 실행됐다는 count/trace를 먼저 단언한 뒤 state/cursor/terminal 결과를 확인한다.
  - partial confirm 뒤 prepared token 해제와 remaining suffix 내용을 비교하고 test inventory count guard와 false-green placeholder 검색을 최종 검증에 둔다.
- Before (`packages/go/streamgate/stream_release_test.go:544-548`):

```go
wg.Wait()
<-reentrantDone

_ = reentrantErr
_ = prepared
```

- After (`packages/go/streamgate/stream_release_test.go`):

```go
select {
case err := <-reentrantResult:
	if !errors.Is(err, ErrReleaserSerializerConflict) {
		t.Fatalf("reentrant error = %v", err)
	}
case <-time.After(time.Second):
	t.Fatal("reentrant callback deadlocked")
}
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/commit_boundary_test.go`: state/error table과 callback barrier/exact count
  - [ ] `packages/go/streamgate/stream_release_test.go`: cursor/suffix/token, prepare/confirm failure, re-entry와 ordered trace
  - [ ] `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/CODE_REVIEW-local-G08.md`: 실제 명령 stdout/stderr와 blocker 기록
- 테스트 작성:
  - 기존 8개 named test를 정확한 이름으로 보강한다. 별도 이름만 추가해 inventory를 우회하지 않는다.
- 중간 검증:
  - `test "$(go test -list '^Test(CommitBoundary(PreservesReturnedStateAcrossSinkErrors|RejectsWrongOrMissingAttempt|SerializesConcurrentStartAndTerminal|RejectsPostOpenReplacement)|StreamReleaser(ConfirmsProgressEvenWhenSinkFails|SuppressesSuccessTerminalUntilConfirmation|RejectsReentrantCallbackWithoutDeadlock|FailPendingOrdersDiscardCancelTerminal))$' ./packages/go/streamgate | sed -n '/^Test/p' | wc -l)" -eq 8`
  - `! rg --sort path -n 't\.Skip\(|_ = (reentrantErr|prepared)' packages/go/streamgate/commit_boundary_test.go packages/go/streamgate/stream_release_test.go`
  - 기대 결과: inventory 8, false-green placeholder/skip 검색 stdout 없음과 exit code 0.

## 의존 관계 및 구현 순서

1. predecessor `01_event_contract_types`와 `06+01_evidence_tail`은 위 complete log로 충족됐다.
2. `REVIEW_API-1`로 irreversible callback outcome과 attempt ownership을 고정한다.
3. `REVIEW_API-2`가 boundary progress를 clean confirmation ledger와 terminal gate에 연결한다.
4. `REVIEW_API-3`이 callback barrier/order/suffix evidence와 최종 검증을 폐쇄한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `packages/go/streamgate/commit_boundary.go` | REVIEW_API-1 |
| `packages/go/streamgate/commit_boundary_test.go` | REVIEW_API-1, REVIEW_API-3 |
| `packages/go/streamgate/stream_release.go` | REVIEW_API-2 |
| `packages/go/streamgate/stream_release_test.go` | REVIEW_API-2, REVIEW_API-3 |
| `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/CODE_REVIEW-local-G08.md` | REVIEW_API-3 evidence |

## 최종 검증

1. `command -v go && readlink -f "$(command -v go)" && go version && go env GOROOT`
   - 기대 결과: PATH host Go와 실제 경로/GOROOT 기록.
2. `gofmt -d packages/go/streamgate/commit_boundary.go packages/go/streamgate/commit_boundary_test.go packages/go/streamgate/stream_release.go packages/go/streamgate/stream_release_test.go`
   - 기대 결과: stdout 없음.
3. `test "$(go test -list '^Test(CommitBoundary(PreservesReturnedStateAcrossSinkErrors|RejectsWrongOrMissingAttempt|SerializesConcurrentStartAndTerminal|RejectsPostOpenReplacement)|StreamReleaser(ConfirmsProgressEvenWhenSinkFails|SuppressesSuccessTerminalUntilConfirmation|RejectsReentrantCallbackWithoutDeadlock|FailPendingOrdersDiscardCancelTerminal))$' ./packages/go/streamgate | sed -n '/^Test/p' | wc -l)" -eq 8`
   - 기대 결과: exit code 0; 8개 named regression이 inventory에 존재.
4. `go test -race -count=20 ./packages/go/streamgate -run '^Test(CommitBoundary(PreservesReturnedStateAcrossSinkErrors|RejectsWrongOrMissingAttempt|SerializesConcurrentStartAndTerminal|RejectsPostOpenReplacement)|StreamReleaser(ConfirmsProgressEvenWhenSinkFails|SuppressesSuccessTerminalUntilConfirmation|RejectsReentrantCallbackWithoutDeadlock|FailPendingOrdersDiscardCancelTerminal))$'`
   - 기대 결과: PASS, barrier/order/cursor/duplicate/race/deadlock 검증.
5. `go test -count=1 -v ./packages/go/streamgate -run '^Test(CommitBoundary|StreamReleaser)'`
   - 기대 결과: 대상 test/subtest가 실제 열거되고 PASS.
6. `go test -count=1 ./packages/go/streamgate`
   - 기대 결과: PASS.
7. `go test -race -count=1 ./packages/go/streamgate`
   - 기대 결과: PASS, race 없음.
8. `go vet ./packages/go/streamgate`
   - 기대 결과: PASS, stdout 없음.
9. `make proto`
   - 기대 결과: 성공, proto 생성물 추가 diff 없음.
10. `go test -count=1 ./apps/edge/internal/transport ./apps/node/internal/transport`
    - 기대 결과: PASS. 동일 GOROOT setup failure면 우회 없이 원문/exit code와 `/config/opt/go` 복구 조건 기록.
11. `! rg --sort path -n 't\.Skip\(|_ = (reentrantErr|prepared)' packages/go/streamgate/commit_boundary_test.go packages/go/streamgate/stream_release_test.go`
    - 기대 결과: stdout 없음, exit code 0.
12. `git diff --check -- packages/go/streamgate/commit_boundary.go packages/go/streamgate/commit_boundary_test.go packages/go/streamgate/stream_release.go packages/go/streamgate/stream_release_test.go agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary proto/gen/iop`
    - 기대 결과: stdout 없음.
13. `git status --short -- proto/gen/iop`
    - 기대 결과: stdout 없음.

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