Sprint 001 전체 구현: Foundation: - package.json (pnpm + Node 22 + TypeScript strict) - tsconfig.json (strict + noUncheckedIndexedAccess) - .env.example (DATABASE_URL, DISCORD_TOKEN, etc.) - vitest.config.ts Core: - src/env.ts — Zod 환경변수 검증 - src/logger.ts — pino 구조화 로거 - src/orchestrator/events.ts — Zod discriminated union 이벤트 스키마 - src/orchestrator/context.ts — PipelineContext 타입 + 팩토리 - src/orchestrator/machine.ts — XState v5 결정론적 FSM States: idle → planning → implementing → reviewing → deploying → done + retrying (exponential backoff 준비) + escalated + aborted - src/orchestrator/persist.ts — Prisma 기반 상태 영속화 - prisma/schema.prisma — MariaDB 스키마 (pipelines, state_transitions, actor_spawns, contracts) CLI (citty): - rails start <project> — 파이프라인 생성 - rails status [id] — 상태 조회 + 타임라인 - rails serve — 오케스트레이터 서버 (Sprint 004 에서 완성) Tests (9/9 pass): - happy path (idle → done) - REQUEST_CHANGES 재작업 루프 + max review round escalation - retryable/non-retryable 에러 분기 - RESUME / ABORT - context 추적 검증: pnpm tsc --noEmit ✓ | pnpm vitest run 9/9 ✓ | pnpm build ✓ | rails --help ✓ Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
hanarang-rails
4자매가 달릴 결정론적 레일 — HaNaRang Rails
hanarang-harness의 후계작. 기존 하네스가 "권고 기반 파이프라인"이라 자매들이 레일을 벗어나 끊기고 엇갈리던 문제를 강제 기반 결정론 파이프라인으로 재설계한다.
왜 다시?
hanarang-harness에서 발견된 6가지 실패 모드:
| 코드 | 증상 | 원인 |
|---|---|---|
| F1 | 하네스 skill bypass — 자매가 worker 혼자 스폰하고 처리 | skill 진입 강제 없음 |
| F2 | DoD 자동 강제 실패 — build 통과 = 완료로 간주 | sprint contract / validator 없음 |
| F3 | QA 단계 누락 — 사용자가 수동으로 다랑이 호출 | 자동 라우팅 없음 |
| F4 | 핸드오프 멘션 불안정 — 잘못된 자매 호출 | Lobster 분기가 LLM에 의존 |
| F5 | 중간 끊김 — request-timed-out 반복, xhigh 무한대기 | 재시도/fallback 정책 없음 |
| F6 | 환경 검증 누락 — "서버에 Docker 없음" 으로 skip 용인 | 환경 전제 검사 없음 |
6가지 원칙
- 결정론적 라우터 — LLM 판단이 아니라 XState FSM으로 자매 간 전이
- Sprint Contract 강제 — DoD를 Zod 스키마로 정의, validator가 pass/fail 판정
- Skill 강제 진입 — skill bypass를 hook으로 감지해 차단
- 상태 전이 기반 핸드오프 — 멘션은 사용자 알림 전용, 자매 간 통신은 FSM 상태
- 재시도/에스컬레이션 — timeout 자동 재시도, N회 실패 시 사용자 에스컬레이션
- QA 체크리스트 강제 — 스프린트 타입별 템플릿, 다랑이가 체크박스 다 채워야 pass
아키텍처 개요
사용자 (디스코드)
│
▼
┌────────────────────────────────────┐
│ hanarang-rails orchestrator │
│ (XState FSM + SQLite + validator) │
└──────────────────┬─────────────────┘
│
┌───────────┼───────────┬───────────┐
▼ ▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ 하랑 │ │ 나랑 │ │ 다랑 │ │ 이랑 │
│Planner│ │ Impl │ │ QA │ │Deploy│
└──────┘ └──────┘ └──────┘ └──────┘
│ │ │ │
└───────────┴─ OpenClaw spawn ──────┘
│
▼
┌────────────┐
│ Discord 알림│ ← 사용자 알림 전용
└────────────┘
기술 스택
| 레이어 | 선택 |
|---|---|
| 런타임 | Node 22 + TypeScript (strict) |
| 상태 머신 | XState v5 |
| 스키마 | Zod |
| 영속화 | SQLite (better-sqlite3) |
| 프로세스 | execa + AbortController |
| CLI | citty |
| 로그 | pino |
| 디스코드 | discord.js v14 |
| 테스트 | Vitest |
상태
🚧 기획 단계 — .plans/ 디렉토리 참조.
자세한 내용:
.plans/OVERVIEW.md— 프로젝트 전체 개요.plans/failure-audit.md— 실패 감사.plans/design/— 설계 문서.plans/sprints/— 스프린트 상세
라이선스
MIT
Languages
TypeScript
95.7%
Shell
3.3%
Dockerfile
0.7%
JavaScript
0.3%