diff --git a/agent-roadmap/phase/control-plane-foundation/milestones/branch-event-protosocket-interop-readiness.md b/agent-roadmap/archive/phase/control-plane-foundation/milestones/branch-event-protosocket-interop-readiness.md similarity index 93% rename from agent-roadmap/phase/control-plane-foundation/milestones/branch-event-protosocket-interop-readiness.md rename to agent-roadmap/archive/phase/control-plane-foundation/milestones/branch-event-protosocket-interop-readiness.md index 73076a9..43b5acd 100644 --- a/agent-roadmap/phase/control-plane-foundation/milestones/branch-event-protosocket-interop-readiness.md +++ b/agent-roadmap/archive/phase/control-plane-foundation/milestones/branch-event-protosocket-interop-readiness.md @@ -11,7 +11,7 @@ Forgejo push webhook에서 정규화된 `branch.updated` event를 여러 외부 ## 상태 -[검토중] +[완료] ## 승격 조건 @@ -46,16 +46,16 @@ Gito가 제공하는 branch event producer 표면을 문서상 계약이 아니 ## 완료 리뷰 -- 상태: 요청됨 +- 상태: 승인됨 - 요청일: 2026-06-15 - 완료 근거: - `services/core/internal/controlplane/binary_interop_test.go`가 branch watch 등록, binary proto-socket `event.subscribe`, Forgejo push callback, `branch.updated` 수신을 한 경로로 검증한다. - `agent-contract/provided/gito-forgejo-branch-events-v1.md`에 binary protobuf frame, consumer-neutral base payload, 운영 smoke 절차가 정리되어 있다. - `cd services/core && go test -run TestBinaryProtoSocketBranchUpdated ./internal/controlplane -count=1` 통과. - 리뷰 필요: - - [ ] 사용자가 완료 결과를 확인했다 - - [ ] archive 이동을 승인했다 -- 리뷰 코멘트: 모든 기능 Task가 완료 근거와 함께 충족되어 완료 후보로 올린다. 사용자 확인과 archive 승인 전까지 활성 Milestone으로 유지한다. + - [x] 사용자가 완료 결과를 확인했다 + - [x] archive 이동을 승인했다 +- 리뷰 코멘트: 2026-06-16 코드레벨 종료 검토에서 producer-side binary proto-socket interop, consumer-neutral payload, smoke 문서, core test가 확인되어 완료 승인 후 archive 이동한다. ## 범위 제외 diff --git a/agent-roadmap/phase/control-plane-foundation/PHASE.md b/agent-roadmap/phase/control-plane-foundation/PHASE.md index cc82252..bbf6975 100644 --- a/agent-roadmap/phase/control-plane-foundation/PHASE.md +++ b/agent-roadmap/phase/control-plane-foundation/PHASE.md @@ -30,14 +30,14 @@ Gito의 초기 control plane을 build 가능한 modular monolith로 구성한다 - 경로: `agent-roadmap/archive/phase/control-plane-foundation/milestones/operation-event-outbox.md` - 요약: operation lifecycle, idempotency, audit event, outbox 발행을 PostgreSQL 기준으로 구성한다. +- [완료] Branch Event Proto-Socket Interop Readiness + - 경로: `agent-roadmap/archive/phase/control-plane-foundation/milestones/branch-event-protosocket-interop-readiness.md` + - 요약: NomadCode 연동 MVP의 Gito producer slice로, `branch.updated` producer 계약을 실제 proto-socket binary wire format, consumer-neutral schema, 다중 소비자 호환 fixture 기준으로 굳힌다. + - [검토중] Runtime Scaffold and Contract Baseline - 경로: `agent-roadmap/phase/control-plane-foundation/milestones/runtime-scaffold-and-contract-baseline.md` - 요약: Go command, Flutter control surface placeholder, contracts, agent-ops, README, architecture 문서를 실행 가능한 기준선으로 정리한다. -- [검토중] Branch Event Proto-Socket Interop Readiness - - 경로: `agent-roadmap/phase/control-plane-foundation/milestones/branch-event-protosocket-interop-readiness.md` - - 요약: NomadCode 연동 MVP의 Gito producer slice로, `branch.updated` producer 계약을 실제 proto-socket binary wire format, consumer-neutral schema, 다중 소비자 호환 fixture 기준으로 굳힌다. - ## Phase 경계 - 이 Phase는 Gito 자체 control plane과 platformless Git 기반만 다룬다. diff --git a/services/core/internal/controlplane/router.go b/services/core/internal/controlplane/router.go index 89bfd26..6d634c0 100644 --- a/services/core/internal/controlplane/router.go +++ b/services/core/internal/controlplane/router.go @@ -200,7 +200,9 @@ func handleForgejoPush(cfg config.Config, runtime *Runtime) http.HandlerFunc { resp := map[string]any{ "accepted": true, "matched": matched, - "event": eventRecordPayload(record), + } + if matched { + resp["event"] = eventRecordPayload(record) } if record.Duplicate { resp["duplicate"] = true diff --git a/services/core/internal/controlplane/router_test.go b/services/core/internal/controlplane/router_test.go index 767fb1b..f021037 100644 --- a/services/core/internal/controlplane/router_test.go +++ b/services/core/internal/controlplane/router_test.go @@ -178,6 +178,9 @@ func TestForgejoPushIgnoresUnwatchedBranch(t *testing.T) { if pushed["matched"] != false { t.Fatalf("expected push to be ignored: %#v", pushed) } + if _, ok := pushed["event"]; ok { + t.Fatalf("unmatched push must not expose an emitted event: %#v", pushed) + } } func TestForgejoPushRequiresSignatureBeforeIgnoringUnsupportedEvent(t *testing.T) {