diff --git a/.claude/rules/07-workflow.md b/.claude/rules/07-workflow.md index edc112bc..85274037 100644 --- a/.claude/rules/07-workflow.md +++ b/.claude/rules/07-workflow.md @@ -1,586 +1,85 @@ -# AI 작업 진행 규약 +# AI 작업 진행 규약 — 본 프로젝트 전용 사항 -이 문서는 Claude / Copilot 등 AI 협업 도구가 본 프로젝트에서 작업을 진행할 때 따라야 하는 -**workflow 규약** 입니다. 작업 도중 사용자 승인을 빈번히 요청하여 흐름이 끊기는 문제를 -해소하고, AI 의 자율성과 안전성의 균형을 명문화합니다 (이슈 #152). +공통 규약은 사용자 레벨 하네스 **`~/.claude/rules/`** 가 기본값이다 (2026-10-11 이관, 이슈 #672). +본 저장소의 구 규약 1~8 (이슈 #152 · #199 · #210 · #212 · #665 · #667 · #669) 이 그 원형이다. +이 문서는 본 저장소에만 있는 값과 공통 규약과 다르게 하는 점만 적는다. -본 규약은 코드 스타일 / 아키텍처 / 테스트 등 **무엇을 만드느냐** 가 아니라, **어떻게 -진행하느냐** 를 다룹니다. 코드 자체의 규약은 [01-architecture.md](01-architecture.md) ~ -[06-code-style.md](06-code-style.md) 참조. +> `~/.claude` 가 없는 환경 — GitHub Action [`claude.yml`](../../.github/workflows/claude.yml) 은 저장소만 체크아웃한다 — 에는 공통 규약이 +> 로드되지 않는다. 그 환경에서는 [CLAUDE.md](../../CLAUDE.md) 의 "반드시 지킬 규칙" (CI 강제) 과 이 문서, 저장소 규칙 01~06 이 적용되고, +> 서브 에이전트 위임은 하지 않는다. 하네스를 Action 에 체크아웃할지는 별도 결정 (이슈 #672 TODO).
-## 핵심 8 규약 +## 구 규약 번호 → 공통 하네스 대응표 -### 1. 이슈 먼저 (issue-first) 생성 정책 +기존 이슈 · PR · 문서 · 스크립트 주석이 "규약 N" 으로 참조한다. 번호는 그대로 쓴다. -사용자 작업 지시가 도착하면 **코드 수정 시작 전에 GitHub 이슈를 먼저 생성** 한다 (이슈 #199). - -#### 원칙 - -- 모든 작업은 GitHub 이슈로 추적 — branch / commit / PR 모두 그 이슈를 참조 -- **이슈 생성 시 Label · Issue Type 부여 필수** (규약 6 매핑 표 참조) -- **규모가 PR 1개로 reviewable diff 안 되면 메인 이슈 + sub-issue N개로 분할** 하여 모두 사전에 생성 - - 메인 이슈 본문에 전체 그림 + sub-issue 목록 + 완료 조건 명시 - - **GitHub 의 Sub-issue 기능 + Relation 적극 활용** — `gh api graphql` 의 `addSubIssue` mutation 으로 메인 ↔ sub 관계 활성화하여 GitHub UI 에서 계층 명시 - - 본문 link (`Parent: #<메인>`) 만으로 표기하던 기존 방식은 보조용. native sub-issue 가 우선 - - **제약: sub-issue 는 부모를 1개만 가진다.** 이미 다른 메인 이슈의 sub 인 이슈를 새 메타에 - 붙이려 하면 `Sub issue may only have one parent` 로 거부됩니다. 이 경우 기존 부모를 유지하고 - 새 메타 본문에서 **참조만** 하세요 (표에 "기존 — 부모 #N 유지, 본 메타는 참조만" 표기). - 부모를 옮기는 것은 기존 계층을 바꾸는 일이라 사용자 확인 대상입니다. -- 각 sub-issue 단위로 `branch → 작업 → commit → PR` 사이클 반복 -- PR closing reference 는 그 sub-issue (`Closes #`). 메인 이슈는 모든 sub-issue 가 close 될 때까지 OPEN 유지하고 마지막 sub-issue PR 에서 함께 close - -#### Why - -- 작업 진입 전 사용자와 scope 합의가 강제됨 → 작업 도중 방향 이탈 / scope creep 회피 -- ad-hoc 으로 PR 직전에 이슈 만드는 패턴 차단 (기존 사례: PR #181 / #183 / #189 / #191 — closing reference 가 필요해서 PR 직전 즉흥 sub-issue 생성) -- 메인 이슈와 sub-issue 의 계층 관계가 GitHub 상에서 명확히 link - -#### 예외 - -- 사용자가 명시적으로 **"이슈 없이 진행해"** / **"단발 hotfix"** 라고 지시한 경우 -- 1줄 typo 수정 / 명백한 작은 chore (사용자 동의 없이 진행해도 손실 적음 — 단, PR 타이틀 규약 준수를 위해 작업 시작 전 이슈 생성) - -#### 판단 모호 시 - -규모가 작아 보이더라도 **이슈 1개 생성** — 작업 끝난 후 PR 본문 정리할 때 추가 비용 거의 없음. -"이거 큰가?" 가 50/50 이면 **메인 + sub-issue 분할 쪽** 으로 보수 분류. - -#### Sub-issue 등록 명령 - -> 규약 6 의 "`gh api graphql` 직접 호출은 사용하지 않는다" 는 **Label · Issue Type 부여** 에 -> 대한 규칙입니다 (그쪽은 `scripts/gh-meta.sh` 가 대체). sub-issue relation 은 아직 스크립트가 -> 없어 아래 graphql 호출을 그대로 사용합니다 — 두 규약은 충돌하지 않습니다. - - -```bash -# 메인 이슈에 sub-issue 등록 (Relation 자동 활성화) -MAIN_ID=$(gh issue view --json id --jq .id) -SUB_ID=$(gh issue view --json id --jq .id) - -gh api graphql -f query=' -mutation($issueId: ID!, $subIssueId: ID!) { - addSubIssue(input: {issueId: $issueId, subIssueId: $subIssueId}) { - issue { number } - subIssue { number } - } -}' -f issueId="$MAIN_ID" -f subIssueId="$SUB_ID" -``` - -
- -### 2. 자율 진행 정책 — 승인 요청 최소화 - -쿼리의 의도가 명확하면 AI 는 **사용자 승인 없이 진행** 한다. -> **핵심 원칙 1**: 아래 "자율 진행 영역"에 해당하는 작업은 **절대 사용자 확인을 요청하지 않는다.** -> 스크립트 실행, 파일 수정, 커밋, 브랜치 생성 등은 묻지 않고 즉시 실행한다. -> 이미 허용된 도구(`Bash`, `Edit`, `Write`, `gh`, `git`, `make` 등)는 추가 승인 없이 사용한다. -> **핵심 원칙 2**: 최대한 자율적으로 진행하되, "예외 영역"에 해당하는 작업은 반드시 사용자 확인을 받는다. -다음 4가지 영역만 예외로 -사용자 확인을 받는다: - -#### 예외 영역 (반드시 사용자 확인) - -| 영역 | 예시 | -|---|---| -| **시스템 자체 변경** | OS / 패키지 / 글로벌 환경 변경 (`apt-get install`, `sudo systemctl`, 시스템 서비스 enable 등) | -| **언급 없는 destructive 권한** | `git push --force`, branch 삭제, DB `DROP TABLE`, `git reset --hard`, 무인 PR merge | -| **외부 시스템 영향** | PR merge / issue close / 배포 트리거 / 외부 API 비용 결제 / 외부 DM 발송 | -| **모호한 작업 범위** | 사용자 의도가 다중 해석 가능하거나 scope 가 불명확한 경우 — 진행 전 구체화 질문 | - -#### 자율 진행 영역 (승인 불필요 — 즉시 실행) - -- 코드 작성 / 수정 / 리팩토링 / 삭제 -- 테스트 추가 / 갱신 -- 새 파일 / 디렉토리 생성 -- DB migration 작성 (단 `DROP` 류는 예외 — 위 destructive 영역) -- 의존성 추가 (`go get`) — 단 신규 외부 모듈은 규약 4 적용 -- Branch 생성, 정상 push (force-push 아닌) -- Commit 단위 결정 및 실행 -- **구조 변경 시 `make harness-check` 통과 확인** — cmd 추가/삭제, 디렉토리 이동, Go 버전 변경, - CI 임계값 변경 등은 규약 문서도 같이 고쳐야 한다 (이슈 #539). 문서가 낡으면 다음 세션의 AI 가 - 잘못된 전제를 받는다. -- PR 본문 작성 -- **`scripts/` 하위 스크립트 실행** — 프로젝트 도구는 경로 확인 없이 실행 -- **이슈 / PR Label · Type 부여** — `scripts/gh-meta.sh` 활용, 별도 승인 불필요 -- **lint / fmt / test / build** — `make` 또는 `scripts/lint.sh` 실행, 경로 확인 불필요 -- **서브 에이전트 spawn** — 규약 8 의 티어 · 동시 상한 안에서는 확인 불필요 - -#### 판단 모호 시 -\"이게 destructive 영역인가?\" 가 50/50 이면 **사용자 확인 쪽으로 보수 분류**. 단, -이미 자율 진행 영역으로 열거된 항목은 50/50 이 아니다 — 확인 없이 진행한다. - -
- -### 3. Commit-per-TODO 정책 - -별다른 사용자 언급이 없으면, AI 는 작업을 **논리적 변경 단위 (TODO)** 마다 commit 한다. - -> **금지**: 작업을 모두 완료한 뒤 한 번에 몰아서 커밋하는 것은 **절대 허용하지 않는다.** -> 논리적 변경 단위가 완성되는 즉시 커밋한다. 커밋을 뒤로 미루지 않는다. - -#### 원칙 - -- 논리적 변경 단위 완성 → **즉시 커밋** (다음 단위 작업 시작 전) -- 큰 PR 도 reviewable diff 단위로 분할 commit -- 각 commit 메시지는 [06-code-style.md](06-code-style.md) 의 컨벤션 준수: - - **Prefix 는 다섯 가지 중 택 1**: `[FEAT]:` / `[FIX]:` / `[REFAC]:` / `[DOCS]:` / `[CHORE]:` - - 이후 한국어 + 변경 의도 - - 단일 commit 이 너무 큰 변경을 담지 않도록 -- 빌드 그린 유지 — 각 commit 이 컴파일 + 테스트 통과 가능한 상태 - -#### 잘못된 패턴 (금지) - -```text -# BAD — 작업 완료 후 모아서 한 번에 커밋 -[파일 A 수정] → [파일 B 수정] → [파일 C 수정] → 커밋 하나로 묶음 -``` - -#### 올바른 패턴 - -```text -# GOOD — 논리 단위마다 즉시 커밋 -[파일 A 수정 — 기능 X 구현] → 커밋 -[파일 B 수정 — 기능 Y 구현] → 커밋 -[파일 C 수정 — 테스트 추가] → 커밋 -``` - -#### 예외 - -- 사용자가 명시적으로 \"한 번에 묶어줘\" / \"squash 해줘\" 요청 시 단일 commit -- 사용자가 \"단일 fix 만 해줘\" 등 명백한 단일 변경을 지시한 경우 - -#### 예시 - -```bash -git log --oneline (refactor/#148 PR 의 5 commits 패턴) -fc95aec [FIX]: 피드백 반영, all-pass 모드 PathPrefixes 검증 + discovery vs fallback 명확 구분 -2a063e8 [FIX]: 피드백 반영, LinkDiscoveryConfig 주석 + migration 008 주석 일관성 -6491d20 [REFAC]: MaxLinksPerPage 정책 변경 — same-origin 무제한 + cross-origin random sample -4cfc9a4 [FEAT]: migration 008 — 운영 사이트 list rules all-pass 모드 + ExcludePatterns 강화 -9f7cbb6 [FEAT]: discovery 테스트 갱신 — all-pass 모드 케이스 추가 -``` - -
- -### 4. PR 자동 생성 정책 - -작업 완료 직후 (별다른 언급 없으면) AI 는 **PR 을 자동 생성** 한다. - -#### 컨벤션 + 템플릿 준수 - -- **PR 타이틀**: `[카테고리#이슈번호] 제목` 정규식 (이슈 #121, CI 강제) -- **본문**: [.github/PULL_REQUEST_TEMPLATE.md](../../.github/PULL_REQUEST_TEMPLATE.md) 의 모든 섹션 채움 - - 연관 이슈 (`Closes #N` — closing reference 명시) - - 구현 내용 - - CI / 머지 게이트 점검 - - 변경 영향 범위 + 위험도 - - 롤백 계획 -- **이슈 링크**: PR 본문 또는 Development sidebar 에 closing reference -- **Label 부여 필수**: 규약 6 매핑 표에 따라 PR 에도 동일 label 부여 (`gh pr create --label