# Milestone: Change Request Abstraction

## 위치

- Roadmap: `agent-roadmap/ROADMAP.md`
- Phase: `agent-roadmap/phase/provider-change-request-integration/PHASE.md`

## 목표

GitHub PR, GitLab MR, Gitea PR을 Gito의 provider-neutral `ChangeRequest`로 묶는다. 외부 소비자는 provider별 이름을 몰라도 create, update, comment, request review, merge, close 같은 공통 action을 사용할 수 있어야 한다.

## 상태

[완료]

## 승격 조건

- 없음

## 구현 잠금

- 상태: 해제
- SDD: 불필요 - 현재 ChangeRequest abstraction은 provider-neutral DTO/action/event 계약 후보를 정리하는 범위이며, provider별 실제 쓰기 API 구현은 범위 제외다.
- 결정 필요: 없음

## 범위

- ChangeRequest domain DTO
- provider-neutral action set
- provider adapter mapping
- checks/review/comment 최소 공통 shape
- provider-specific extension field 경계

## 기능

### Epic: [cr-model] ChangeRequest model

PR/MR-like 객체를 공통 domain으로 표현한다.

- [x] [shape] source branch, target branch, title, body, draft, state, external id를 포함하는 ChangeRequest shape를 확정한다.
- [x] [actions] create, update, comment, request review, merge, close action을 정의한다.
- [x] [events] opened, updated, merged, closed event를 normalized event로 매핑한다.

### Epic: [adapter-map] Adapter mapping

provider별 API 차이를 adapter 안에 격리한다.

- [x] [github-map] GitHub PR mapping 후보를 작성한다.
- [x] [gitlab-map] GitLab MR mapping 후보를 작성한다.
- [x] [gitea-map] Gitea PR mapping 후보를 작성한다.
- [x] [extension] provider-specific field를 공통 DTO 밖 확장 영역에 둔다.

## 완료 리뷰

- 상태: 통과
- 요청일: 2026-06-20
- 완료일: 2026-06-20
- 완료 근거:
  - `ChangeRequest` shape/action/event와 GitHub/GitLab/Gitea mapping 후보 및 provider extension 경계를 구현했다.
  - 코드 레벨 검토에서 `core.ChangeRequest`, provider mapping, normalized event, contract note, 관련 tests가 마일스톤 기능 Task와 일치함을 확인했다.
  - 검증: `cd services/core && go test -count=1 ./...`, contracts/workspace smoke `rg`, `git diff --check` 통과.
- 남은 차단 항목: 없음
- 리뷰 필요:
  - [x] 사용자가 완료 결과 확인을 요청했고 코드 레벨 검토가 통과했다.
  - [x] 사용자가 종료 가능 시 archive 이동을 요청했다.
- 리뷰 코멘트: `[완료]` 전환 및 archive 이동 완료.

## 범위 제외

- provider별 완전한 API client 구현
- CI provider integration
- branch protection/permission API
- Flutter PR/MR 화면

## 작업 컨텍스트

- 관련 경로: `services/core/internal/core/`, `services/core/internal/provider/`, `packages/contracts/notes/gito-control-plane.md`
- 표준선(선택): provider-neutral interface를 먼저 정의하고 provider-specific DTO는 adapter 내부에 둔다.
- 선행 작업: Provider Adapter Foundation
- 후속 작업: Webhook Revision Reconcile
- 확인 필요: 없음
