# Milestone: Gito HTTP Webhook Consumer Readiness

## 위치

- Roadmap: `agent-roadmap/ROADMAP.md`
- Phase: `agent-roadmap/phase/agent-ops-mcp-control-plane/PHASE.md`

## 목표

NomadCode Core의 Gito branch event consumer를 Gito 제공 계약 `gito.forgejo-branch-events.v1`의 signed HTTP webhook delivery와 맞춘다. Gito는 외부/인접 consumer에게 `/proto-socket` binary transport를 요구하지 않으며, NomadCode는 `branch.updated` JSON delivery를 wakeup signal로 받아 target branch revision을 재검증한 뒤 기존 creation sync enqueue 흐름으로 수렴한다.

## 상태

[완료]

## 승격 조건

- 없음

## 구현 잠금

- 상태: 해제
- SDD: 필요
- SDD 문서: `agent-roadmap/sdd/agent-ops-mcp-control-plane/gito-http-webhook-consumer-readiness/SDD.md`
- 잠금 해제 조건:
  - [x] SDD 잠금이 해제되어 있다
  - [x] SDD 사용자 리뷰가 없거나 승인/해결되었다
  - [x] Acceptance Scenario가 Milestone 기능 Task와 연결되어 있다
  - [x] Evidence Map이 plan의 `Spec Targets`와 완료 시 `Spec Completion`으로 검증 가능하게 연결되어 있다
  - [x] Workspace lock `nomadcode:gito-http-webhook-consumer-readiness`의 모든 `rely-on.status`가 `enable`이다
- 결정 필요: 없음

## 범위

- Gito -> NomadCode signed HTTP webhook callback endpoint
- `X-Gito-Event`, `X-Gito-Delivery`, `X-Gito-Signature` 기준의 delivery 검증과 idempotency 경계
- Gito `branch.updated` base payload를 NomadCode 전용 필수 필드 없이 소비하는 schema boundary
- 기존 `gitoevents` decode/filter와 `gitosync` branch scan/enqueue 의미 로직의 HTTP transport 재연결
- Gito webhook subscription bootstrap과 NomadCode callback/secret 설정 문서화
- invalid signature, malformed payload, duplicate delivery, not-ready revision, Gito retry에 대한 운영 로그와 실패 처리

## 기능

### Epic: [webhook-consumer] Gito HTTP webhook intake

NomadCode Core가 Gito branch event delivery를 외부 HTTP callback으로 받고, Gito 원문 계약을 source of truth로 소비한다.

- [x] [receiver] Gito `branch.updated` HTTP callback endpoint를 추가한다. 검증: signed `branch.updated` delivery는 수락되고, wrong event와 invalid signature는 side effect 없이 거부된다.
- [x] [payload-boundary] Gito base payload를 repo/branch/revision/change hint 중심으로 해석하고 NomadCode 전용 필드를 요구하지 않는다. 검증: NomadCode 전용 필드 없이도 on-target event가 decode된다.
- [x] [idempotency] `X-Gito-Delivery`와 revision key 기준으로 duplicate delivery를 중복 enqueue 없이 처리한다. 검증: 같은 delivery 또는 같은 revision 재전달이 정확히 한 번의 sync 후보로 수렴한다.

### Epic: [sync-bridge] Revision verification and creation sync

HTTP webhook wakeup을 기존 branch revision 재검증과 creation sync enqueue 의미 로직으로 연결한다.

- [x] [scan-enqueue] HTTP receiver에서 받은 on-target event가 target branch fetch/scan 이후 `EnqueueRoadmapCreationSync`로 이어진다. 검증: 한 건의 Gito webhook delivery가 target branch 재검증 후 정확히 하나의 creation sync job으로 수렴한다.
- [x] [config-docs] `GITO_PROTO_SOCKET_URL` 중심의 소비자 설정을 webhook callback endpoint, signing secret, Gito subscription bootstrap 기준으로 교체한다. 검증: secret 원문 없이 local/dev webhook consumer 설정 경로가 문서화된다.
- [x] [failure-ops] invalid signature, malformed payload, not-ready revision, duplicate delivery, Gito retry가 core server shutdown이나 중복 Plane mutation으로 이어지지 않는다. 검증: 장애 입력이 안전하게 reject/drop/retry 후보로 기록된다.

## 완료 리뷰

- 상태: 통과
- 요청일: 2026-06-19
- 완료 근거:
  - `scan-enqueue`가 `agent-task/archive/2026/06/m-gito-http-webhook-consumer-readiness/03+01,02_http_scan_enqueue/complete.log`의 Roadmap Completion과 Spec Completion(S04) PASS 근거로 완료되었다.
  - 모든 기능 Task가 체크되었고 SDD는 `[승인됨]`/잠금 해제, workspace lock은 `agent-ops/bin/roadmap-dependency-checker.sh` 결과 `true`로 확인했다.
  - 코드 레벨 종료 감사에서 Gito 제공 계약에 맞춰 `X-Gito-Delivery` 누락 delivery를 side effect 없이 `400`으로 거부하도록 보강했고, 관련 테스트를 갱신했다.
  - 최종 검증은 `cd services/core && go test -count=1 ./cmd/server ./internal/http ./internal/gitosync ./internal/config`, `cd services/core && go test -count=1 ./...`, `git diff --check` PASS로 확인했다.
- 리뷰 필요:
  - [x] 사용자가 완료 결과를 확인했다
  - [x] archive 이동을 승인했다
- 리뷰 코멘트: 코드 레벨 종료 감사와 소규모 계약 보강 후 완료/archive 대상으로 확정했다.

## 범위 제외

- Gito Forgejo webhook producer와 outbound webhook delivery worker 구현
- Gito 제공 계약 `gito.forgejo-branch-events.v1` 원문 변경
- Gito event schema를 NomadCode 전용 필드로 확장하는 작업
- Plane `Todo -> In Progress` 실행 lifecycle
- Milestone Task와 Plane 하위 티켓 동기화
- Flutter UI에서 branch event 상태를 표시하는 기능

## 작업 컨텍스트

- 관련 경로: `services/core/internal/gitoevents/`, `services/core/internal/gitosync/`, `services/core/internal/http/`, `services/core/cmd/server/main.go`, `services/core/internal/config/`, `services/core/docker-compose.yml`, `README.md`, `packages/contracts/notes/flutter-core-api-candidates.md`
- 외부 계약: Gito `agent-contract/provided/gito-forgejo-branch-events-v1.md` (`gito.forgejo-branch-events.v1`)
- 관련 Gito Milestone: `Forgejo Branch Event MVP`, `Webhook Revision Reconcile`
- 표준선(선택): NomadCode는 Gito `branch.updated` delivery를 wakeup signal로만 사용하고, 최종 판단은 target branch fetch/scan과 provider identity 재검증으로 수행한다. Gito schema는 여러 consumer를 위한 범용 규약이며, Gito -> external consumer delivery는 HTTP webhook/callback이고 `/proto-socket`은 Gito 내부 control/runtime transport로 본다.
- 이전 방향 정리: `Gito Proto-Socket Consumer Wire Readiness`는 archive된 완료 기록으로 보존하되, 현재 프로젝트 방향에서는 NomadCode/Gito 외부 소비 표면으로 재사용하지 않는다.
- 우선순위: 최우선 - `Roadmap Driven Agent-Ops Automation`과 `Milestone Execution Lifecycle Sync`보다 먼저 SDD gate와 Gito 외부 의존 잠금 상태를 정리한다.
- 선행 작업: Gito 제공 계약 `gito.forgejo-branch-events.v1`의 HTTP webhook delivery 경계 확인
- 외부 의존 잠금: Gito `agent-roadmap/phase/provider-change-request-integration/milestones/webhook-revision-reconcile.md`의 consumer webhook subscription과 signed HTTP delivery 구현이 완료되어야 실제 연동 구현/검증을 닫을 수 있다.
- 후속 작업: Milestone Execution Lifecycle Sync
- 확인 필요:
  - [x] SDD 작성과 gate 확인 후 구현 잠금을 해제한다.
