<!-- task=m-gito-protosocket-consumer-wire-readiness/02+01_bridge_e2e plan=1 tag=REVIEW_TEST -->

# Plan - REVIEW_TEST

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

`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 필수입니다. 구현 후 검증을 실행하고 실제 stdout/stderr를 붙인 뒤 active 파일을 그대로 두고 리뷰 준비를 보고하세요. 최종 판정, log rename, `complete.log`, archive 이동은 code-review-skill 전용입니다.

구현 중 사용자만 결정할 수 있는 범위 변경, 사용자 소유 외부 환경/secret, 또는 scope conflict가 없이는 안전하게 진행할 수 없으면 review stub의 `사용자 리뷰 요청` 섹션에 근거와 재개 조건을 채우고 멈추세요. 구현 에이전트는 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않으며, `USER_REVIEW.md`, archive log, `complete.log`를 만들지 않습니다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 닫을 수 있는 증거 공백은 사용자 리뷰가 아닙니다.

## 배경

이 후속 계획은 첫 리뷰에서 발견된 Required 하나만 닫습니다. 새 wire-to-bridge e2e 테스트가 binary proto-socket event를 받기는 하지만, scanner fake가 event `After` revision을 읽지 않아 wire payload의 revision handoff를 검증하지 못합니다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록합니다. 구현 에이전트의 직접 사용자 질문은 금지되며, code-review가 해당 요청을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정합니다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/agent-ops-mcp-control-plane/milestones/gito-protosocket-consumer-wire-readiness.md`
- Task ids:
  - `bridge-e2e`: wire-compatible consumer, branch scan, `EnqueueRoadmapCreationSync`까지 이어지는 integration test 또는 dev smoke 추가
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- Archived plan: `agent-task/m-gito-protosocket-consumer-wire-readiness/02+01_bridge_e2e/plan_cloud_G07_0.log`
- Archived review: `agent-task/m-gito-protosocket-consumer-wire-readiness/02+01_bridge_e2e/code_review_cloud_G07_0.log`
- Verdict: FAIL
- Required summary:
  - `services/core/internal/gitosync/runner_test.go`의 새 e2e가 정적 `fakeScanner{out: matchedScanOutput()}`와 `RoadmapRevision == "bbbb"` 기대값을 사용해, wire event `after == "new-sha"`가 scanner/enqueue 경로까지 전달되는지 검증하지 못한다.
- Suggested summary: 없음
- Nit summary: 없음
- Affected files:
  - `services/core/internal/gitosync/runner_test.go`
- Verification evidence:
  - `git diff --check` - PASS; no output
  - `cd services/core && go test ./internal/gitosync -run TestWireConsumer -count=1` - PASS
  - `cd services/core && go test ./...` - PASS
- Allowed archive reread:
  - `agent-task/m-gito-protosocket-consumer-wire-readiness/02+01_bridge_e2e/plan_cloud_G07_0.log`
  - `agent-task/m-gito-protosocket-consumer-wire-readiness/02+01_bridge_e2e/code_review_cloud_G07_0.log`

## 범위 결정 근거

Production code, proto-socket transport, bridge behavior, scheduler args type은 변경하지 않습니다. 이미 존재하는 e2e test fixture만 보강해 계획의 revision handoff 검증 요구를 만족시킵니다.

## 빌드 등급

`cloud-G07`입니다. binary proto-socket, async event delivery, scanner seam, scheduler job args가 함께 걸린 기존 리뷰 경로를 유지합니다.

## 구현 체크리스트

- [ ] `services/core/internal/gitosync/runner_test.go`에 e2e 전용 scanner fake를 추가하거나 기존 fake를 감싸 `BranchUpdatedEvent`의 `RepoID`, `Branch`, `Before`, `After`, milestone `ChangedFiles`를 검증한다.
- [ ] scanner fake가 `ev.After`를 `ScanOutput.Result.Revision.Revision`으로 반영하게 하고 `TestWireConsumerEventEnqueuesCreationSyncOnce`에서 `job.RoadmapRevision == "new-sha"`를 assert한다.
- [ ] `TestWireConsumerDuplicateEventDoesNotReEnqueue`가 새 scanner fixture와 함께 duplicate event를 추가 enqueue로 번지지 않게 유지한다.
- [ ] `git diff --check`와 `cd services/core && go test ./...`를 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## [REVIEW_TEST-1] Tie e2e scanner output to wire event revision

문제: 현재 e2e는 `branchUpdatedEnvelope()`의 `after` 값이 scanner까지 전달되는지 확인하지 않습니다. 정적 `matchedScanOutput()`이 `"bbbb"` revision을 반환하기 때문에 event decode 또는 handoff가 깨져도 test가 통과할 수 있습니다.

해결 방법: `runner_test.go`에 recording scanner를 두어 받은 `gitoevents.BranchUpdatedEvent`를 검사하고, `matchedScanOutput()` 기반 output의 `Result.Revision.Revision`을 `ev.After`로 바꿔 반환합니다. happy path test는 `job.RoadmapRevision == "new-sha"`를 기대해야 합니다.

수정 파일 및 체크리스트:

- [ ] `runner_test.go`에 recording scanner helper를 추가한다.
- [ ] helper가 `RepoID`, `Branch`, `Before`, `After`, milestone changed file presence를 검증한다.
- [ ] helper가 반환하는 `ScanOutput.Result.Revision.Revision`과 최종 `job.RoadmapRevision`이 wire event `after`와 일치하게 한다.
- [ ] duplicate test가 same-after duplicate를 계속 한 번만 enqueue한다고 검증한다.

테스트 작성: 필수. 기존 테스트를 보강하고 새 production API는 만들지 않습니다.

중간 검증:

```bash
cd services/core && go test ./internal/gitosync -run 'TestWireConsumer(EventEnqueuesCreationSyncOnce|DuplicateEventDoesNotReEnqueue)' -count=1
```

## 최종 검증

```bash
git diff --check
cd services/core && go test ./...
```

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
