Files
hanarang-rails/.plans/sprints/SPRINT-003-contract.md
이랑이 bac114d469 docs(plans): Sprint 000 — 전체 플랜 문서 세트 작성
- CLAUDE.md 를 .claude/rules/ 4파일로 분할 (project/stack/principles/workflow)
- Plans.md 루트 인덱스 (스프린트 목차 + 참조만)
- hooks/ pre/post-tool.sh 스켈레톤 (no-op, Sprint 002에서 구현)
- .plans/OVERVIEW.md — 목표/범위/성공기준 8개
- .plans/failure-audit.md — F1~F6 실패 감사 (증거 기반)
- .plans/design/ 6개 문서:
  * state-machine.md (XState v5 FSM 설계)
  * sprint-contract.md (Zod schema + validator)
  * skill-enforcement.md (4계층 방어)
  * handoff.md (상태 전이 기반 자매 통신)
  * retry-policy.md (backoff + escalation)
  * qa-template.md (체크리스트 runtime)
- .plans/sprints/ 8개 스프린트 명세 (SPRINT-000~007)
- .plans/migration/from-hanarang-harness.md (자산 매트릭스 + 단계별 가이드)

총 17개 문서, 약 2146 lines.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:36:49 +09:00

66 lines
3.2 KiB
Markdown

# SPRINT-003 — Sprint Contract + DoD Validator
> **목표**: F2 (DoD 강제 실패), F6 (환경 검증 누락) 해결. contract 가 기계 판정 가능하고 불변이며 validator 가 pass/fail 을 확정한다.
## Type
`feature`
## Prerequisites
- Sprint 001 완료 (FSM + store)
- `.plans/design/sprint-contract.md` 확정
## Scope
- `src/contract/schema.ts` — Zod schema 전체 (SprintContract + 하위 타입)
- `src/contract/checks/` — check kind 별 구현 (file_exists, command_success, regex_in_file, http_status, db_query, process_listening, artifact_schema, manual)
- `src/contract/validator.ts` — 전체 검증 파이프라인 (prerequisites → runtime → dod → verdict)
- `src/contract/generator.ts` — 스프린트 md → contract 초안
- `src/contract/store.ts` — SQLite `contracts` 테이블 + frozen_at
- `rails contract <subcommand>` CLI 전 서브커맨드 구현 (generate / edit / freeze / validate / show / history)
- Fixture: SPRINT-001 contract 샘플
- 테스트: 각 check kind 단위 테스트 + validator integration 테스트
## Non-Goals
- manual check 의 LLM 판단 로직 (Sprint 006)
- contract 의 diff/merge 도구
- 시각화 UI
## Tasks
| # | 내용 | DoD | Status |
|---|---|---|---|
| 3.1 | Zod schema 전체 (`SprintContract`) | 타입체크 pass | cc:TODO |
| 3.2 | `src/contract/checks/file_exists.ts` | unit test pass | cc:TODO |
| 3.3 | `src/contract/checks/command_success.ts` (execa + timeout) | timeout 테스트 포함 | cc:TODO |
| 3.4 | `src/contract/checks/regex_in_file.ts` | unit test | cc:TODO |
| 3.5 | `src/contract/checks/http_status.ts` | mock server 테스트 | cc:TODO |
| 3.6 | `src/contract/checks/db_query.ts` | fixture SQLite 테스트 | cc:TODO |
| 3.7 | `src/contract/checks/process_listening.ts` | port open/close 테스트 | cc:TODO |
| 3.8 | `src/contract/checks/artifact_schema.ts` | Zod 검증 위임 | cc:TODO |
| 3.9 | `src/contract/checks/manual.ts` — placeholder (Sprint 006 에서 활성) | 현재는 SKIP | cc:TODO |
| 3.10 | `src/contract/validator.ts` — 전체 파이프라인 | integration test | cc:TODO |
| 3.11 | `src/contract/generator.ts` — md 파싱 → draft contract | SPRINT-001 으로 generate 테스트 | cc:TODO |
| 3.12 | `src/contract/store.ts` — frozen_at 불변성 | write 거부 테스트 | cc:TODO |
| 3.13 | `rails contract generate/edit/freeze/validate/show/history` | 전 서브커맨드 동작 | cc:TODO |
| 3.14 | Environment prerequisite 체크 (ABORT_PRECHECK) | pre-check fail 테스트 | cc:TODO |
| 3.15 | SPRINT-001 샘플 contract 생성 + validate | PASS 결과 확인 | cc:TODO |
## Definition of Done
### 자동
- `rails contract generate SPRINT-001` → JSON 생성
- `rails contract freeze <id>``frozen_at` 세팅 + ro 퍼미션
- `rails contract validate <id>` → PASS / FAIL / ABORT_PRECHECK 중 하나 명확 출력
- frozen contract 에 write 시도 시 에러
- env prerequisite 미달 → `ABORT_PRECHECK`
- 단일 check 종류별 테스트 8개 이상 pass
### 수동
- [ ] "build 통과 = 완료" 시나리오를 수동 테스트. FAIL 판정 확인
- [ ] contract JSON 이 사람이 읽기 좋은 포맷
## Exit Criteria
F2 / F6 재현 불가. 어떤 스프린트도 contract 없이 시작될 수 없고, build 만으로 PASS 받을 수 없다.