---
name: update-contract
version: 1.0.0
description: agent-contract inner/outer 계약 문서를 갱신하고 흩어진 계약 설명을 정리한다. 계약 업데이트해, 프로젝트 계약 업데이트해, 계약 갱신/수정/정리, contract update 요청에서 사용한다.
---

# update-contract

## 목적

기존 `agent-contract/`의 inner/outer 계약 문서를 최신 코드와 문서 기준으로 갱신한다.
계약 원문은 한 곳에 모으고, README/docs/rules에는 포인터와 경계 규칙만 남긴다.

## 언제 호출할지

- 사용자가 계약 업데이트, 프로젝트 계약 업데이트, 계약 갱신, 계약 수정, 계약 정리를 요청할 때
- API, runtime 호출, wire protocol, event/config schema 변경이 기존 계약에 영향을 줄 때
- 계약 설명이 README/docs/rules/code review 과정에서 다시 흩어진 것을 정리할 때
- legacy `provided/consumed` 계약을 `inner/outer` 모델로 점진 정리할 때

## 입력

- `contract-id`: 갱신할 계약 식별자 (선택, 없으면 index와 변경 diff에서 탐색)
- `change`: 바뀐 내용 또는 정리할 문제 요약 (선택, 없으면 최근 변경/요청 맥락에서 산출)
- `boundary`: `inner` 또는 `outer` (선택, 기존 문서 우선)
- `canonical-path`: 갱신 기준이 되는 proto/OpenAPI/config/code 원본 경로 (선택)

## 먼저 확인할 것

- [ ] `agent-contract/index.md` 존재 여부를 확인한다. 없으면 create-contract 흐름으로 전환할지 판단한다.
- [ ] index에서 대상 계약 문서를 찾는다. 없으면 새 계약 생성 대상인지 판단한다.
- [ ] 대상 계약 문서와 원본 경로를 읽는다.
- [ ] 변경 범위와 관련된 코드, proto, config, 테스트를 읽어 실제 동작을 확인한다.
- [ ] README/docs/rules에 계약 본문이 새로 중복 작성되었는지 검색한다.
- [ ] legacy `provided/consumed/` 구조가 남아 있으면 현재 요청이 구조 migration인지 단순 계약 갱신인지 구분한다.

## 실행 절차

1. **대상 확정**
   - index의 `Outer Contracts`/`Inner Contracts`에서 계약을 찾는다.
   - `contract-id`가 없으면 요청 키워드, 변경 파일, 코드 diff, README/docs/rules의 계약 설명을 기준으로 영향을 받는 계약을 좁힌다.
   - legacy index만 있으면 `provided`는 outer 후보, 프로젝트 내부 runtime/wire 계약은 inner 후보로 분류하되 즉시 이동하지 말고 변경 범위와 함께 판단한다.
   - 대상이 없고 요청이 계약 생성/정리까지 허용하면 create-contract 흐름으로 전환한다.
   - 대상이 없고 사용자가 특정 기존 계약 갱신만 요청했다면 대상 부재를 보고한다.

2. **코드 우선 분석**
   - 원본 경로를 먼저 확인한다.
   - 실제 parser/handler/DTO/interface/test에서 필드 의미와 허용/거부 동작을 확인한다.
   - 문서와 코드가 다르면 코드를 근거로 계약 문서를 갱신하고, 코드가 틀렸을 가능성이 있으면 사용자에게 후보를 제시한다.

3. **계약 문서 갱신**
   - 필드 의미, 금지 사항, 읽는 조건, 변경 시 테스트를 최신 상태로 맞춘다.
   - schema 원본 전체를 복제하지 않고 핵심 의미와 원본 경로를 유지한다.
   - 불확실한 값은 단정하지 않고 `확인 필요`로 남긴다.
   - `last updated` 같은 날짜 메타가 이미 있는 문서에서만 갱신한다. 없는 문서에 날짜 관례를 새로 만들지 않는다.

4. **index 갱신**
   - 읽는 조건이 새 API/field/message/protocol 이름을 포함하는지 확인한다.
   - path, 원본 경로, boundary가 실제 문서와 일치하는지 확인한다.
   - 중복 id, dead path, 존재하지 않는 원본 경로를 제거하거나 수정한다.
   - 프로젝트 전용 path trigger가 필요하면 `agent-contract/index.md` 또는 project/domain rule 포인터에 둔다. common rule에는 넣지 않는다.

5. **흩어진 문서 정리**
   - README/docs/rules에 계약 본문이 들어간 경우 계약 문서 포인터로 축소한다.
   - domain rule에는 책임 경계와 금지 사항만 남기고 상세 요청/응답 schema를 반복하지 않는다.
   - 테스트 문서에는 검증 기준만 남기고 계약 본문을 복제하지 않는다.
   - common rule에 특정 프로젝트 경로, 계약 id, API 이름이 새로 들어갔으면 제거하고 프로젝트 문서로 옮긴다.

6. **검증 판단**
   - 계약 문서만 바꿨으면 링크/path/index 정합성을 확인한다.
   - 원본 schema 또는 runtime 코드를 함께 바꿨으면 해당 domain/test rule의 검증 기준을 따른다.
   - proto/config schema를 바꿨으면 생성물 갱신 명령과 관련 테스트를 실행한다.

7. **결과 보고**
   - 수정한 계약 문서와 index
   - 코드 분석 근거
   - 중복 제거한 문서
   - 실행한 검증
   - 남은 확인 필요 항목

## 실행 결과 검증

- [ ] index가 대상 계약의 최신 path와 읽는 조건을 가리키는가
- [ ] 계약 문서의 원본 경로가 실제 코드/proto/config와 맞는가
- [ ] README/docs/rules에 같은 계약 본문이 중복 남아 있지 않은가
- [ ] inner/outer boundary가 계약의 실제 소비자와 맞는가
- [ ] 코드 분석 없이 문서만 추측해 갱신하지 않았는가
- [ ] 변경 범위에 필요한 테스트 또는 링크 검증을 실행했는가
- 검증 실패 시: index/path/원본 경로/중복 문서/테스트 누락을 보완한다.

## 출력 형식

```md
## 계약 업데이트 완료

- contract: agent-contract/<inner|outer>/<contract-name>.md
- index: agent-contract/index.md
- code evidence: <확인한 코드/proto/config/test>
- pointers: <갱신한 README/docs/rules 경로 또는 없음>
- verification: <실행한 명령 또는 생략 사유>
- 확인 필요: <항목 또는 없음>
```

## 금지 사항

- 코드와 원본 경로를 확인하지 않고 계약 문서만 고치지 않는다.
- README/docs/rules에 계약 본문을 새로 복제하지 않는다.
- 프로젝트 전용 path trigger를 common rule에 넣지 않는다.
- 사용자 요청 없이 전체 계약 구조를 대량 migration하지 않는다.
- 한 패키지 내부 구현 세부를 inner 계약으로 승격하지 않는다.
- 계약 갱신과 무관한 리팩터링을 함께 수행하지 않는다.
