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

# Stream Gate Terminal State Preservation과 Exact Evidence 재폐쇄 계획

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

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

## 배경

sink callback이 operation과 다른 더 진행된 state를 반환하면 현재 구현은 state 자체를 버려 downstream terminal side effect 뒤에도 response-start/release를 재호출한다. 기존 named 테스트는 이 동작을 기대값으로 고정했고, releaser 테스트도 exact suffix/token과 confirm/discard 시점 증거를 만들지 않아 package/race 검증이 false-green이다. SDD S03/S04/S05/S17/S19의 single visible terminal과 discard-before-cancel을 실제 callback 경로에서 다시 폐쇄한다.

## Archive Evidence Snapshot

- 현재 계획 로그: `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/plan_local_G06_5.log`
- 현재 리뷰 로그: `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/code_review_local_G07_5.log`
- 판정: `FAIL`
- Required:
  - callback-role mismatch가 더 진행된 `terminal_committed` state를 버려 response-start/release가 terminal side effect 뒤 재호출된다.
  - boundary named 테스트가 이 결함을 non-terminal 기대값으로 고정하고 state+error/mismatch 이후 exactly-once를 검증하지 않는다.
  - releaser named 테스트가 exact zero/partial/full suffix/token/cursor, actual confirm failure, cancel 시점 discard와 callback count를 검증하지 않는다.
- Suggested: 없음
- Nit: 없음
- 영향 파일: `packages/go/streamgate/commit_boundary.go`, `commit_boundary_test.go`, `stream_release_test.go`, 현재 task evidence.
- 실제 검증:
  - 집중 재현 `TestReviewProbePreservesTerminalStateOnOperationMismatch`에서 response-start state는 `transport_uncommitted`, 재호출 error는 다시 operation mismatch, response-start call은 2회였다.
  - 같은 재현의 release 경로에서 state는 `stream_open`, release call은 terminal 반환 뒤에도 2회였다. 임시 probe 파일은 실행 직후 제거했다.
  - named inventory 8개, named `-race -count=20`, fresh package와 vet은 PASS해 assertion 공백을 확인했다.
  - Edge/Node transport unit은 `/config/opt/go/src/crypto/internal/fips140cache` 누락으로 setup 전에 실패했다. 별도 toolchain으로 우회하지 않는다.
- 선행 완료:
  - `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/evidence_tail.go`의 prepare/confirm/discard와 상태 accessor 구간
- `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_G06_5.log`
- `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/code_review_local_G07_5.log`
- `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`

### SDD 기준

- SDD: `agent-roadmap/sdd/knowledge-tool-optimization-extension/stream-evidence-gate-core/SDD.md`
- 상태: `[승인됨]`; SDD/Milestone 잠금 `해제`, 결정 필요 `없음`.
- 대상:
  - `S03`/`commit-boundary`: staged start와 terminal을 한 번만 선택한다.
  - `S04`/`commit-boundary`: idle pending을 release하지 않고 error terminal만 commit한다.
  - `S05`/`commit-boundary`: `stream_open` 이후 상태를 rollback하지 않고 terminal을 단조 보존한다.
  - `S17`/`commit-boundary`: selected attempt의 start/output만 한 번 노출한다.
  - `S19`/`evidence-tail`: pending/prepared state를 discard한 뒤 cancel하고 terminal error로 끝낸다.
- Evidence Map의 callback single-action, state monotonicity, no partial release와 discard-before-cancel 요구를 `REVIEW_API-1/2`의 regression assertion과 최종 named/race 검증으로 역산했다.

### 테스트 환경 규칙

- `test_env`: local.
- `agent-test/local/rules.md`와 `agent-test/local/platform-common-smoke.md`를 읽었고 빈 값이나 `<확인 필요>`는 없다.
- PATH에서 해석되는 host Go의 실제 binary/version/GOROOT, `make proto`, fresh 대상/package test, named `-race -count=20`, package race/vet, transport unit, gofmt와 deterministic hygiene를 적용한다.
- transport unit은 호스트 GOROOT의 `crypto/internal/fips140cache` 누락으로 setup 전에 실패한다. 별도 Go로 우회하지 않고 원문/exit code와 `/config/opt/go` 복구 조건을 기록한다.
- public production consumer/proto/config를 바꾸지 않고 현재 package 밖 `CommitBoundary`/`StreamReleaser` call site가 없으므로 Edge-Node full-cycle과 외부 service는 적용하지 않는다. test-rule 유지보수도 필요 없다.

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

- response-start/release callback이 `terminal_committed`를 반환한 뒤 boundary state와 재호출 억제가 검증되지 않고, 현재 테스트는 잘못된 non-terminal 상태를 기대한다.
- callback error와 valid forward state, callback-role mismatch가 함께 있을 때 state 보존과 joined error가 table로 검증되지 않는다.
- release loop가 apply 오류 뒤 다음 event를 호출하지 않는지 exact count가 없다.
- zero/partial/full confirm의 exact suffix, cursor와 stale/new token 의미가 하나의 deterministic matrix로 검증되지 않는다.
- outstanding/invalidated prepare와 actual confirm invalidation이 success terminal을 0회로 억제하는지 releaser 공개 경로에서 검증되지 않는다.
- re-entry outer completion은 있으나 callback/conflict exact count가 없고, S19 discard는 cancel hook 시점의 pending/prepared 상태를 확인하지 않는다.

### 심볼 참조

- public rename/remove 없음.
- `applySinkOutcomeLocked` wrapper는 package 내부에서 호출되지 않고, `applySinkOutcomeLockedWithOpLocked` call site는 `commit_boundary.go`의 response-start/release/terminal finish 세 곳뿐이다.
- `CommitBoundary`, `StreamReleaser`, `ReplaceUncommittedAttempt`의 production call site는 없고 `packages/go/streamgate` source/test만 참조한다.
- 새 dependency는 없고 Go 표준 라이브러리만 사용한다.
- 매칭되는 active agent-spec과 별도 agent-contract 문서는 없다. 내부 `ReleaseSink`/SDD interface와 코드·테스트가 원본이다.

### 분할 판단

- split decision policy를 파일명 선택 전에 평가했다.
- 기존 dependent subtask `07+01,06_commit_boundary`를 그대로 유지하며 `01`과 `06`은 위 두 archive `complete.log`로 충족됐다.
- terminal state preservation과 releaser evidence는 같은 commit/release state machine의 현재 Required를 함께 닫아야 하나의 PASS가 된다. production fix와 그 callback/evidence test를 분리하면 어느 쪽도 독립 완료 근거를 만들지 못하고 기존 dependency identity만 깨지므로 단일 follow-up이 안전하다.
- public consumer rollout, config/proto와 transport adapter는 별도 ownership/risk profile이며 이번 strict subset에서 제외한다.

### 범위 결정 근거

- 동작 수정은 `commit_boundary.go`, regression은 `commit_boundary_test.go`와 `stream_release_test.go`, evidence는 현재 review stub에 한정한다.
- `stream_release.go` ledger와 `evidence_tail.go` prepare/confirm/discard 구현은 현재 재현에서 production defect가 확인되지 않아 동작을 바꾸지 않고 공개 경로 test로 검증한다.
- `terminal.go`, Edge/OpenAI handler, production `ReleaseSink`/`AttemptCanceller`, config/proto/API, host Go 설치와 unrelated dirty worktree는 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:
    - scope: 두 callback 재현과 세 source/test 경로로 수정 범위가 닫힌다.
    - context: commit state, releaser confirmation, SDD rows와 지정 evidence를 한 package에서 함께 유지할 수 있다.
    - verification: callback table/count, suffix/token/order와 fresh/race 명령으로 판정 가능하다.
    - evidence: 실제 probe 실패와 false-green named output이 현재 코드와 일치한다.
    - ownership: task write-set과 unrelated dirty 변경이 분리되고 외부 caller가 없다.
    - decision: SDD/Milestone 잠금이 해제됐고 사용자 결정 항목이 없다.
  - scores: `scope_coupling=1`, `state_concurrency=2`, `blast_irreversibility=1`, `evidence_diagnosis=1`, `verification_complexity=1`
  - result: lane `local`, grade `G06`, filename `PLAN-local-G06.md`
- review:
  - closures: `scope_closed=true`, `context_closed=true`, `verification_closed=true`, `evidence_trusted=true`, `ownership_closed=true`, `decision_closed=true`
  - closure basis:
    - scope: operation/state fix와 exact evidence matrix가 명시돼 있다.
    - context: callback state, token/cursor와 SDD single-terminal evidence를 한 번에 대조할 수 있다.
    - verification: 새 assertion이 기존 false-green 경로를 실제로 선택하는지 named/race output으로 판정한다.
    - evidence: current source, focused failure와 test gaps가 독립 재현 가능하다.
    - ownership: task write-set과 external host blocker가 분리된다.
    - decision: 제품 선택이나 외부 권한 판단이 필요 없다.
  - scores: `scope_coupling=1`, `state_concurrency=2`, `blast_irreversibility=1`, `evidence_diagnosis=2`, `verification_complexity=1`
  - result: lane `local`, grade `G07`, filename `CODE_REVIEW-local-G07.md`

## 구현 체크리스트

- [x] `REVIEW_API-1` known/monotonic sink state를 callback error와 role mismatch보다 먼저 보존하고 reservation/callback operation을 검증하며 apply 오류 뒤 추가 callback을 막는 동작과 regression을 구현한다.
- [x] `REVIEW_API-2` boundary/releaser named 회귀에 terminal mismatch exactly-once, zero/partial/full exact suffix/token/cursor, actual prepare/confirm failure, re-entry count와 cancel 시점 discard evidence를 구현한다.
- [x] `REVIEW_API-3` named/fresh/race/profile/hygiene 검증을 실제 실행하고 호스트 transport blocker를 원문 그대로 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

### [REVIEW_API-1] Monotonic sink outcome과 operation identity

- 문제:
  - `packages/go/streamgate/commit_boundary.go:200`은 role mismatch에서 `stateTransitionValid=false`로 바꿔 이미 더 진행된 sink state를 버린다.
  - `packages/go/streamgate/commit_boundary.go:374`는 `sErr`만 보고 loop를 중단해 `applyErr`가 있어도 다음 release callback을 호출한다.
  - `reservation.op`는 finish validation에 사용되지 않고 별도 op argument만 신뢰한다.
- 해결 방법:
  - returned state의 known/monotonic transition을 먼저 판정하고 valid forward state를 sink error/role error와 무관하게 한 번 반영한다.
  - reservation operation과 실제 callback kind의 허용 matrix를 검증한다. response-start는 release/terminal reservation의 선행 callback, release는 release reservation, terminal은 terminal reservation에서만 허용한다.
  - expected callback state mismatch와 sink/transition error를 `errors.Join`하고, state가 terminal로 전진했으면 staged start를 제거한다.
  - response-start/release의 모든 apply 오류에서 다음 downstream callback을 중단한다.
- Before (`packages/go/streamgate/commit_boundary.go:200`):

```go
if sinkErr == nil && stateTransitionValid {
	if returnedState != expectedState {
		valErr = fmt.Errorf("%w: ...", ErrInvalidStateTransition)
		stateTransitionValid = false
	}
}
if stateTransitionValid && isStateMoreAdvanced(returnedState, b.state) {
	b.state = returnedState
}
```

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

```go
transitionErr := validateStateTransition(b.state, returnedState)
if transitionErr == nil && isStateMoreAdvanced(returnedState, b.state) {
	b.state = returnedState
}
operationErr := validateSinkCallback(res.op, callback, returnedState)
return errors.Join(sinkErr, transitionErr, operationErr)
```

- 수정 파일 및 체크리스트:
  - [x] `packages/go/streamgate/commit_boundary.go`: reservation/callback operation matrix, state-first monotonic apply, joined error와 apply-error short-circuit
  - [x] `packages/go/streamgate/commit_boundary_test.go`: response-start/release terminal mismatch state preservation, joined error와 exact call count
- 테스트 작성:
  - 기존 `TestCommitBoundaryPreservesReturnedStateAcrossSinkErrors`에 response-start/release/terminal의 success/error × expected/mismatch state table을 보강한다.
  - terminal side effect 반환 뒤 state가 `terminal_committed`, 후속 release/terminal이 `ErrBoundaryAlreadyTerminal`, callback이 1회임을 단언한다.
  - `TestCommitBoundarySerializesConcurrentStartAndTerminal`의 barrier/count/final state assertion을 유지한다.
- 중간 검증:
  - `go test -race -count=20 ./packages/go/streamgate -run '^TestCommitBoundary(PreservesReturnedStateAcrossSinkErrors|SerializesConcurrentStartAndTerminal|RejectsWrongOrMissingAttempt|RejectsPostOpenReplacement)$'`
  - 기대 결과: operation mismatch도 advanced terminal state를 보존하고 이후 sink callback이 없으며 race/deadlock 없이 PASS한다.

### [REVIEW_API-2] Exact confirmation과 discard ordering evidence

- 문제:
  - `packages/go/streamgate/stream_release_test.go:479`은 partial suffix의 payload와 old/new token을 비교하지 않는다.
  - `packages/go/streamgate/stream_release_test.go:612` 이후 prepare/invalidated 케이스는 terminal 공개 경로를 실행하지 않고 `:672`는 actual confirm invalidation이 아니다.
  - `packages/go/streamgate/stream_release_test.go:737`은 cancel callback 시점에 pending/prepared discard가 끝났는지 확인하지 않는다.
- 해결 방법:
  - 위치가 구별되는 text fixture를 사용해 zero/partial/full confirm 뒤 cursor와 동일 epoch reprepare의 exact suffix/token/consumed 의미를 table로 검증한다.
  - outstanding prepared token, invalidated epoch, sink release failure와 release callback 중 token invalidation으로 만든 actual confirm failure 각각에서 `ReleaseTerminalEpoch` terminal count 0을 확인한다. clean completed epoch만 terminal 1을 허용한다.
  - re-entry callback/conflict 횟수와 outer completion을 모두 bounded timeout 안에서 수집한다.
  - FailPending 전에 prepared token을 만들고 canceller hook 안에서 pending entries/runes, prepared token map과 epoch invalidation을 확인한 뒤 `discard-verified → cancel → terminal` trace와 start/release/cancel/terminal exact count를 단언한다.
- Before (`packages/go/streamgate/stream_release_test.go:513`):

```go
gotEvents := prepared2.ReleaseEvents()
if len(gotEvents) == 0 {
	t.Fatal("remaining suffix events is empty")
}
```

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

```go
gotSuffix := releaseEventTexts(t, prepared2.ReleaseEvents())
if diff := compareStrings(gotSuffix, wantSuffix); diff != "" {
	t.Fatal(diff)
}
if prepared2.Token() == staleToken {
	t.Fatal("reprepare reused stale token")
}
```

- 수정 파일 및 체크리스트:
  - [x] `packages/go/streamgate/stream_release_test.go`: distinct fixture, exact confirm matrix, terminal suppression paths, re-entry counts와 discard-aware ordered spy
  - [x] `packages/go/streamgate/commit_boundary_test.go`: shared programmable sink의 race-safe state/error/count support
- 테스트 작성:
  - 기존 named `TestStreamReleaserConfirmsProgressEvenWhenSinkFails`, `TestStreamReleaserSuppressesSuccessTerminalUntilConfirmation`, `TestStreamReleaserRejectsReentrantCallbackWithoutDeadlock`, `TestStreamReleaserFailPendingOrdersDiscardCancelTerminal`을 직접 보강한다.
  - 별도 이름만 추가해 8개 inventory guard를 우회하지 않는다.
- 중간 검증:
  - `go test -race -count=20 ./packages/go/streamgate -run '^TestStreamReleaser(ConfirmsProgressEvenWhenSinkFails|SuppressesSuccessTerminalUntilConfirmation|RejectsReentrantCallbackWithoutDeadlock|FailPendingOrdersDiscardCancelTerminal)$'`
  - 기대 결과: exact suffix/token/cursor, terminal 0/1, re-entry count와 discard-before-cancel 순서를 실제 callback으로 단언하고 PASS한다.

### [REVIEW_API-3] Verification trust 폐쇄

- 문제:
  - 기존 named/race 명령은 누락되거나 반대인 assertion 때문에 false-green이었고 transport unit은 호스트 GOROOT 손상으로 setup 전에 실패한다.
- 해결 방법:
  - 8개 named inventory와 fresh verbose output으로 정확한 regression/subtest가 실행됐음을 확인한다.
  - 동일 PATH host Go로 named/package race와 vet을 실행하고 repo-local probe/tool을 남기지 않는다.
  - transport setup 실패가 유지되면 우회하지 않고 원문, exit code와 호스트 Go 복구 조건을 기록한다.
- 수정 파일 및 체크리스트:
  - [x] `agent-task/m-stream-evidence-gate-core/07+01,06_commit_boundary/CODE_REVIEW-local-G07.md`: 실제 명령 stdout/stderr와 blocker
- 테스트 작성:
  - production 동작 regression은 REVIEW_API-1/2에서 작성한다. 이 항목은 실행 evidence와 hygiene만 소유한다.
- 중간 검증:
  - 아래 최종 검증 1~13을 순서대로 실행한다.

## 의존 관계 및 구현 순서

1. `01_event_contract_types`와 `06+01_evidence_tail`은 Archive Evidence Snapshot의 `complete.log`로 충족됐다.
2. `REVIEW_API-1`로 state-first callback finish와 exactly-once를 고정한다.
3. `REVIEW_API-2`가 confirmation/discard 공개 경로 evidence를 폐쇄한다.
4. `REVIEW_API-3`이 fresh/race/profile 결과를 기록한다.

## 수정 파일 요약

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

## 최종 검증

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_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 존재.
4. `go test -race -count=20 ./packages/go/streamgate -run '^Test(CommitBoundary(PreservesReturnedStateAcrossSinkErrors|RejectsWrongOrMissingAttempt|SerializesConcurrentStartAndTerminal|RejectsPostOpenReplacement)|StreamReleaser(ConfirmsProgressEvenWhenSinkFails|SuppressesSuccessTerminalUntilConfirmation|RejectsReentrantCallbackWithoutDeadlock|FailPendingOrdersDiscardCancelTerminal))$'`
   - 기대 결과: terminal preservation, exact callback/count/suffix/token/order와 race/deadlock 검증 PASS.
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|outerErr)|TestReviewProbe' packages/go/streamgate/commit_boundary_test.go packages/go/streamgate/stream_release_test.go packages/go/streamgate`
    - 기대 결과: 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_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`의 구현 에이전트 소유 섹션을 채운다.
