<!-- task=m-policy-history-audit/01_audit_contracts plan=4 tag=REVIEW_API_EVIDENCE_MATCH -->

# Plan - REVIEW_API_EVIDENCE_MATCH

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

`CODE_REVIEW-local-G09.md`의 구현 에이전트 소유 섹션을 채우는 것이 구현의 필수 마지막 단계다. 코드를 바꾸고 검증을 실행한 뒤 실제 구현 내용, 계획 대비 변경 사항, 주요 설계 결정, 검증 stdout/stderr를 리뷰 스텁에 기록하고 active 파일을 그대로 둔 채 리뷰 준비를 보고한다. 구현 중 사용자만 결정할 수 있는 제품 선택, 사용자 소유 외부 환경 prerequisite, 또는 범위 충돌이 생기면 리뷰 스텁의 `사용자 리뷰 요청` 섹션에 정확한 근거를 채우고 멈춘다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 evidence 공백은 사용자 리뷰 요청이 아니다.

## 배경

G08 리뷰에서 Go 테스트와 checklist completion은 통과했지만, placeholder 탐지 명령의 기록 결과가 실제 명령 결과와 맞지 않았다. 이번 후속은 source/test 변경 없이 active review file의 검증 기록을 실제 명령 결과와 일치시키고, 검사 명령 자체가 검색 대상 문자열을 만들지 않도록 정리한다.

## 사용자 리뷰 요청 흐름

구현 중 차단 사유가 있으면 active `CODE_REVIEW-local-G09.md`의 `사용자 리뷰 요청` 섹션을 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 형식으로 채운다. code-review가 요청의 타당성을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/control-plane-portal-ops/milestones/policy-history-audit.md`
- Task ids:
  - `schema-evidence`: policy/audit 상세 schema는 구현 단계에서 명확한 evidence와 함께 확정한다.
- Completion mode: check-on-pass

## 리뷰 발견사항

- Required: G08 active review file에서 placeholder 탐지 명령의 recorded no-output 결과와 실제 명령 결과가 일치하지 않았다. 후속에서는 active G09 file만 대상으로 검사하고, 검색 패턴을 bracket expression으로 써서 검사 명령 자체가 대상 token을 만들지 않게 한다.

## 범위 결정 근거

- 포함: `CODE_REVIEW-local-G09.md`의 구현 에이전트 소유 섹션을 실제 검증 결과와 일치하게 완성한다.
- 포함: fresh Go verification 재실행과 실제 stdout/stderr 기록.
- 포함: placeholder token 탐지 명령을 bracket expression 기반으로 실행해 active review file에 남은 placeholder token이 없음을 확인한다.
- 제외: `packages/go/audit/audit.go`와 `packages/go/audit/audit_test.go` 추가 변경. source/test behavior는 이전 리뷰에서 통과했다.

## 빌드 등급

- `local-G09`: repeated loop의 verification evidence mismatch cleanup이며 deterministic command로 검증 가능하다.

## 구현 체크리스트

- [ ] `CODE_REVIEW-local-G09.md`의 구현 체크리스트 문구를 이 계획과 동일하게 유지하고, 완료된 항목을 `[x]`로 표시한다.
- [ ] `go test -count=1 ./packages/go/audit ./packages/go/policy ./packages/go/jobs ./packages/go/events ./packages/go/metadata`를 실행해 audit package와 인접 공통 패키지를 fresh 검증한다.
- [ ] `go test -count=1 ./packages/go/...`를 실행해 platform-common 전체 회귀를 fresh 검증한다.
- [ ] `rg --sort path -n '[(]output[)]' agent-task/m-policy-history-audit/01_audit_contracts/CODE_REVIEW-local-G09.md`를 실행해 active review file에 placeholder token이 남지 않았음을 확인한다.
- [ ] `CODE_REVIEW-local-G09.md`의 구현 에이전트 소유 섹션을 실제 완료 상태와 검증 출력으로 채우고, 기록한 검증 출력이 재실행 결과와 일치하게 한다.

## [REVIEW_API_EVIDENCE_MATCH-1] Placeholder Search Evidence Match

### 문제

G08 implementation은 placeholder cleanup을 의도했지만, 검증 기록과 실제 `rg` 결과가 서로 달랐다. code-review는 기록된 stdout/stderr가 실제 명령 결과와 일치해야 PASS할 수 있다.

### 해결 방법

`CODE_REVIEW-local-G09.md`에서 다음을 수행한다.

- 각 검증 명령을 한 번만 기록한다.
- placeholder 탐지에는 `[(]output[)]` pattern을 사용한다.
- active G09 review file에 남은 placeholder token이 없으면 결과를 `(no matches)`로 기록한다.
- Go verification stdout/stderr는 실제 실행 결과를 그대로 기록한다.

### 수정 파일 및 체크리스트

- [ ] `CODE_REVIEW-local-G09.md`: 구현 에이전트 소유 섹션을 실제 명령 결과와 일치하게 완성한다.

### 테스트 작성

- 별도 코드 테스트는 작성하지 않는다. 기존 audit tests와 platform-common 회귀를 fresh run으로 확인한다.

### 중간 검증

```bash
rg --sort path -n '[(]output[)]' agent-task/m-policy-history-audit/01_audit_contracts/CODE_REVIEW-local-G09.md
```

기대 결과: 출력 없음. 결과 기록 시에는 `(no matches)`라고 쓴다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-task/m-policy-history-audit/01_audit_contracts/CODE_REVIEW-local-G09.md` | REVIEW_API_EVIDENCE_MATCH-1 |

## 최종 검증

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

기대 결과: platform-common 전체 Go 테스트가 fresh run으로 통과한다. 모든 완료 후 반드시 `CODE_REVIEW-local-G09.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
