# Complete - m-stream-evidence-gate-core/02+01_evaluation_contract

## 완료 일시

2026-07-24

## 요약

Stream Gate evaluation binding과 immutable outcome-set 계약을 4회 리뷰 루프로 보완했으며 최종 판정은 PASS다.

## 루프 이력

| Plan | Review | Verdict | 메모 |
|------|--------|---------|------|
| `plan_local_G03_0.log` | `code_review_local_G03_0.log` | FAIL | evaluator id snapshot, evaluated wrapper/decision id 일치, not-applicable/deferred kind 회귀가 필요했다. |
| `plan_local_G03_1.log` | `code_review_local_G04_1.log` | FAIL | package-local forged failure disposition을 defensive validation과 set 경계에서 거부해야 했다. |
| `plan_local_G01_2.log` | `code_review_local_G01_2.log` | FAIL | decision-id set 회귀 복원, disposition 대표 set assertion, 테스트 이름 존재성 검증이 필요했다. |
| `plan_local_G03_3.log` | `code_review_local_G04_3.log` | PASS | 이전 Required를 모두 보완하고 전체 local 검증을 통과했다. |

## 구현/정리 내용

- `EpochFilter`가 생성 시 evaluator stable id를 snapshot하고 이후 evaluator mutation과 무관한 identity를 반환하도록 했다.
- evaluated outcome의 wrapper filter id와 decision filter id 일치를 constructor, `Validate()`, `NewEvaluationSet` 경계에서 강제했다.
- outcome kind와 enforcement에서 canonical failure disposition을 파생하는 공통 helper를 사용하고 package-local forged disposition을 거부하도록 했다.
- not-applicable/deferred kind, forged decision-id/disposition, `Validate()`/`NewEvaluationSet` 양쪽 경계의 회귀 테스트와 테스트 이름 존재성 검증을 보강했다.

## 최종 검증

- `env GOROOT=/config/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.12.linux-arm64 GOTOOLCHAIN=local .../go version` - PASS; `go version go1.24.12 linux/arm64`.
- `gofmt -d packages/go/streamgate/evaluation_contract_test.go` - PASS; 출력 없음.
- `go test ./packages/go/streamgate -list '^TestEvaluationSetRejectsForged(DecisionID|FailureDisposition)Mismatch$'` 결과와 기대 이름의 `diff -u` - PASS; 출력 없음.
- `go test -count=1 ./packages/go/streamgate -run '^Test(EpochFilterOutcomeValidatesFailurePolicy|EpochFilterOutcomeRejectsDecisionIDMismatch|EvaluationSetRejectsForgedDecisionIDMismatch|EvaluationSetRejectsForgedFailureDispositionMismatch|EpochFilterSnapshotsEvaluatorID)$'` - PASS; `ok iop/packages/go/streamgate`.
- `go test -count=1 ./packages/go/streamgate` - PASS; `ok iop/packages/go/streamgate`.
- `go vet ./packages/go/streamgate` - PASS; 출력 없음.
- `make proto` - PASS; protobuf 생성 성공 및 생성물 추가 diff 없음.
- `go test -count=1 ./apps/edge/internal/transport ./apps/node/internal/transport` - PASS; 두 transport package 모두 `ok`.
- `go list -f '{{range .Imports}}{{println .}}{{end}}' ./packages/go/streamgate | LC_ALL=C sort` - PASS; 표준 라이브러리 import만 확인.
- `git diff --check -- packages/go/streamgate proto/gen/iop` - PASS; 출력 없음.
- `git status --short -- proto/gen/iop` - PASS; 출력 없음.

## 잔여 Nit

- 없음

## 후속 작업

- 없음
