<!-- task=m-stream-evidence-gate-core/11+09,10_policy_hook_contract plan=0 tag=TEST -->

# Code Review Reference - TEST

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> Fill every implementation-owned section, keep active files in place, and report ready for review.
> If blocked, record only exact blocker, attempted output, and resume condition here.
> Do not ask the user, call user-input tools, create stop files, classify next state, archive, or write `complete.log`.
> Finalization and review-only checklist belong only to the review agent.

## 개요

date=2026-07-26
task=m-stream-evidence-gate-core/11+09,10_policy_hook_contract, plan=0, tag=TEST

## 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:
  - `policy-hook`: mixed rolling/schema/tool/provider-error policy와 consumer semantic decision/intent 책임 경계를 공통 Core 계약으로 검증한다.
- Completion mode: check-on-pass

## 이 파일을 읽는 리뷰 에이전트에게

> **[REVIEW AGENT ONLY]** 실제 소스와 검증 출력을 대조한 뒤 종결한다.

1. 판정을 append한다.
2. `CODE_REVIEW-cloud-G06.md` → `code_review_cloud_G06_0.log`, `PLAN-local-G05.md` → `plan_local_G05_0.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 task 디렉터리를 `agent-task/archive/YYYY/MM/m-stream-evidence-gate-core/11+09,10_policy_hook_contract/`로 이동한다.
4. PASS이면 `policy-hook` milestone 완료 이벤트 메타데이터를 보고한다. roadmap 갱신은 런타임 책임이다.
5. WARN/FAIL이면 code-review skill의 다음 filesystem state를 작성한다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|---|---|
| TEST-1 consumer semantic/intent parity | ✅ |
| TEST-2 mixed policy public integration | ✅ |
| VERIFY-3 predecessor와 closure 검증 | ✅ |

## 구현 체크리스트

- [x] [TEST-1] OpenAI-family와 agent-family의 semantic decision/optional intent matrix가 동일 `ArbitrationResult`를 만드는지 검증한다.
- [x] [TEST-2] public API로 rolling/schema/fragment/provider-error mixed policy의 applicability, hold/release, single-buffer/commit 경계를 검증한다.
- [x] [VERIFY-3] index 09·10 predecessor 증거와 fresh package/race/생성물/transport 검증을 기록하고 `policy-hook` 완료 근거를 정리한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 코드리뷰 전용 체크리스트

> **[REVIEW AGENT ONLY]** 구현 에이전트는 수정하거나 체크하지 않는다.

- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나를 append한다.
- [ ] 판정과 차원별 평가, Required/Suggested/Nit 분류가 일치한다.
- [ ] active review를 `code_review_cloud_G06_0.log`로 아카이브한다.
- [ ] active plan을 `plan_local_G05_0.log`로 아카이브한다.
- [ ] `.gitignore` Agent-Ops block과 current.md ignore를 확인한다.
- [ ] PASS이면 template에 맞춰 `complete.log`를 쓰고 active `.md`를 남기지 않는다.
- [ ] PASS이면 task 디렉터리를 archive로 옮기고 최종 위치에서 체크리스트를 갱신한다.
- [ ] PASS이면 `policy-hook` runtime 완료 이벤트 메타데이터를 보고하고 roadmap을 직접 수정하지 않는다.
- [ ] PASS split 작업이면 남은 sibling 상태에 따라 active parent 유지/제거를 확인한다.
- [ ] WARN/FAIL이면 다음 filesystem state를 작성하고 `complete.log`를 만들지 않는다.

## 계획 대비 변경 사항

- 계획의 수정 파일 목록에 따르면 `packages/go/streamgate/consumer_contract_test.go`만 수정한다.
- 생산 코드는 수정하지 않았다.
- `CODE_REVIEW-cloud-G06.md` 파일은 이미 존재했으므로 내용을 채우는 방식으로 처리했다.

## 주요 설계 결정

1. **semanticFilter fixture**: `streamgate.Filter` 인터페이스만 구현하는 테스트 전용 필터. `ID()`, `Applies()`, `HoldRequirement()`, `Evaluate()`만 구현하며, mutation/retry/rebuild/dispatch/submit callback은 없다.
2. **HoldRequirement 동적 모드 선택**: 필터 ID에 `rolling`/`terminal`/`fragment`가 포함되면 해당 hold mode를 반환하여 TEST-2에서 rolling/terminal-gate/fragment-gate 모드를 구분한다.
3. **ReplacementProposal 전달**: `f.repl != nil`일 때 `NewFilterDecisionWithReplacement`을 사용하여 replacement decision을 생성한다.
4. **EvidenceTail 비사용**: `computeApplicabilities`가 unexported이므로 `NewEvidenceEpochWithApplicabilities` + `NewFilterApplicability`로 직접 applicability를 구성하여 public API만 사용한다.
5. **FilterContext 생성**: `NewFilterContextBuilder`로 테스트용 FilterContext를 생성하여 `Evaluate(ctx, filterCtx, batch)`에 전달한다.

## 리뷰어를 위한 체크포인트

- index 09와 10 predecessor `complete.log`가 각각 정확히 하나이고 PASS evidence를 확인했는가.
- production 파일을 수정하지 않고 external-package public API만 사용했는가.
- OpenAI/agent raw fixture와 normalizer가 독립이며 semantic decision/intent/result만 비교하는가.
- pass, violation no-intent/with-intent, fatal, replacement, unmatched/matched provider error가 모두 포함되는가.
- filter seam에 mutation/retry/rebuild/dispatch/submit capability가 없고 recovery 실행을 fixture가 흉내 내지 않는가.
- early rolling, terminal deferred, fragment complete, normal terminal, provider-error-only applicability가 기대대로 조합되는가.
- 같은 tail/batch/token/confirm cursor만 사용해 duplicate buffer/commit이 없음을 증명하는가.
- Roadmap Completion evidence가 S06 consumer ownership과 S07 mixed/single-buffer assertion을 모두 포함하는가.

## 검증 결과

### 선행 작업 확인

```bash
bash -lc 'shopt -s nullglob; find_one() { local idx="$1"; local active=(agent-task/m-stream-evidence-gate-core/${idx}_*/complete.log agent-task/m-stream-evidence-gate-core/${idx}+*/complete.log); if (( ${#active[@]} > 0 )); then printf "%s\n" "${active[@]}"; test "${#active[@]}" -eq 1; return; fi; local archived=(agent-task/archive/*/*/m-stream-evidence-gate-core/${idx}_*/complete.log agent-task/archive/*/*/m-stream-evidence-gate-core/${idx}+*/complete.log); printf "%s\n" "${archived[@]}"; test "${#archived[@]}" -eq 1; }; find_one 09; find_one 10'
```

실제 출력 및 exit status:

```
agent-task/archive/2026/07/m-stream-evidence-gate-core/09_decision_arbiter/complete.log
agent-task/archive/2026/07/m-stream-evidence-gate-core/10+09_policy_hook/complete.log
```

- index 09: `09_decision_arbiter` PASS (2026-07-26), S13 decision arbiter action 검증, deterministic arbitration, priority snapshot, coordinator result 전파
- index 10: `10+09_policy_hook` PASS (2026-07-26), filter별 pending/applicability, exact-set binding, single buffer/token/commit lifecycle

### 포맷 및 집중 테스트

```bash
gofmt -w packages/go/streamgate/consumer_contract_test.go
go test -count=1 ./packages/go/streamgate -run 'TestConsumer.*(Semantic|Policy|Mixed)'
```

실제 출력:

```
PASS
ok  	iop/packages/go/streamgate	0.003s
```

TestConsumerSemanticIntentParity: 20개 subtest 전체 PASS
TestConsumerPolicyMixedPublicIntegration: 5개 subtest 전체 PASS

### 패키지 및 race 검증

```bash
go test -count=1 ./packages/go/streamgate
go test -race -count=1 ./packages/go/streamgate
```

실제 출력:

```
ok  	iop/packages/go/streamgate	0.820s
ok  	iop/packages/go/streamgate	1.862s
```

### 생성물 및 transport 회귀

```bash
make proto
go test -count=1 ./apps/edge/internal/transport ./apps/node/internal/transport
```

실제 출력:

```
ok  	iop/apps/edge/internal/transport	4.739s
ok  	iop/apps/node/internal/transport	5.552s
```

### Diff 검증

```bash
git diff --check
```

실제 출력:

```
(출력 없음 — whitespace 오류 없음)
```

---

> **[IMPLEMENTING AGENT — BEFORE SAVING]** Fill every implementation-owned section and leave review-only sections unchanged.

## 섹션 소유권

| Section | Owner | Note |
|---|---|---|
| Header, 개요, 리뷰 지시 | Fixed | 구현 에이전트 수정/실행 금지 |
| Roadmap Targets | Fixed | PASS 때 review가 completion에 복사 |
| 구현 항목별 완료 여부 | Implementing agent | 체크만 변경 |
| 구현 체크리스트 | Implementing agent | 체크만 변경 |
| 코드리뷰 전용 체크리스트 | Review agent | 구현 에이전트 수정 금지 |
| 계획 대비 변경 사항, 주요 설계 결정 | Implementing agent | 실제 내용으로 교체 |
| 리뷰어 체크포인트 | Fixed | 변경 금지 |
| 검증 결과 | Implementing agent | 실제 출력 기록 |
| 코드리뷰 결과 | Review agent | review가 append |
