<!-- task=m-stream-evidence-gate-core/11+09,10_policy_hook_contract plan=0 tag=TEST -->
# Stream Evidence Gate Core — Policy Hook 계약·통합 Closure 계획

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

- 이 test-only closure는 index `09`와 `10`이 모두 PASS한 뒤 실행한다. 각 predecessor의 active/archive `complete.log`를 허용 pattern으로 확인하고 index별 정확히 하나가 아니면 중단한다.
- 생산 코드를 수정하지 않는다. public contract만으로 fixture를 작성할 수 없거나 테스트가 생산 결함을 드러내면 review stub에 blocker와 최소 재현을 기록하고 upstream follow-up으로 넘긴다.
- `CODE_REVIEW-cloud-G06.md`의 구현 에이전트 소유 섹션과 실제 출력을 모두 채우고 active 파일을 유지한 채 review-ready로 보고한다.

## 배경

index 09는 S13 공통 arbitration을, index 10은 S07 multi-requirement scheduler와 single-buffer policy seam을 만든다. 이 작업은 두 독립 생산 slice를 실제 OpenAI-family/agent-family consumer fixture로 결합해 S06/S07의 공개 계약 closure를 제공한다. 생산 slice별 unit test와 별개로, family detector가 semantic decision/선택적 intent만 반환하고 공통 Core가 applicability, hold와 single action을 소유한다는 것을 외부 패키지 관점에서 증명한다.

## 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

## Analysis Result

### 읽은 파일

- 승인 SDD와 active Milestone 문서
- project platform-common domain rule, local test rule/profile
- `packages/go/streamgate/consumer_contract_test.go`
- `packages/go/streamgate/filter_contract.go`, `evaluation_contract.go`, `filter_registry.go`, `evidence_tail.go`, `parallel_evaluation.go`, `event.go`
- 각 생산 계약의 관련 test 파일 전체
- `go.mod`

### closure 공백

- 기존 consumer fixture는 OpenAI/agent raw frame normalization과 release framing은 검증하지만 semantic filter result를 공통 arbiter에 넣지 않는다.
- S06의 pass/violation/intent/fatal/replacement/provider-error family parity와 filter가 mutation/retry/rebuild/dispatch를 소유하지 않는 경계가 없다.
- S07의 rolling early evaluation + schema deferred + fragment gate + provider-error event-only 조합을 public API 전체 경로로 실행하는 evidence가 없다.
- index 10의 unit test만으로는 external consumer가 caller boolean이나 second buffer 없이 같은 계약을 사용할 수 있는지 확인되지 않는다.

### 분할·의존성

- task group은 `m-stream-evidence-gate-core`, 이 subtask는 `11+09,10_policy_hook_contract`다.
- predecessor `09_decision_arbiter`와 `10+09_policy_hook`은 현재 계획 단계에서 complete evidence가 없어 상태는 missing이며 구현은 대기한다.
- 이 child는 완성된 두 생산 계약을 횡단하는 추가 integration/closure evidence만 소유하므로 test-only child 허용 조건에 맞는다.
- `policy-hook` Roadmap Targets는 이 최종 child만 소유해 partial production PASS가 task를 조기 체크하지 않게 한다.

### 범위 밖

- production detector, Core API/tail/registry 수정.
- recovery 실행, provider dispatch, host codec/config/wire 변경.
- 실제 외부 service/secret/provider 호출.

### 최종 라우팅

- evaluation_mode: `first-pass`.
- finalizer/mode: `finalize-task-policy.sh`, `pair`.
- Build: local-fit=true, scope=1, state=1, blast=1, evidence=1, verification=1 → `local G05`.
- Review: official-review, scope=1, state=1, blast=1, evidence=1, verification=2 → `cloud G06`.
- Review adapter/model/effort: `codex`, `gpt-5.6-sol`, `xhigh`.
- Loop-risk는 family × semantic outcome × mixed trigger의 table fixture에 한정된다. 생산 상태 변경은 없고 capability gap/unknown은 없다.

## 구현 체크리스트

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

## 의존 관계 및 구현 순서

1. index 09의 active candidates를 확인하고 없을 때만 archive candidates를 확인해 정확히 하나의 `complete.log`를 찾는다.
2. index 10도 같은 방식으로 정확히 하나를 찾는다. 각 log의 PASS 완료 및 public contract 이름을 확인한다.
3. TEST-1 → TEST-2 → VERIFY-3 순으로 실행한다. 추가 dependency를 숨겨 넣지 않는다.

### [TEST-1] consumer semantic/intent parity

- 기존 `consumer_contract_test.go`의 독립 OpenAI-family/agent-family normalizer를 재사용한다. 한 family의 raw fixture나 converter를 다른 family에 공유하지 않는다.
- public `Filter` seam만 구현하는 semantic fixture를 만들고 mutation, retry, rebuild, dispatch, submit callback을 두지 않는다.
- pass, violation without intent, violation with valid recovery intent, fatal, replacement, unmatched provider error, matched provider error 표를 두 family에 동일하게 실행한다.
- normalized event disposition, `FilterDecision`, 선택 intent, `ArbitrationResult` action/base/selected filter가 family 간 동일한지 비교한다.
- violation with intent는 registry-effective priority를 사용하고 forged/mismatched priority는 생산 contract가 거절하는지 확인한다.
- unmatched provider error는 terminal을 유지하고 matched valid intent만 recover가 되는지 확인한다.

수정 파일:

- `packages/go/streamgate/consumer_contract_test.go`

### [TEST-2] mixed policy public integration

- 같은 resolved request에 rolling repeat, terminal schema/integrity, fragment tool, none-mode provider-error filter를 등록한다. blocking/observe-only를 섞되 stable ids와 distinct priorities를 사용한다.
- text delta threshold epoch에서 rolling filter는 evaluated, terminal schema는 blocking deferred, fragment/provider error는 event applicability에 따라 not-applicable이고 result는 hold인지 확인한다.
- tool fragment completion epoch에서 해당 fragment filter만 trigger-ready가 되고 같은 tail/batch로 평가되는지 확인한다.
- normal terminal에서는 terminal-gated filter와 applicable final filters가 ready가 되어 single result를 만들고, provider-error-only filter는 not-applicable인지 확인한다.
- provider-error epoch에서는 event-only filter만 ready가 되고 unmatched/matched case가 terminal/recover로 갈리는지 확인한다.
- plan accessor와 observable cursor/token으로 channel별 pending buffer, release preparation, confirm/commit이 한 경로임을 증명한다. filter별 tail이나 두 번째 release token fixture는 만들지 않는다.
- 모든 검증은 external-package public API만 사용한다. internal field 접근이 필요하면 생산 API 공백으로 기록하고 생산 코드를 이 child에서 수정하지 않는다.

### [VERIFY-3] closure와 Roadmap 근거

- predecessor 두 개의 정확한 경로와 PASS evidence, test 원문 출력, exit status를 review stub에 기록한다.
- S06 consumer semantic/intent ownership과 common recovery ownership 부정 경계, S07 mixed schedule/single buffer assertion을 Roadmap Completion evidence로 정리한다.
- 모든 검증 통과 전 `policy-hook` 완료를 주장하지 않는다.

## 수정 파일 요약

| 파일 | 변경 |
|---|---|
| `packages/go/streamgate/consumer_contract_test.go` | S06 family parity와 S07 public mixed integration fixture |
| `CODE_REVIEW-cloud-G06.md` | predecessor, 실제 fixture, 검증, Roadmap Completion evidence |

## 최종 검증

```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'
gofmt -w packages/go/streamgate/consumer_contract_test.go
go test -count=1 ./packages/go/streamgate -run 'TestConsumer.*(Semantic|Policy|Mixed)'
go test -count=1 ./packages/go/streamgate
go test -race -count=1 ./packages/go/streamgate
make proto
go test -count=1 ./apps/edge/internal/transport ./apps/node/internal/transport
git diff --check
```

예상 결과: predecessor 09와 10이 각각 정확히 하나 출력되고 모든 명령이 exit 0이며 S06/S07 closure가 public API만으로 통과한다.

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