# Milestone: Operation Event Outbox

## 위치

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

## 목표

operation lifecycle과 normalized event를 PostgreSQL 원장에 기록하고, proto-socket event stream 또는 future Redis fanout이 읽을 수 있는 outbox 경계를 만든다. 재시도와 중복 적용은 idempotency key로 제어한다.

## 상태

[완료]

## 승격 조건

- 없음

## 구현 잠금

- 상태: 해제
- 결정 필요: 없음

## 범위

- operation lifecycle model
- idempotency key와 duplicate guard
- operation event/outbox table
- worker가 pending operation을 pick하는 store boundary
- proto-socket event stream이 사용할 event shape

## 기능

### Epic: [operation] Operation lifecycle

Git operation, agent run, provider projection을 같은 operation 원장으로 관리한다.

- [x] [op-model] operation type/state/idempotency schema를 확정한다.
- [x] [op-store] operation create/start/succeed/fail/cancel store boundary를 만든다. 검증: invalid transition과 idempotency duplicate를 테스트한다.
- [x] [op-pick] worker가 pending operation을 안전하게 pick하는 기준을 만든다. 검증: 같은 operation이 중복 pick되지 않는다.

### Epic: [outbox] Durable events

operation 결과를 durable event로 남기고 fanout 대상이 읽을 수 있게 한다.

- [x] [event-model] normalized event type과 payload 저장 형식을 정리한다.
- [x] [event-store] event append/list/mark-published boundary를 만든다. 검증: event order와 retry 가능한 publish 상태를 확인한다.
- [x] [protosocket-events] proto-socket `event` channel 후보와 outbox event mapping을 contracts에 기록한다.

## 완료 리뷰

- 상태: 승인됨
- 요청일: 2026-06-14
- 완료 근거:
  - `agent-task/archive/2026/06/m-operation-event-outbox_1/complete.log`의 Roadmap Completion이 `event-store` PASS를 기록했다.
  - 원격 code-server compose의 `code-server-postgres`에 `gito_test` DB를 만들고 `TestPostgresOperationEventStoreAppendsListsMarksPublishedAndValidates`를 `SKIP` 없이 PASS했다.
  - `cd /config/workspace/gito/services/core && GITO_TEST_DATABASE_URL=<redacted> go test ./... -count=1`이 PASS했다.
  - 2026-06-14 코드레벨 재검토에서 operation lifecycle/store/pick/outbox 경계와 계약 shape를 확인했고, operation event fixture를 계약 payload 형식에 맞춘 뒤 검증을 통과했다.
- 리뷰 필요:
  - [x] 사용자가 완료 결과를 확인했다
  - [x] archive 이동을 승인했다
- 리뷰 코멘트: 모든 기능 Task와 명시 검증이 evidence와 함께 충족되었고, 코드레벨 재검토와 통합 검증 PASS 후 사용자 조건부 승인에 따라 `[완료]` 및 archive 이동을 진행했다.

## 범위 제외

- Redis Streams 구현
- provider-specific projection
- Flutter event UI
- distributed scheduler 최적화

## 작업 컨텍스트

- 관련 경로: `services/core/internal/events/`, `services/core/internal/storage/`, `services/core/internal/worker/`, `services/core/migrations/`
- 표준선(선택): Postgres outbox가 event source of truth이며 Redis는 optional acceleration이다.
- 현재 작업현황: `event-store` 구현과 DB-backed 검증, 코드레벨 재검토가 완료되어 Milestone은 `[완료]` 처리 후 archive로 이동했다.
- 검증 완료: 원격 code-server compose의 `code-server-postgres`에서 `gito_test` DB를 사용해 event order, retry 가능한 pending publish 상태, mark-published 동작을 검증했다.
- 선행 작업: Platformless Git Operation Engine
- 후속 작업: Agent Shell Runtime Channel
- 확인 필요: 없음
