diff --git a/.agents/skills/harness-work/SKILL.md b/.agents/skills/harness-work/SKILL.md index cda92a5..d8cbe88 100644 --- a/.agents/skills/harness-work/SKILL.md +++ b/.agents/skills/harness-work/SKILL.md @@ -9,11 +9,11 @@ Codex에서 Claude Code `/harness-work`에 해당하는 절차를 직접 수행 ## 절차 -1. `AGENTS.md`, `CLAUDE.md`, `agents/quality-gates.md`, `.harness/STATE.md`, 최근 `.harness/LESSONS.md`, `tasks/index.json`, `Plans.md`를 읽는다. +1. `AGENTS.md`, `CLAUDE.md`, `agents/quality-gates.md`, `tasks/index.json`, `Plans.md`, 최근 `.harness/LESSONS.md`를 읽는다. 진행 중인 Task가 있으면 `.harness/tasks//STATE.md`도 읽는다. 2. 수행할 `todo` Task 하나를 고른다. 사용자가 지정한 Task가 있으면 그 Task를 우선한다. 3. 구현 전 `agents/task-decomposer.md`의 세분화 기준과 `agents/quality-gates.md`의 scope/YAGNI 체크를 확인한다. 4. 기준 미달이면 구현하지 말고 `$harness-plan` 절차로 하위 Task proposal을 만든다. -5. 기준 통과 시 `.harness/STATE.md`를 갱신하고 구현한다. +5. 기준 통과 시 `.harness/tasks//STATE.md`를 갱신하고 구현한다. Task 디렉토리가 없으면 루트 `.harness/*.md` 템플릿을 복사해 만든다. 6. 작업 중 범위가 커지면 중단하고 `agents/quality-gates.md`의 split 조건과 task-decomposer 기준으로 재분해한다. 7. 구현 후 `agents/test-agent.md` 절차대로 해당 Task Acceptance 명령과 관련 테스트 스위트를 실행한다. 8. 검증 실패 시 수정 후 재실행한다. @@ -26,5 +26,6 @@ Codex에서 Claude Code `/harness-work`에 해당하는 절차를 직접 수행 `done`으로 갱신하고 `Plans.md`를 재생성한다. GitHub Actions는 Task 상태를 전환하지 않는다. - 새 파일이나 역할 변경은 `.harness/CONTEXT_INDEX.md`에 반영한다. +- 루트 `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`는 템플릿이므로 실제 진행 상태를 쓰지 않는다. - ponytail/caveman Codex plugin 자동 동작을 가정하지 않는다. Codex에서는 `agents/quality-gates.md`를 직접 적용한다. diff --git a/.harness/CHECKPOINTS.md b/.harness/CHECKPOINTS.md index c440e4e..b3b894b 100644 --- a/.harness/CHECKPOINTS.md +++ b/.harness/CHECKPOINTS.md @@ -1,28 +1,8 @@ -# CHECKPOINTS.md — 작업 단위 완료 기록 +# CHECKPOINTS.md — Task 완료 지점 템플릿 -> 한 작업 단위(보통 Task 하나 또는 커밋 하나)가 끝날 때마다 한 줄 추가. -> 커밋 해시로 git 이력과 연결한다. 최신이 위. +> 이 루트 파일은 실제 checkpoint 기록이 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//CHECKPOINTS.md`로 복사해서 사용한다. | 일시 | Task | 내용 | 커밋 | 검증 | |------|------|------|------|------| -| 2026-07-08 | 4.11 | rescue-from-main workflow helper 추가 | 미커밋 | Acceptance·frontmatter·init smoke·unittest PASS | -| 2026-07-04 | - | README·github-integration.md Week 3 반영 갱신 | 930e404 | grep 확인 | -| 2026-07-04 | 3.12 | 플러그인 SHA 기록 절차 (M8) | 6667307 | Acceptance PASS | -| 2026-07-04 | 3.11 | ci.yml ci-ok 요약 잡 (M6) | 2b9a6d8 | harness-gh-test 실PR PASS | -| 2026-07-04 | 3.10 | agents 문서 수행 주체 명시 (M5) | d5117bc | Acceptance PASS | -| 2026-07-04 | 3.9 | Plans.md anti-pattern 예시 교정 (M2) | 11aa504 | Acceptance PASS | -| 2026-07-04 | 3.8 | harness.toml 죽은 설정 정리 (M4) | 2dd1d8b | Acceptance PASS | -| 2026-07-04 | 3.7 | 완료 전환 서술 통일 (M3) | 2594119 | Acceptance PASS | -| 2026-07-04 | 3.5 | plans-guard depends-check (H3) | 03d185f | harness-gh-test 실PR PASS | -| 2026-07-04 | 3.4 | plans-guard diff 보호 (H2) | 0c8ea99 | harness-gh-test 실PR 2종 PASS | -| 2026-07-04 | 3.6 | Plans.md 헤더 검증 선행 파싱 (M1·M7) | 603fcc0 | 정상/컬럼누락 양쪽 검증 PASS | -| 2026-07-04 | 3.3 | init.sh 초기화 스크립트 (H5) | 15ebe23 | 스크래치 실행 검증 PASS | -| 2026-07-04 | 3.2 | clean 골격 세트 분리 (H5) | d44a70a | 이력 잔재 0건 확인 | -| 2026-07-04 | 3.1 | plans-complete branch protection 호환 (H1) | 1ea64da | harness-gh-test 실증 PASS | -| 2026-07-04 | - | 감사 보고서 + Week 3 Task 12건 추가 | 37e1997 | - | -| 2026-07-04 | 2.7 | GitHub 연동 E2E 검증 + plans-complete.yml | 2f94273 | 시나리오 A~D 실검증 PASS | -| 2026-07-03 | 2.6 | DESIGN.md 기획 산출물 추가 (골격+규칙+routine-saas 적용) | 6a51ad0 | Acceptance PASS | -| 2026-07-03 | 2.1~2.5 | Week 2 dogfooding — routine-saas 기획 파이프라인 통과 | (커밋 금지 지시) | Acceptance 2.1~2.4 PASS | -| 2026-07-03 | 1.4 | .harness/ 상태 문서 체계 (골격 7종 + CLAUDE.md 규칙) | a4c6ef1 | Acceptance PASS | -| 2026-07-03 | - | .gitignore 플러그인 산출물 정리 | 9c05093 | git status clean 확인 | -| 2026-07-03 | 1.3 | task-decomposer + 세분화 게이트 | a32df79 | Acceptance PASS | +| YYYY-MM-DD | [id] | [완료 지점] | [hash 또는 미커밋] | [검증 결과] | diff --git a/.harness/CONTEXT_INDEX.md b/.harness/CONTEXT_INDEX.md index 8c53264..7864ff8 100644 --- a/.harness/CONTEXT_INDEX.md +++ b/.harness/CONTEXT_INDEX.md @@ -1,47 +1,66 @@ # CONTEXT_INDEX.md — 파일 역할 인덱스 > 토큰 절약용. 세션 재개 시 이 인덱스로 "이번 작업에 필요한 파일"만 골라 읽는다. +> 루트 `.harness/*.md`는 템플릿이고, 실제 작업 맥락은 `.harness/tasks//`에 있다. > 새 파일을 만들거나 기존 파일의 역할이 바뀌면 여기를 갱신한다. -## 항상 먼저 (세션 재개 시) +## 세션 재개 읽는 순서 -| 파일 | 역할 | 읽는 시점 | +1. `tasks/index.json`에서 `wip` Task 또는 사용자가 지정한 Task를 확인한다. +2. 해당 Task의 `.harness/tasks//STATE.md`를 읽는다. +3. 루트 `.harness/LESSONS.md` 최근 항목을 읽는다. +4. `Plans.md`를 읽어 사람이 보는 snapshot을 확인한다. +5. 이 파일에서 필요한 추가 문서만 고른다. + +## Task별 맥락 디렉토리 + +| 경로 | 역할 | 읽는 시점 | |------|------|-----------| -| `.harness/STATE.md` | 현재 상태 스냅샷 | 매 세션 시작 | -| `.harness/LESSONS.md` | 재발 방지 기록 (최근 5개만) | 매 세션 시작 | -| `Plans.md` | Task 상태 단일 출처 (DoD·Acceptance·Status) | 매 세션 시작 | +| `.harness/tasks//STATE.md` | 해당 Task의 현재 스냅샷 | Task 재개 시 | +| `.harness/tasks//LOG.md` | 해당 Task 작업·에러 로그 | 작업 이력/에러 확인 시 | +| `.harness/tasks//CHECKPOINTS.md` | 해당 Task 완료 지점 기록 | 완료 근거 확인 시 | +| `.harness/tasks//HANDOFF.md` | 해당 Task 재개 정보 | 세션 재개 직후 | +| `.harness/tasks//TASKS.md` | 해당 Task 내부 체크리스트 | Task 진행 중 | +| `.harness/tasks//tasks.index.snapshot.json` | 작업 시작 시점의 `tasks/index.json` 참고본 | 시작 시점 비교가 필요할 때 | -## 필요할 때만 +## 루트 `.harness/` 템플릿과 전역 파일 | 파일 | 역할 | 읽는 시점 | |------|------|-----------| -| `.harness/HANDOFF.md` | 직전 세션 인수인계 | 재개 직후 1회 | -| `.harness/TASKS.md` | 현재 Task의 세션 체크리스트 | Task 진행 중 | -| `.harness/LOG.md` | 작업·에러 로그 | 에러 이력 조회 시 | -| `.harness/CHECKPOINTS.md` | 작업 단위 완료 기록 | 이력 추적 시 | -| `.harness/events/planning.jsonl` | `/harness-plan` 단계별 감시 로그 (사용자 친화 JSONL) | planning 실패·반영 흐름 추적 시 | +| `.harness/STATE.md` | Task별 `STATE.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/HANDOFF.md` | Task별 `HANDOFF.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/TASKS.md` | Task별 `TASKS.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/LOG.md` | Task별 `LOG.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/CHECKPOINTS.md` | Task별 `CHECKPOINTS.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/LESSONS.md` | 전역 재발 방지 기록 (최근 항목 우선) | 매 세션 시작 | +| `.harness/CONTEXT_INDEX.md` | 파일 역할·읽는 순서 인덱스 | 세션 재개/파일 역할 확인 시 | +| `.harness/events/planning.jsonl` | `/harness-plan` 단계별 감시 로그 | planning 실패·반영 흐름 추적 시 | | `.harness/shared/planning/latest.json` | 최신 planning run의 context/proposal/report 위치 | 최신 task-decomposer proposal 확인 시 | | `.harness/shared/planning/runs/` | run별 context.json·proposed-tasks.json·decomposition-report.md 작업대 | 특정 planning run 감사 시 | + +## 필요할 때만 + +| 파일 | 역할 | 읽는 시점 | +|------|------|-----------| | `CLAUDE.md` | 프로젝트 규칙 (기획·구현·테스트·리뷰·상태 문서) | 규칙 확인 시 | | `AGENTS.md` | Codex 진입점. CLAUDE.md 규칙을 Codex 세션에서 동일 절차로 실행하기 위한 호환 지침 | Codex 환경 구성·규칙 확인 시 | | `.agents/skills/` | Codex repo-scoped skills (`$grill-me`, `$harness-plan`, `$harness-work`, `$harness-review`, `$harness-progress`, `$harness-sync`, `$branch-checkout`, `$git-push`, `$pr-create`, `$rescue-from-main`) | Codex skill 호출 UX·절차 수정 시 | | `.claude/commands/` | Claude Code local custom commands (`/branch-checkout`, `/git-push`, `/pr-create`, `/rescue-from-main`) | Claude command 호출 UX·절차 수정 시 | -| `harness.toml` | harness 플러그인 설정 ([plan]·[test]·[review]) | 설정 변경 시 | +| `harness.toml` | harness 플러그인 설정 요약 인덱스 ([plan]·[test]·[review]) | 설정 변경 시 | | `BLUEPRINT.md` | 시스템 전체 아키텍처 설명 (읽기용) | 구조 이해 필요 시 | | `README.md` | 템플릿 사용법 (외부 사용자용) | 문서 갱신 시 | -| `agents/quality-gates.md` | Claude/Codex 공통 scope·YAGNI·review·reporting 게이트. ponytail/caveman 원칙을 repo 규칙으로 적용 | 구현·리뷰·Codex skill 절차 수정 시 | +| `agents/quality-gates.md` | Claude/Codex 공통 scope·YAGNI·review·reporting 게이트 | 구현·리뷰·Codex skill 절차 수정 시 | | `agents/task-decomposer.md` | Task 세분화 기준·게이트 정의 | 계획/게이트 실행 시 | | `agents/test-agent.md` | 런타임 검증 절차 정의 | worker 완료 후 | -| `.github/workflows/plans-guard.yml` | header-check·WIP 확인·diff 보호·depends 검증·Acceptance Oracle·세분화 CI (6잡) | CI 수정 시 | -| `.github/workflows/plans-complete.yml` | 머지 시 cc:WIP→완료 자동 커밋, push 실패 시 PR 폴백 (stale WIP 방지, H1) | CI 수정 시 | -| `.github/workflows/ci.yml` | 스택 빌드·테스트 + ci-ok 요약 잡(required check 이름 고정) | CI 수정 시 | +| `.github/workflows/plans-guard.yml` | header-check·WIP 확인·diff 보호·depends 검증·Acceptance Oracle·세분화 CI | CI 수정 시 | +| `.github/workflows/plans-complete.yml` | 머지 시 cc:WIP→완료 자동 커밋, push 실패 시 PR 폴백 | CI 수정 시 | +| `.github/workflows/ci.yml` | 스택 빌드·테스트 + ci-ok 요약 잡 | CI 수정 시 | | `init.sh` | 새 프로젝트에 이 템플릿 전체(설정+CI+골격) 자동 복사 | 새 프로젝트 적용 시 | -| `templates/skeleton/` | init.sh가 복사하는 Plans.md·.harness/ 초기 상태 (dogfood 이력 없음) | 골격 자체를 고칠 때 | -| `docs/PRD.md`, `docs/UserFlow.md`, `docs/Architecture.md` | 기획 산출물 | 기획 참조 시 | +| `templates/skeleton/` | init.sh가 복사하는 Plans.md·.harness/ 초기 템플릿 구조 | 골격 자체를 고칠 때 | | `docs/templates/` | 기획 문서 골격 4종 (PRD·UserFlow·DESIGN·Architecture) | 새 기획 착수 시 | -| `docs/github-integration.md` | GitHub 연동 상세 가이드 (branch protection·CI 잡 6종·plans-complete 동작) | GitHub 연동 설정 시 | -| `docs/specs/2026-07-04-template-audit.md` | 템플릿 빈틈 감사 보고서 (H1~H5·M1~M8·L1~L5), Week 3 Task 매핑 근거 (L1~L5는 Plans.md Week 4 Task 4.1~4.6로 전환됨) | 감사 배경 확인 시 | -| `docs/specs/2026-07-08-codex-claude-quality-gates.md` | ponytail/caveman Claude-only enhancement와 Codex quality-gates 적용 경계 기록 | 품질 게이트 설계 배경 확인 시 | -| `docs/claude-code-hooks.md` | hooks 미설정 현황 + 권장 hooks 예시, harness.toml [safety.permissions]와 역할 분담 | hooks 추가 검토 시 | -| `docs/session-recovery.md` | `.harness/` 재개 절차 심화 (파일별 역할·읽는 순서·실제 형식·다중 프로젝트 시나리오) | 세션 복구 절차 상세 확인 시 | -| `docs/error-memory.md` | `LOG.md`/`LESSONS.md` 작성 규칙·실제 형식·CLAUDE.md 승격 기준 | 에러 기록 규칙 확인 시 | +| `docs/github-integration.md` | GitHub 연동 상세 가이드 | GitHub 연동 설정 시 | +| `docs/specs/2026-07-04-template-audit.md` | 템플릿 빈틈 감사 보고서 | 감사 배경 확인 시 | +| `docs/specs/2026-07-08-codex-claude-quality-gates.md` | Claude/Codex quality gate 경계 기록 | 품질 게이트 설계 배경 확인 시 | +| `docs/claude-code-hooks.md` | hooks 미설정 현황 + 권장 hooks 예시 | hooks 추가 검토 시 | +| `docs/session-recovery.md` | `.harness/tasks/` 기반 재개 절차 심화 | 세션 복구 절차 상세 확인 시 | +| `docs/error-memory.md` | Task별 `LOG.md`와 전역 `LESSONS.md` 작성 규칙 | 에러 기록 규칙 확인 시 | diff --git a/.harness/HANDOFF.md b/.harness/HANDOFF.md index 03df992..888a81a 100644 --- a/.harness/HANDOFF.md +++ b/.harness/HANDOFF.md @@ -1,32 +1,21 @@ -# HANDOFF.md — 다음 세션 인수인계 +# HANDOFF.md — Task 인수인계 템플릿 -> 세션 종료(또는 끊김 대비) 시점에 갱신. 다음 세션이 전체 파일을 다시 읽지 않고 -> 여기 적힌 최소 파일만 읽고 바로 이어가게 하는 것이 목적. +> 이 루트 파일은 실제 인수인계가 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//HANDOFF.md`로 복사해서 사용한다. ## 다음 세션이 먼저 읽을 최소 파일 -1. `.harness/STATE.md` — 현재 상태 -2. `.harness/LESSONS.md` — 최근 5개 항목 -3. `Plans.md` — Task 상태 (cc:WIP 행 확인) +1. `.harness/tasks//STATE.md` +2. `.harness/LESSONS.md` 최근 항목 +3. `tasks/index.json` +4. `Plans.md` +5. `.harness/CONTEXT_INDEX.md`에서 필요한 파일 ## 재개 지점 -- Week 3 전 Task(3.1~3.12) 완료 + 커밋 + push까지 끝난 상태. 진행 중인 - 작업 없음. -- 이번 세션에서 발견한 새 사실(문서에 반영 완료, 여기는 참고용 요약): - - branch protection 켜진 private repo는 GitHub Free 플랜에서 API 자체가 - 403 — H1 실증을 위해 harness-gh-test를 잠깐 public 전환했다가 검증 후 - 원복함(사용자 승인받음). - - plans-complete의 PR 폴백이 동작하려면 저장소 설정 2개가 별도로 켜져야 - 함(Actions PR 생성 허용, Allow auto-merge) — 둘 다 기본값 꺼짐, 실증 - 중 실제로 막혀서 발견. `plans-complete.yml` 주석에 명시함. -- 다음 세션에서 판단할 것: Week 4 스코프 — 남은 후보는 template-audit.md의 - L1~L5(백로그, granularity vague_re 오탐, test-agent pretest 오매칭 등)와 - M8에서 명시한 대로 "SHA 강제 핀"은 여전히 미지원(YAGNI 보류 상태 유지 중). +- [어디서 이어가면 되는지 기록] ## 주의사항 -- Task 상태는 Plans.md가 단일 출처 — `.harness/TASKS.md`에 Task 상태를 복제하지 말 것. -- harness-gh-test repo는 private + branch protection 해제 상태로 복원됨 — - 다시 H1류 검증이 필요하면 이 순서(public 전환 승인 → protection 설정 - 승인 → 검증 → 전부 원복)를 다시 밟을 것, 자동화하지 말고 매번 확인받을 것. +- Task 상태의 단일 출처는 `tasks/index.json`이다. +- 루트 `.harness/*.md` 템플릿에 실제 진행 상태를 기록하지 않는다. diff --git a/.harness/LOG.md b/.harness/LOG.md index 711ec48..0d92697 100644 --- a/.harness/LOG.md +++ b/.harness/LOG.md @@ -1,171 +1,9 @@ -# LOG.md — 작업·에러 로그 (append-only) +# LOG.md — Task 작업·에러 로그 템플릿 -> 시간 역순 아님 — 위에서 아래로 추가만 한다. 에러는 숨기지 말고 원문 그대로 기록. -> 해결된 에러는 재발 방지 관점에서 LESSONS.md에도 요약을 남긴다. +> 이 루트 파일은 실제 작업 로그가 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//LOG.md`로 복사해서 사용한다. +> 전역 재발 방지 규칙은 루트 `.harness/LESSONS.md`에 유지한다. -## 2026-07-03 +## YYYY-MM-DD -- Task 1.3 커밋 (`a32df79`) — task-decomposer + 세분화 게이트. Acceptance PASS. -- .gitignore 정리 커밋 (`9c05093`) — 플러그인 런타임 산출물 제외. -- Task 1.4 착수 — .harness/ 상태 문서 체계 추가. - 참고: 세션 재개 프롬프트가 .harness/ 문서를 전제했으나 저장소에 부재 → - 사용자 승인 받아 템플릿 정식 기능으로 추가. -- Task 1.4 완료 — .harness/ 골격 7종 + CLAUDE.md 상태 문서 규칙. Acceptance PASS. - 미커밋 (사용자 요청 대기). 훅 경고: CLAUDE.md 118줄 분할 권고 → 미실행, HANDOFF에 기록. -- Task 1.4 커밋 (`a4c6ef1`) — 사용자 승인. -- Week 2 dogfooding (2.1~2.5, 커밋 금지 지시) — ../routine-saas/ 골격 생성, - grill-me 인터뷰 4문항 확정(실행 도구·직장인·코어 3종·PWA+웹푸시), 5번째(성공 기준) - 무응답 → 권장값 잠정 적용. PRD·UserFlow·Architecture·Plans.md(Task 11개) 산출. - 템플릿 결함 2건 발견 → LESSONS.md 기록. -- Task 2.6 — DESIGN.md 기획 산출물 추가 (사용자 지적: 디자인 산출물 누락). - templates/DESIGN.md 골격 + CLAUDE.md 기획 규칙 + routine-saas 실제 작성 + - UI Task(2.1·2.3) Depends 게이트 연결. 훅 경고: CLAUDE.md 123줄 (분할 권고 지속). - -## 2026-07-04 - -- 템플릿 커밋 `6a51ad0` + origin push (Task 2.6분). -- Task 2.7 — GitHub 연동 E2E 검증. devRonPark/harness-gh-test(private) 생성, - Milestone 1 + Issue #1·#2, PR 4개로 시나리오 A~D 검증 → plans-guard 3잡 전부 - 기대대로. 빈틈 7건 도출 (LESSONS 참고). plans-complete.yml 신설·실증. - 에러 1건: 충돌 해소 정규식이 Plans.md 행 2개 삭제 → Read 확인 후 복원, LESSONS 기록. - 에러 2건: 훅이 git push 복합 명령을 force-push로 오탐 차단 → 명령 분리로 해결. -- docs/specs/2026-07-04-template-audit.md 작성 — 전 파일 정독 감사, H1~H5· - M1~M8·L1~L5 도출. Plans.md Week 3 Task 3.1~3.12로 매핑 후 커밋(`37e1997`). -- Week 3 순차 실행 (3.1 → 3.2 → 3.3 → 3.6 → 3.4 → 3.5 → 3.7 → 3.8 → 3.9 → - 3.10 → 3.11 → 3.12, Depends 순서 기준): - - 3.1(H1): plans-complete push→PR 폴백 설계. harness-gh-test를 사용자 승인 - 받아 public 임시 전환 + branch protection 실제 설정 후 검증 — GitHub Free - 플랜은 private repo에 branch protection/rulesets API 자체가 403이라는 - 사실을 실증 중 발견(LESSONS 기록). PR 생성도 저장소 설정 - ("Allow GitHub Actions to create and approve pull requests") 기본값 꺼짐 - 때문에 최초 실패 → 켜서 통과. auto-merge도 동일하게 "Allow auto-merge" - 꺼짐으로 실패 → 수동 merge로 최종 flip 확인. 검증 후 전부 원복. - - 3.2(H5): templates/skeleton/ 신설(Plans.md + .harness/ 7종, dogfood - 이력 0건 확인). - - 3.3(H5): init.sh 작성, 스크래치 디렉토리에 실제 실행해 검증. - - 3.6(M1·M7): header-check 잡 신설, 정상/컬럼 누락 케이스 로컬 검증. - - 3.4(H2): plans-diff-check 잡 신설, 비-task 브랜치·task 브랜치 타 행 변경 - 2종 시나리오를 harness-gh-test에서 실제 PR로 재현·검증. - - 3.5(H3): depends-check 잡 신설, 미완료 Depends 시나리오 실제 PR 검증. - - 3.7(M3): README·BLUEPRINT의 완료 전환 서술을 GitHub 연동/미연동 모드별로 - 명확히 구분. - - 3.8(M4): harness.toml 죽은 키(max_iterations 등) 제거, 섹션 주석 SSOT - 역할 반전 명시. harness sync 산출물(.claude-plugin/)이 untracked인 것을 - 발견해 .gitignore 추가. - - 3.9(M2): Task 0.4의 "|| echo skip"과 Week 2 행들의 ../routine-saas/ - 경로를 Acceptance "-"로 교정, 범례에 anti-pattern 금지 규약 추가. - - 3.10(M5): agents/*.md가 실제 서브에이전트가 아님을 BLUEPRINT·README에 - 명시, .claude/agents/ 이전은 보류 결정(근거 기록). - - 3.11(M6): ci-ok 요약 잡 신설, harness-gh-test에서 실제 PR로 실행 검증. - - 3.12(M8): README 플러그인 버전 표에 확인된 SHA·확인일 컬럼 + 업데이트 - 전 확인 절차 추가. - - 사용자 요청으로 README.md·docs/github-integration.md 추가 갱신 — - github-integration.md가 예전 3잡 구성을 서술하고 "완료를 PR 마지막 - 커밋에 포함시켜도 된다"는, CLAUDE.md·plans-diff-check와 모순되는 안내를 - 담고 있어서 함께 교정(`930e404`). - -## 2026-07-04 (계속) — README 고도화 + 백로그 정리 - -- README.md 전면 개편: Why·What You Get·Quick Start·Claude Code Setup· - 기존 프로젝트에 적용·Recommended Workflow·Commands·Hooks·Session Recovery· - Error Memory·Philosophy·Contributing·License 섹션 추가. 기존 정확한 내용 - (플러그인 표, 파일 구조, 워크플로우, 치트시트, 버전 SHA)은 유지·재배치만 함. - 없는 파일(ADR.md·verify-harness.sh·.claude/commands/)은 지어내지 않고 - "미포함"으로 명시. -- docs/claude-code-hooks.md·session-recovery.md·error-memory.md 3개 신설 — - README 요약을 실제 파일 형식 기준으로 심화. -- 사용자 요청으로 템플릿 완결성 재감사 실시. docs/specs/2026-07-04-template-audit.md의 - L1~L5가 Plans.md에 Task로 전환된 적 없이 백로그로만 남아 있음을 확인 - (grep으로 실코드 재검증: vague_re 정규식 여전히 `(전체|모든| 및 |그리고)`, - test-agent.md:40 `grep -q '"test"'` 여전히 pretest 오탐 가능, CONTEXT_INDEX.md가 - 존재하지 않는 docs/PRD.md 등 인덱싱, harness.toml의 `rm -r` 패턴이 - `rm -fr`/`rm -R` 미포착 — 전부 실제로 확인됨). -- 세션 자체 점검 중 발견: README 개편 + docs 3개 신설이라는 작업 단위가 - 끝났는데도 `.harness/STATE.md`·`CONTEXT_INDEX.md`를 갱신하지 않은 채 - 다음 요청을 받음 — CLAUDE.md 상태 문서 규칙 위반. 이번에 STATE.md· - CONTEXT_INDEX.md·LOG.md를 갱신해 바로잡음. -- L1~L5를 Plans.md Week 4 Task 4.1~4.6으로 등록(cc:TODO) — 계획 단계만 - 진행, 실제 수정은 /harness-work로 별도 진행 예정. 세분화 기준 - (agents/task-decomposer.md) 통과 확인: 파일당 단일 관심사, grill-me 관련 - 2건(산출 경로 인자·headless 모드)은 관심사가 달라 4.5·4.6으로 분리. - -## 2026-07-08 — Planning observability v1 - -- 사용자 요청으로 독립 task-decomposer proposal 기본 흐름과 비개발자 친화 planning - JSONL 감시 구조 구현. `docs/specs/2026-07-08-planning-observability.md`에 - 계획 문서 저장. -- `.harness/shared/planning/runs/`와 `.harness/events/` 골격 추가, skeleton에도 - 반영해 `init.sh` 복사 대상에 포함. -- planning 전용 스크립트 추가: - `planning_log.py`, `build_planning_context.py`, `run_task_decomposer.py`, - `validate_task_proposal.py`, `apply_task_proposal.py`. -- 문서 규약 갱신: `agents/task-decomposer.md`, `CLAUDE.md`, `BLUEPRINT.md`, - `README.md`, `docs/session-recovery.md`, `.harness/CONTEXT_INDEX.md`, - `templates/skeleton/.harness/CONTEXT_INDEX.md`, `harness.toml`. -- 검증: `python3 -m unittest tests.test_tasks tests.test_planning -v` PASS(18), - `python3 scripts/validate_tasks.py` PASS, `python3 scripts/sync_plans.py --check` PASS, - `init.sh` smoke test PASS. - -## 2026-07-08 — Codex repo-scoped harness skills - -- 사용자 제공 계획에 따라 `.agents/skills/` 아래 Codex skill 6종 추가: - `grill-me`, `harness-plan`, `harness-work`, `harness-review`, - `harness-progress`, `harness-sync`. -- `AGENTS.md`, `README.md`, `BLUEPRINT.md`를 `$grill-me`/`$harness-*` 호출 - 방식으로 갱신하고, `init.sh`가 `.agents/skills`와 planning proposal scripts를 - 새 프로젝트에 복사하도록 수정. -- `.agents/skills` 디렉터리가 샌드박스에서 read-only로 잡혀 최초 `mkdir -p`가 - `Read-only file system`으로 실패. 승인된 escalated command로 디렉터리를 생성한 - 뒤 `apply_patch`로 파일을 추가해 해결. -- 검증: skill 6개 존재 확인, frontmatter 확인, `python3 scripts/validate_tasks.py` - PASS, `python3 scripts/validate_tasks.py --root templates/skeleton` PASS, - `python3 scripts/sync_plans.py --check` PASS, skeleton sync check PASS, - `init.sh /tmp/cc-harness-skill-test.iB2C65` smoke test PASS, - `python3 -m unittest tests.test_tasks tests.test_planning -v` PASS(18). - -## 2026-07-08 — Git workflow helper command/skill - -- Claude Code local custom command 3종 추가: - `.claude/commands/branch-checkout.md`, `.claude/commands/git-push.md`, - `.claude/commands/pr-create.md`. -- Codex repo-scoped skill 3종 추가: - `.agents/skills/branch-checkout/SKILL.md`, `.agents/skills/git-push/SKILL.md`, - `.agents/skills/pr-create/SKILL.md`. -- 각 절차는 `git status`와 현재 브랜치를 먼저 확인하고, local changes discard와 - force push를 금지하도록 작성. -- `init.sh`, `README.md`, `BLUEPRINT.md`, `AGENTS.md`, `docs/setup-guide.md`, - context index, `tasks/index.json`, `Plans.md` 갱신. -- 검증: skill frontmatter PASS, command 파일 존재 확인 PASS, - `python3 scripts/validate_tasks.py` PASS, skeleton validate PASS, - `python3 scripts/sync_plans.py --check` PASS, skeleton sync check PASS, - `python3 -m unittest tests.test_tasks tests.test_planning -v` PASS(18), - `init.sh /tmp/cc-harness-git-helper-test.9j00Yd` smoke test PASS. - -## 2026-07-08 — rescue-from-main workflow helper - -- planning proposal 절차로 Task `4.11`을 추가하고 완료 처리했다. -- Claude Code local custom command `.claude/commands/rescue-from-main.md`와 - Codex repo-scoped skill `.agents/skills/rescue-from-main/SKILL.md`를 추가했다. -- 절차는 preflight, diff 기반 branch slug 생성, `main`/`master` uncommitted 변경의 - `git switch -c` 보존, local commit 자동 reset 금지, commit/push/draft PR 본문 - 규칙을 포함한다. -- `AGENTS.md`, `README.md`, `BLUEPRINT.md`, `.harness/CONTEXT_INDEX.md`에 새 helper를 - 등록했다. `init.sh`는 `.agents/skills/`와 `.claude/commands/` 전체 복사라 새 파일이 - 자동 포함됨을 smoke test로 확인했다. -- `.agents/skills/rescue-from-main` 디렉터리 생성은 샌드박스 read-only 제한으로 - 최초 `mkdir -p`가 실패했고, 승인된 escalated command로 생성한 뒤 `apply_patch`로 - 파일을 추가해 해결했다. -- 검증: Task Acceptance PASS, skill frontmatter PASS(10개), `init.sh` smoke test - PASS(`/tmp/cc-harness-rescue-test.0oIJCZ`), `python3 scripts/validate_tasks.py` PASS, - `python3 scripts/sync_plans.py --check` PASS, - `python3 -m unittest tests.test_tasks tests.test_planning -v` PASS(18). -## 2026-07-08 12:20 KST — Task status patch target mistake - -- 상황: Task `4.10`을 완료 처리하려고 `"status": "todo"` 단일 패턴을 패치했더니 - 첫 번째 TODO였던 `4.1`이 잘못 `done`으로 변경됐다. -- 원인: `apply_patch` context가 Task ID를 포함하지 않아 동일한 status 문자열 중 - 첫 매칭에 적용됐다. -- 조치: `grep -n '"id": "4\.' -A7 tasks/index.json`으로 상태를 확인했고, - `4.1`은 `todo`로 복구, `4.10`만 `done`으로 전환했다. -- 검증: `python3 scripts/sync_plans.py`, `python3 scripts/validate_tasks.py`, - `python3 scripts/sync_plans.py --check`, 전체 unittest 재실행 모두 PASS. +- [작업 또는 에러를 시간순으로 추가] diff --git a/.harness/STATE.md b/.harness/STATE.md index 2d2e399..cc7add9 100644 --- a/.harness/STATE.md +++ b/.harness/STATE.md @@ -1,49 +1,22 @@ -# STATE.md — 현재 상태 스냅샷 +# STATE.md — Task 상태 스냅샷 템플릿 -> 세션이 언제 끊겨도 이 파일 하나로 "지금 어디까지 왔는지"를 복원한다. -> 작업 시작 전·작업 단위 종료 후마다 갱신. Task 상태의 단일 출처는 tasks/index.json — -> 이 파일은 tasks/index.json이 담지 않는 세션 맥락(마지막 검증 결과, 차단 요소)만 담는다. +> 이 루트 파일은 실제 작업 상태가 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//STATE.md`로 복사해서 사용한다. +> 실제 최신 작업 맥락은 `.harness/tasks/` 아래 Task별 디렉토리에 기록한다. ## 현재 목표 -`main`/`master`에서 작업한 변경사항을 안전하게 작업 브랜치로 옮겨 -`commit → push → draft PR`까지 진행하는 `rescue-from-main` 공용 helper를 추가한다. -Claude Code custom command와 Codex repo skill을 함께 제공하고, 문서·초기화 경로에 -등록한다. +[Task 목표를 한 문장으로 기록] ## 진행 중인 Task -- Task `4.11` 완료: `rescue-from-main` workflow helper 추가. +- Task ID: `[id]` +- 상태: `[todo|wip|done|blocked]` +- 기준 문서: `tasks/index.json` ## 마지막 검증 결과 -- Task `4.11` Acceptance **PASS**: - `test -f .agents/skills/rescue-from-main/SKILL.md && test -f .claude/commands/rescue-from-main.md && grep -q 'rescue-from-main' AGENTS.md && grep -q 'rescue-from-main' README.md && grep -q 'rescue-from-main' BLUEPRINT.md` -- `.agents/skills` frontmatter check **PASS** (10개 `SKILL.md`) -- `init.sh` smoke test **PASS**: `/tmp/cc-harness-rescue-test.0oIJCZ`에 - `.agents/skills/rescue-from-main/SKILL.md`와 - `.claude/commands/rescue-from-main.md` 복사 확인 -- `python3 scripts/validate_tasks.py` **PASS** (`tasks/index.json valid`) -- `python3 scripts/sync_plans.py --check` **PASS** (`Plans.md in sync`) -- `python3 -m unittest tests.test_tasks tests.test_planning -v` **PASS** (18 tests) - -이전 작업 검증 기록: -- Task `4.10` Acceptance **PASS**: - `test -f docs/specs/2026-07-08-codex-claude-quality-gates.md && test -f agents/quality-gates.md && grep -q 'YAGNI' agents/quality-gates.md && grep -q 'caveman' README.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-work/SKILL.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-review/SKILL.md` -- `python3 -m unittest tests.test_tasks tests.test_planning -v` **PASS** (18 tests) -- `python3 scripts/validate_tasks.py` **PASS** (`tasks/index.json valid`) -- `python3 scripts/validate_tasks.py --root templates/skeleton` **PASS** (`tasks/index.json valid`) -- `python3 scripts/sync_plans.py --check` **PASS** (`Plans.md in sync`) -- `python3 scripts/sync_plans.py --root templates/skeleton --check` **PASS** (`Plans.md in sync`) -- init smoke test **PASS**: `/tmp/cc-harness-quality-gate-test.G576HW`에 - `agents/quality-gates.md`, `.agents/skills/{harness-work,harness-review}/SKILL.md`, - `AGENTS.md`, `CLAUDE.md` 복사 확인 -- `.agents/skills` frontmatter check **PASS** (9개 `SKILL.md`) -- Claude command existence check **PASS** (`branch-checkout`, `git-push`, `pr-create`) -- Codex Git skill existence check **PASS** (`branch-checkout`, `git-push`, `pr-create`) -- `init.sh` smoke test **PASS**: `/tmp/cc-harness-git-helper-test.9j00Yd`에 - `.claude/commands/*`, `.agents/skills/{branch-checkout,git-push,pr-create}/SKILL.md`, - `AGENTS.md`, `CLAUDE.md` 복사 확인 +- [아직 없음] ## 차단 요소 @@ -51,14 +24,8 @@ Claude Code custom command와 Codex repo skill을 함께 제공하고, 문서· ## 마지막 커밋 -- `930e404` docs: README·github-integration.md를 Week 3 변경사항에 맞춰 갱신 -- Week 3 Task 커밋 이력: `1ea64da`(3.1) → `d44a70a`(3.2) → `15ebe23`(3.3) → - `603fcc0`(3.6) → `0c8ea99`(3.4) → `03d185f`(3.5) → `2594119`(3.7) → - `2dd1d8b`(3.8) → `11aa504`(3.9) → `d5117bc`(3.10) → `2b9a6d8`(3.11) → - `6667307`(3.12) -- 현재 planning observability, Codex skill, Git helper command/skill, - `rescue-from-main` helper 변경분은 **아직 커밋 안 됨**. +- 없음 ## 최종 갱신 -- 2026-07-08 KST, Task `4.11` 구현·검증 완료 +- YYYY-MM-DD HH:MM KST diff --git a/.harness/TASKS.md b/.harness/TASKS.md index f73410f..fdecc78 100644 --- a/.harness/TASKS.md +++ b/.harness/TASKS.md @@ -1,9 +1,14 @@ -# TASKS.md — 세션 체크리스트 +# TASKS.md — Task 내부 체크리스트 템플릿 -> **Task 상태의 단일 출처는 Plans.md다.** 이 파일은 Plans.md Task 하나를 -> 세션 안에서 수행할 때의 세부 체크리스트(Task보다 작은 단위)만 기록한다. -> Task 완료 시 해당 섹션을 비우고 Plans.md 상태만 갱신한다. +> 이 루트 파일은 실제 체크리스트가 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//TASKS.md`로 복사해서 사용한다. -## 현재 Task: 없음 +## 현재 Task: [id] [title] -(Week 3 전 Task(3.1~3.12) 완료 — 체크리스트 비움. 다음 Task 착수 시 여기에 새로 작성.) +- [ ] 세분화 기준 확인 +- [ ] scope/YAGNI 기준 확인 +- [ ] 구현 +- [ ] Acceptance 실행 +- [ ] 관련 테스트 실행 +- [ ] 리뷰 +- [ ] `tasks/index.json`/`Plans.md` 갱신 diff --git a/.harness/shared/planning/latest.json b/.harness/shared/planning/latest.json index 9e4193b..6d5667e 100644 --- a/.harness/shared/planning/latest.json +++ b/.harness/shared/planning/latest.json @@ -1,7 +1,7 @@ { - "run_id": "plan-20260708-150320-db655f", - "updated_at": "2026-07-08T15:03:20+09:00", - "context": ".harness/shared/planning/runs/plan-20260708-150320-db655f/context.json", - "proposal": ".harness/shared/planning/runs/plan-20260708-150320-db655f/proposed-tasks.json", - "report": ".harness/shared/planning/runs/plan-20260708-150320-db655f/decomposition-report.md" + "run_id": "plan-20260708-155019-c28b5b", + "updated_at": "2026-07-08T15:50:19+09:00", + "context": ".harness/shared/planning/runs/plan-20260708-155019-c28b5b/context.json", + "proposal": ".harness/shared/planning/runs/plan-20260708-155019-c28b5b/proposed-tasks.json", + "report": ".harness/shared/planning/runs/plan-20260708-155019-c28b5b/decomposition-report.md" } diff --git a/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/context.json b/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/context.json new file mode 100644 index 0000000..3afbf40 --- /dev/null +++ b/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/context.json @@ -0,0 +1,277 @@ +{ + "run_id": "plan-20260708-155019-c28b5b", + "created_at": "2026-07-08T15:50:19+09:00", + "request": "Task별 .harness 맥락 디렉토리 도입", + "documents": [ + { + "label": "PRD", + "path": "docs/PRD.md", + "exists": false + }, + { + "label": "User Flow", + "path": "docs/UserFlow.md", + "exists": false + }, + { + "label": "Design", + "path": "docs/DESIGN.md", + "exists": false + }, + { + "label": "Architecture", + "path": "docs/Architecture.md", + "exists": false + } + ], + "existing_tasks": [ + { + "id": "0.1", + "title": "PRD 작성 (`/grill-me` 인터뷰)", + "status": "done", + "section": "완료된 작업" + }, + { + "id": "0.2", + "title": "기획 보완 문서", + "status": "done", + "section": "완료된 작업" + }, + { + "id": "0.3", + "title": "Harness 초기화", + "status": "done", + "section": "완료된 작업" + }, + { + "id": "0.4", + "title": "Plugin 설정", + "status": "done", + "section": "완료된 작업" + }, + { + "id": "1.0", + "title": "Plans.md 템플릿 개선", + "status": "done", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.1", + "title": "test agent 추가", + "status": "done", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.2", + "title": "기획 파이프라인 추가", + "status": "done", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.3", + "title": "task-decomposer + 세션 세분화 게이트 추가", + "status": "done", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.4", + "title": ".harness/ 상태 문서 체계 추가", + "status": "done", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "2.1", + "title": "테스트 프로젝트 골격 생성", + "status": "done", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.2", + "title": "기획 파이프라인 테스트 (grill-me 인터뷰)", + "status": "done", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.3", + "title": "보완 문서 테스트 (UserFlow·Architecture 골격 적용)", + "status": "done", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.4", + "title": "계획 파이프라인 테스트 (task-decomposer → Plans.md)", + "status": "done", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.5", + "title": "템플릿 결함 기록", + "status": "done", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.6", + "title": "DESIGN.md 기획 산출물 추가", + "status": "done", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.7", + "title": "GitHub 연동 E2E 검증", + "status": "done", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "3.1", + "title": "GitHub branch protection 호환 (H1)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.2", + "title": "clean 골격 세트 분리 (H5)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.3", + "title": "init.sh 초기화 스크립트 (H5)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.4", + "title": "plans-guard 상태 변경 보호 검토 기록 (H2)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.5", + "title": "Depends 검증 경로 정리 (H3)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.6", + "title": "Plans.md 헤더 검증 선행 파싱 (M1·M7)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.7", + "title": "완료 전환 서술 통일 (M3)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.8", + "title": "harness.toml 죽은 설정 정리 (M4)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.9", + "title": "Plans.md anti-pattern 예시 교정 (M2)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.10", + "title": "agents 문서 수행 주체 명시 (M5)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.11", + "title": "ci.yml 이름 고정 요약 잡 (M6)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.12", + "title": "플러그인 SHA 기록 절차 (M8)", + "status": "done", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "4.1", + "title": "세분화 기준 표현 정확도 개선 (L1)", + "status": "todo", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.2", + "title": "test-agent pretest 오탐 스택 감지 수정 (L2)", + "status": "todo", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.3", + "title": "CONTEXT_INDEX.md 미존재 파일 인덱스 정리 (L3)", + "status": "todo", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.4", + "title": "rm 위험 패턴 매칭 범위 확대 (L4)", + "status": "todo", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.5", + "title": "grill-me 산출 경로 인자 지원 (L5)", + "status": "todo", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.6", + "title": "grill-me 비대화형 실행 호환 모드 (L5)", + "status": "todo", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.7", + "title": "Codex 호환 진입점 추가", + "status": "done", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.8", + "title": "Codex harness skills 추가", + "status": "done", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.9", + "title": "Git workflow helper command/skill 추가", + "status": "done", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.10", + "title": "Claude/Codex 공용 Quality Gate 문서화", + "status": "done", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.11", + "title": "rescue-from-main workflow helper 추가", + "status": "done", + "section": "Week 4 — Codex 호환 환경 구성" + } + ], + "rules": { + "task_decomposer": "agents/task-decomposer.md", + "task_state_source": "tasks/index.json", + "readable_plan": "Plans.md" + }, + "outputs": { + "run_dir": ".harness/shared/planning/runs/plan-20260708-155019-c28b5b", + "proposal": ".harness/shared/planning/runs/plan-20260708-155019-c28b5b/proposed-tasks.json", + "report": ".harness/shared/planning/runs/plan-20260708-155019-c28b5b/decomposition-report.md" + }, + "technical": { + "schema_version": 1, + "proposal_dir": ".harness/shared/planning" + } +} diff --git a/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/decomposition-report.md b/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/decomposition-report.md new file mode 100644 index 0000000..e88d961 --- /dev/null +++ b/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/decomposition-report.md @@ -0,0 +1,16 @@ +# Decomposition Report — Task별 .harness 맥락 디렉토리 도입 + +## 완료 기준 + +- 루트 `.harness/*.md`는 복사용 템플릿 역할로 정리된다. +- 실제 작업 맥락은 `.harness/tasks//` 아래 Task별 파일로 기록된다. +- 최근 완료된 `4.11` 맥락과 중단된 README 개편 맥락만 새 구조 예시로 이관된다. +- `CLAUDE.md`, `AGENTS.md`, Codex skill, recovery/error 문서, skeleton이 같은 구조를 설명한다. + +## 확인 방법 + +Acceptance 명령은 새 Task별 디렉토리, skeleton `.gitkeep`, 핵심 문구, task/plan sync를 확인한다. 추가 검증으로 관련 unittest와 `init.sh` smoke test를 실행한다. + +## 먼저 끝나야 할 작업 + +`4.11`의 rescue-from-main helper 맥락을 이관 예시로 사용하므로 `4.11` 완료에 의존한다. diff --git a/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/proposed-tasks.json b/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/proposed-tasks.json new file mode 100644 index 0000000..2fbc942 --- /dev/null +++ b/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/proposed-tasks.json @@ -0,0 +1,16 @@ +{ + "tasks": [ + { + "id": "4.12", + "title": "Task별 .harness 맥락 디렉토리 도입", + "dod": ".harness/tasks// 구조와 루트 템플릿 역할이 문서·skeleton·최근 이관 예시로 정리됨", + "acceptance": "test -d .harness/tasks/4.11-rescue-from-main && test -d .harness/tasks/readme-user-friendly && test -f .harness/tasks/readme-user-friendly/tasks.index.snapshot.json && test -f templates/skeleton/.harness/tasks/.gitkeep && grep -q '템플릿' .harness/STATE.md && grep -q '.harness/tasks' CLAUDE.md && grep -q '.harness/tasks' AGENTS.md && grep -q '.harness/tasks' .agents/skills/harness-work/SKILL.md && python3 scripts/validate_tasks.py && python3 scripts/sync_plans.py --check", + "depends": [ + "4.11" + ], + "status": "todo", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + } + ] +} diff --git a/.harness/tasks/4.11-rescue-from-main/CHECKPOINTS.md b/.harness/tasks/4.11-rescue-from-main/CHECKPOINTS.md new file mode 100644 index 0000000..ce8ef25 --- /dev/null +++ b/.harness/tasks/4.11-rescue-from-main/CHECKPOINTS.md @@ -0,0 +1,5 @@ +# CHECKPOINTS.md — Task 4.11 완료 지점 + +| 일시 | Task | 내용 | 커밋 | 검증 | +|------|------|------|------|------| +| 2026-07-08 | 4.11 | rescue-from-main workflow helper 추가 | 미커밋 | Acceptance·frontmatter·init smoke·unittest PASS | diff --git a/.harness/tasks/4.11-rescue-from-main/HANDOFF.md b/.harness/tasks/4.11-rescue-from-main/HANDOFF.md new file mode 100644 index 0000000..e1e543f --- /dev/null +++ b/.harness/tasks/4.11-rescue-from-main/HANDOFF.md @@ -0,0 +1,16 @@ +# HANDOFF.md — Task 4.11 인수인계 + +## 다음 세션이 먼저 읽을 최소 파일 + +1. `tasks/index.json` +2. `Plans.md` +3. `.harness/tasks/4.11-rescue-from-main/STATE.md` + +## 재개 지점 + +- Task `4.11`은 완료 상태다. +- 추가 재개 작업은 없다. + +## 주의사항 + +- 이 디렉토리는 루트 `.harness/STATE.md`에 섞여 있던 4.11 검증 맥락을 Task별 구조로 이관한 예시다. diff --git a/.harness/tasks/4.11-rescue-from-main/LOG.md b/.harness/tasks/4.11-rescue-from-main/LOG.md new file mode 100644 index 0000000..0774094 --- /dev/null +++ b/.harness/tasks/4.11-rescue-from-main/LOG.md @@ -0,0 +1,16 @@ +# LOG.md — Task 4.11 작업·에러 로그 + +## 2026-07-08 + +- planning proposal 절차로 Task `4.11`을 추가하고 완료 처리했다. +- Claude Code local custom command `.claude/commands/rescue-from-main.md`와 + Codex repo-scoped skill `.agents/skills/rescue-from-main/SKILL.md`를 추가했다. +- 절차는 preflight, diff 기반 branch slug 생성, `main`/`master` uncommitted 변경의 + `git switch -c` 보존, local commit 자동 reset 금지, commit/push/draft PR 본문 + 규칙을 포함한다. +- `AGENTS.md`, `README.md`, `BLUEPRINT.md`, `.harness/CONTEXT_INDEX.md`에 새 helper를 + 등록했다. `init.sh`는 `.agents/skills/`와 `.claude/commands/` 전체 복사라 새 파일이 + 자동 포함됨을 smoke test로 확인했다. +- `.agents/skills/rescue-from-main` 디렉터리 생성은 샌드박스 read-only 제한으로 + 최초 `mkdir -p`가 실패했고, 승인된 escalated command로 생성한 뒤 `apply_patch`로 + 파일을 추가해 해결했다. diff --git a/.harness/tasks/4.11-rescue-from-main/STATE.md b/.harness/tasks/4.11-rescue-from-main/STATE.md new file mode 100644 index 0000000..4c8aa36 --- /dev/null +++ b/.harness/tasks/4.11-rescue-from-main/STATE.md @@ -0,0 +1,33 @@ +# STATE.md — Task 4.11 스냅샷 + +## 현재 목표 + +`rescue-from-main` workflow helper를 Claude command와 Codex skill로 제공한다. + +## 진행 중인 Task + +- Task ID: `4.11` +- 상태: `done` +- 기준 문서: `tasks/index.json` + +## 마지막 검증 결과 + +- Task `4.11` Acceptance PASS: + `test -f .agents/skills/rescue-from-main/SKILL.md && test -f .claude/commands/rescue-from-main.md && grep -q 'rescue-from-main' AGENTS.md && grep -q 'rescue-from-main' README.md && grep -q 'rescue-from-main' BLUEPRINT.md` +- `.agents/skills` frontmatter check PASS (10개 `SKILL.md`) +- `init.sh` smoke test PASS: `/tmp/cc-harness-rescue-test.0oIJCZ` +- `python3 scripts/validate_tasks.py` PASS +- `python3 scripts/sync_plans.py --check` PASS +- `python3 -m unittest tests.test_tasks tests.test_planning -v` PASS (18 tests) + +## 차단 요소 + +- 없음 + +## 마지막 커밋 + +- 미커밋 상태에서 기록됨 + +## 최종 갱신 + +- 2026-07-08 15:50 KST diff --git a/.harness/tasks/4.11-rescue-from-main/TASKS.md b/.harness/tasks/4.11-rescue-from-main/TASKS.md new file mode 100644 index 0000000..b45baa8 --- /dev/null +++ b/.harness/tasks/4.11-rescue-from-main/TASKS.md @@ -0,0 +1,8 @@ +# TASKS.md — Task 4.11 내부 체크리스트 + +- [x] planning proposal 생성·검증·적용 +- [x] Claude command 추가 +- [x] Codex skill 추가 +- [x] 문서 등록 +- [x] Acceptance 실행 +- [x] 관련 테스트 실행 diff --git a/.harness/tasks/4.11-rescue-from-main/tasks.index.snapshot.json b/.harness/tasks/4.11-rescue-from-main/tasks.index.snapshot.json new file mode 100644 index 0000000..2afec07 --- /dev/null +++ b/.harness/tasks/4.11-rescue-from-main/tasks.index.snapshot.json @@ -0,0 +1,442 @@ +{ + "version": 1, + "tasks": [ + { + "id": "0.1", + "title": "PRD 작성 (`/grill-me` 인터뷰)", + "dod": "docs/PRD.md v0.1 존재, Open Questions 정리됨", + "acceptance": "test -f docs/PRD.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "0.2", + "title": "기획 보완 문서", + "dod": "UserFlow.md·Architecture.md 작성 (docs/templates/ 골격 사용)", + "acceptance": "test -f docs/UserFlow.md && test -f docs/Architecture.md", + "depends": [ + "0.1" + ], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "0.3", + "title": "Harness 초기화", + "dod": "harness doctor 전체 통과, CLAUDE.md·Plans.md 존재", + "acceptance": "test -f CLAUDE.md && test -f Plans.md && test -f harness.toml", + "depends": [], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "0.4", + "title": "Plugin 설정", + "dod": "ponytail·caveman·VFF 설치 확인, agent MEMORY.md 3개 존재", + "acceptance": "-", + "depends": [ + "0.3" + ], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "1.0", + "title": "Plans.md 템플릿 개선", + "dod": "bootstrap Task에 Acceptance 예시 있음, 현실적 샘플 Task 포함", + "acceptance": "grep -qE 'test -f|npm test|pytest|go test|curl' Plans.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.1", + "title": "test agent 추가", + "dod": "agents/test-agent.md 존재, harness.toml [test] 섹션, BLUEPRINT.md 업데이트", + "acceptance": "test -f agents/test-agent.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.2", + "title": "기획 파이프라인 추가", + "dod": "grill-me 스킬 + docs/templates/ 골격 3종, CLAUDE.md 기획 규칙", + "acceptance": "test -f .claude/skills/grill-me/SKILL.md && test -f docs/templates/PRD.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.3", + "title": "task-decomposer + 세션 세분화 게이트 추가", + "dod": "agents/task-decomposer.md 존재, harness.toml [plan] 섹션, CLAUDE.md 구현 규칙에 세분화 게이트 명시", + "acceptance": "test -f agents/task-decomposer.md && grep -q '세분화 게이트' CLAUDE.md", + "depends": [ + "1.1" + ], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.4", + "title": ".harness/ 상태 문서 체계 추가", + "dod": ".harness/ 골격 7종(STATE·HANDOFF·TASKS·LOG·LESSONS·CHECKPOINTS·CONTEXT_INDEX) 존재, CLAUDE.md 상태 문서 규칙 섹션 존재", + "acceptance": "test -f .harness/STATE.md && test -f .harness/CONTEXT_INDEX.md && grep -q '상태 문서 규칙' CLAUDE.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "2.1", + "title": "테스트 프로젝트 골격 생성", + "dod": "../routine-saas/에 CLAUDE.md·Plans.md·harness.toml·agents/·docs/templates/·.github/ 복사됨", + "acceptance": "-", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.2", + "title": "기획 파이프라인 테스트 (grill-me 인터뷰)", + "dod": "../routine-saas/docs/PRD.md v0.1 존재, Decisions 섹션 기록됨", + "acceptance": "-", + "depends": [ + "2.1" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.3", + "title": "보완 문서 테스트 (UserFlow·Architecture 골격 적용)", + "dod": "../routine-saas/docs/UserFlow.md·Architecture.md 존재", + "acceptance": "-", + "depends": [ + "2.2" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.4", + "title": "계획 파이프라인 테스트 (task-decomposer → Plans.md)", + "dod": "../routine-saas/Plans.md에 세분화 기준 통과 Task 표 존재", + "acceptance": "-", + "depends": [ + "2.3" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.5", + "title": "템플릿 결함 기록", + "dod": "테스트 중 발견한 템플릿 문제를 .harness/LESSONS.md에 기록, 수정 필요 항목은 Week 3 후보로 정리", + "acceptance": "-", + "depends": [ + "2.4" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.6", + "title": "DESIGN.md 기획 산출물 추가", + "dod": "docs/templates/DESIGN.md 골격 존재, CLAUDE.md 기획 규칙에 DESIGN 단계 반영, routine-saas에 실제 작성 적용", + "acceptance": "test -f docs/templates/DESIGN.md", + "depends": [ + "2.5" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.7", + "title": "GitHub 연동 E2E 검증", + "dod": "harness-gh-test repo에서 GitHub 연동 시나리오를 검증하고 발견한 빈틈을 문서화", + "acceptance": "grep -q 'GitHub 플로우' CLAUDE.md", + "depends": [ + "2.5" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "3.1", + "title": "GitHub branch protection 호환 (H1)", + "dod": "protection 활성 테스트 repo에서 자동 flip 실증, 선택한 방식(bypass/PR)의 근거를 워크플로 주석에 기록", + "acceptance": "grep -qi 'branch protection' docs/github-integration.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.2", + "title": "clean 골격 세트 분리 (H5)", + "dod": "templates/skeleton/에 Plans.md·.harness/ 7종 초기 상태 존재, dogfood 이력 미포함", + "acceptance": "test -f templates/skeleton/Plans.md && test -f templates/skeleton/.harness/STATE.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.3", + "title": "init.sh 초기화 스크립트 (H5)", + "dod": "init.sh가 ci.yml·plans-guard.yml·.harness/ 골격 포함 복사, README 수동 cp 절차를 스크립트 안내로 교체", + "acceptance": "test -x init.sh && grep -q 'plans-guard.yml' init.sh && grep -q 'ci.yml' init.sh", + "depends": [ + "3.2" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.4", + "title": "plans-guard 상태 변경 보호 검토 기록 (H2)", + "dod": "Task 상태 변경 보호를 CI가 아닌 세션 에이전트 책임으로 둘지 검토하고 결정을 문서화", + "acceptance": "-", + "depends": [ + "3.6" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.5", + "title": "Depends 검증 경로 정리 (H3)", + "dod": "Depends 존재 여부와 WIP 선행 완료 검증 경로가 validate_tasks.py 기준으로 정리됨", + "acceptance": "python3 scripts/validate_tasks.py", + "depends": [ + "3.6" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.6", + "title": "Plans.md 헤더 검증 선행 파싱 (M1·M7)", + "dod": "헤더 7컬럼 불일치 시 명시 FAIL(조용한 skip 제거), plans-guard에 적용", + "acceptance": "python3 scripts/sync_plans.py --check", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.7", + "title": "완료 전환 서술 통일 (M3)", + "dod": "README·BLUEPRINT의 Task 상태 전환 서술을 CLAUDE.md 기준과 일치시킴", + "acceptance": "grep -q 'GitHub Actions는 Task 상태를 바꾸지 않는다' README.md && grep -q 'Actions는 Task 상태를 쓰지 않고' BLUEPRINT.md", + "depends": [ + "3.1" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.8", + "title": "harness.toml 죽은 설정 정리 (M4)", + "dod": "미사용 키 제거, 미파싱 섹션 역할 주석 재정의(실행 SSOT는 CLAUDE.md)", + "acceptance": "! grep -q 'max_iterations' harness.toml", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.9", + "title": "Plans.md anti-pattern 예시 교정 (M2)", + "dod": "무력화 패턴(echo skip) 행 교정, repo 밖 경로 acceptance `-` 처리, 주석에 금지 규약 추가", + "acceptance": "! grep -qE 'echo sk[i]p' Plans.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.10", + "title": "agents 문서 수행 주체 명시 (M5)", + "dod": "BLUEPRINT·README에 \"절차 문서, 수행 주체=세션 Claude\" 명시, .claude/agents/ 이전 여부 결정 기록", + "acceptance": "grep -q '수행 주체' BLUEPRINT.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.11", + "title": "ci.yml 이름 고정 요약 잡 (M6)", + "dod": "ci-ok 잡 신설(스택 잡 needs 집약), required check 등록 안내 주석", + "acceptance": "grep -q 'ci-ok' .github/workflows/ci.yml", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.12", + "title": "플러그인 SHA 기록 절차 (M8)", + "dod": "README 버전 표에 검증 커밋 SHA 컬럼 추가, 업데이트 전 확인 절차 단락", + "acceptance": "grep -q 'SHA' README.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "4.1", + "title": "세분화 기준 표현 정확도 개선 (L1)", + "dod": "agents/task-decomposer.md가 정상 연결어와 여러 관심사 열거 표현을 구분하는 기준을 설명", + "acceptance": "grep -q '여러 관심사' agents/task-decomposer.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.2", + "title": "test-agent pretest 오탐 스택 감지 수정 (L2)", + "dod": "\"pretest\" 스크립트만 있는 package.json을 npm test 스택으로 오판하지 않음", + "acceptance": "grep -q '\"test\":' agents/test-agent.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.3", + "title": "CONTEXT_INDEX.md 미존재 파일 인덱스 정리 (L3)", + "dod": "이 저장소에 없는 docs/PRD.md·UserFlow.md·Architecture.md 인덱스 항목 제거", + "acceptance": "! grep -q 'docs/PRD.md' .harness/CONTEXT_INDEX.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.4", + "title": "rm 위험 패턴 매칭 범위 확대 (L4)", + "dod": "harness.toml ask 목록이 rm -fr·rm -R 조합도 포착", + "acceptance": "[ $(grep -c 'rm -' harness.toml) -gt 1 ]", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.5", + "title": "grill-me 산출 경로 인자 지원 (L5)", + "dod": "SKILL.md에 대상 디렉토리 인자 규약 명시, 기본값은 현재 프로젝트 docs/", + "acceptance": "grep -q '산출 경로' .claude/skills/grill-me/SKILL.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.6", + "title": "grill-me 비대화형 실행 호환 모드 (L5)", + "dod": "무응답·headless 환경에서 질문마다 권장값으로 자동 확정 후 진행하는 대안 경로 명시", + "acceptance": "grep -q 'headless' .claude/skills/grill-me/SKILL.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.7", + "title": "Codex 호환 진입점 추가", + "dod": "AGENTS.md가 Codex 진입점으로 존재하고 init.sh가 새 프로젝트에 복사하며 README·BLUEPRINT에 Codex 동작 경로가 명시됨", + "acceptance": "test -f AGENTS.md && grep -q 'AGENTS.md' init.sh && grep -q 'Recommended Codex Workflow' README.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.8", + "title": "Codex harness skills 추가", + "dod": ".agents/skills 아래 harness 흐름 6종 SKILL.md가 존재하고 init.sh가 새 프로젝트에 복사함", + "acceptance": "test -f .agents/skills/grill-me/SKILL.md && test -f .agents/skills/harness-plan/SKILL.md && test -f .agents/skills/harness-work/SKILL.md && test -f .agents/skills/harness-review/SKILL.md && test -f .agents/skills/harness-progress/SKILL.md && test -f .agents/skills/harness-sync/SKILL.md && grep -q '.agents/skills' init.sh", + "depends": [ + "4.7" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.9", + "title": "Git workflow helper command/skill 추가", + "dod": "Claude custom command와 Codex skill로 branch-checkout·git-push·pr-create 절차가 제공되고 init.sh가 복사함", + "acceptance": "test $(find .claude/commands -name '*.md' | wc -l) -ge 3 && test -f .agents/skills/branch-checkout/SKILL.md && test -f .agents/skills/git-push/SKILL.md && test -f .agents/skills/pr-create/SKILL.md && grep -q '.claude/commands' init.sh", + "depends": [ + "4.8" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.10", + "title": "Claude/Codex 공용 Quality Gate 문서화", + "dod": "docs/specs/2026-07-08-codex-claude-quality-gates.md와 agents/quality-gates.md가 존재하고 Codex skill, README, BLUEPRINT, AGENTS, init skeleton이 quality gate 기준을 참조함", + "acceptance": "test -f docs/specs/2026-07-08-codex-claude-quality-gates.md && test -f agents/quality-gates.md && grep -q 'YAGNI' agents/quality-gates.md && grep -q 'caveman' README.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-work/SKILL.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-review/SKILL.md", + "depends": [ + "4.8" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.11", + "title": "rescue-from-main workflow helper 추가", + "dod": "Claude custom command와 Codex skill로 rescue-from-main 절차가 제공되고 AGENTS·README·BLUEPRINT·init 복사 경로에 등록됨", + "acceptance": "test -f .agents/skills/rescue-from-main/SKILL.md && test -f .claude/commands/rescue-from-main.md && grep -q 'rescue-from-main' AGENTS.md && grep -q 'rescue-from-main' README.md && grep -q 'rescue-from-main' BLUEPRINT.md", + "depends": [ + "4.9", + "4.10" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.12", + "title": "Task별 .harness 맥락 디렉토리 도입", + "dod": ".harness/tasks// 구조와 루트 템플릿 역할이 문서·skeleton·최근 이관 예시로 정리됨", + "acceptance": "test -d .harness/tasks/4.11-rescue-from-main && test -d .harness/tasks/readme-user-friendly && test -f .harness/tasks/readme-user-friendly/tasks.index.snapshot.json && test -f templates/skeleton/.harness/tasks/.gitkeep && grep -q '템플릿' .harness/STATE.md && grep -q '.harness/tasks' CLAUDE.md && grep -q '.harness/tasks' AGENTS.md && grep -q '.harness/tasks' .agents/skills/harness-work/SKILL.md && python3 scripts/validate_tasks.py && python3 scripts/sync_plans.py --check", + "depends": [ + "4.11" + ], + "status": "todo", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + } + ] +} diff --git a/.harness/tasks/4.12-task-harness-context/CHECKPOINTS.md b/.harness/tasks/4.12-task-harness-context/CHECKPOINTS.md new file mode 100644 index 0000000..4c4352d --- /dev/null +++ b/.harness/tasks/4.12-task-harness-context/CHECKPOINTS.md @@ -0,0 +1,6 @@ +# CHECKPOINTS.md — Task 4.12 완료 지점 + +| 일시 | Task | 내용 | 커밋 | 검증 | +|------|------|------|------|------| +| 2026-07-08 | 4.12 | Task별 `.harness/tasks/` 구조 도입 완료 | 미커밋 | Acceptance·unittest·skeleton validate·init smoke PASS | +| 2026-07-08 | 4.12 | planning proposal 적용 | 미커밋 | validate_task_proposal PASS | diff --git a/.harness/tasks/4.12-task-harness-context/HANDOFF.md b/.harness/tasks/4.12-task-harness-context/HANDOFF.md new file mode 100644 index 0000000..d9a26d2 --- /dev/null +++ b/.harness/tasks/4.12-task-harness-context/HANDOFF.md @@ -0,0 +1,17 @@ +# HANDOFF.md — Task 4.12 인수인계 + +## 다음 세션이 먼저 읽을 최소 파일 + +1. `.harness/tasks/4.12-task-harness-context/STATE.md` +2. `tasks/index.json` +3. `Plans.md` +4. `.harness/CONTEXT_INDEX.md` + +## 재개 지점 + +- Task `4.12`는 완료됐다. 다음 작업은 `tasks/index.json`의 남은 `todo` Task 중에서 선택한다. + +## 주의사항 + +- 루트 `.harness/*.md`에 실제 작업 상태를 다시 쓰지 않는다. +- README 사용자 친화 개편은 `.harness/tasks/readme-user-friendly/`에 후순위 상태로 이관했으며, 별도 Task가 필요하다. diff --git a/.harness/tasks/4.12-task-harness-context/LOG.md b/.harness/tasks/4.12-task-harness-context/LOG.md new file mode 100644 index 0000000..08531be --- /dev/null +++ b/.harness/tasks/4.12-task-harness-context/LOG.md @@ -0,0 +1,14 @@ +# LOG.md — Task 4.12 작업·에러 로그 + +## 2026-07-08 + +- 사용자 제공 계획을 기준으로 Task `4.12` planning proposal을 생성·검증·적용했다. +- 루트 `.harness/*.md`를 템플릿으로 바꾸고, 실제 맥락은 `.harness/tasks//`로 이동하는 작업을 시작했다. +- `.harness/tasks/4.11-rescue-from-main/`, `.harness/tasks/readme-user-friendly/`, + `.harness/tasks/4.12-task-harness-context/`를 만들고 Task별 상태·로그·인수인계·checkpoint를 기록했다. +- `CLAUDE.md`, `AGENTS.md`, `.agents/skills/harness-work/SKILL.md`, README, + `docs/session-recovery.md`, `docs/error-memory.md`, hooks/spec 문서를 `.harness/tasks/` + 구조 기준으로 갱신했다. +- `templates/skeleton/.harness/` 루트 문서를 템플릿으로 바꾸고 + `templates/skeleton/.harness/tasks/.gitkeep`를 추가했다. +- Acceptance, unittest, skeleton 검증, `init.sh` smoke test가 모두 PASS했다. diff --git a/.harness/tasks/4.12-task-harness-context/STATE.md b/.harness/tasks/4.12-task-harness-context/STATE.md new file mode 100644 index 0000000..2d941ab --- /dev/null +++ b/.harness/tasks/4.12-task-harness-context/STATE.md @@ -0,0 +1,34 @@ +# STATE.md — Task 4.12 스냅샷 + +## 현재 목표 + +Task별 `.harness/tasks//` 맥락 디렉토리 구조를 도입한다. + +## 진행 중인 Task + +- Task ID: `4.12` +- 상태: `done` +- 기준 문서: `tasks/index.json` + +## 마지막 검증 결과 + +- planning proposal 생성 PASS +- `python3 scripts/validate_task_proposal.py --proposal .harness/shared/planning/runs/plan-20260708-155019-c28b5b/proposed-tasks.json` PASS +- `python3 scripts/apply_task_proposal.py --proposal .harness/shared/planning/runs/plan-20260708-155019-c28b5b/proposed-tasks.json` PASS +- Task Acceptance PASS +- `python3 -m unittest tests.test_tasks tests.test_planning -v` PASS (18 tests) +- `python3 scripts/validate_tasks.py --root templates/skeleton` PASS +- `python3 scripts/sync_plans.py --root templates/skeleton --check` PASS +- `init.sh /tmp/cc-harness-task-context-test.FYunNx` smoke test PASS + +## 차단 요소 + +- 없음 + +## 마지막 커밋 + +- 미커밋 + +## 최종 갱신 + +- 2026-07-08 16:00 KST diff --git a/.harness/tasks/4.12-task-harness-context/TASKS.md b/.harness/tasks/4.12-task-harness-context/TASKS.md new file mode 100644 index 0000000..5c34456 --- /dev/null +++ b/.harness/tasks/4.12-task-harness-context/TASKS.md @@ -0,0 +1,8 @@ +# TASKS.md — Task 4.12 내부 체크리스트 + +- [x] planning proposal 생성·검증·적용 +- [x] Task별 디렉토리 골격 생성 +- [x] 루트 `.harness/*.md` 템플릿화 +- [x] 규칙 문서 갱신 +- [x] skeleton 갱신 +- [x] Acceptance와 관련 테스트 실행 diff --git a/.harness/tasks/4.12-task-harness-context/tasks.index.snapshot.json b/.harness/tasks/4.12-task-harness-context/tasks.index.snapshot.json new file mode 100644 index 0000000..2afec07 --- /dev/null +++ b/.harness/tasks/4.12-task-harness-context/tasks.index.snapshot.json @@ -0,0 +1,442 @@ +{ + "version": 1, + "tasks": [ + { + "id": "0.1", + "title": "PRD 작성 (`/grill-me` 인터뷰)", + "dod": "docs/PRD.md v0.1 존재, Open Questions 정리됨", + "acceptance": "test -f docs/PRD.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "0.2", + "title": "기획 보완 문서", + "dod": "UserFlow.md·Architecture.md 작성 (docs/templates/ 골격 사용)", + "acceptance": "test -f docs/UserFlow.md && test -f docs/Architecture.md", + "depends": [ + "0.1" + ], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "0.3", + "title": "Harness 초기화", + "dod": "harness doctor 전체 통과, CLAUDE.md·Plans.md 존재", + "acceptance": "test -f CLAUDE.md && test -f Plans.md && test -f harness.toml", + "depends": [], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "0.4", + "title": "Plugin 설정", + "dod": "ponytail·caveman·VFF 설치 확인, agent MEMORY.md 3개 존재", + "acceptance": "-", + "depends": [ + "0.3" + ], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "1.0", + "title": "Plans.md 템플릿 개선", + "dod": "bootstrap Task에 Acceptance 예시 있음, 현실적 샘플 Task 포함", + "acceptance": "grep -qE 'test -f|npm test|pytest|go test|curl' Plans.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.1", + "title": "test agent 추가", + "dod": "agents/test-agent.md 존재, harness.toml [test] 섹션, BLUEPRINT.md 업데이트", + "acceptance": "test -f agents/test-agent.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.2", + "title": "기획 파이프라인 추가", + "dod": "grill-me 스킬 + docs/templates/ 골격 3종, CLAUDE.md 기획 규칙", + "acceptance": "test -f .claude/skills/grill-me/SKILL.md && test -f docs/templates/PRD.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.3", + "title": "task-decomposer + 세션 세분화 게이트 추가", + "dod": "agents/task-decomposer.md 존재, harness.toml [plan] 섹션, CLAUDE.md 구현 규칙에 세분화 게이트 명시", + "acceptance": "test -f agents/task-decomposer.md && grep -q '세분화 게이트' CLAUDE.md", + "depends": [ + "1.1" + ], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.4", + "title": ".harness/ 상태 문서 체계 추가", + "dod": ".harness/ 골격 7종(STATE·HANDOFF·TASKS·LOG·LESSONS·CHECKPOINTS·CONTEXT_INDEX) 존재, CLAUDE.md 상태 문서 규칙 섹션 존재", + "acceptance": "test -f .harness/STATE.md && test -f .harness/CONTEXT_INDEX.md && grep -q '상태 문서 규칙' CLAUDE.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "2.1", + "title": "테스트 프로젝트 골격 생성", + "dod": "../routine-saas/에 CLAUDE.md·Plans.md·harness.toml·agents/·docs/templates/·.github/ 복사됨", + "acceptance": "-", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.2", + "title": "기획 파이프라인 테스트 (grill-me 인터뷰)", + "dod": "../routine-saas/docs/PRD.md v0.1 존재, Decisions 섹션 기록됨", + "acceptance": "-", + "depends": [ + "2.1" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.3", + "title": "보완 문서 테스트 (UserFlow·Architecture 골격 적용)", + "dod": "../routine-saas/docs/UserFlow.md·Architecture.md 존재", + "acceptance": "-", + "depends": [ + "2.2" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.4", + "title": "계획 파이프라인 테스트 (task-decomposer → Plans.md)", + "dod": "../routine-saas/Plans.md에 세분화 기준 통과 Task 표 존재", + "acceptance": "-", + "depends": [ + "2.3" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.5", + "title": "템플릿 결함 기록", + "dod": "테스트 중 발견한 템플릿 문제를 .harness/LESSONS.md에 기록, 수정 필요 항목은 Week 3 후보로 정리", + "acceptance": "-", + "depends": [ + "2.4" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.6", + "title": "DESIGN.md 기획 산출물 추가", + "dod": "docs/templates/DESIGN.md 골격 존재, CLAUDE.md 기획 규칙에 DESIGN 단계 반영, routine-saas에 실제 작성 적용", + "acceptance": "test -f docs/templates/DESIGN.md", + "depends": [ + "2.5" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.7", + "title": "GitHub 연동 E2E 검증", + "dod": "harness-gh-test repo에서 GitHub 연동 시나리오를 검증하고 발견한 빈틈을 문서화", + "acceptance": "grep -q 'GitHub 플로우' CLAUDE.md", + "depends": [ + "2.5" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "3.1", + "title": "GitHub branch protection 호환 (H1)", + "dod": "protection 활성 테스트 repo에서 자동 flip 실증, 선택한 방식(bypass/PR)의 근거를 워크플로 주석에 기록", + "acceptance": "grep -qi 'branch protection' docs/github-integration.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.2", + "title": "clean 골격 세트 분리 (H5)", + "dod": "templates/skeleton/에 Plans.md·.harness/ 7종 초기 상태 존재, dogfood 이력 미포함", + "acceptance": "test -f templates/skeleton/Plans.md && test -f templates/skeleton/.harness/STATE.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.3", + "title": "init.sh 초기화 스크립트 (H5)", + "dod": "init.sh가 ci.yml·plans-guard.yml·.harness/ 골격 포함 복사, README 수동 cp 절차를 스크립트 안내로 교체", + "acceptance": "test -x init.sh && grep -q 'plans-guard.yml' init.sh && grep -q 'ci.yml' init.sh", + "depends": [ + "3.2" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.4", + "title": "plans-guard 상태 변경 보호 검토 기록 (H2)", + "dod": "Task 상태 변경 보호를 CI가 아닌 세션 에이전트 책임으로 둘지 검토하고 결정을 문서화", + "acceptance": "-", + "depends": [ + "3.6" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.5", + "title": "Depends 검증 경로 정리 (H3)", + "dod": "Depends 존재 여부와 WIP 선행 완료 검증 경로가 validate_tasks.py 기준으로 정리됨", + "acceptance": "python3 scripts/validate_tasks.py", + "depends": [ + "3.6" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.6", + "title": "Plans.md 헤더 검증 선행 파싱 (M1·M7)", + "dod": "헤더 7컬럼 불일치 시 명시 FAIL(조용한 skip 제거), plans-guard에 적용", + "acceptance": "python3 scripts/sync_plans.py --check", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.7", + "title": "완료 전환 서술 통일 (M3)", + "dod": "README·BLUEPRINT의 Task 상태 전환 서술을 CLAUDE.md 기준과 일치시킴", + "acceptance": "grep -q 'GitHub Actions는 Task 상태를 바꾸지 않는다' README.md && grep -q 'Actions는 Task 상태를 쓰지 않고' BLUEPRINT.md", + "depends": [ + "3.1" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.8", + "title": "harness.toml 죽은 설정 정리 (M4)", + "dod": "미사용 키 제거, 미파싱 섹션 역할 주석 재정의(실행 SSOT는 CLAUDE.md)", + "acceptance": "! grep -q 'max_iterations' harness.toml", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.9", + "title": "Plans.md anti-pattern 예시 교정 (M2)", + "dod": "무력화 패턴(echo skip) 행 교정, repo 밖 경로 acceptance `-` 처리, 주석에 금지 규약 추가", + "acceptance": "! grep -qE 'echo sk[i]p' Plans.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.10", + "title": "agents 문서 수행 주체 명시 (M5)", + "dod": "BLUEPRINT·README에 \"절차 문서, 수행 주체=세션 Claude\" 명시, .claude/agents/ 이전 여부 결정 기록", + "acceptance": "grep -q '수행 주체' BLUEPRINT.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.11", + "title": "ci.yml 이름 고정 요약 잡 (M6)", + "dod": "ci-ok 잡 신설(스택 잡 needs 집약), required check 등록 안내 주석", + "acceptance": "grep -q 'ci-ok' .github/workflows/ci.yml", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.12", + "title": "플러그인 SHA 기록 절차 (M8)", + "dod": "README 버전 표에 검증 커밋 SHA 컬럼 추가, 업데이트 전 확인 절차 단락", + "acceptance": "grep -q 'SHA' README.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "4.1", + "title": "세분화 기준 표현 정확도 개선 (L1)", + "dod": "agents/task-decomposer.md가 정상 연결어와 여러 관심사 열거 표현을 구분하는 기준을 설명", + "acceptance": "grep -q '여러 관심사' agents/task-decomposer.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.2", + "title": "test-agent pretest 오탐 스택 감지 수정 (L2)", + "dod": "\"pretest\" 스크립트만 있는 package.json을 npm test 스택으로 오판하지 않음", + "acceptance": "grep -q '\"test\":' agents/test-agent.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.3", + "title": "CONTEXT_INDEX.md 미존재 파일 인덱스 정리 (L3)", + "dod": "이 저장소에 없는 docs/PRD.md·UserFlow.md·Architecture.md 인덱스 항목 제거", + "acceptance": "! grep -q 'docs/PRD.md' .harness/CONTEXT_INDEX.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.4", + "title": "rm 위험 패턴 매칭 범위 확대 (L4)", + "dod": "harness.toml ask 목록이 rm -fr·rm -R 조합도 포착", + "acceptance": "[ $(grep -c 'rm -' harness.toml) -gt 1 ]", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.5", + "title": "grill-me 산출 경로 인자 지원 (L5)", + "dod": "SKILL.md에 대상 디렉토리 인자 규약 명시, 기본값은 현재 프로젝트 docs/", + "acceptance": "grep -q '산출 경로' .claude/skills/grill-me/SKILL.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.6", + "title": "grill-me 비대화형 실행 호환 모드 (L5)", + "dod": "무응답·headless 환경에서 질문마다 권장값으로 자동 확정 후 진행하는 대안 경로 명시", + "acceptance": "grep -q 'headless' .claude/skills/grill-me/SKILL.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.7", + "title": "Codex 호환 진입점 추가", + "dod": "AGENTS.md가 Codex 진입점으로 존재하고 init.sh가 새 프로젝트에 복사하며 README·BLUEPRINT에 Codex 동작 경로가 명시됨", + "acceptance": "test -f AGENTS.md && grep -q 'AGENTS.md' init.sh && grep -q 'Recommended Codex Workflow' README.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.8", + "title": "Codex harness skills 추가", + "dod": ".agents/skills 아래 harness 흐름 6종 SKILL.md가 존재하고 init.sh가 새 프로젝트에 복사함", + "acceptance": "test -f .agents/skills/grill-me/SKILL.md && test -f .agents/skills/harness-plan/SKILL.md && test -f .agents/skills/harness-work/SKILL.md && test -f .agents/skills/harness-review/SKILL.md && test -f .agents/skills/harness-progress/SKILL.md && test -f .agents/skills/harness-sync/SKILL.md && grep -q '.agents/skills' init.sh", + "depends": [ + "4.7" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.9", + "title": "Git workflow helper command/skill 추가", + "dod": "Claude custom command와 Codex skill로 branch-checkout·git-push·pr-create 절차가 제공되고 init.sh가 복사함", + "acceptance": "test $(find .claude/commands -name '*.md' | wc -l) -ge 3 && test -f .agents/skills/branch-checkout/SKILL.md && test -f .agents/skills/git-push/SKILL.md && test -f .agents/skills/pr-create/SKILL.md && grep -q '.claude/commands' init.sh", + "depends": [ + "4.8" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.10", + "title": "Claude/Codex 공용 Quality Gate 문서화", + "dod": "docs/specs/2026-07-08-codex-claude-quality-gates.md와 agents/quality-gates.md가 존재하고 Codex skill, README, BLUEPRINT, AGENTS, init skeleton이 quality gate 기준을 참조함", + "acceptance": "test -f docs/specs/2026-07-08-codex-claude-quality-gates.md && test -f agents/quality-gates.md && grep -q 'YAGNI' agents/quality-gates.md && grep -q 'caveman' README.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-work/SKILL.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-review/SKILL.md", + "depends": [ + "4.8" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.11", + "title": "rescue-from-main workflow helper 추가", + "dod": "Claude custom command와 Codex skill로 rescue-from-main 절차가 제공되고 AGENTS·README·BLUEPRINT·init 복사 경로에 등록됨", + "acceptance": "test -f .agents/skills/rescue-from-main/SKILL.md && test -f .claude/commands/rescue-from-main.md && grep -q 'rescue-from-main' AGENTS.md && grep -q 'rescue-from-main' README.md && grep -q 'rescue-from-main' BLUEPRINT.md", + "depends": [ + "4.9", + "4.10" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.12", + "title": "Task별 .harness 맥락 디렉토리 도입", + "dod": ".harness/tasks// 구조와 루트 템플릿 역할이 문서·skeleton·최근 이관 예시로 정리됨", + "acceptance": "test -d .harness/tasks/4.11-rescue-from-main && test -d .harness/tasks/readme-user-friendly && test -f .harness/tasks/readme-user-friendly/tasks.index.snapshot.json && test -f templates/skeleton/.harness/tasks/.gitkeep && grep -q '템플릿' .harness/STATE.md && grep -q '.harness/tasks' CLAUDE.md && grep -q '.harness/tasks' AGENTS.md && grep -q '.harness/tasks' .agents/skills/harness-work/SKILL.md && python3 scripts/validate_tasks.py && python3 scripts/sync_plans.py --check", + "depends": [ + "4.11" + ], + "status": "todo", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + } + ] +} diff --git a/.harness/tasks/readme-user-friendly/CHECKPOINTS.md b/.harness/tasks/readme-user-friendly/CHECKPOINTS.md new file mode 100644 index 0000000..79cfb14 --- /dev/null +++ b/.harness/tasks/readme-user-friendly/CHECKPOINTS.md @@ -0,0 +1,5 @@ +# CHECKPOINTS.md — README 사용자 친화 개편 완료 지점 + +| 일시 | Task | 내용 | 커밋 | 검증 | +|------|------|------|------|------| +| 2026-07-08 | - | README 사용자 친화 개편 시작 후 후순위로 이동 | 없음 | 미실행 | diff --git a/.harness/tasks/readme-user-friendly/HANDOFF.md b/.harness/tasks/readme-user-friendly/HANDOFF.md new file mode 100644 index 0000000..ee4f5c1 --- /dev/null +++ b/.harness/tasks/readme-user-friendly/HANDOFF.md @@ -0,0 +1,17 @@ +# HANDOFF.md — README 사용자 친화 개편 인수인계 + +## 다음 세션이 먼저 읽을 최소 파일 + +1. `.harness/tasks/readme-user-friendly/STATE.md` +2. `.harness/tasks/readme-user-friendly/tasks.index.snapshot.json` +3. `README.md` +4. `tasks/index.json` + +## 재개 지점 + +- README 첫 화면, Quick Start, Codex CLI Setup, 작업별 workflow 메뉴, Troubleshooting을 + 사용자 행동 순서 중심으로 정리하는 별도 Task를 먼저 추가한다. + +## 주의사항 + +- 이번 `4.12` 범위에는 README 개편 구현이 포함되지 않는다. diff --git a/.harness/tasks/readme-user-friendly/LOG.md b/.harness/tasks/readme-user-friendly/LOG.md new file mode 100644 index 0000000..b8e1244 --- /dev/null +++ b/.harness/tasks/readme-user-friendly/LOG.md @@ -0,0 +1,8 @@ +# LOG.md — README 사용자 친화 개편 로그 + +## 2026-07-08 + +- 루트 `.harness/STATE.md`에 README 사용자 친화 개편 목표가 기록돼 있었으나, + 해당 작업은 별도 Task 없이 시작된 뒤 중단됐다. +- 이번 `4.12`에서는 해당 문구를 루트 템플릿에서 제거하고 이 Task별 디렉토리로 이관했다. +- README 개편은 후속 Task로 남긴다. diff --git a/.harness/tasks/readme-user-friendly/STATE.md b/.harness/tasks/readme-user-friendly/STATE.md new file mode 100644 index 0000000..07c30bb --- /dev/null +++ b/.harness/tasks/readme-user-friendly/STATE.md @@ -0,0 +1,27 @@ +# STATE.md — README 사용자 친화 개편 스냅샷 + +## 현재 목표 + +`README.md`를 비개발자도 따라가기 쉬운 안내서로 개편한다. + +## 진행 중인 Task + +- 현재 `tasks/index.json`에는 이 README 개편 전용 Task가 없다. +- 상태: 후순위로 미룸 +- 이번 `4.12`에서는 README 개편 자체를 구현하지 않는다. + +## 마지막 검증 결과 + +- 없음. 작업 착수 직후 중단된 상태다. + +## 차단 요소 + +- 별도 Task가 필요하다. + +## 마지막 커밋 + +- 없음 + +## 최종 갱신 + +- 2026-07-08 15:50 KST diff --git a/.harness/tasks/readme-user-friendly/TASKS.md b/.harness/tasks/readme-user-friendly/TASKS.md new file mode 100644 index 0000000..de02f46 --- /dev/null +++ b/.harness/tasks/readme-user-friendly/TASKS.md @@ -0,0 +1,6 @@ +# TASKS.md — README 사용자 친화 개편 내부 체크리스트 + +- [ ] README 개편 전용 Task 추가 +- [ ] 현재 README 구조 재확인 +- [ ] 사용자 행동 순서 기준으로 섹션 재배치 +- [ ] 문서 링크와 파일 존재 여부 검증 diff --git a/.harness/tasks/readme-user-friendly/tasks.index.snapshot.json b/.harness/tasks/readme-user-friendly/tasks.index.snapshot.json new file mode 100644 index 0000000..2afec07 --- /dev/null +++ b/.harness/tasks/readme-user-friendly/tasks.index.snapshot.json @@ -0,0 +1,442 @@ +{ + "version": 1, + "tasks": [ + { + "id": "0.1", + "title": "PRD 작성 (`/grill-me` 인터뷰)", + "dod": "docs/PRD.md v0.1 존재, Open Questions 정리됨", + "acceptance": "test -f docs/PRD.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "0.2", + "title": "기획 보완 문서", + "dod": "UserFlow.md·Architecture.md 작성 (docs/templates/ 골격 사용)", + "acceptance": "test -f docs/UserFlow.md && test -f docs/Architecture.md", + "depends": [ + "0.1" + ], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "0.3", + "title": "Harness 초기화", + "dod": "harness doctor 전체 통과, CLAUDE.md·Plans.md 존재", + "acceptance": "test -f CLAUDE.md && test -f Plans.md && test -f harness.toml", + "depends": [], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "0.4", + "title": "Plugin 설정", + "dod": "ponytail·caveman·VFF 설치 확인, agent MEMORY.md 3개 존재", + "acceptance": "-", + "depends": [ + "0.3" + ], + "status": "done", + "gh": "-", + "section": "완료된 작업" + }, + { + "id": "1.0", + "title": "Plans.md 템플릿 개선", + "dod": "bootstrap Task에 Acceptance 예시 있음, 현실적 샘플 Task 포함", + "acceptance": "grep -qE 'test -f|npm test|pytest|go test|curl' Plans.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.1", + "title": "test agent 추가", + "dod": "agents/test-agent.md 존재, harness.toml [test] 섹션, BLUEPRINT.md 업데이트", + "acceptance": "test -f agents/test-agent.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.2", + "title": "기획 파이프라인 추가", + "dod": "grill-me 스킬 + docs/templates/ 골격 3종, CLAUDE.md 기획 규칙", + "acceptance": "test -f .claude/skills/grill-me/SKILL.md && test -f docs/templates/PRD.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.3", + "title": "task-decomposer + 세션 세분화 게이트 추가", + "dod": "agents/task-decomposer.md 존재, harness.toml [plan] 섹션, CLAUDE.md 구현 규칙에 세분화 게이트 명시", + "acceptance": "test -f agents/task-decomposer.md && grep -q '세분화 게이트' CLAUDE.md", + "depends": [ + "1.1" + ], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "1.4", + "title": ".harness/ 상태 문서 체계 추가", + "dod": ".harness/ 골격 7종(STATE·HANDOFF·TASKS·LOG·LESSONS·CHECKPOINTS·CONTEXT_INDEX) 존재, CLAUDE.md 상태 문서 규칙 섹션 존재", + "acceptance": "test -f .harness/STATE.md && test -f .harness/CONTEXT_INDEX.md && grep -q '상태 문서 규칙' CLAUDE.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 1 — 템플릿 개선" + }, + { + "id": "2.1", + "title": "테스트 프로젝트 골격 생성", + "dod": "../routine-saas/에 CLAUDE.md·Plans.md·harness.toml·agents/·docs/templates/·.github/ 복사됨", + "acceptance": "-", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.2", + "title": "기획 파이프라인 테스트 (grill-me 인터뷰)", + "dod": "../routine-saas/docs/PRD.md v0.1 존재, Decisions 섹션 기록됨", + "acceptance": "-", + "depends": [ + "2.1" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.3", + "title": "보완 문서 테스트 (UserFlow·Architecture 골격 적용)", + "dod": "../routine-saas/docs/UserFlow.md·Architecture.md 존재", + "acceptance": "-", + "depends": [ + "2.2" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.4", + "title": "계획 파이프라인 테스트 (task-decomposer → Plans.md)", + "dod": "../routine-saas/Plans.md에 세분화 기준 통과 Task 표 존재", + "acceptance": "-", + "depends": [ + "2.3" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.5", + "title": "템플릿 결함 기록", + "dod": "테스트 중 발견한 템플릿 문제를 .harness/LESSONS.md에 기록, 수정 필요 항목은 Week 3 후보로 정리", + "acceptance": "-", + "depends": [ + "2.4" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.6", + "title": "DESIGN.md 기획 산출물 추가", + "dod": "docs/templates/DESIGN.md 골격 존재, CLAUDE.md 기획 규칙에 DESIGN 단계 반영, routine-saas에 실제 작성 적용", + "acceptance": "test -f docs/templates/DESIGN.md", + "depends": [ + "2.5" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "2.7", + "title": "GitHub 연동 E2E 검증", + "dod": "harness-gh-test repo에서 GitHub 연동 시나리오를 검증하고 발견한 빈틈을 문서화", + "acceptance": "grep -q 'GitHub 플로우' CLAUDE.md", + "depends": [ + "2.5" + ], + "status": "done", + "gh": "-", + "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" + }, + { + "id": "3.1", + "title": "GitHub branch protection 호환 (H1)", + "dod": "protection 활성 테스트 repo에서 자동 flip 실증, 선택한 방식(bypass/PR)의 근거를 워크플로 주석에 기록", + "acceptance": "grep -qi 'branch protection' docs/github-integration.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.2", + "title": "clean 골격 세트 분리 (H5)", + "dod": "templates/skeleton/에 Plans.md·.harness/ 7종 초기 상태 존재, dogfood 이력 미포함", + "acceptance": "test -f templates/skeleton/Plans.md && test -f templates/skeleton/.harness/STATE.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.3", + "title": "init.sh 초기화 스크립트 (H5)", + "dod": "init.sh가 ci.yml·plans-guard.yml·.harness/ 골격 포함 복사, README 수동 cp 절차를 스크립트 안내로 교체", + "acceptance": "test -x init.sh && grep -q 'plans-guard.yml' init.sh && grep -q 'ci.yml' init.sh", + "depends": [ + "3.2" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.4", + "title": "plans-guard 상태 변경 보호 검토 기록 (H2)", + "dod": "Task 상태 변경 보호를 CI가 아닌 세션 에이전트 책임으로 둘지 검토하고 결정을 문서화", + "acceptance": "-", + "depends": [ + "3.6" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.5", + "title": "Depends 검증 경로 정리 (H3)", + "dod": "Depends 존재 여부와 WIP 선행 완료 검증 경로가 validate_tasks.py 기준으로 정리됨", + "acceptance": "python3 scripts/validate_tasks.py", + "depends": [ + "3.6" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.6", + "title": "Plans.md 헤더 검증 선행 파싱 (M1·M7)", + "dod": "헤더 7컬럼 불일치 시 명시 FAIL(조용한 skip 제거), plans-guard에 적용", + "acceptance": "python3 scripts/sync_plans.py --check", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.7", + "title": "완료 전환 서술 통일 (M3)", + "dod": "README·BLUEPRINT의 Task 상태 전환 서술을 CLAUDE.md 기준과 일치시킴", + "acceptance": "grep -q 'GitHub Actions는 Task 상태를 바꾸지 않는다' README.md && grep -q 'Actions는 Task 상태를 쓰지 않고' BLUEPRINT.md", + "depends": [ + "3.1" + ], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.8", + "title": "harness.toml 죽은 설정 정리 (M4)", + "dod": "미사용 키 제거, 미파싱 섹션 역할 주석 재정의(실행 SSOT는 CLAUDE.md)", + "acceptance": "! grep -q 'max_iterations' harness.toml", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.9", + "title": "Plans.md anti-pattern 예시 교정 (M2)", + "dod": "무력화 패턴(echo skip) 행 교정, repo 밖 경로 acceptance `-` 처리, 주석에 금지 규약 추가", + "acceptance": "! grep -qE 'echo sk[i]p' Plans.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.10", + "title": "agents 문서 수행 주체 명시 (M5)", + "dod": "BLUEPRINT·README에 \"절차 문서, 수행 주체=세션 Claude\" 명시, .claude/agents/ 이전 여부 결정 기록", + "acceptance": "grep -q '수행 주체' BLUEPRINT.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.11", + "title": "ci.yml 이름 고정 요약 잡 (M6)", + "dod": "ci-ok 잡 신설(스택 잡 needs 집약), required check 등록 안내 주석", + "acceptance": "grep -q 'ci-ok' .github/workflows/ci.yml", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "3.12", + "title": "플러그인 SHA 기록 절차 (M8)", + "dod": "README 버전 표에 검증 커밋 SHA 컬럼 추가, 업데이트 전 확인 절차 단락", + "acceptance": "grep -q 'SHA' README.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" + }, + { + "id": "4.1", + "title": "세분화 기준 표현 정확도 개선 (L1)", + "dod": "agents/task-decomposer.md가 정상 연결어와 여러 관심사 열거 표현을 구분하는 기준을 설명", + "acceptance": "grep -q '여러 관심사' agents/task-decomposer.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.2", + "title": "test-agent pretest 오탐 스택 감지 수정 (L2)", + "dod": "\"pretest\" 스크립트만 있는 package.json을 npm test 스택으로 오판하지 않음", + "acceptance": "grep -q '\"test\":' agents/test-agent.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.3", + "title": "CONTEXT_INDEX.md 미존재 파일 인덱스 정리 (L3)", + "dod": "이 저장소에 없는 docs/PRD.md·UserFlow.md·Architecture.md 인덱스 항목 제거", + "acceptance": "! grep -q 'docs/PRD.md' .harness/CONTEXT_INDEX.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.4", + "title": "rm 위험 패턴 매칭 범위 확대 (L4)", + "dod": "harness.toml ask 목록이 rm -fr·rm -R 조합도 포착", + "acceptance": "[ $(grep -c 'rm -' harness.toml) -gt 1 ]", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.5", + "title": "grill-me 산출 경로 인자 지원 (L5)", + "dod": "SKILL.md에 대상 디렉토리 인자 규약 명시, 기본값은 현재 프로젝트 docs/", + "acceptance": "grep -q '산출 경로' .claude/skills/grill-me/SKILL.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.6", + "title": "grill-me 비대화형 실행 호환 모드 (L5)", + "dod": "무응답·headless 환경에서 질문마다 권장값으로 자동 확정 후 진행하는 대안 경로 명시", + "acceptance": "grep -q 'headless' .claude/skills/grill-me/SKILL.md", + "depends": [], + "status": "todo", + "gh": "-", + "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" + }, + { + "id": "4.7", + "title": "Codex 호환 진입점 추가", + "dod": "AGENTS.md가 Codex 진입점으로 존재하고 init.sh가 새 프로젝트에 복사하며 README·BLUEPRINT에 Codex 동작 경로가 명시됨", + "acceptance": "test -f AGENTS.md && grep -q 'AGENTS.md' init.sh && grep -q 'Recommended Codex Workflow' README.md", + "depends": [], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.8", + "title": "Codex harness skills 추가", + "dod": ".agents/skills 아래 harness 흐름 6종 SKILL.md가 존재하고 init.sh가 새 프로젝트에 복사함", + "acceptance": "test -f .agents/skills/grill-me/SKILL.md && test -f .agents/skills/harness-plan/SKILL.md && test -f .agents/skills/harness-work/SKILL.md && test -f .agents/skills/harness-review/SKILL.md && test -f .agents/skills/harness-progress/SKILL.md && test -f .agents/skills/harness-sync/SKILL.md && grep -q '.agents/skills' init.sh", + "depends": [ + "4.7" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.9", + "title": "Git workflow helper command/skill 추가", + "dod": "Claude custom command와 Codex skill로 branch-checkout·git-push·pr-create 절차가 제공되고 init.sh가 복사함", + "acceptance": "test $(find .claude/commands -name '*.md' | wc -l) -ge 3 && test -f .agents/skills/branch-checkout/SKILL.md && test -f .agents/skills/git-push/SKILL.md && test -f .agents/skills/pr-create/SKILL.md && grep -q '.claude/commands' init.sh", + "depends": [ + "4.8" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.10", + "title": "Claude/Codex 공용 Quality Gate 문서화", + "dod": "docs/specs/2026-07-08-codex-claude-quality-gates.md와 agents/quality-gates.md가 존재하고 Codex skill, README, BLUEPRINT, AGENTS, init skeleton이 quality gate 기준을 참조함", + "acceptance": "test -f docs/specs/2026-07-08-codex-claude-quality-gates.md && test -f agents/quality-gates.md && grep -q 'YAGNI' agents/quality-gates.md && grep -q 'caveman' README.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-work/SKILL.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-review/SKILL.md", + "depends": [ + "4.8" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.11", + "title": "rescue-from-main workflow helper 추가", + "dod": "Claude custom command와 Codex skill로 rescue-from-main 절차가 제공되고 AGENTS·README·BLUEPRINT·init 복사 경로에 등록됨", + "acceptance": "test -f .agents/skills/rescue-from-main/SKILL.md && test -f .claude/commands/rescue-from-main.md && grep -q 'rescue-from-main' AGENTS.md && grep -q 'rescue-from-main' README.md && grep -q 'rescue-from-main' BLUEPRINT.md", + "depends": [ + "4.9", + "4.10" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.12", + "title": "Task별 .harness 맥락 디렉토리 도입", + "dod": ".harness/tasks// 구조와 루트 템플릿 역할이 문서·skeleton·최근 이관 예시로 정리됨", + "acceptance": "test -d .harness/tasks/4.11-rescue-from-main && test -d .harness/tasks/readme-user-friendly && test -f .harness/tasks/readme-user-friendly/tasks.index.snapshot.json && test -f templates/skeleton/.harness/tasks/.gitkeep && grep -q '템플릿' .harness/STATE.md && grep -q '.harness/tasks' CLAUDE.md && grep -q '.harness/tasks' AGENTS.md && grep -q '.harness/tasks' .agents/skills/harness-work/SKILL.md && python3 scripts/validate_tasks.py && python3 scripts/sync_plans.py --check", + "depends": [ + "4.11" + ], + "status": "todo", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" + } + ] +} diff --git a/AGENTS.md b/AGENTS.md index 518278e..3738ff9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,9 +15,9 @@ At the start of a session, read these files before planning or editing: On resumed work, follow the recovery order in `CLAUDE.md`: -1. `.harness/STATE.md` -2. latest entries in `.harness/LESSONS.md` -3. `tasks/index.json` +1. `tasks/index.json` to identify the `wip` or user-specified Task +2. `.harness/tasks//STATE.md` +3. latest entries in `.harness/LESSONS.md` 4. `Plans.md` 5. only the extra files listed in `.harness/CONTEXT_INDEX.md` that are needed @@ -88,9 +88,12 @@ branches, pushing, or creating PRs. Never force push or discard local changes. ## State Documents -- Update `.harness/STATE.md` before risky work and after meaningful work units. -- Append errors and fixes to `.harness/LOG.md`; add durable prevention rules to - `.harness/LESSONS.md`. +- Root `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, and + `CHECKPOINTS.md` are templates. Do not write live task state into them. +- Store live context under `.harness/tasks//` and update that Task's + `STATE.md` before risky work and after meaningful work units. +- Append errors and fixes to `.harness/tasks//LOG.md`; add durable + prevention rules to root `.harness/LESSONS.md`. - Update `.harness/CONTEXT_INDEX.md` when creating a file or changing a file's role. diff --git a/CLAUDE.md b/CLAUDE.md index 704d89b..7109bd3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -68,22 +68,31 @@ ## 상태 문서 규칙 - **터미널 세션은 언제든 끊길 수 있다고 가정한다.** 작업 시작 전·작업 단위 - 종료 후마다 `.harness/` 상태 문서를 갱신한다. + 종료 후마다 해당 Task의 `.harness/tasks//` 상태 문서를 갱신한다. - **Task 상태의 단일 출처는 `tasks/index.json`이다.** `Plans.md`는 사람이 필요할 때 `python3 scripts/sync_plans.py`로 갱신하는 읽기용 snapshot이며 stale일 수 있다. - 직접 편집하지 않는다. `.harness/`는 `tasks/index.json`이 담지 않는 - 세션 맥락만 담는다 — Task 상태를 `.harness/`에 복제하지 않는다. -- 세션 재개 시 읽는 순서: `.harness/STATE.md` → `.harness/LESSONS.md`(최근 5개) - → `tasks/index.json` → `Plans.md`. 나머지는 `.harness/CONTEXT_INDEX.md`로 필요한 파일만 선별해서 - 읽는다 — 목적 없이 전체 파일을 다시 읽지 않는다. -- 파일별 역할: `STATE.md`(현재 스냅샷) · `HANDOFF.md`(다음 세션 인수인계) · - `TASKS.md`(현재 Task의 세션 체크리스트) · `LOG.md`(작업·에러 append-only) · - `LESSONS.md`(재발 방지) · `CHECKPOINTS.md`(작업 단위 완료 + 커밋 해시) · - `CONTEXT_INDEX.md`(파일 역할 인덱스) · `.harness/shared/planning/`(planning - proposal 작업대) · `.harness/events/planning.jsonl`(planning 단계 감시 로그). -- 에러는 숨기지 말고 `LOG.md`에 원문 기록, 해결하면 `LESSONS.md`에 재발 방지 - 항목 추가. 항상 지킬 규칙으로 승격되면 이 파일(CLAUDE.md)에도 반영한다. -- 새 파일을 만들거나 기존 파일 역할이 바뀌면 `CONTEXT_INDEX.md`를 갱신한다. + 직접 편집하지 않는다. `.harness/tasks//`는 `tasks/index.json`이 담지 + 않는 세션 맥락만 담는다 — Task 상태를 `.harness/`에 단일 출처처럼 복제하지 않는다. +- 루트 `.harness/STATE.md`, `.harness/HANDOFF.md`, `.harness/TASKS.md`, + `.harness/LOG.md`, `.harness/CHECKPOINTS.md`는 **복사용 템플릿**이다. 실제 + 진행 상태를 루트 템플릿에 쓰지 않는다. +- 새 Task 착수 시 `.harness/tasks//`를 만들고 루트 템플릿을 복사해 + `STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`를 둔다. 작업 + 시작 시점의 `tasks/index.json`은 참고본으로 + `.harness/tasks//tasks.index.snapshot.json`에 저장할 수 있다. +- 세션 재개 시 읽는 순서: `tasks/index.json`에서 `wip` 또는 사용자가 지정한 + Task 확인 → `.harness/tasks//STATE.md` → `.harness/LESSONS.md`(최근 + 항목) → `Plans.md`. 나머지는 `.harness/CONTEXT_INDEX.md`로 필요한 파일만 + 선별해서 읽는다 — 목적 없이 전체 파일을 다시 읽지 않는다. +- Task별 파일 역할: `STATE.md`(해당 Task 현재 스냅샷) · `HANDOFF.md`(다음 세션 + 인수인계) · `TASKS.md`(Task 내부 체크리스트) · `LOG.md`(작업·에러 append-only) · + `CHECKPOINTS.md`(작업 단위 완료 + 커밋 해시) · `tasks.index.snapshot.json` + (작업 시작 시점 참고본). 루트 `LESSONS.md`는 전역 재발 방지 기록으로 유지한다. + 루트 `CONTEXT_INDEX.md`는 파일 역할 인덱스다. +- 에러는 숨기지 말고 해당 Task의 `LOG.md`에 원문 기록, 해결하면 전역 + `.harness/LESSONS.md`에 재발 방지 항목 추가. 항상 지킬 규칙으로 승격되면 + 이 파일(CLAUDE.md)에도 반영한다. +- 새 파일을 만들거나 기존 파일 역할이 바뀌면 `.harness/CONTEXT_INDEX.md`를 갱신한다. - 요청이 전제한 파일이 저장소에 없으면 임의 생성하지 않는다 — 스코프 결정이므로 보고 후 사용자 확인을 받는다. diff --git a/Plans.md b/Plans.md index 5304720..ff1e13f 100644 --- a/Plans.md +++ b/Plans.md @@ -83,6 +83,7 @@ | 4.9 | Git workflow helper command/skill 추가 | Claude custom command와 Codex skill로 branch-checkout·git-push·pr-create 절차가 제공되고 init.sh가 복사함 | test $(find .claude/commands -name '*.md' \| wc -l) -ge 3 && test -f .agents/skills/branch-checkout/SKILL.md && test -f .agents/skills/git-push/SKILL.md && test -f .agents/skills/pr-create/SKILL.md && grep -q '.claude/commands' init.sh | 4.8 | cc:완료 | - | | 4.10 | Claude/Codex 공용 Quality Gate 문서화 | docs/specs/2026-07-08-codex-claude-quality-gates.md와 agents/quality-gates.md가 존재하고 Codex skill, README, BLUEPRINT, AGENTS, init skeleton이 quality gate 기준을 참조함 | test -f docs/specs/2026-07-08-codex-claude-quality-gates.md && test -f agents/quality-gates.md && grep -q 'YAGNI' agents/quality-gates.md && grep -q 'caveman' README.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-work/SKILL.md && grep -q 'agents/quality-gates.md' .agents/skills/harness-review/SKILL.md | 4.8 | cc:완료 | - | | 4.11 | rescue-from-main workflow helper 추가 | Claude custom command와 Codex skill로 rescue-from-main 절차가 제공되고 AGENTS·README·BLUEPRINT·init 복사 경로에 등록됨 | test -f .agents/skills/rescue-from-main/SKILL.md && test -f .claude/commands/rescue-from-main.md && grep -q 'rescue-from-main' AGENTS.md && grep -q 'rescue-from-main' README.md && grep -q 'rescue-from-main' BLUEPRINT.md | 4.9, 4.10 | cc:완료 | - | +| 4.12 | Task별 .harness 맥락 디렉토리 도입 | .harness/tasks// 구조와 루트 템플릿 역할이 문서·skeleton·최근 이관 예시로 정리됨 | test -d .harness/tasks/4.11-rescue-from-main && test -d .harness/tasks/readme-user-friendly && test -f .harness/tasks/readme-user-friendly/tasks.index.snapshot.json && test -f templates/skeleton/.harness/tasks/.gitkeep && grep -q '템플릿' .harness/STATE.md && grep -q '.harness/tasks' CLAUDE.md && grep -q '.harness/tasks' AGENTS.md && grep -q '.harness/tasks' .agents/skills/harness-work/SKILL.md && python3 scripts/validate_tasks.py && python3 scripts/sync_plans.py --check | 4.11 | cc:완료 | - | --- diff --git a/README.md b/README.md index b60f6e2..dd5d4f5 100644 --- a/README.md +++ b/README.md @@ -225,11 +225,11 @@ Then check harness.toml, tasks/index.json, Plans.md, and BLUEPRINT.md. Follow the harness rules in CLAUDE.md: the planning gate (task-decomposer) before writing Task rows, the test gate (test-agent) before review, and the .harness/ state-doc rules. -Before making risky changes, update .harness/STATE.md. +Before making risky changes, update .harness/tasks//STATE.md. Apply agents/quality-gates.md before implementation and review. After implementation, run the Acceptance command recorded for the task in tasks/index.json. If an error occurs and you fix it, record the cause and prevention rule in -.harness/LOG.md and .harness/LESSONS.md. +.harness/tasks//LOG.md and .harness/LESSONS.md. ``` 한국어 버전: @@ -239,11 +239,11 @@ If an error occurs and you fix it, record the cause and prevention rule in 그다음 harness.toml, tasks/index.json, Plans.md, BLUEPRINT.md를 확인해줘. CLAUDE.md의 harness 규칙을 따라줘 — Task 작성 전 task-decomposer 세분화 게이트, 리뷰 전 test-agent 검증 게이트, .harness/ 상태 문서 규칙 전부 포함. -위험한 변경 전에는 .harness/STATE.md를 갱신해줘. +위험한 변경 전에는 .harness/tasks//STATE.md를 갱신해줘. 구현과 리뷰 전에는 agents/quality-gates.md의 scope/YAGNI/review gate를 적용해줘. 구현 후에는 tasks/index.json에 기록된 해당 Task의 Acceptance 명령을 실행해줘. -에러가 발생했고 해결했다면 원인과 재발 방지 규칙을 .harness/LOG.md와 -.harness/LESSONS.md에 기록해줘. +에러가 발생했고 해결했다면 원문은 .harness/tasks//LOG.md에, +재발 방지 규칙은 .harness/LESSONS.md에 기록해줘. ``` --- @@ -533,7 +533,7 @@ Codex에서는 ponytail/caveman plugin 자동 hook을 가정하지 않고 - 파일 수정 후 관련 테스트 실행 - 위험한 shell command(`rm -r`, `git push --force` 등) 실행 전 확인 — `harness.toml`의 `[safety.permissions] ask` 목록과 역할이 겹치므로 중복 등록 주의 -- 세션 종료 시 `.harness/STATE.md` 갱신 여부 확인 +- 세션 종료 시 `.harness/tasks//STATE.md` 갱신 여부 확인 - Acceptance 명령 미실행 상태에서 Task를 `done`으로 표시하는 것 방지 hooks 설정 예시는 이 README에 넣지 않고 `docs/claude-code-hooks.md`로 분리할 것을 @@ -546,27 +546,32 @@ hooks 설정 예시는 이 README에 넣지 않고 `docs/claude-code-hooks.md` 터미널 세션은 언제든 끊길 수 있다는 전제로 이 템플릿을 만들었다 (CLAUDE.md 상태 문서 규칙). 재개 시 읽는 순서는 고정돼 있다. -1. `.harness/STATE.md` — 현재 상태 스냅샷 -2. `.harness/LESSONS.md` — 최근 5개 항목 (재발 방지 기록) -3. `tasks/index.json` — Task 상태 단일 출처 (`wip` Task 확인) +1. `tasks/index.json` — Task 상태 단일 출처 (`wip` Task 확인) +2. `.harness/tasks//STATE.md` — 해당 Task 현재 상태 스냅샷 +3. `.harness/LESSONS.md` — 최근 항목 (전역 재발 방지 기록) 4. `Plans.md` — 사람이 읽는 snapshot. stale일 수 있으므로 상태 판단은 `tasks/index.json` 기준 -5. 필요할 때만 `.harness/HANDOFF.md`(직전 세션 인수인계), `.harness/TASKS.md`(현재 - Task 체크리스트), `.harness/LOG.md`(에러 이력) — `.harness/CONTEXT_INDEX.md`가 - 전체 인덱스다. +5. 필요할 때만 `.harness/tasks//HANDOFF.md`, `TASKS.md`, `LOG.md`, + `CHECKPOINTS.md` — `.harness/CONTEXT_INDEX.md`가 전체 인덱스다. + +루트 `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`는 +새 Task 디렉토리로 복사해서 쓰는 템플릿이다. 실제 작업 상태는 +`.harness/tasks//` 아래에 남긴다. 재개 프롬프트: ```text -Read .harness/STATE.md, then the last 5 entries of .harness/LESSONS.md, -then tasks/index.json and Plans.md. +Read tasks/index.json to identify the wip or requested Task. +Then read .harness/tasks//STATE.md, recent .harness/LESSONS.md entries, +and Plans.md. Resume from the last recorded state. Do not repeat completed Tasks unless Acceptance requires re-verification. Before continuing, summarize the current state and next action. ``` ```text -.harness/STATE.md를 읽고, .harness/LESSONS.md 최근 5개 항목을 읽고, -tasks/index.json과 Plans.md를 읽어줘. +tasks/index.json에서 wip 또는 지정된 Task를 확인한 뒤, +.harness/tasks//STATE.md와 .harness/LESSONS.md 최근 항목, +Plans.md를 읽어줘. 마지막으로 기록된 상태부터 작업을 재개해줘. Acceptance 재검증이 필요한 경우가 아니면 이미 완료된 Task는 반복하지 마. 계속하기 전에 현재 상태와 다음 작업을 먼저 요약해줘. @@ -576,11 +581,11 @@ Acceptance 재검증이 필요한 경우가 아니면 이미 완료된 Task는 ## Error Memory / 반복 실패 방지 -에러 기록은 `.harness/LOG.md`(append-only, 원문 그대로)와 `.harness/LESSONS.md` -(해결 후 재발 방지 요약)로 나뉜다 — 하나의 파일에 섞지 않는다. +에러 기록은 Task별 `.harness/tasks//LOG.md`(append-only, 원문 그대로)와 +전역 `.harness/LESSONS.md`(해결 후 재발 방지 요약)로 나뉜다 — 하나의 파일에 섞지 않는다. -- `.harness/LOG.md`: 시간 역순 아님, 위에서 아래로 추가만. 실패한 명령·에러 - 메시지·조치를 있는 그대로 남긴다. +- `.harness/tasks//LOG.md`: 시간 역순 아님, 위에서 아래로 추가만. + 실패한 명령·에러 메시지·조치를 있는 그대로 남긴다. - `.harness/LESSONS.md`: 최신 항목이 위. "무엇이 문제였고, 다음엔 어떻게 판단할지"를 근거와 함께 남긴다. 항상 지켜야 할 규칙으로 승격되면 `CLAUDE.md`에도 반영한다. @@ -588,13 +593,13 @@ Acceptance 재검증이 필요한 경우가 아니면 이미 완료된 Task는 기록 프롬프트: ```text -If an error occurs, log the raw command and error message in .harness/LOG.md. +If an error occurs, log the raw command and error message in .harness/tasks//LOG.md. Once fixed, summarize the cause and a prevention rule in .harness/LESSONS.md. If it should always apply going forward, also update CLAUDE.md. ``` ```text -에러가 발생하면 실패한 명령과 에러 메시지를 원문 그대로 .harness/LOG.md에 남겨줘. +에러가 발생하면 실패한 명령과 에러 메시지를 원문 그대로 .harness/tasks//LOG.md에 남겨줘. 해결되면 원인과 재발 방지 규칙을 .harness/LESSONS.md에 요약해줘. 항상 지켜야 할 규칙이면 CLAUDE.md에도 반영해줘. ``` @@ -644,14 +649,16 @@ cc-harness-template/ │ ├── pr-create/SKILL.md │ └── rescue-from-main/SKILL.md │ -├── templates/skeleton/ # init.sh가 복사하는 tasks/·Plans.md·.harness/ 초기 상태 (dogfood 이력 없음) +├── templates/skeleton/ # init.sh가 복사하는 tasks/·Plans.md·.harness/ 템플릿 구조 (dogfood 이력 없음) │ ├── Plans.md │ ├── tasks/index.json -│ └── .harness/ # 7종 골격 (아래 .harness/ 항목과 동일 구성) +│ └── .harness/ # 루트 템플릿 + tasks/.gitkeep │ -├── .harness/ # 세션 상태 문서 (Task 상태 단일 출처는 tasks/index.json, 여긴 세션 맥락만) -│ ├── STATE.md / HANDOFF.md / TASKS.md / LOG.md / LESSONS.md / CHECKPOINTS.md -│ ├── CONTEXT_INDEX.md # 파일 역할 인덱스 — 세션 재개 시 여기서 필요한 파일만 선별 +├── .harness/ # Task별 세션 맥락 템플릿과 전역 기록 +│ ├── STATE.md / HANDOFF.md / TASKS.md / LOG.md / CHECKPOINTS.md # 복사용 템플릿 +│ ├── LESSONS.md # 전역 재발 방지 기록 +│ ├── CONTEXT_INDEX.md # 파일 역할 인덱스 — 세션 재개 시 필요한 파일만 선별 +│ ├── tasks// # 실제 Task별 상태·로그·인수인계·checkpoint │ ├── shared/planning/runs/ # /harness-plan run별 context/proposal/report 작업대 │ └── events/planning.jsonl # planning 단계 감시 로그 (JSONL, v1 범위) │ @@ -700,7 +707,8 @@ cc-harness-template/ ### `CLAUDE.md`가 길어져 컨텍스트를 많이 차지함 실제로 이 템플릿을 dogfooding하는 동안 `CLAUDE.md`가 118줄, 이어서 123줄로 -늘어나며 분할 권고 훅 경고가 반복 발생한 이력이 있다(`.harness/LOG.md` 참고). +늘어나며 분할 권고 훅 경고가 반복 발생한 이력이 있다(과거 로그와 Task별 +`.harness/tasks/*/LOG.md` 참고). 프로젝트 전역 규칙만 `CLAUDE.md`에 남기고, 세부 절차는 `docs/`나 `agents/`로 옮긴다. ### 검증 명령을 실행하지 않고 완료라고 말함 @@ -793,8 +801,8 @@ worker/reviewer/advisor 분리가, 상태 유실은 `.harness/`가 각각 담당 | 문서 | 담을 내용 | |------|-----------| | `docs/claude-code-hooks.md` | hooks 설정 예시, `harness.toml [safety.permissions]`와의 역할 분담 | -| `docs/session-recovery.md` | `.harness/` 재개 절차 심화 (여러 프로젝트 동시 운영 시나리오 포함) | -| `docs/error-memory.md` | `LOG.md`/`LESSONS.md` 작성 규칙 + 실제 사례 모음 | +| `docs/session-recovery.md` | `.harness/tasks/` 재개 절차 심화 (여러 프로젝트 동시 운영 시나리오 포함) | +| `docs/error-memory.md` | Task별 `LOG.md`와 전역 `LESSONS.md` 작성 규칙 + 실제 사례 모음 | `why-claude-code-harness`·`how-this-template-works`류는 이미 `BLUEPRINT.md`가 겸하고 있어 별도로 분리하지 않는다 — 중복 문서를 만들지 않는다. diff --git a/docs/claude-code-hooks.md b/docs/claude-code-hooks.md index 704f83c..cfea19e 100644 --- a/docs/claude-code-hooks.md +++ b/docs/claude-code-hooks.md @@ -74,19 +74,20 @@ ask = ["Bash(rm -r:*)", "Bash(git push --force:*)"] `[safety.permissions]`가 이미 커버하는 패턴은 제외하고, 프로젝트 고유의 위험 명령(예: 특정 배포 스크립트)만 `PreToolUse`로 별도 확인한다. -### 3. 세션 종료 시 `.harness/STATE.md` 갱신 확인 +### 3. 세션 종료 시 Task별 `STATE.md` 갱신 확인 -CLAUDE.md는 "작업 시작 전·작업 단위 종료 후마다 `.harness/` 상태 문서를 +CLAUDE.md는 "작업 시작 전·작업 단위 종료 후마다 `.harness/tasks//` 상태 문서를 갱신한다"를 규칙으로 두지만, 강제하는 훅은 없다 — 세션 Claude가 규칙을 -따르는지에 의존한다. 자동 강제하려면 `Stop` 훅에서 `.harness/STATE.md`의 -mtime이 세션 시작 이후로 갱신됐는지 확인하는 스크립트를 붙인다. +따르는지에 의존한다. 자동 강제하려면 `Stop` 훅에서 현재 Task의 +`.harness/tasks//STATE.md` mtime이 세션 시작 이후로 갱신됐는지 +확인하는 스크립트를 붙인다. ```json { "hooks": { "Stop": [ { - "hooks": [{ "type": "command", "command": "test $(find .harness/STATE.md -newer /tmp/session-start-marker) || echo 'WARN: STATE.md not updated this session' >&2" }] + "hooks": [{ "type": "command", "command": "test $(find .harness/tasks -path '*/STATE.md' -newer /tmp/session-start-marker | head -n 1) || echo 'WARN: task STATE.md not updated this session' >&2" }] } ] } @@ -102,7 +103,7 @@ mtime이 세션 시작 이후로 갱신됐는지 확인하는 스크립트를 CLAUDE.md 테스트 규칙(`worker 구현 완료 후, reviewer 검토 전에 agents/test-agent.md 절차를 실행한다`)은 세션 규약이지 훅이 아니다. 기계적으로 강제하려면 Plans.md에서 Task를 `cc:완료`로 바꾸는 Edit를 `PreToolUse`로 -가로채 `.harness/LOG.md`에 최근 Acceptance 실행 기록이 있는지 확인하는 훅을 +가로채 `.harness/tasks//LOG.md`에 최근 Acceptance 실행 기록이 있는지 확인하는 훅을 붙일 수 있다 — 다만 이 검증 로직은 프로젝트마다 Task 완료 절차가 다르므로 직접 짜야 한다. 현재 GitHub Actions는 Acceptance 실행을 대신하지 않고 `tasks/index.json`과 `Plans.md`의 검증만 수행한다. diff --git a/docs/error-memory.md b/docs/error-memory.md index 6177a6b..8e94045 100644 --- a/docs/error-memory.md +++ b/docs/error-memory.md @@ -1,91 +1,88 @@ # Error Memory — 반복 실패 방지 규칙 에러를 숨기지 않고 기록해서, 같은 실수를 같은 원인으로 두 번 반복하지 않게 -하는 것이 `.harness/LOG.md`·`.harness/LESSONS.md`의 목적이다. 두 파일은 -역할이 다르다 — 섞어 쓰지 않는다. +하는 것이 Task별 `LOG.md`와 전역 `.harness/LESSONS.md`의 목적이다. --- ## `LOG.md`와 `LESSONS.md`의 차이 -| | `LOG.md` | `LESSONS.md` | +| | Task별 `LOG.md` | 루트 `LESSONS.md` | |---|---|---| -| 성격 | append-only 작업·에러 일지 | 해결 후 재발 방지 요약 | -| 순서 | 위→아래로 추가만 (시간순) | 최신 항목이 위 | -| 내용 | 실패한 명령·에러 메시지 원문, 커밋 해시 | 원인 + "다음엔 어떻게 판단할지" | -| 분량 | 계속 누적 (아카이브하지 않음) | 최근 5개만 세션 시작 시 읽음 | +| 경로 | `.harness/tasks//LOG.md` | `.harness/LESSONS.md` | +| 성격 | 해당 Task 작업·에러 일지 | 해결 후 전역 재발 방지 요약 | +| 순서 | 위→아래로 추가만 (시간순) | 최신 항목 우선 | +| 내용 | 실패한 명령·에러 메시지 원문, 해당 Task 작업 기록 | 원인 + 다음엔 어떻게 판단할지 | +| 읽는 시점 | 해당 Task 재개 또는 에러 이력 확인 시 | 세션 시작 시 최근 항목 우선 | | 승격 | — | 항상 지킬 규칙이면 `CLAUDE.md`에도 반영 | -에러가 나면 먼저 `LOG.md`에 원문을 남기고, 해결되면 `LESSONS.md`에 요약을 -추가한다 — 둘 다 해야 한다. `LOG.md`만 남기면 다음 세션이 "왜"를 다시 -찾아야 하고, `LESSONS.md`만 남기면 실제 에러 메시지가 사라져 재현이 어렵다. +루트 `.harness/LOG.md`는 복사용 템플릿이다. 실제 에러 원문은 반드시 해당 Task의 +`.harness/tasks//LOG.md`에 남긴다. + +에러가 나면 먼저 Task별 `LOG.md`에 원문을 남기고, 해결되면 루트 +`.harness/LESSONS.md`에 재발 방지 요약을 추가한다. `LOG.md`만 남기면 다음 세션이 +"왜"를 다시 찾아야 하고, `LESSONS.md`만 남기면 실제 에러 메시지가 사라져 재현이 +어렵다. --- -## `LOG.md` 실제 형식 +## Task별 `LOG.md` 실제 형식 ```markdown -# LOG.md — 작업·에러 로그 (append-only) - -> 시간 역순 아님 — 위에서 아래로 추가만 한다. 에러는 숨기지 말고 원문 그대로 기록. -> 해결된 에러는 재발 방지 관점에서 LESSONS.md에도 요약을 남긴다. +# LOG.md — Task 4.12 작업·에러 로그 -## 2026-07-04 +## 2026-07-08 -- Task 2.7 — GitHub 연동 E2E 검증. ... - 에러 1건: 충돌 해소 정규식이 Plans.md 행 2개 삭제 → Read 확인 후 복원, LESSONS 기록. - 에러 2건: 훅이 git push 복합 명령을 force-push로 오탐 차단 → 명령 분리로 해결. +- 무엇을 시도했고 어떤 결과가 났는지 시간순으로 기록한다. +- 실패한 명령: + `python3 scripts/example.py` +- 에러 원문: + `ValueError: example` ``` 날짜 헤더 아래 불릿으로 그날의 작업·에러를 쌓는다. 에러는 "무엇을 시도했고 -무엇이 실패했는지"를 있는 그대로 적는다 — 각색하지 않는다. +무엇이 실패했는지"를 있는 그대로 적는다. + +--- ## `LESSONS.md` 실제 형식 ```markdown # LESSONS.md — 재발 방지 기록 -> 에러·실수를 해결한 뒤 "다음에 같은 실수를 안 하려면"을 한 항목으로 남긴다. -> 최신 항목이 위. 세션 재개 시 최근 5개를 먼저 읽는다. -> 항상 지켜야 할 규칙으로 승격되면 CLAUDE.md에도 반영하고 여기 표시한다. - -## 2026-07-04 — Week 3 감사 빈틈 개선 (H1~H5·M1~M8 실증) +## 2026-07-08 — Task status 변경은 Task ID context와 함께 패치할 것 -- **GitHub Free 플랜 private repo는 branch protection/rulesets API가 403.** - harness-gh-test(private)에서 branch protection 테스트 시도 → 즉시 확인. - 다음에 이런 검증 필요하면 이 제약을 먼저 확인하고 사용자에게 public 전환 - 여부를 물을 것(자동으로 켜지 말 것). +- `tasks/index.json`에는 `"status": "todo"` 같은 반복 문자열이 많다. +- 예방 규칙: status 패치는 반드시 `"id": "{task-id}"`와 title/acceptance 일부를 + 포함한 context hunk로 적용하고, 직후 대상 Task 상태를 확인한다. ``` 각 항목은 **상황 → 왜 문제였는지 → 다음엔 어떻게 판단할지** 순서로 쓴다. -"CLAUDE.md 반영: 불필요/완료" 한 줄을 붙여, 일회성 판단 습관인지 항상 -지킬 규칙으로 승격됐는지 구분한다(예: 2026-07-03 "세션 모니터 스냅샷은 -stale일 수 있다" 항목은 "CLAUDE.md 반영: 불필요"로 남겼다 — 규칙화할 -정도는 아니라고 판단했기 때문). +"CLAUDE.md 반영: 불필요/완료" 한 줄을 붙여, 일회성 판단 습관인지 항상 지킬 +규칙으로 승격됐는지 구분한다. --- ## 언제 승격하는가 -같은 유형의 실수가 **두 번째** 발생했거나, 프로젝트 전체에 적용되는 원칙이면 -`CLAUDE.md`로 승격한다. 예: "에러는 숨기지 말고 LOG.md에 원문 기록, 해결하면 -LESSONS.md에 재발 방지 항목 추가"는 이 템플릿에서 실제로 CLAUDE.md -상태 문서 규칙 섹션에 반영된 규칙이다. 일회성 판단(예: 세션 모니터 신뢰도)은 -승격하지 않고 LESSONS.md에만 남긴다 — 모든 걸 규칙화하면 CLAUDE.md가 -비대해져 컨텍스트만 잡아먹는다. +같은 유형의 실수가 두 번째 발생했거나, 프로젝트 전체에 적용되는 원칙이면 +`CLAUDE.md`로 승격한다. Task 하나에만 해당하는 세부 이력은 해당 Task 디렉토리에 +남기고, 다른 Task에서도 반복될 수 있는 판단 규칙만 `LESSONS.md`에 남긴다. --- ## 기록 프롬프트 ```text -If an error occurs, log the raw command and error message in .harness/LOG.md. +If an error occurs, log the raw command and error message in +.harness/tasks//LOG.md. Once fixed, summarize the cause and a prevention rule in .harness/LESSONS.md. If it should always apply going forward, also update CLAUDE.md. ``` ```text -에러가 발생하면 실패한 명령과 에러 메시지를 원문 그대로 .harness/LOG.md에 남겨줘. +에러가 발생하면 실패한 명령과 에러 메시지를 원문 그대로 +.harness/tasks//LOG.md에 남겨줘. 해결되면 원인과 재발 방지 규칙을 .harness/LESSONS.md에 요약해줘. 항상 지켜야 할 규칙이면 CLAUDE.md에도 반영해줘. ``` @@ -95,5 +92,5 @@ If it should always apply going forward, also update CLAUDE.md. ## 참고 - [../README.md](../README.md#error-memory--반복-실패-방지) — 요약 -- [session-recovery.md](./session-recovery.md) — `.harness/` 전체 읽는 순서 +- [session-recovery.md](./session-recovery.md) — `.harness/tasks/` 기반 읽는 순서 - [../CLAUDE.md](../CLAUDE.md) — 상태 문서 규칙 원본 diff --git a/docs/session-recovery.md b/docs/session-recovery.md index 51850d9..b0d1a21 100644 --- a/docs/session-recovery.md +++ b/docs/session-recovery.md @@ -1,107 +1,96 @@ # Session Recovery — 세션 복구 절차 심화 터미널 세션은 언제든 끊긴다는 전제로 이 템플릿을 만들었다. `.harness/`는 -그 전제에 대응하는 상태 문서 세트다. 이 문서는 README의 -[Session Recovery](../README.md#session-recovery) 요약을 실제 파일 단위로 풀어 쓴다. +그 전제에 대응하는 상태 문서 세트다. 이제 루트 `.harness/*.md`는 템플릿이고, +실제 작업 맥락은 `.harness/tasks//` 아래에 Task별로 보관한다. --- ## 읽는 순서 (고정) -CLAUDE.md 상태 문서 규칙에 박혀 있는 순서 — 이 순서를 바꾸지 않는다. - -1. **`.harness/STATE.md`** — 현재 상태 스냅샷. "지금 목표가 뭐고 어디까지 왔는지"를 - 한 파일로 복원하는 용도. -2. **`.harness/LESSONS.md`** — 최근 5개 항목만. 전체를 다 읽지 않는다 — 오래된 - 교훈까지 매번 다시 읽으면 토큰만 쓰고 최신 맥락에 못 미친다. -3. **`tasks/index.json`** — Task 상태 단일 출처. `wip` Task가 있으면 그게 재개 지점. -4. **`Plans.md`** — 사람이 읽는 snapshot. stale일 수 있으며 Task 표를 직접 편집하지 않는다. -5. 그 다음은 **필요할 때만**, `.harness/CONTEXT_INDEX.md`로 골라서: - - `.harness/HANDOFF.md` — 직전 세션이 남긴 인수인계. 재개 직후 1회만 읽는다. - - `.harness/TASKS.md` — 현재 Task의 세션 체크리스트 (Task보다 작은 단위). - - `.harness/LOG.md` — 에러 이력 조회가 필요할 때만. - - `.harness/CHECKPOINTS.md` — 커밋 이력 추적이 필요할 때만. - - `.harness/events/planning.jsonl` — `/harness-plan` 단계 실패·반영 흐름을 - 감시해야 할 때만. - - `.harness/shared/planning/latest.json` — 최신 planning run의 - context/proposal/report 위치가 필요할 때만. - -**목적 없이 전체 파일을 다시 읽지 않는다** — CONTEXT_INDEX.md가 이 선별을 위해 존재한다. +CLAUDE.md 상태 문서 규칙에 박혀 있는 순서다. + +1. **`tasks/index.json`** — Task 상태 단일 출처. `wip` Task가 있으면 그게 재개 지점이다. +2. **`.harness/tasks//STATE.md`** — 해당 Task의 현재 스냅샷. +3. **`.harness/LESSONS.md`** — 전역 재발 방지 기록. 최근 항목만 우선 읽는다. +4. **`Plans.md`** — 사람이 읽는 snapshot. stale일 수 있으며 직접 편집하지 않는다. +5. 그 다음은 **필요할 때만**, `.harness/CONTEXT_INDEX.md`로 골라서 읽는다. + +루트 `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`는 +복사용 템플릿이다. 실제 진행 상태를 찾으려고 루트 템플릿을 읽지 않는다. --- -## 파일별 역할 (겹치지 않게 나뉜다) +## Task별 파일 역할 | 파일 | 역할 | 갱신 시점 | |------|------|-----------| -| `STATE.md` | 현재 스냅샷 (목표, 진행 중 Task, 마지막 검증 결과) | 작업 시작 전·단위 종료 후 | -| `HANDOFF.md` | 다음 세션이 최소한으로 읽을 것 + 재개 지점 + 주의사항 | 세션 종료 시(또는 끊김 대비) | -| `TASKS.md` | 현재 Task 하나의 세션 체크리스트 | Task 착수·완료 시 | -| `LOG.md` | 작업·에러 append-only 로그 | 매 작업/에러 발생 시 | -| `LESSONS.md` | 재발 방지 기록 | 에러 해결 후 | -| `CHECKPOINTS.md` | 작업 단위 완료 + 커밋 해시 | 커밋할 때마다 | -| `CONTEXT_INDEX.md` | 위 파일들의 역할·읽는 시점 인덱스 | 새 파일 추가/역할 변경 시 | -| `events/planning.jsonl` | `/harness-plan` 단계별 감시 이벤트 | planning 실패·반영 흐름 추적 시 | -| `shared/planning/runs/` | run별 context/proposal/report 작업대 | planning proposal 확인 시 | - -**Task 상태의 단일 출처는 `tasks/index.json`이다.** `Plans.md`는 사람이 필요할 때 여기서 생성하는 snapshot이다. -`.harness/TASKS.md`에 Task 상태를 -복제하지 않는다 — 복제하면 두 파일이 어긋났을 때 뭘 믿을지 애매해진다. +| `.harness/tasks//STATE.md` | 해당 Task 현재 스냅샷 | 작업 시작 전·단위 종료 후 | +| `.harness/tasks//HANDOFF.md` | 다음 세션이 최소한으로 읽을 것 + 재개 지점 + 주의사항 | 세션 종료 시(또는 끊김 대비) | +| `.harness/tasks//TASKS.md` | Task 내부 체크리스트 | Task 착수·완료 시 | +| `.harness/tasks//LOG.md` | 해당 Task 작업·에러 append-only 로그 | 매 작업/에러 발생 시 | +| `.harness/tasks//CHECKPOINTS.md` | 해당 Task 작업 단위 완료 + 커밋 해시 | 완료 지점마다 | +| `.harness/tasks//tasks.index.snapshot.json` | 작업 시작 시점의 `tasks/index.json` 참고본 | Task 시작 시 | ---- +루트 `.harness/LESSONS.md`는 전역 재발 방지 기록으로 유지한다. 같은 유형의 실수가 +다른 Task에서도 반복될 수 있기 때문이다. 루트 `.harness/CONTEXT_INDEX.md`는 파일 +역할과 읽는 순서 인덱스다. -## 실제 파일 형식 +**Task 상태의 단일 출처는 `tasks/index.json`이다.** `Plans.md`는 사람이 필요할 때 +여기서 생성하는 snapshot이다. Task별 `.harness/` 파일은 세션 맥락을 담을 뿐, +상태 판정의 단일 출처가 아니다. -`TASKS.md`는 Task 착수 전엔 비어 있다: +--- -```markdown -## 현재 Task: 없음 +## 새 Task 디렉토리 만들기 -(아직 착수 전 — Task 착수 시 여기에 체크리스트 작성.) +```bash +mkdir -p .harness/tasks/ +cp .harness/STATE.md .harness/tasks//STATE.md +cp .harness/HANDOFF.md .harness/tasks//HANDOFF.md +cp .harness/TASKS.md .harness/tasks//TASKS.md +cp .harness/LOG.md .harness/tasks//LOG.md +cp .harness/CHECKPOINTS.md .harness/tasks//CHECKPOINTS.md +cp tasks/index.json .harness/tasks//tasks.index.snapshot.json ``` -`CHECKPOINTS.md`는 표 형식으로 누적한다: - -```markdown -| 일시 | Task | 내용 | 커밋 | 검증 | -|------|------|------|------|------| -| 2026-07-04 | 1.4 | .harness/ 골격 7종 추가 | `a4c6ef1` | Acceptance PASS | -``` +``는 사람이 알아볼 수 있게 `4.12-task-harness-context`처럼 Task ID와 짧은 +slug를 함께 쓴다. --- ## 여러 프로젝트를 동시에 운영할 때 이 템플릿을 여러 프로젝트에 각각 적용하면 `.harness/`도 프로젝트마다 독립적으로 -생긴다 — 공유하지 않는다. 프로젝트 A의 `STATE.md`가 프로젝트 B의 재개에 -영향을 주지 않는다. 여러 프로젝트를 오갈 땐 세션 시작 시 "지금 어느 디렉토리에 -있는지"부터 확인하는 습관이 중요하다 — `.harness/STATE.md`의 "현재 목표"가 -지금 열려 있는 프로젝트와 일치하는지 첫 응답에서 검증한다. +생긴다. 프로젝트 A의 `.harness/tasks/.../STATE.md`가 프로젝트 B의 재개에 영향을 +주지 않는다. 여러 프로젝트를 오갈 땐 세션 시작 시 `pwd`, `git status`, 그리고 +`tasks/index.json`의 `wip` Task부터 확인한다. --- ## 모니터/훅이 주는 상태 요약은 참고만 세션 시작 시 어떤 모니터나 훅이 "WIP 1건" 같은 요약을 보여줄 수 있다. 이 요약이 -`tasks/index.json`·`git status`의 실제 상태와 어긋난 사례가 있었다(`.harness/LESSONS.md` -2026-07-03 항목). 요약은 참고만 하고, 판단은 항상 `tasks/index.json`과 `git status` -직접 확인으로 한다. +`tasks/index.json`·`git status`의 실제 상태와 어긋난 사례가 있었다. 요약은 +참고만 하고, 판단은 항상 `tasks/index.json`과 `git status` 직접 확인으로 한다. --- ## 재개 프롬프트 ```text -Read .harness/STATE.md, then the last 5 entries of .harness/LESSONS.md, -then tasks/index.json and Plans.md. +Read tasks/index.json to identify the wip or requested Task. +Then read .harness/tasks//STATE.md, recent .harness/LESSONS.md entries, +and Plans.md. Resume from the last recorded state. Do not repeat completed Tasks unless Acceptance requires re-verification. Before continuing, summarize the current state and next action. ``` ```text -.harness/STATE.md를 읽고, .harness/LESSONS.md 최근 5개 항목을 읽고, -tasks/index.json과 Plans.md를 읽어줘. +tasks/index.json에서 wip 또는 지정된 Task를 확인한 뒤, +.harness/tasks//STATE.md와 .harness/LESSONS.md 최근 항목, +Plans.md를 읽어줘. 마지막으로 기록된 상태부터 작업을 재개해줘. Acceptance 재검증이 필요한 경우가 아니면 이미 완료된 Task는 반복하지 마. 계속하기 전에 현재 상태와 다음 작업을 먼저 요약해줘. @@ -112,5 +101,5 @@ Acceptance 재검증이 필요한 경우가 아니면 이미 완료된 Task는 ## 참고 - [../README.md](../README.md#session-recovery) — 요약 -- [error-memory.md](./error-memory.md) — `LOG.md`/`LESSONS.md` 작성 규칙 +- [error-memory.md](./error-memory.md) — Task별 `LOG.md`와 전역 `LESSONS.md` 작성 규칙 - [../CLAUDE.md](../CLAUDE.md) — 상태 문서 규칙 원본 diff --git a/docs/specs/2026-07-08-planning-observability.md b/docs/specs/2026-07-08-planning-observability.md index 9015d81..b9fdf7d 100644 --- a/docs/specs/2026-07-08-planning-observability.md +++ b/docs/specs/2026-07-08-planning-observability.md @@ -84,7 +84,7 @@ - 실패 처리: - JSON 파싱 실패, 필수 파일 누락, validation 실패, apply 전 충돌은 모두 `planning.jsonl`에 쉬운 메시지로 기록한다. - - 원문 에러가 있으면 기존 규칙대로 `.harness/LOG.md`에도 기록한다. + - 원문 에러가 있으면 기존 규칙대로 해당 Task의 `.harness/tasks//LOG.md`에도 기록한다. ## Explicitly Out Of V1 @@ -127,5 +127,5 @@ `allow_inline_fallback = true`일 때만 현재 세션 fallback으로 이어진다. - 기존 `tasks/index.json` 필드명은 호환성 때문에 유지한다. 대신 값과 보고서는 쉬운 표현을 우선한다. -- `.harness/LOG.md`는 에러 원문과 중요 작업 이력을 남기는 사람이 읽는 로그이며, +- `.harness/tasks//LOG.md`는 에러 원문과 중요 작업 이력을 남기는 사람이 읽는 로그이며, planning 자동 감시는 `.harness/events/planning.jsonl`만 사용한다. diff --git a/tasks/index.json b/tasks/index.json index 886191b..05ef5d7 100644 --- a/tasks/index.json +++ b/tasks/index.json @@ -425,6 +425,18 @@ "status": "done", "gh": "-", "section": "Week 4 — Codex 호환 환경 구성" + }, + { + "id": "4.12", + "title": "Task별 .harness 맥락 디렉토리 도입", + "dod": ".harness/tasks// 구조와 루트 템플릿 역할이 문서·skeleton·최근 이관 예시로 정리됨", + "acceptance": "test -d .harness/tasks/4.11-rescue-from-main && test -d .harness/tasks/readme-user-friendly && test -f .harness/tasks/readme-user-friendly/tasks.index.snapshot.json && test -f templates/skeleton/.harness/tasks/.gitkeep && grep -q '템플릿' .harness/STATE.md && grep -q '.harness/tasks' CLAUDE.md && grep -q '.harness/tasks' AGENTS.md && grep -q '.harness/tasks' .agents/skills/harness-work/SKILL.md && python3 scripts/validate_tasks.py && python3 scripts/sync_plans.py --check", + "depends": [ + "4.11" + ], + "status": "done", + "gh": "-", + "section": "Week 4 — Codex 호환 환경 구성" } ] } diff --git a/templates/skeleton/.harness/CHECKPOINTS.md b/templates/skeleton/.harness/CHECKPOINTS.md index 88d8c5a..b3b894b 100644 --- a/templates/skeleton/.harness/CHECKPOINTS.md +++ b/templates/skeleton/.harness/CHECKPOINTS.md @@ -1,7 +1,8 @@ -# CHECKPOINTS.md — 작업 단위 완료 기록 +# CHECKPOINTS.md — Task 완료 지점 템플릿 -> 한 작업 단위(보통 Task 하나 또는 커밋 하나)가 끝날 때마다 한 줄 추가. -> 커밋 해시로 git 이력과 연결한다. 최신이 위. +> 이 루트 파일은 실제 checkpoint 기록이 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//CHECKPOINTS.md`로 복사해서 사용한다. | 일시 | Task | 내용 | 커밋 | 검증 | |------|------|------|------|------| +| YYYY-MM-DD | [id] | [완료 지점] | [hash 또는 미커밋] | [검증 결과] | diff --git a/templates/skeleton/.harness/CONTEXT_INDEX.md b/templates/skeleton/.harness/CONTEXT_INDEX.md index 085db92..0dff38c 100644 --- a/templates/skeleton/.harness/CONTEXT_INDEX.md +++ b/templates/skeleton/.harness/CONTEXT_INDEX.md @@ -1,38 +1,36 @@ # CONTEXT_INDEX.md — 파일 역할 인덱스 -> 토큰 절약용. 세션 재개 시 이 인덱스로 "이번 작업에 필요한 파일"만 골라 읽는다. -> 새 파일을 만들거나 기존 파일의 역할이 바뀌면 여기를 갱신한다. +> 루트 `.harness/*.md`는 템플릿이고, 실제 작업 맥락은 `.harness/tasks//`에 있다. -## 항상 먼저 (세션 재개 시) +## 세션 재개 읽는 순서 -| 파일 | 역할 | 읽는 시점 | +1. `tasks/index.json`에서 `wip` Task 또는 사용자가 지정한 Task를 확인한다. +2. 해당 Task의 `.harness/tasks//STATE.md`를 읽는다. +3. 루트 `.harness/LESSONS.md` 최근 항목을 읽는다. +4. `Plans.md`를 읽어 사람이 보는 snapshot을 확인한다. +5. 이 파일에서 필요한 추가 문서만 고른다. + +## Task별 맥락 디렉토리 + +| 경로 | 역할 | 읽는 시점 | |------|------|-----------| -| `.harness/STATE.md` | 현재 상태 스냅샷 | 매 세션 시작 | -| `.harness/LESSONS.md` | 재발 방지 기록 (최근 5개만) | 매 세션 시작 | -| `Plans.md` | Task 상태 단일 출처 (DoD·Acceptance·Status) | 매 세션 시작 | +| `.harness/tasks//STATE.md` | 해당 Task의 현재 스냅샷 | Task 재개 시 | +| `.harness/tasks//LOG.md` | 해당 Task 작업·에러 로그 | 작업 이력/에러 확인 시 | +| `.harness/tasks//CHECKPOINTS.md` | 해당 Task 완료 지점 기록 | 완료 근거 확인 시 | +| `.harness/tasks//HANDOFF.md` | 해당 Task 재개 정보 | 세션 재개 직후 | +| `.harness/tasks//TASKS.md` | 해당 Task 내부 체크리스트 | Task 진행 중 | +| `.harness/tasks//tasks.index.snapshot.json` | 작업 시작 시점의 `tasks/index.json` 참고본 | 시작 시점 비교가 필요할 때 | -## 필요할 때만 +## 루트 템플릿과 전역 파일 | 파일 | 역할 | 읽는 시점 | |------|------|-----------| -| `.harness/HANDOFF.md` | 직전 세션 인수인계 | 재개 직후 1회 | -| `.harness/TASKS.md` | 현재 Task의 세션 체크리스트 | Task 진행 중 | -| `.harness/LOG.md` | 작업·에러 로그 | 에러 이력 조회 시 | -| `.harness/CHECKPOINTS.md` | 작업 단위 완료 기록 | 이력 추적 시 | -| `.harness/events/planning.jsonl` | `/harness-plan` 단계별 감시 로그 (사용자 친화 JSONL) | planning 실패·반영 흐름 추적 시 | -| `.harness/shared/planning/latest.json` | 최신 planning run의 context/proposal/report 위치 | 최신 task-decomposer proposal 확인 시 | -| `.harness/shared/planning/runs/` | run별 context.json·proposed-tasks.json·decomposition-report.md 작업대 | 특정 planning run 감사 시 | -| `CLAUDE.md` | 프로젝트 규칙 (기획·구현·테스트·리뷰·상태 문서) | 규칙 확인 시 | -| `AGENTS.md` | Codex 진입점. CLAUDE.md 규칙을 Codex 세션에서 동일 절차로 실행하기 위한 호환 지침 | Codex 환경 구성·규칙 확인 시 | -| `.agents/skills/` | Codex repo-scoped skills (`$grill-me`, `$harness-plan`, `$harness-work`, `$harness-review`, `$harness-progress`, `$harness-sync`, `$branch-checkout`, `$git-push`, `$pr-create`) | Codex skill 호출 UX·절차 수정 시 | -| `.claude/commands/` | Claude Code local custom commands (`/branch-checkout`, `/git-push`, `/pr-create`) | Claude command 호출 UX·절차 수정 시 | -| `harness.toml` | harness 플러그인 설정 ([plan]·[test]·[review]) | 설정 변경 시 | -| `BLUEPRINT.md` | 시스템 전체 아키텍처 설명 (읽기용) | 구조 이해 필요 시 | -| `README.md` | 템플릿 사용법 (외부 사용자용) | 문서 갱신 시 | -| `agents/quality-gates.md` | Claude/Codex 공통 scope·YAGNI·review·reporting 게이트. ponytail/caveman 원칙을 repo 규칙으로 적용 | 구현·리뷰·Codex skill 절차 수정 시 | -| `agents/task-decomposer.md` | Task 세분화 기준·게이트 정의 | 계획/게이트 실행 시 | -| `agents/test-agent.md` | 런타임 검증 절차 정의 | worker 완료 후 | -| `.github/workflows/plans-guard.yml` | WIP 확인 + Acceptance Oracle + 세분화 CI | CI 수정 시 | -| `.github/workflows/plans-complete.yml` | 머지 시 cc:WIP→완료 자동 커밋 (stale WIP 방지) | CI 수정 시 | -| `docs/PRD.md`, `docs/UserFlow.md`, `docs/Architecture.md` | 기획 산출물 | 기획 참조 시 | -| `docs/templates/` | 기획 문서 골격 4종 (PRD·UserFlow·DESIGN·Architecture) | 새 기획 착수 시 | +| `.harness/STATE.md` | Task별 `STATE.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/HANDOFF.md` | Task별 `HANDOFF.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/TASKS.md` | Task별 `TASKS.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/LOG.md` | Task별 `LOG.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/CHECKPOINTS.md` | Task별 `CHECKPOINTS.md` 복사용 템플릿 | 새 Task 디렉토리 만들 때 | +| `.harness/LESSONS.md` | 전역 재발 방지 기록 | 매 세션 시작 | +| `.harness/CONTEXT_INDEX.md` | 파일 역할·읽는 순서 인덱스 | 세션 재개/파일 역할 확인 시 | +| `.harness/events/planning.jsonl` | `/harness-plan` 단계별 감시 로그 | planning 실패·반영 흐름 추적 시 | +| `.harness/shared/planning/latest.json` | 최신 planning run 위치 | 최신 proposal 확인 시 | diff --git a/templates/skeleton/.harness/HANDOFF.md b/templates/skeleton/.harness/HANDOFF.md index 333c55f..888a81a 100644 --- a/templates/skeleton/.harness/HANDOFF.md +++ b/templates/skeleton/.harness/HANDOFF.md @@ -1,18 +1,21 @@ -# HANDOFF.md — 다음 세션 인수인계 +# HANDOFF.md — Task 인수인계 템플릿 -> 세션 종료(또는 끊김 대비) 시점에 갱신. 다음 세션이 전체 파일을 다시 읽지 않고 -> 여기 적힌 최소 파일만 읽고 바로 이어가게 하는 것이 목적. +> 이 루트 파일은 실제 인수인계가 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//HANDOFF.md`로 복사해서 사용한다. ## 다음 세션이 먼저 읽을 최소 파일 -1. `.harness/STATE.md` — 현재 상태 -2. `.harness/LESSONS.md` — 최근 5개 항목 -3. `Plans.md` — Task 상태 (cc:WIP 행 확인) +1. `.harness/tasks//STATE.md` +2. `.harness/LESSONS.md` 최근 항목 +3. `tasks/index.json` +4. `Plans.md` +5. `.harness/CONTEXT_INDEX.md`에서 필요한 파일 ## 재개 지점 -- 아직 세션 없음 (초기 상태). 첫 세션에서 `/grill-me`부터 시작. +- [어디서 이어가면 되는지 기록] ## 주의사항 -- Task 상태는 Plans.md가 단일 출처 — `.harness/TASKS.md`에 Task 상태를 복제하지 말 것. +- Task 상태의 단일 출처는 `tasks/index.json`이다. +- 루트 `.harness/*.md` 템플릿에 실제 진행 상태를 기록하지 않는다. diff --git a/templates/skeleton/.harness/LOG.md b/templates/skeleton/.harness/LOG.md index 319b9c0..0d92697 100644 --- a/templates/skeleton/.harness/LOG.md +++ b/templates/skeleton/.harness/LOG.md @@ -1,6 +1,9 @@ -# LOG.md — 작업·에러 로그 (append-only) +# LOG.md — Task 작업·에러 로그 템플릿 -> 시간 역순 아님 — 위에서 아래로 추가만 한다. 에러는 숨기지 말고 원문 그대로 기록. -> 해결된 에러는 재발 방지 관점에서 LESSONS.md에도 요약을 남긴다. +> 이 루트 파일은 실제 작업 로그가 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//LOG.md`로 복사해서 사용한다. +> 전역 재발 방지 규칙은 루트 `.harness/LESSONS.md`에 유지한다. -(아직 로그 없음 — 초기 상태) +## YYYY-MM-DD + +- [작업 또는 에러를 시간순으로 추가] diff --git a/templates/skeleton/.harness/STATE.md b/templates/skeleton/.harness/STATE.md index edb57b9..cc7add9 100644 --- a/templates/skeleton/.harness/STATE.md +++ b/templates/skeleton/.harness/STATE.md @@ -1,20 +1,22 @@ -# STATE.md — 현재 상태 스냅샷 +# STATE.md — Task 상태 스냅샷 템플릿 -> 세션이 언제 끊겨도 이 파일 하나로 "지금 어디까지 왔는지"를 복원한다. -> 작업 시작 전·작업 단위 종료 후마다 갱신. Task 상태의 단일 출처는 Plans.md — -> 이 파일은 Plans.md가 담지 않는 세션 맥락(마지막 검증 결과, 차단 요소)만 담는다. +> 이 루트 파일은 실제 작업 상태가 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//STATE.md`로 복사해서 사용한다. +> 실제 최신 작업 맥락은 `.harness/tasks/` 아래 Task별 디렉토리에 기록한다. ## 현재 목표 -[PROJECT_NAME] 초기화 (Week 0) +[Task 목표를 한 문장으로 기록] ## 진행 중인 Task -- 없음 (아직 착수 전) +- Task ID: `[id]` +- 상태: `[todo|wip|done|blocked]` +- 기준 문서: `tasks/index.json` ## 마지막 검증 결과 -- 없음 (초기 상태) +- [아직 없음] ## 차단 요소 @@ -22,8 +24,8 @@ ## 마지막 커밋 -- 없음 (초기 상태) +- 없음 ## 최종 갱신 -- YYYY-MM-DD, 초기 생성 +- YYYY-MM-DD HH:MM KST diff --git a/templates/skeleton/.harness/TASKS.md b/templates/skeleton/.harness/TASKS.md index de64fad..fdecc78 100644 --- a/templates/skeleton/.harness/TASKS.md +++ b/templates/skeleton/.harness/TASKS.md @@ -1,9 +1,14 @@ -# TASKS.md — 세션 체크리스트 +# TASKS.md — Task 내부 체크리스트 템플릿 -> **Task 상태의 단일 출처는 Plans.md다.** 이 파일은 Plans.md Task 하나를 -> 세션 안에서 수행할 때의 세부 체크리스트(Task보다 작은 단위)만 기록한다. -> Task 완료 시 해당 섹션을 비우고 Plans.md 상태만 갱신한다. +> 이 루트 파일은 실제 체크리스트가 아니라 템플릿이다. +> 새 Task를 시작할 때 `.harness/tasks//TASKS.md`로 복사해서 사용한다. -## 현재 Task: 없음 +## 현재 Task: [id] [title] -(아직 착수 전 — Task 착수 시 여기에 체크리스트 작성.) +- [ ] 세분화 기준 확인 +- [ ] scope/YAGNI 기준 확인 +- [ ] 구현 +- [ ] Acceptance 실행 +- [ ] 관련 테스트 실행 +- [ ] 리뷰 +- [ ] `tasks/index.json`/`Plans.md` 갱신 diff --git a/templates/skeleton/.harness/tasks/.gitkeep b/templates/skeleton/.harness/tasks/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/templates/skeleton/.harness/tasks/.gitkeep @@ -0,0 +1 @@ +