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

# Stream Gate Commit/Release 불변조건 구현 및 증거 폐쇄 계획

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

- 아래 구현 체크리스트와 검증 명령을 수행하고 `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 파일·다음 상태 분류를 만들지 않는다.

## 배경

현재 `CommitBoundary`와 `StreamReleaser`는 partial sink 오류, concurrent/re-entrant operation, attempt replacement에서 irreversible state와 tail cursor를 보존하지 못한다. 직전 후속 구현은 source/test를 수정하지 않았고 핵심 회귀 명령도 `no tests to run`으로 종료됐다. SDD S03/S04/S05/S17/S19를 충족하도록 request-scoped reservation, progress confirmation, success-terminal gate와 실제 실행되는 deterministic 회귀를 함께 완성한다.

## Archive Evidence Snapshot

- 현재 계획 로그: `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/plan_local_G07_2.log`
- 현재 리뷰 로그: `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/code_review_local_G08_2.log`
- 판정: `FAIL`
- Required:
  - boundary mutating operation에 attempt/generation 검증과 in-flight reservation이 없어 duplicate/stale commit이 가능하다.
  - partial release 오류가 confirmation을 건너뛰고 release/confirm 실패 뒤에도 success terminal이 commit되며 callback 동안 serializer lock이 유지된다.
  - 계획된 8개 회귀 테스트가 없고 핵심 정규식은 `no tests to run`으로 종료됐으며 overflow `t.Skip`이 남아 있다.
  - review stub의 구현 체크리스트, 설계 기록과 모든 검증 결과가 미완료다.
- Suggested: 없음
- Nit: 없음
- 영향 파일: `packages/go/streamgate/commit_boundary.go`, `commit_boundary_test.go`, `stream_release.go`, `stream_release_test.go`, 현재 task evidence.
- 실제 검증:
  - host Go는 `/config/.local/bin/go` → `/config/opt/go/bin/go`, `go1.26.2 linux/arm64`, `GOROOT=/config/opt/go`다.
  - 계획된 8개 핵심 회귀 정규식은 exit code 0이지만 `testing: warning: no tests to run`을 출력했다.
  - 기존 `Test(CommitBoundary|StreamReleaser)` focused package는 PASS했다.
  - `rg --sort path -n 't\.Skip\(' ...`는 `stream_release_test.go:452`의 skip을 찾았다.
- 선행 완료:
  - `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`: predecessor S01/S02 evidence와 S19 overflow cancel/terminal 통합
  - `commit-boundary`: staged response-start, irreversible release 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/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/m-stream-evidence-gate-core/07+01,06_commit_boundary/plan_local_G07_2.log`
- `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/code_review_local_G08_2.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 timeout은 pending release 없이 terminal error만 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 없이 cancel 뒤 terminal error로 끝낸다.
- Evidence Map의 no eager commit/single terminal, pending-tail no-release, commit strategy matrix, selected attempt와 fail-closed ordering을 구현 항목과 race/order/cursor 검증으로 역산했다.

### 테스트 환경 규칙

- `test_env`: local.
- `agent-test/local/rules.md`와 `agent-test/local/platform-common-smoke.md`를 읽었다. 빈 값이나 `<확인 필요>`는 없다.
- host toolchain: `/config/.local/bin/go` → `/config/opt/go/bin/go`, `go1.26.2 linux/arm64`, `GOROOT=/config/opt/go`.
- fresh test를 위해 `-count=1`, concurrency/order 회귀는 `-race -count=20`을 사용한다. test inventory count guard로 `no tests to run` 성공을 금지한다.
- 적용 명령: `make proto`, focused/fresh/race/vet, Edge/Node transport unit, gofmt, skip/diff/generated hygiene.
- transport unit은 host GOROOT의 `/config/opt/go/src/crypto/internal/fips140cache` 누락으로 setup 전에 차단될 수 있다. 우회하지 않고 원문·exit code와 host Go 복구 조건을 기록한다.
- production consumer/proto/config를 바꾸지 않으므로 Edge-Node full-cycle과 외부 service는 적용하지 않는다. test-rule 유지보수도 필요 없다.

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

- response-start 성공 뒤 body 오류와 sink error+forward/unknown/regression state의 단조 반영 검증이 없다.
- wrong/missing attempt와 actual post-open replacement rejection 검증이 없다.
- concurrent start/release/terminal/replace 및 callback re-entry conflict의 exactly-once 검증이 없다.
- zero/partial/full release 오류 뒤 tail cursor, token 해제와 remaining suffix reprepare 검증이 없다.
- prepare/release/confirm 실패에서 success terminal 억제 검증이 없다.
- idle/overflow의 start/release 0, discard→cancel→terminal 순서와 정확한 호출 수 검증이 없다.
- 계획된 회귀 이름 자체가 없어 정규식이 아무 테스트도 실행하지 않는다.

### 심볼 참조

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

### 분할 판단

- split decision policy를 파일명 선택 전에 평가했다.
- 현재 subtask는 boundary state와 tail confirmation이 같은 sink progress/generation을 공유하므로 source와 최소 회귀를 분리하면 한쪽만 통과하는 unsafe 중간 API가 생긴다.
- public production call-site rollout, config/proto와 외부 transport adapter는 별도 소유 범위이며 이 follow-up에 포함하지 않는다.
- predecessor `01`은 `agent-task/archive/2026/07/m-stream-evidence-gate-core/01_event_contract_types/complete.log`, predecessor `06`은 `agent-task/archive/2026/07/m-stream-evidence-gate-core/06+01_evidence_tail/complete.log`로 충족됐다.
- 따라서 기존 `07+01,06_commit_boundary` 단일 pair를 유지한다.

### 범위 결정 근거

- 수정 범위는 네 source/test 파일과 현재 review evidence다.
- `terminal.go`, `evidence_tail.go`, event/filter 계약은 변경하지 않고 소비한다.
- Edge/OpenAI handler, production `ReleaseSink`/`AttemptCanceller`, coordinator/arbiter/recovery budget, config/proto/API는 후속 consumer adoption 범위다.
- host Go 설치 복구와 repo root의 기존 `streamgate.test` artifact는 현재 write-set 밖이며 새 검증 artifact를 repo 안에 만들지 않는다.

### 최종 라우팅

- 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 public API에는 production caller가 없으며 named inventory/race/order/cursor 명령으로 완료를 판정할 수 있다.
  - 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: state/generation/cursor와 test selection을 함께 대조해야 하지만 관련 코드·SDD·검증이 bounded하고 deterministic barrier와 inventory guard로 독립 판정 가능하다.
  - 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` attempt-scoped reservation, exact attempt/generation ownership, sink 반환 state 검증·단조 반영, response-start/terminal exactly-once와 uncommitted-only atomic replacement를 구현·테스트한다.
- [ ] `REVIEW_API-2` zero/partial/full release progress를 error 여부와 무관하게 confirm하고, fully confirmed epoch 뒤에만 success terminal을 commit하며 callback 중 serializer mutex를 노출하지 않도록 구현·테스트한다.
- [ ] `REVIEW_API-3` 명시된 8개 cursor/state/attempt/concurrency/order 회귀와 test inventory guard를 작성하고 no-skip, fresh/race/profile 검증을 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

### [REVIEW_API-1] Boundary reservation, state와 attempt ownership

- 문제:
  - `commit_boundary.go:108-121`은 stage attempt를 검증하지 않고 `128-199`, `208-264`는 callback 전에 lock을 풀면서 operation reservation을 남기지 않는다.
  - response-start가 실제 commit돼도 뒤 body 오류 시 state 보존이 불완전하고 sink 반환 state를 validate하지 않는다.
  - `272-287`은 `stream_open` replacement를 허용하고 `newAttemptID` ownership을 확정하지 않는다.
- 해결 방법:
  - state mutex 아래 request generation과 single in-flight reservation을 둔다. 모든 mutating operation은 current attempt/generation을 검증하고 reservation을 획득한 뒤 sink callback을 lock 밖에서 실행한다. callback 뒤 동일 reservation에만 결과를 적용하며 concurrent/re-entrant operation은 stable conflict error로 즉시 실패한다.
  - 각 sink callback의 반환 `CommitState`를 validate하고 이미 관찰된 forward state를 오류와 함께 단조 반영한다. unknown/regression state는 stable contract error로 반환하되 user-visible forward state를 되돌리지 않는다.
  - replacement는 `transport_uncommitted`에서만 old ID를 검증하고 new ID를 같은 transition에서 current attempt로 확정하며 staged/confirmed state와 generation을 reset한다.
- Before (`packages/go/streamgate/commit_boundary.go:136-157`):

```go
b.mu.Lock()
currentState := b.state
b.mu.Unlock()
```

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

```go
b.mu.Lock()
reservation, err := b.reserveLocked(operationRelease, attemptID)
b.mu.Unlock()
// sink callback without b.mu
b.mu.Lock()
err = b.finishLocked(reservation, returnedState, sinkErr)
b.mu.Unlock()
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/commit_boundary.go`: generation/reservation, exact attempt validation, monotonic state helper, staged-start/terminal lifecycle와 atomic replacement
  - [ ] `packages/go/streamgate/commit_boundary_test.go`: state+error table, wrong/missing attempt, concurrent/re-entrant start/terminal, actual post-open replace
- 테스트 작성:
  - `TestCommitBoundaryPreservesReturnedStateAcrossSinkErrors`
  - `TestCommitBoundaryRejectsWrongOrMissingAttempt`
  - `TestCommitBoundarySerializesConcurrentStartAndTerminal`
  - `TestCommitBoundaryRejectsPostOpenReplacement`
- 중간 검증:
  - `go test -race -count=20 ./packages/go/streamgate -run '^TestCommitBoundary(PreservesReturnedStateAcrossSinkErrors|RejectsWrongOrMissingAttempt|SerializesConcurrentStartAndTerminal|RejectsPostOpenReplacement)$'`
  - 기대 결과: 4개 test가 실제 실행되고 PASS하며 duplicate sink call/deadlock/race가 없다.

### [REVIEW_API-2] Progress confirmation과 terminal gate

- 문제:
  - `stream_release.go:83-91`은 partial progress와 error가 함께 반환되면 confirmation 전에 종료한다.
  - `109-126`은 prepare/release/confirm 실패 뒤에도 success terminal을 commit한다.
  - `70-94`, `101-191`은 sink/canceller callback 동안 releaser mutex를 잡아 re-entry가 deadlock할 수 있다.
- 해결 방법:
  - releaser mutex 아래 busy reservation만 획득하고 tail→boundary→tail cycle과 canceller/sink callback은 mutex 밖에서 단독 실행한다. concurrent/re-entrant 호출은 `ErrReleaserSerializerConflict`로 즉시 실패한다.
  - `ReleaseEpoch`은 zero/partial/full progress 모두 `ConfirmRelease`해 prepared token을 닫고 cursor를 실제 sink 성공 수와 맞춘다. release와 confirm 오류는 `errors.Join`으로 보존한다.
  - full confirmation을 request-local로 기록한다. `ReleaseTerminalEpoch`은 known-complete epoch 또는 remaining suffix release+confirm이 모두 성공한 경우에만 success terminal을 commit한다. 오류 시 progress/suffix는 보존하고 terminal을 호출하지 않는다.
  - `FailPending`은 error terminal만 허용하고 discard→cancel→terminal 순서를 보장하며 cancel failure cause에는 attempt ID를 넣지 않는다.
- Before (`packages/go/streamgate/stream_release.go:83-91`):

```go
prog, err := r.boundary.ReleaseSafe(ctx, attemptID, releaseEvents)
if err != nil {
	return prog, err
}
return prog, r.tail.ConfirmRelease(prepared.Token(), confirmation)
```

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

```go
prog, releaseErr := r.boundary.ReleaseSafe(ctx, attemptID, releaseEvents)
confirmErr := r.tail.ConfirmRelease(
	prepared.Token(),
	ReleaseConfirmation{ReleasedEvents: prog.ReleasedEvents()},
)
return prog, errors.Join(releaseErr, confirmErr)
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/stream_release.go`: busy reservation, zero/partial/full confirmation, completed epoch tracking, success-terminal gate, error-terminal/cancel cause validation
  - [ ] `packages/go/streamgate/stream_release_test.go`: cursor/suffix reprepare, terminal suppression, callback conflict/no deadlock, deterministic cancel ordering
- 테스트 작성:
  - `TestStreamReleaserConfirmsProgressEvenWhenSinkFails`
  - `TestStreamReleaserSuppressesSuccessTerminalUntilConfirmation`
  - `TestStreamReleaserRejectsReentrantCallbackWithoutDeadlock`
  - `TestStreamReleaserFailPendingOrdersDiscardCancelTerminal`
- 중간 검증:
  - `go test -race -count=20 ./packages/go/streamgate -run '^TestStreamReleaser(ConfirmsProgressEvenWhenSinkFails|SuppressesSuccessTerminalUntilConfirmation|RejectsReentrantCallbackWithoutDeadlock|FailPendingOrdersDiscardCancelTerminal)$'`
  - 기대 결과: 4개 test가 실제 실행되고 cursor/suffix/terminal count와 call order가 deterministic하게 일치한다.

### [REVIEW_API-3] SDD fixture와 verification trust 폐쇄

- 문제:
  - `commit_boundary_test.go:126-214`은 sink progress count만 확인하고 sink error와 함께 반환된 state, attempt ownership과 concurrent terminal을 검증하지 않는다.
  - `commit_boundary_test.go:314-371`은 old attempt staging 성공을 허용하며 post-open에서 실제 replacement를 호출하지 않는다.
  - `stream_release_test.go:143-238`은 partial cursor/suffix를 단언하지 않고 `429-469`의 overflow는 skip 가능하며 cancel-before-terminal 순서를 확인하지 않는다.
- 해결 방법:
  - barrier/hook sink와 ordered canceller를 사용해 callback 진입, re-entry conflict, start/terminal count와 순서를 검증한다. timeout은 hang을 FAIL로 처리한다.
  - zero/partial/full마다 sink count, boundary state, committed cursor, remaining suffix와 새 token을 함께 단언한다.
  - terminal-gate hard bound fixture로 overflow를 반드시 발생시키고 `t.Skip`을 제거한다.
  - exact test inventory count guard를 최종 검증에 두어 정규식의 false-green `no tests to run`을 금지한다.
- Before (`packages/go/streamgate/stream_release_test.go:451-453`):

```go
if !overflowed {
	t.Skip("expected overflow signal not generated with current configuration")
}
```

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

```go
if !overflowed {
	t.Fatal("expected deterministic overflow signal")
}
```

- 수정 파일 및 체크리스트:
  - [ ] `packages/go/streamgate/commit_boundary_test.go`: required state/attempt/concurrency assertions
  - [ ] `packages/go/streamgate/stream_release_test.go`: cursor/suffix/terminal/order assertions와 `t.Skip` 제거
  - [ ] `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/CODE_REVIEW-local-G08.md`: 실제 명령 stdout/stderr와 blocker 기록
- 테스트 작성:
  - REVIEW_API-1/2의 8개 회귀를 정확한 이름으로 작성하고 기존 weak case는 중복 없이 보강한다.
- 중간 검증:
  - `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\(' packages/go/streamgate/commit_boundary_test.go packages/go/streamgate/stream_release_test.go`
  - 기대 결과: inventory count 8, skip 검색 stdout 없음과 exit code 0.

## 의존 관계 및 구현 순서

1. predecessor `01_event_contract_types`와 `06+01_evidence_tail`은 위 complete log로 충족됐다.
2. `REVIEW_API-1`로 boundary reservation/state/attempt ownership을 고정한다.
3. `REVIEW_API-2`가 boundary progress를 tail confirmation/terminal에 연결한다.
4. `REVIEW_API-3`이 S03/S04/S05/S17/S19와 최종 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, race/deadlock/duplicate 없음.
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. 동일 host GOROOT setup failure면 우회 없이 원문/exit code와 `/config/opt/go` 복구 조건 기록.
11. `! rg --sort path -n 't\.Skip\(' 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`의 구현 에이전트 소유 섹션을 채운다.
