<!-- task=m-gito-branch-event-creation-sync-bridge/02+01_creation_enqueue_bridge review=0 tag=GITO_CREATION_ENQUEUE -->

# Code Review: Gito Creation Enqueue Bridge

## 리뷰 범위
- Roadmap milestone: `gito-branch-event-creation-sync-bridge`
- Task IDs:
  - `[revision-scan]`
  - `[creation-enqueue]`
  - `[runtime-wiring]`
- Plan: `PLAN-cloud-G07.md`

## 선행 의존성
- [x] `internal/gitoevents` (01_event_client) 구현됨: client.go/events.go + 테스트 통과

## 구현 항목별 완료 여부
- [x] target branch revision scanner 추가 (`internal/gitosync/scanner.go`)
- [x] milestone markdown scan result 변환 추가 (scanner + `ParseMilestoneIdentity`)
- [x] Plane work item 조회 및 job args 구성 추가 (`internal/gitosync/bridge.go`)
- [x] `EnqueueRoadmapCreationSync` bridge 추가 (`Enqueuer` seam)
- [x] duplicate/same revision guard 추가 (`InMemoryRevisionStore`)
- [x] server runtime wiring 추가 (`cmd/server/main.go` + `gitosync/runner.go`)
- [x] scanner/bridge/config 테스트 추가
- [x] 전체 검증 통과

## 리뷰 체크리스트
- [x] Gito `changed_files`를 wakeup hint로만 사용하고 target revision에서 다시 검증하는가 (scanner가 fetch/rev-parse 후 `git diff`/`git show`로 재검증)
- [x] event `after`와 remote target revision mismatch 시 enqueue하지 않는가 (`ErrNotReady`)
- [x] provider identity가 없는 milestone을 잘못 enqueue하지 않는가 (scanner가 Docs에서 제외)
- [x] endpoint/todo-state-id 미설정 시 기존 server 동작이 유지되는가 (`GitoBranchEventsEnabled` 게이트)
- [x] 중복 이벤트가 같은 revision job을 반복 enqueue하지 않는가 (`InMemoryRevisionStore`)

## 검증 명령
- [x] `cd services/core && go test -count=1 ./internal/gitoevents ./internal/gitosync ./internal/roadmapsync ./internal/roadmapsyncpipeline ./internal/scheduler ./internal/config`
- [x] `cd services/core && go test -count=1 ./...`
- [x] `cd services/core && go vet ./...`
- [x] `git diff --check`

## 리뷰 결과
- Status: implemented; pending user review
- Findings: 없음 (전체 검증 통과)

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Fail
  - completeness: Fail
  - test coverage: Fail
  - API contract: Pass
  - code quality: Pass
  - plan deviation: Fail
  - verification trust: Pass
- 발견된 문제:
  - Required: `services/core/internal/gitosync/bridge.go:156`에서 Plane work item의 현재 `State`를 `ProviderRevision`으로 저장하고 있습니다. `roadmapsync.ReconcileCreationCycle`는 기존 identity가 있으면 저장된 `ProviderRevision`과 새 trigger의 `ProviderRevision` mismatch를 conflict로 처리한 뒤 completed ledger 확인에 도달합니다(`services/core/internal/roadmapsync/retry.go:132`). 따라서 첫 sync가 Plane state를 Todo로 옮긴 뒤 프로세스 재시작/메모리 dedup 유실 상태에서 같은 `(repo, branch, after)` 이벤트를 다시 받으면, bridge가 새로 fetch한 `item.State`는 Todo이고 기존 row의 `provider_revision`은 이전 state라서 이미 완료된 ledger라도 `ActionComplete`가 아니라 conflict가 됩니다. 실제 provider revision token이 없는 현재 bridge에서는 `ProviderRevision`을 비워 두거나 안정적인 provider revision 필드를 도입하고, 같은 roadmap revision 재처리가 completed ledger로 `complete`가 되는 테스트를 추가해야 합니다.
- 다음 단계:
  - FAIL 후속: `ProviderRevision`에 mutable Plane state를 넣지 않도록 bridge/job args를 수정하고 재처리 idempotency 테스트를 추가한다.

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

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-cloud-G07.md`를 `code_review_cloud_G07_0.log`로 아카이브한다.
- [x] active `PLAN-cloud-G07.md`를 `plan_cloud_G07_0.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [ ] PASS이면 active task 디렉터리 `agent-task/{task_name}/`를 `agent-task/archive/YYYY/MM/{task_name}/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/{task_group}/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [x] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-cloud-G07.md`와 `CODE_REVIEW-cloud-G07.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
