From 0cb3457b1b8fa454c1c06c7e78e85260d45594f2 Mon Sep 17 00:00:00 2001 From: devRonPark Date: Thu, 9 Jul 2026 11:17:00 +0900 Subject: [PATCH 1/2] trim harness docs and state templates --- .agents/skills/harness-work/SKILL.md | 5 +- .agents/skills/harness-yagni-trimmer/SKILL.md | 197 ++++ .../harness-yagni-trimmer/agents/openai.yaml | 4 + .harness/CONTEXT_INDEX.md | 37 +- .harness/RUN_REPORT.md | 25 + AGENTS.md | 16 +- BLUEPRINT.md | 3 +- CLAUDE.md | 12 +- README.md | 916 ++---------------- docs/error-memory.md | 2 + docs/harness-observability-traceability.md | 45 + docs/session-recovery.md | 23 +- templates/skeleton/.harness/CONTEXT_INDEX.md | 31 +- templates/skeleton/.harness/RUN_REPORT.md | 25 + 14 files changed, 437 insertions(+), 904 deletions(-) create mode 100644 .agents/skills/harness-yagni-trimmer/SKILL.md create mode 100644 .agents/skills/harness-yagni-trimmer/agents/openai.yaml create mode 100644 .harness/RUN_REPORT.md create mode 100644 docs/harness-observability-traceability.md create mode 100644 templates/skeleton/.harness/RUN_REPORT.md diff --git a/.agents/skills/harness-work/SKILL.md b/.agents/skills/harness-work/SKILL.md index d8cbe88..6051a55 100644 --- a/.agents/skills/harness-work/SKILL.md +++ b/.agents/skills/harness-work/SKILL.md @@ -22,10 +22,13 @@ Codex에서 Claude Code `/harness-work`에 해당하는 절차를 직접 수행 ## 완료 기준 - Acceptance와 관련 테스트가 통과해야 한다. +- `.harness/tasks//RUN_REPORT.md`에 변경 요약, 주요 결정 근거, + Acceptance/test evidence, 남은 위험을 짧게 남긴다. - Acceptance와 관련 테스트 통과 후 에이전트가 `tasks/index.json`의 대상 Task를 `done`으로 갱신하고 `Plans.md`를 재생성한다. GitHub Actions는 Task 상태를 전환하지 않는다. - 새 파일이나 역할 변경은 `.harness/CONTEXT_INDEX.md`에 반영한다. -- 루트 `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`는 템플릿이므로 실제 진행 상태를 쓰지 않는다. +- 루트 `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`, + `RUN_REPORT.md`는 템플릿이므로 실제 진행 상태를 쓰지 않는다. - ponytail/caveman Codex plugin 자동 동작을 가정하지 않는다. Codex에서는 `agents/quality-gates.md`를 직접 적용한다. diff --git a/.agents/skills/harness-yagni-trimmer/SKILL.md b/.agents/skills/harness-yagni-trimmer/SKILL.md new file mode 100644 index 0000000..36dfa05 --- /dev/null +++ b/.agents/skills/harness-yagni-trimmer/SKILL.md @@ -0,0 +1,197 @@ +--- +name: harness-yagni-trimmer +description: Harness template or harness system YAGNI review for solo builders. Use when the user asks to review, trim, simplify, archive, or reduce a harness/template/system where documentation, progress tracking, logs, reports, workflows, prompts, skills, or task/state files feel too heavy; especially when the goal is complexity reduction rather than feature addition. +--- + +# harness-yagni-trimmer + +Review a harness template from the position of a solo builder. The goal is not to add capability. The goal is to leave only the structure that helps someone quickly resume, code, verify, and move on. + +## Core Standard + +First answer this before judging files: + +```text +What is this harness template's minimum successful flow? +``` + +Example: + +```text +1. Start a new project. +2. Write the goal in one paragraph. +3. Ask Codex to implement. +4. Run the result. +5. If it fails, record only the error and next action. +6. If it succeeds, record changed files and usage. +``` + +Treat anything not directly helping that flow as suspicious. + +## Scan Targets + +Prioritize these surfaces: + +- `README.md`, `CLAUDE.md`, `AGENTS.md`, `SKILL.md` +- `.codex/`, `.claude/`, `.cursor/`, `.agents/` +- `docs/`, `specs/`, `memory/`, `logs/`, `reports/`, `tasks/`, `workflows/` +- `scripts/`, `templates/`, `prompts/` +- `Makefile`, `package.json`, `pyproject.toml` +- CI/CD configuration files + +## Classification + +Classify each important file or feature as one of: + +- `KEEP`: directly needed in the current solo-builder flow; removing it often blocks work. +- `SIMPLIFY`: needed, but too long, repetitive, or heavy; shorten the format. +- `REMOVE`: not needed now; looks useful but does not change today's work. +- `ARCHIVE`: maybe useful as reference, but should not be in the default harness path. + +Default stance: ask "why keep this?" If the answer is weak, mark it `REMOVE` or `ARCHIVE`. + +## Preferred Minimal Docs + +Reduce default documentation toward these files when safe: + +- `README.md`: what this is, how to run it, key commands, current state. Target under 100 lines. +- `WORKING_STATE.md`: current goal, done, next, blockers, last updated. +- `DECISIONS.md`: only hard-to-reverse structural or technical decisions. +- `ERRORS.md`: only recurring errors with symptom, cause, fix, and command. + +Do not add these files just to satisfy the pattern if the repo already has a smaller effective equivalent. Consolidate only when it reduces real reading and writing burden. + +## Removal Priority + +Trim in this order: + +1. Duplicate status docs such as `STATUS.md`, `PROGRESS.md`, `TASKS.md`, `REPORT.md`, `WORKING_STATE.md`. +2. Reporting docs such as long completion reports, generated summaries, heavy review logs, retrospectives. +3. Unused expansion structures such as provider abstractions, plugin registries, hook systems, policy layers, generic executors, template engines. +4. Mandatory checklists that do not prevent real mistakes within 30 seconds. +5. Logs that are not failure cause, reproduction command, or next action. + +## Workflow + +1. Scan the repository and report: + +```md +## Harness Surface Area + +- 문서 파일 수: +- workflow 파일 수: +- prompt/skill 파일 수: +- logs/reports/tasks 관련 파일 수: +- 의심되는 중복 영역: +``` + +2. Diagnose briefly: + +```md +## Diagnosis + +현재 harness는 다음 문제가 있다. + +1. 과한 문서화: +2. 중복 상태 추적: +3. 아직 필요 없는 확장 구조: +4. solo builder 흐름 방해 요소: +5. 삭제해도 안전해 보이는 것: +``` + +3. Apply YAGNI questions to major components: + +```md +## YAGNI Questions + +### 대상: 파일 또는 기능 이름 + +- 지금 실제로 쓰는가? +- 없으면 오늘 작업이 막히는가? +- 다음 행동을 더 쉽게 만드는가? +- 같은 내용을 다른 곳에서도 기록하는가? +- 미래 대비라는 이유만으로 존재하는가? + +판정: +- KEEP / SIMPLIFY / REMOVE / ARCHIVE + +이유: +- 짧게 작성 +``` + +4. Show a trim plan before risky deletion: + +```md +## Trim Plan + +### KEEP + +- 유지할 것 + +### SIMPLIFY + +- 줄일 것 +- 어떻게 줄일 것 + +### REMOVE + +- 삭제할 것 +- 삭제해도 되는 이유 + +### ARCHIVE + +- 옮길 것 +- 이동 위치 +``` + +5. Apply clearly safe reductions without waiting for extra confirmation. Safe examples: merging duplicate docs, deleting empty templates, archiving unused examples, shortening long docs, consolidating duplicate state docs. + +6. Do not directly apply risky reductions. Propose first when a change removes execution scripts, CI/CD behavior, real code paths, active hooks, or agent execution rules. + +## Final Report + +After edits, report exactly in this shape: + +```md +# Harness Trim Result + +## 한 줄 결론 + +이번 변경으로 harness가 더 가벼워졌는지 한 문장으로 설명. + +## 제거한 것 + +- 항목: + - 이유: + +## 줄인 것 + +- 항목: + - 기존: + - 변경: + +## 남긴 것 + +- 항목: + - 이유: + +## 아직 무거운 부분 + +- 항목: + - 왜 아직 무거운지: + - 다음에 줄이는 방법: + +## 다음 작업 + +1. 가장 먼저 할 일 +2. 그 다음 할 일 +3. 보류할 일 +``` + +## Guardrails + +- Do not add new harness structures because they look useful. +- Do not create interfaces, providers, plugin registries, or logging frameworks for future use. +- Do not solve documentation bloat by adding more documentation files. +- Do not keep anything only because it might be useful later. +- Judge success by whether the next solo-builder action is easier, not by whether the file count is lower. diff --git a/.agents/skills/harness-yagni-trimmer/agents/openai.yaml b/.agents/skills/harness-yagni-trimmer/agents/openai.yaml new file mode 100644 index 0000000..9313142 --- /dev/null +++ b/.agents/skills/harness-yagni-trimmer/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Harness YAGNI Trimmer" + short_description: "Review and reduce harness template complexity for solo builders." + default_prompt: "이 프로젝트의 harness template을 YAGNI 관점에서 리뷰하고 줄여줘." diff --git a/.harness/CONTEXT_INDEX.md b/.harness/CONTEXT_INDEX.md index 7864ff8..d3209c7 100644 --- a/.harness/CONTEXT_INDEX.md +++ b/.harness/CONTEXT_INDEX.md @@ -14,29 +14,22 @@ ## Task별 맥락 디렉토리 -| 경로 | 역할 | 읽는 시점 | -|------|------|-----------| -| `.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/tasks//` 아래에 실제 작업 맥락을 둔다. + +- `STATE.md`: 현재 스냅샷 +- `LOG.md`: 작업·에러 원문 +- `RUN_REPORT.md`: 변경·결정·검증 요약 +- `HANDOFF.md`, `TASKS.md`, `CHECKPOINTS.md`: 필요할 때만 읽는 보조 기록 +- `tasks.index.snapshot.json`: 시작 시점 비교가 필요할 때만 읽는 참고본 ## 루트 `.harness/` 템플릿과 전역 파일 -| 파일 | 역할 | 읽는 시점 | -|------|------|-----------| -| `.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 감사 시 | +- `.harness/{STATE,HANDOFF,TASKS,LOG,CHECKPOINTS,RUN_REPORT}.md`: 새 Task용 템플릿 +- `.harness/LESSONS.md`: 전역 재발 방지 기록 +- `.harness/CONTEXT_INDEX.md`: 필요한 파일만 고르는 인덱스 +- `.harness/events/planning.jsonl`: planning 실패·반영 흐름 추적 +- `.harness/shared/planning/latest.json`: 최신 planning run 위치 +- `.harness/shared/planning/runs/`: 특정 planning run 감사 시만 읽는 작업대 ## 필요할 때만 @@ -44,7 +37,7 @@ |------|------|-----------| | `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·절차 수정 시 | +| `.agents/skills/` | Codex repo-scoped skills (`$grill-me`, `$harness-plan`, `$harness-work`, `$harness-review`, `$harness-progress`, `$harness-sync`, `$harness-yagni-trimmer`, `$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]) | 설정 변경 시 | | `BLUEPRINT.md` | 시스템 전체 아키텍처 설명 (읽기용) | 구조 이해 필요 시 | @@ -53,7 +46,6 @@ | `agents/task-decomposer.md` | Task 세분화 기준·게이트 정의 | 계획/게이트 실행 시 | | `agents/test-agent.md` | 런타임 검증 절차 정의 | worker 완료 후 | | `.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/ 초기 템플릿 구조 | 골격 자체를 고칠 때 | @@ -62,5 +54,6 @@ | `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/harness-observability-traceability.md` | 실행 요약, 원문 로그, 결정 근거, context 보존 위치 | harness 운영 증거 위치 확인 시 | | `docs/session-recovery.md` | `.harness/tasks/` 기반 재개 절차 심화 | 세션 복구 절차 상세 확인 시 | | `docs/error-memory.md` | Task별 `LOG.md`와 전역 `LESSONS.md` 작성 규칙 | 에러 기록 규칙 확인 시 | diff --git a/.harness/RUN_REPORT.md b/.harness/RUN_REPORT.md new file mode 100644 index 0000000..3b60769 --- /dev/null +++ b/.harness/RUN_REPORT.md @@ -0,0 +1,25 @@ +# RUN_REPORT.md — Task 실행 요약 템플릿 + +> 루트 파일은 템플릿이다. 실제 보고서는 `.harness/tasks//RUN_REPORT.md`에 둔다. +> 원문 로그는 `LOG.md`에 남기고, 여기는 다음 세션이 읽을 증거만 남긴다. + +## Summary + +- Task: `[id]` +- 상태: `[done|blocked|needs-review|in-progress]` +- 변경: `[핵심 변경 1-3줄]` + +## Evidence + +| 명령 | 결과 | 비고 | +|------|------|------| +| `[acceptance command]` | `[PASS|FAIL|SKIP]` | `[핵심 출력 또는 이유]` | +| `[test command]` | `[PASS|FAIL|SKIP]` | `[핵심 출력 또는 이유]` | + +## Notes + +- 결정: `[결정과 근거. 없으면 없음]` +- 변경 파일: `[path — 이유]` +- 실패/복구: `[LOG.md 위치 또는 없음]` +- 다음 행동: `[이어갈 위치 또는 없음]` +- 최종 갱신: `YYYY-MM-DD HH:MM KST` diff --git a/AGENTS.md b/AGENTS.md index 3738ff9..57cf00d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -17,9 +17,10 @@ On resumed work, follow the recovery order in `CLAUDE.md`: 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 +3. `.harness/tasks//RUN_REPORT.md` if it exists +4. latest entries in `.harness/LESSONS.md` +5. `Plans.md` +6. only the extra files listed in `.harness/CONTEXT_INDEX.md` that are needed ## Source Of Truth @@ -49,6 +50,7 @@ procedure directly: | `/harness-review` | Use `$harness-review` from `.agents/skills/harness-review/SKILL.md` to review the diff against `CLAUDE.md`, the target task, and acceptance evidence. | | `/harness-progress` | Use `$harness-progress` from `.agents/skills/harness-progress/SKILL.md` for read-only progress summaries. | | `/harness-sync` | Use `$harness-sync` from `.agents/skills/harness-sync/SKILL.md` to validate `tasks/index.json` and regenerate `Plans.md`. | +| Harness YAGNI trim | Use `$harness-yagni-trimmer` from `.agents/skills/harness-yagni-trimmer/SKILL.md` to review and reduce harness/template complexity for solo-builder use. | Do not assume the Claude Code plugin has performed any gate automatically. Codex must execute the same gates explicitly. @@ -88,12 +90,16 @@ branches, pushing, or creating PRs. Never force push or discard local changes. ## State Documents -- Root `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, and - `CHECKPOINTS.md` are templates. Do not write live task state into them. +- Root `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, + `CHECKPOINTS.md`, and `RUN_REPORT.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`. +- Summarize decisions, changed files, verification evidence, and handoff risks + in `.harness/tasks//RUN_REPORT.md` after meaningful work or before + handoff. - Update `.harness/CONTEXT_INDEX.md` when creating a file or changing a file's role. diff --git a/BLUEPRINT.md b/BLUEPRINT.md index 26634d8..0cc73fb 100644 --- a/BLUEPRINT.md +++ b/BLUEPRINT.md @@ -391,7 +391,8 @@ GitHub → Settings → Branches → main: Codex에서는 `/grill-me`와 `/harness-*` top-level slash command 대신 `.agents/skills/`의 `$grill-me`, `$harness-plan`, `$harness-work`, -`$harness-review`, `$harness-progress`, `$harness-sync`를 사용한다. Git helper는 +`$harness-review`, `$harness-progress`, `$harness-sync`, +`$harness-yagni-trimmer`를 사용한다. Git helper는 `$branch-checkout`, `$git-push`, `$pr-create`, `$rescue-from-main`를 사용한다. Codex용 별도 `$ponytail`/`$caveman` skill은 제공하지 않는다. 해당 원칙은 `agents/quality-gates.md`에서 공통 gate로 적용한다. diff --git a/CLAUDE.md b/CLAUDE.md index 7109bd3..8802d81 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -74,19 +74,21 @@ 직접 편집하지 않는다. `.harness/tasks//`는 `tasks/index.json`이 담지 않는 세션 맥락만 담는다 — Task 상태를 `.harness/`에 단일 출처처럼 복제하지 않는다. - 루트 `.harness/STATE.md`, `.harness/HANDOFF.md`, `.harness/TASKS.md`, - `.harness/LOG.md`, `.harness/CHECKPOINTS.md`는 **복사용 템플릿**이다. 실제 + `.harness/LOG.md`, `.harness/CHECKPOINTS.md`, `.harness/RUN_REPORT.md`는 **복사용 템플릿**이다. 실제 진행 상태를 루트 템플릿에 쓰지 않는다. - 새 Task 착수 시 `.harness/tasks//`를 만들고 루트 템플릿을 복사해 - `STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`를 둔다. 작업 - 시작 시점의 `tasks/index.json`은 참고본으로 + `STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`, `RUN_REPORT.md`를 + 둔다. 작업 시작 시점의 `tasks/index.json`은 참고본으로 `.harness/tasks//tasks.index.snapshot.json`에 저장할 수 있다. - 세션 재개 시 읽는 순서: `tasks/index.json`에서 `wip` 또는 사용자가 지정한 - Task 확인 → `.harness/tasks//STATE.md` → `.harness/LESSONS.md`(최근 + Task 확인 → `.harness/tasks//STATE.md` → 있으면 + `.harness/tasks//RUN_REPORT.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` + `CHECKPOINTS.md`(작업 단위 완료 + 커밋 해시) · `RUN_REPORT.md`(실행 요약, + 결정 근거, 검증 evidence) · `tasks.index.snapshot.json` (작업 시작 시점 참고본). 루트 `LESSONS.md`는 전역 재발 방지 기록으로 유지한다. 루트 `CONTEXT_INDEX.md`는 파일 역할 인덱스다. - 에러는 숨기지 말고 해당 Task의 `LOG.md`에 원문 기록, 해결하면 전역 diff --git a/README.md b/README.md index 8ac1c8f..6611f5d 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,44 @@ # cc-harness-template -**Claude Code / Codex Agent Harness Template** — Claude Code와 Codex가 같은 프로젝트 -맥락을 안정적으로 유지하고, 계획·구현·검증·리뷰를 역할별로 나누고, 세션이 끊겨도 -복구할 수 있게 만드는 repo-level 템플릿. +Claude Code와 Codex가 같은 repo 규칙으로 계획, 구현, 검증, 리뷰를 진행하게 하는 개인용 harness 템플릿. -> Claude Code 또는 Codex로 개발할 때, 매번 처음부터 설정하지 않아도 되도록 만든 개인 환경 템플릿. - ---- +최소 성공 흐름: 템플릿 적용 → `CLAUDE.md` 작성 → `tasks/index.json`에 작은 작업 작성 → 구현 → Acceptance/test 실행 → 실패는 `LOG.md`, 완료 요약은 `RUN_REPORT.md`에 기록. ## 먼저 고를 것 -이 템플릿은 두 실행 환경을 모두 지원한다. 처음에는 아래 중 하나만 고르면 된다. - -| 내가 쓰는 도구 | 먼저 할 일 | 핵심 진입점 | +| 도구 | 시작점 | 명령 | |---|---|---| -| Claude Code | [Claude Code Setup](#claude-code-setup)으로 플러그인 설치 후 `claude` 실행 | `CLAUDE.md`, `/harness-*`, `/grill-me` | -| Codex | [Codex CLI Setup](#codex-cli-setup) 확인 후 `codex` 실행 | `AGENTS.md`, `.agents/skills/*`, `$harness-*` | -| 둘 다 | Claude Code 플러그인을 설치하고 Codex는 repo 규칙을 직접 실행 | `CLAUDE.md`를 기준으로 `AGENTS.md`가 호환 절차 제공 | +| Claude Code | `CLAUDE.md` | `/grill-me`, `/harness-plan`, `/harness-work` | +| Codex | `AGENTS.md` | `$grill-me`, `$harness-plan`, `$harness-work` | +| 둘 다 | `CLAUDE.md` 기준, `AGENTS.md` 호환 절차 | 같은 `tasks/index.json` 사용 | -새 프로젝트에 바로 적용하려면 아래 Quick Start부터 실행한다. 이미 코드와 README가 -있는 프로젝트라면 [기존 프로젝트에 적용](#기존-프로젝트에-적용)으로 건너뛴다. +Claude Code의 ponytail/caveman plugin hook은 Codex에서 자동 실행되지 않는다. Codex는 `AGENTS.md`, `.agents/skills/*`, `agents/quality-gates.md`를 직접 따른다. ## Quick Start ```bash -# 1. 템플릿 클론 git clone https://github.com/devRonPark/cc-harness-template /tmp/harness-tpl - -# 2. 내 프로젝트에 적용 /tmp/harness-tpl/init.sh /path/to/my-project - -# 3. 프로젝트로 이동 cd /path/to/my-project ``` -이후 사용할 도구를 실행한다. +복사 직후 아래 파일을 먼저 채운다. + +- `harness.toml`: `[project] name`, `description` +- `CLAUDE.md`: 프로젝트 개요, 기술 스택, 코딩 규칙 +- `tasks/index.json`: 첫 작업, DoD, Acceptance 명령 +- `.claude/agent-memory/*/MEMORY.md`: Claude Code agent용 Project Context + +그다음: ```bash -claude # Claude Code -codex # Codex +python3 scripts/validate_tasks.py +python3 scripts/sync_plans.py ``` -복사 직후엔 `harness.toml`·`CLAUDE.md`가 플레이스홀더 상태다. -[커스터마이징 체크리스트](#step-2--커스터마이징-체크리스트)를 먼저 채워야 -AI가 엉뚱한 컨텍스트로 동작하지 않는다. - ## Codex CLI Setup -Codex는 Claude Code 플러그인 hook을 자동 실행하지 않는다. 대신 이 저장소의 -루트 `AGENTS.md`와 `.agents/skills/`가 같은 절차를 Codex 방식으로 제공한다. - -Codex에서 새 세션을 열면 아래 순서로 시작한다. +Codex 세션 첫 프롬프트: ```text AGENTS.md를 읽어줘. @@ -58,860 +46,94 @@ tasks/index.json과 Plans.md 기준으로 현재 상태를 확인해줘. $harness-progress로 진행 상황을 요약해줘. ``` -작업을 실행할 때는 Claude Code slash command 대신 Codex skill 이름을 쓴다. - -| 목적 | Codex에서 호출 | 하는 일 | -|---|---|---| -| 기획 인터뷰 | `$grill-me` | PRD 초안과 Open Questions 정리 | -| Task 추가 | `$harness-plan` | planning context → proposal → 검증 → `tasks/index.json` 반영 | -| Task 구현 | `$harness-work` | 세분화/scope 게이트 → 구현 → Acceptance/test → 리뷰 | -| 진행 확인 | `$harness-progress` | `tasks/index.json` 기준 읽기 전용 요약 | -| Plans sync | `$harness-sync` | `tasks/index.json` 검증과 `Plans.md` 재생성 | -| Git 작업 | `$branch-checkout`, `$git-push`, `$pr-create`, `$rescue-from-main` | 브랜치, push, PR, main 작업 구조 | - -Codex 작업도 항상 `agents/quality-gates.md`를 따른다. ponytail/caveman plugin -자동 hook이 없으므로 YAGNI, scope check, findings-first 리뷰는 Codex 세션이 직접 -적용한다. - -## 작업별 Workflow - -| 하고 싶은 일 | 시작 명령 | 완료 전 확인 | -|---|---|---| -| 새 기능 기획 | Claude: `/grill-me` / Codex: `$grill-me` | `docs/PRD.md`와 Open Questions가 남았는지 확인 | -| Task 추가 | Claude: `/harness-plan` / Codex: `$harness-plan` | `validate_task_proposal.py`, `validate_tasks.py`, `sync_plans.py --check` 통과 | -| Task 구현 | Claude: `/harness-work` / Codex: `$harness-work` | Task Acceptance 명령과 관련 테스트 통과 | -| 현재 diff 리뷰 | Claude: `/harness-review` / Codex: `$harness-review` | findings-first 리뷰에서 blocker 없음 | -| 진행률 확인 | Claude: `/harness-progress` / Codex: `$harness-progress` | `tasks/index.json` 기준으로 `wip`/`todo` 확인 | -| 작업 브랜치 만들기 | Claude: `/branch-checkout` / Codex: `$branch-checkout` | `git status`가 깨끗한지 확인 후 전환 | -| PR 준비 | Claude: `/git-push`, `/pr-create` / Codex: `$git-push`, `$pr-create` | Acceptance evidence와 리뷰 결과를 PR 본문에 반영 | - ---- - -## 이 템플릿이 해결하는 문제 (Why) - -Claude Code로 새 프로젝트를 시작할 때마다 반복되는 일이 있다. +Codex skill 매핑: -- AI가 불필요한 추상화나 과잉 구현을 한다 -- 응답이 너무 길어서 읽는 데 시간이 걸린다 -- 구현·리뷰·방향 결정을 같은 AI에게 시키면 역할이 뒤섞인다 -- 할 일 목록과 실제 구현 상태가 어긋난다 -- 터미널 세션이 끊기면 어디까지 했는지 다시 파악해야 한다 -- 같은 에러를 원인 파악 없이 반복한다 -- 프로젝트별 규칙이 `CLAUDE.md`에 정리돼 있지 않아 작업 품질이 세션마다 흔들린다 - -이 템플릿은 이 문제들을 **4개 Claude Code 플러그인 + `CLAUDE.md` 규약 + -Codex용 `AGENTS.md` 진입점 + `.harness/` 상태 문서** 조합으로 해결한다. -새 프로젝트에 복사하고 이름만 바꾸면 바로 쓸 수 있다. - ---- - -## 이 템플릿에 포함된 것 (What You Get) - -`CLAUDE.md`가 이 템플릿의 핵심 — Claude Code가 세션마다 가장 먼저 읽는 프로젝트 운영 규칙이다. -아래는 이 저장소에 실제로 있는 파일 기준. 없는 것을 있는 것처럼 적지 않는다. - -| 경로 | 상태 | 용도 | -|---|---|---| -| `CLAUDE.md` | 포함 | Claude Code가 항상 먼저 읽는 프로젝트 규칙 (플레이스홀더 — 프로젝트마다 채워야 함) | -| `AGENTS.md` | 포함 | Codex가 자동으로 읽는 프로젝트 규칙 진입점. `CLAUDE.md` 규약을 Codex 절차로 실행 | -| `harness.toml` | 포함 | 프로젝트 이름·안전 규칙 + `[github]`/`[review]`/`[test]`/`[plan]` 요약 인덱스 (실행 SSOT는 CLAUDE.md) | -| `tasks/index.json` | 포함 | Task 상태 단일 출처 (`todo`/`wip`/`done`/`blocked` + DoD·Acceptance·Depends·GH) | -| `Plans.md` | 포함 | 사람이 필요할 때 갱신하는 읽기용 Task snapshot. stale일 수 있으며 직접 편집하지 않음 | -| `BLUEPRINT.md` | 포함 | 플러그인·에이전트 협력 구조 전체 설명 (읽기용) | -| `agents/task-decomposer.md`, `agents/test-agent.md`, `agents/quality-gates.md` | 포함 | 세분화 게이트·런타임 검증·공통 scope/YAGNI/review/reporting 기준. task-decomposer는 `/harness-plan`에서 외부 명령 계약 기반 proposal 흐름을 기본으로 사용 | -| `.harness/` (STATE·HANDOFF·TASKS·LOG·LESSONS·CHECKPOINTS·CONTEXT_INDEX) | 포함 | 세션 상태·에러 이력·인수인계 기록 | -| `.agents/skills/*/SKILL.md` | 포함 | 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`) | -| `.claude/commands/{branch-checkout,git-push,pr-create,rescue-from-main}.md` | 포함 | Claude Code custom commands for Git branch checkout, safe push, draft PR creation, main/master work rescue | -| `.claude/skills/grill-me/SKILL.md` | 포함 | 인터뷰 기반 PRD 초안 작성 스킬 (`/grill-me`) | -| `.claude/agent-memory/*/MEMORY.md` | 포함 | worker·reviewer·advisor 행동 규칙 주입 (caveman/VFF 적용 강도 지정) | -| `docs/templates/{PRD,UserFlow,DESIGN,Architecture}.md` | 포함 | 기획 산출물 골격 | -| `.github/workflows/{ci,plans-guard}.yml` | 포함 | 기술 스택 CI + Task manifest/snapshot 검증 (GitHub 연동 시) | -| `init.sh` | 포함 | 위 전체를 새 프로젝트 디렉토리에 한 번에 복사 | -| `scripts/setup-plugins.sh` | 포함 | `~/.claude/settings.json` 플러그인 등록·설치 자동화 (Step 1 수동 JSON 편집 대체) | -| `.claude/settings.local.json.example` | 포함(예시) | 프로젝트 전용 권한 설정 — 복사 후 `settings.local.json`으로 rename | -| `LICENSE` | 포함 (MIT) | — | -| `.claude/settings.json` (hooks) | **미포함 — 추가 권장** | 파일 수정 후 검증 자동화 등 (아래 [Hooks](#claude-code-hooks) 참고) | -| `.claude/commands/` | 일부 포함 | Git helper custom commands만 포함. `/harness-*` 명령은 로컬 파일이 아니라 설치된 플러그인이 제공 | -| `scripts/{validate_tasks,report_tasks,sync_plans,build_planning_context,validate_task_proposal,apply_task_proposal}.py` | 포함 | Task JSON 검증·진행률 출력·planning proposal·읽기용 Plans.md snapshot 생성 | -| `scripts/verify-harness.sh` | **미포함** | 대체 수단: `harness doctor` (설치 상태) + `tasks/index.json`의 Task별 Acceptance 명령 (기능 검증) | - ---- - -## 구성 요소 한눈에 보기 - -이 템플릿은 **필수 Plugin 3개** + **선택 Plugin 1개** + **5개 에이전트 규칙** + -**프로젝트 설정 파일**로 이루어진다. - -### Plugin 3개(필수) — 세션 시작 시 자동으로 켜진다 - -| Plugin | 한 줄 설명 | -|--------|-----------| -| **claude-code-harness** | `tasks/index.json`/Plans.md를 기준으로 할 일을 worker·reviewer·advisor에게 나눠준다 | -| **ponytail** | 코드를 쓰기 전에 "이게 정말 필요한가?"를 7단계로 확인하게 만든다 | -| **caveman** | AI 응답의 군더더기를 제거해 토큰을 약 65% 줄인다 | - -ponytail/caveman은 Claude Code에서만 자동 hook으로 동작하는 plugin enhancement다. -Codex에는 같은 플러그인 자동 동작이 없으므로 `.agents/skills/*`가 -`agents/quality-gates.md`를 직접 참조해 YAGNI, scope check, findings-first 리뷰, -짧은 검증 중심 보고 원칙을 적용한다. - -### Plugin 1개(선택) — 개인 취향에 따라 설치 여부를 고른다 - -| Plugin | 한 줄 설명 | -|--------|-----------| -| **value-for-fable** | Sonnet 모델에 Fable 5 수준의 진단 규율을 적용한다. `setup-plugins.sh` 실행 시 설치 여부를 묻는다 (`--skip-vff`/`--with-vff`로 무인 지정 가능) | - -### 에이전트 5종 — 계획·구현 단계에서 자동으로 협업한다 - -``` -계획 → task-decomposer (PRD를 실행 가능한 최소 Task로 분해 — /harness-plan 필수 선행 단계) - -구현 → harness → advisor (방향 결정) - → [게이트] task-decomposer + quality-gates 재확인 — 세분화/scope/YAGNI 기준 미달이면 worker 진입 차단 - → worker (구현) - → test-agent (런타임 검증 — Acceptance + 테스트 스위트) - → reviewer (검토) -``` - -각 에이전트는 서로 다른 Plugin 조합으로 동작한다. -worker는 토큰을 아끼면서 구현하고, reviewer와 advisor는 판단 근거를 압축하지 않는다. - -| | worker | reviewer | advisor | test-agent | task-decomposer | -|--|:------:|:--------:|:-------:|:----------:|:----------------:| -| ponytail (과잉 구현 방지) | ✅ | ✅ | ✅ | — | ✅ | -| caveman (응답 압축) | lite | — | — | — | — | -| VFF v2 (진단 구조) | 검증만 | ✅ 전체 | ✅ 전체 | — | — | -| `agents/quality-gates.md` (공통 기준) | ✅ | ✅ | ✅ | — | ✅ | - ---- +| 목적 | 호출 | +|---|---| +| 기획 인터뷰 | `$grill-me` | +| Task 추가 | `$harness-plan` | +| Task 구현 | `$harness-work` | +| 리뷰 | `$harness-review` | +| 진행 확인 | `$harness-progress` | +| Plans sync | `$harness-sync` | +| Harness YAGNI trim | `$harness-yagni-trimmer` | +| Git 작업 | `$branch-checkout`, `$git-push`, `$pr-create`, `$rescue-from-main` | ## Claude Code Setup -### 사전 조건 - -- [Claude Code CLI](https://claude.ai/code) 설치됨 -- Node.js 18 이상 (`node --version`으로 확인) - -### Step 1 — 플러그인 등록 + 설치 (자동) - -`~/.claude/settings.json`을 손으로 편집하지 않는다 — JSON 문법 실수 한 번으로 -Claude Code 전체 설정이 깨질 수 있다. 대신 스크립트를 실행한다. - -```bash -git clone https://github.com/devRonPark/cc-harness-template /tmp/harness-tpl -/tmp/harness-tpl/scripts/setup-plugins.sh -``` - -이 스크립트가 하는 일: - -1. `~/.claude/settings.json`이 없으면 새로 만들고, 있으면 백업(`settings.json.bak.<시각>`)한 뒤 - 기존 내용을 보존한 채 이 템플릿이 필요로 하는 plugin만 병합한다 - (다른 plugin·permissions·theme 설정은 건드리지 않는다). -2. 필수 3종(claude-code-harness·ponytail·caveman)은 항상 설치한다. - 선택 plugin인 value-for-fable은 대화형 터미널이면 설치 여부를 묻고, - `--skip-vff`/`--with-vff` 플래그나 `SETUP_SKIP_VFF=1` 환경변수로 무인 지정할 수 있다. -3. `harness doctor`로 설치 상태를 확인한다. - -`claude`/`harness` CLI가 아직 없으면 해당 단계만 건너뛰고 안내 메시지를 출력한다 — -설치 후 다시 실행하면 된다(멱등적이라 여러 번 실행해도 안전). - -```bash -./scripts/setup-plugins.sh --skip-vff # value-for-fable 제외 -./scripts/setup-plugins.sh --with-vff # value-for-fable 포함 (프롬프트 생략) -``` - -
-수동으로 편집하고 싶다면 (참고용) - -```json -{ - "enabledPlugins": { - "claude-code-harness@claude-code-harness-marketplace": true, - "ponytail@ponytail": true, - "caveman@caveman": true, - "value-for-fable@itsinseong": true - }, - "extraKnownMarketplaces": { - "claude-code-harness-marketplace": { - "source": { "source": "github", "repo": "Chachamaru127/claude-code-harness" } - }, - "ponytail": { - "source": { "source": "github", "repo": "DietrichGebert/ponytail" } - }, - "caveman": { - "source": { "source": "github", "repo": "JuliusBrussee/caveman" } - }, - "itsinseong": { - "source": { "source": "git", "url": "https://github.com/itsinseong/value-for-fable.git" } - } - }, - "tui": "fullscreen", - "theme": "dark" -} -``` - -`value-for-fable` 블록(enabledPlugins·extraKnownMarketplaces 양쪽 모두)은 선택 사항이다 — -설치하지 않으려면 통째로 빼면 된다. - -이후 필수 3종을 개별 설치한다 (value-for-fable은 원할 때만 추가로 설치). - -```bash -claude plugin install claude-code-harness@claude-code-harness-marketplace -claude plugin install ponytail@ponytail -claude plugin install caveman@caveman -claude plugin install value-for-fable@itsinseong # 선택 -``` - -
- -### Step 2 — 설치 확인 - ```bash +/tmp/harness-tpl/scripts/setup-plugins.sh --skip-vff harness doctor ``` -모든 항목에 체크가 붙으면 완료 (setup-plugins.sh를 썼다면 이미 자동 실행됨). - -### 첫 프롬프트 - -프로젝트에 `claude`로 진입한 직후, 아래를 그대로 붙여넣는다. - -```text -Read CLAUDE.md first. -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/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/tasks//LOG.md and .harness/LESSONS.md. -``` +필수 plugin은 `claude-code-harness`, `ponytail`, `caveman`이다. `value-for-fable`은 선택이다. -한국어 버전: +Claude Code 세션 첫 프롬프트: ```text 먼저 CLAUDE.md를 읽어줘. 그다음 harness.toml, tasks/index.json, Plans.md, BLUEPRINT.md를 확인해줘. -CLAUDE.md의 harness 규칙을 따라줘 — Task 작성 전 task-decomposer 세분화 게이트, -리뷰 전 test-agent 검증 게이트, .harness/ 상태 문서 규칙 전부 포함. -위험한 변경 전에는 .harness/tasks//STATE.md를 갱신해줘. -구현과 리뷰 전에는 agents/quality-gates.md의 scope/YAGNI/review gate를 적용해줘. -구현 후에는 tasks/index.json에 기록된 해당 Task의 Acceptance 명령을 실행해줘. -에러가 발생했고 해결했다면 원문은 .harness/tasks//LOG.md에, -재발 방지 규칙은 .harness/LESSONS.md에 기록해줘. -``` - ---- - -## 새 프로젝트에 적용 - -빈 프로젝트(또는 이제 막 시작하는 프로젝트)에 이 템플릿을 통째로 적용하는 경우. -기존 코드가 이미 있는 프로젝트라면 [기존 프로젝트에 적용](#기존-프로젝트에-적용)을 본다. - -### Step 1 — 템플릿 파일 복사 - -`init.sh`가 아래 모든 파일(CI 워크플로 2종, PR/Issue 템플릿, `.harness/` 골격 -7종 포함)을 한 번에 복사한다. `tasks/index.json`·`Plans.md`·`.harness/`는 이 템플릿 저장소 -자신의 작업 이력이 아니라 `templates/skeleton/`의 깨끗한 초기 상태에서 -복사되므로, 새 프로젝트가 남의 완료 Task를 물려받지 않는다. - -```bash -git clone https://github.com/devRonPark/cc-harness-template /tmp/harness-tpl -/tmp/harness-tpl/init.sh /path/to/my-new-project +구현 전 agents/quality-gates.md와 agents/task-decomposer.md를 적용해줘. +구현 후 tasks/index.json의 Acceptance 명령과 관련 테스트를 실행해줘. ``` -### Step 2 — 커스터마이징 체크리스트 - -복사 후 반드시 아래 항목을 채워야 한다. 비워두면 AI가 엉뚱한 컨텍스트로 동작한다. - -**`harness.toml`** -```toml -[project] -name = "my-actual-project" # ← 이 프로젝트 이름으로 변경 -description = "한 줄 설명" # ← 변경 -``` - -**`CLAUDE.md`** -`[PROJECT_NAME]`, 기술 스택, 디렉토리 구조, 코딩 규칙 섹션을 실제 프로젝트에 맞게 채운다. - -**`tasks/index.json`** -Week 구조와 Task를 정의한다. DoD는 **검증 가능한 형태**로, Acceptance는 -**세션 에이전트가 완료 전 실행할 명령어**로 쓴다. 사람이 읽는 로드맵이 필요하면 -`python3 scripts/sync_plans.py`로 `Plans.md` snapshot을 갱신한다. - -```markdown -# 좋은 DoD / Acceptance 예시 -DoD: `npm run build` 에러 0, dist/index.js 존재 -Acceptance: npm run build 2>&1 | grep -v error ← 세션 에이전트가 실행, 실패 시 done 전환 금지 - -# 성공 판단 기준 -- Task는 INVEST 기준으로 독립 검증 가능, 관찰 가능한 가치, 1 PR 이내, 테스트 가능해야 한다. -- DoD는 Definition of Done: 완료 후 관찰 가능한 상태를 쓴다. -- Acceptance는 Given/When/Then의 Then을 기계화한 oracle: exit 0, 파일 존재, 출력 매칭, - HTTP 응답, 테스트 통과 중 하나로 판정한다. -- 기계 검증이 불가능한 조사·인터뷰·외부 승인 Task만 Acceptance: - 를 허용하고, - DoD에는 사람이 확인할 산출물 위치나 승인 기록을 남긴다. - -# 나쁜 예시 -DoD: 코드가 잘 작성됨 -Acceptance: true -Acceptance: pytest tests || echo skip -Acceptance: test -f ../other-repo/Plans.md -``` - -**`.claude/agent-memory/*/MEMORY.md`** -세 파일 모두 아래 섹션을 찾아서 채운다: +## 작업별 Workflow -```markdown -## Project Context +| 하고 싶은 일 | Claude Code | Codex | 완료 전 확인 | +|---|---|---|---| +| 새 기능 기획 | `/grill-me` | `$grill-me` | `docs/PRD.md` 또는 결정 기록 | +| Task 추가 | `/harness-plan` | `$harness-plan` | `validate_tasks.py`, `sync_plans.py --check` | +| Task 구현 | `/harness-work` | `$harness-work` | Acceptance/test 통과 | +| 현재 diff 리뷰 | `/harness-review` | `$harness-review` | blocker 없음 | +| 진행률 확인 | `/harness-progress` | `$harness-progress` | `tasks/index.json` 기준 | +| PR 준비 | `/git-push`, `/pr-create` | `$git-push`, `$pr-create` | 검증 evidence 포함 | -프로젝트: [실제 프로젝트 이름] -목표: [핵심 목표 한 줄] -``` +GitHub Actions는 Task 상태를 바꾸지 않는다. Acceptance와 관련 테스트가 통과하면 세션 에이전트가 `tasks/index.json`을 갱신하고 `python3 scripts/sync_plans.py`를 실행한다. -### Step 3 — harness 동기화 +## 포함된 파일 -```bash -harness sync # harness.toml → .claude-plugin/ 파일 생성 -harness doctor # 전체 통과 확인 -``` +핵심 파일은 `CLAUDE.md`, `AGENTS.md`, `harness.toml`, `tasks/index.json`, `Plans.md`, `agents/*`, `.harness/`, `.agents/skills/*`, `.claude/commands/*`, `.github/workflows/*`, `scripts/*`다. -### Step 4 — GitHub 연동 (선택) +상세 구조는 `BLUEPRINT.md`, 설치는 `docs/setup-guide.md`, GitHub 연동은 `docs/github-integration.md`를 본다. -```toml -# harness.toml -[github] -enabled = true -``` +## Session Recovery -```bash -gh auth login -harness sync -``` +재개 시 읽는 순서: -`.github/workflows/ci.yml`에서 기술 스택 블록 주석 해제 후 branch protection 설정. -→ 상세: [docs/github-integration.md](./docs/github-integration.md) +1. `tasks/index.json` +2. `.harness/tasks//STATE.md` +3. `.harness/tasks//RUN_REPORT.md`가 있으면 확인 +4. `.harness/LESSONS.md` 최근 항목 +5. `Plans.md` +6. 필요할 때만 `.harness/CONTEXT_INDEX.md`에서 추가 파일 선택 ---- +루트 `.harness/{STATE,HANDOFF,TASKS,LOG,CHECKPOINTS,RUN_REPORT}.md`는 템플릿이다. 실제 작업 상태는 `.harness/tasks//` 아래에 둔다. ## 기존 프로젝트에 적용 -이미 코드·README·문서가 있는 프로젝트에 이 harness만 얹는 경우. `init.sh`는 -빈 프로젝트를 가정하고 전체 세트를 복사하므로, 기존 파일과 겹치는 항목은 -개별로 골라 복사한다. - -1. 기존 프로젝트 루트로 이동한다. -2. 다음만 개별 복사한다 (전체 `init.sh` 실행 금지 — 기존 README·docs를 덮어쓸 수 있다): - ```bash - cp /tmp/harness-tpl/harness.toml . - cp /tmp/harness-tpl/CLAUDE.md . - cp /tmp/harness-tpl/AGENTS.md . - cp -r /tmp/harness-tpl/agents . - cp -r /tmp/harness-tpl/templates/skeleton/.harness . - cp /tmp/harness-tpl/templates/skeleton/Plans.md . - cp -r /tmp/harness-tpl/templates/skeleton/tasks . - cp -r /tmp/harness-tpl/scripts . - mkdir -p .claude/agent-memory - cp -r /tmp/harness-tpl/.claude/agent-memory/. .claude/agent-memory/ - ``` -3. `CLAUDE.md`가 기존 `README.md`/아키텍처 문서를 대체하지 않게, `CLAUDE.md` - 안에서 그 문서들을 참조하도록 링크만 추가한다. `docs/templates/*` 골격은 - 그런 문서가 아예 없을 때만 복사한다. -4. `tasks/index.json`에 "기존 코드 파악" Week 0 Task를 추가한다 — DoD·Acceptance를 - 명시해 [세분화 게이트](#구현-규칙-세분화-게이트)를 통과하게 쓰고, - `python3 scripts/sync_plans.py`로 `Plans.md`를 갱신한다. -5. `.claude/agent-memory/*/MEMORY.md`의 `Project Context`를 채운다. -6. `harness sync && harness doctor`. -7. 첫 작업 전에 Claude Code에게 규칙 요약과 빈틈 점검을 요청한다: +기존 README나 docs가 있으면 `init.sh` 전체 실행 대신 `harness.toml`, `CLAUDE.md`, `AGENTS.md`, `agents/`, `templates/skeleton/.harness`, `templates/skeleton/Plans.md`, `templates/skeleton/tasks`, `scripts/`만 골라 복사한다. -```text -Read CLAUDE.md. -Check whether this existing project already has architecture docs, tests, -and verification commands (build/test/lint scripts). -If anything is missing, propose the minimum harness files needed before -implementation — do not create files speculatively. -``` - -```text -CLAUDE.md를 읽어줘. -이 기존 프로젝트에 아키텍처 문서, 테스트, 검증 명령(빌드/테스트/린트)이 -이미 있는지 확인해줘. -빠진 게 있으면 구현 전에 필요한 최소한의 harness 파일만 제안해줘 — 임의로 -먼저 만들지는 마. -``` - ---- +기존 문서가 있으면 `docs/templates/*`를 복사하지 말고 `CLAUDE.md`에서 기존 문서를 링크한다. ## Recommended Codex Workflow -Codex에서는 루트 `AGENTS.md`가 진입점이고, `.agents/skills/`의 repo-scoped -skills가 Claude Code workflow에 대응한다. top-level `/harness-work` slash -command를 만들지 않고, `/skills`에서 선택하거나 `$harness-work`처럼 명시 호출한다. - -```text -AGENTS.md를 읽어줘. -/skills 목록에서 harness skill을 확인해줘. -$harness-progress로 현재 상태를 요약해줘. -``` - -핵심 매핑: - -| Claude Code | Codex | -|---|---| -| `/grill-me` | `$grill-me` | -| `/harness-plan` | `$harness-plan` | -| `/harness-work` | `$harness-work` | -| `/harness-review` | `$harness-review` | -| `/harness-progress` | `$harness-progress` | -| `/harness-sync` | `$harness-sync` | -| `/branch-checkout` | `$branch-checkout` | -| `/git-push` | `$git-push` | -| `/pr-create` | `$pr-create` | -| `/rescue-from-main` | `$rescue-from-main` | - ---- - -## Recommended Claude Code Workflow - -```bash -# 1. Claude Code 열기 -claude - -# 2. (새 프로젝트/기능이면) 기획 — 인터뷰로 PRD 작성 -/grill-me -# → docs/PRD.md 초안 → UserFlow·Architecture 보완 (docs/templates/ 골격) - -# 3. 할 일 추가 (planning context → task-decomposer proposal → 검증 → tasks/index.json 반영) -/harness-plan - -# 4. 실행 (세분화 + quality gate 통과 확인 → worker → reviewer → advisor 자동 순환) -/harness-work - -# 5. 진행 상황 확인 -/harness-progress - -# 6. tasks/index.json ↔ 구현 상태 확인 (필요 시 Plans.md snapshot 갱신) -/harness-sync -``` - -### `/harness-work` 내부 흐름 - -1. `tasks/index.json`에서 `todo` 상태 Task를 선택 -1-a. **세분화 + quality gate**: 선택된 Task가 `agents/task-decomposer.md` 기준(1 PR 이내· - 단일 관심사·DoD/Acceptance 명시) 또는 `agents/quality-gates.md`의 scope/YAGNI - 기준을 못 채우면 worker에게 넘기지 않고 task-decomposer를 다시 실행해 하위 - Task로 쪼갠 뒤에만 진행 -2. **advisor**에게 방향 물어봄 (VFF v2 전체 적용 — 핵심 변수 먼저, 일반론 금지) -3. **worker**에게 구현 위임 (ponytail 7단계 + VFF 검증 의무 + quality gate) — - 진행 중 범위 초과를 발견하면 즉시 멈추고 task-decomposer를 재호출해 하위 - Task로 분리 -4. **test-agent**가 런타임 검증 — Acceptance 명령 + 프로젝트 테스트 스위트 실행. - FAIL 시 worker에 재위임, PASS 시에만 다음 단계 진행 -5. **reviewer**에게 검토 요청 (VFF v2 전체 + quality gate — findings와 검증 근거 먼저) -6. 완료 반영: Acceptance와 관련 테스트가 통과하면 세션이 - `tasks/index.json`의 대상 Task를 `done`으로 갱신하고 - `python3 scripts/sync_plans.py`를 실행한다. GitHub Actions는 Task 상태를 - 바꾸지 않는다. - -> **동작 원리 주의**: 위 흐름 중 task-decomposer/quality gate(1-a)와 test-agent 실행(4), -> GitHub Issue/PR 자동화는 harness 플러그인 내장 기능이 아니라 **CLAUDE.md의 지시를 -> Claude가 세션에서 직접 수행**하는 규약이다. `harness.toml`의 -> `[github]`·`[review]`·`[test]`·`[plan]` 섹션은 `harness sync`가 파싱하지 않으며 -> 규약의 SSOT 요약 인덱스 역할만 한다. `plans-guard.yml`은 Task manifest와 -> `Plans.md` snapshot이 유효한지만 확인한다. 세분화·scope/YAGNI·Acceptance 실행은 -> 세션 에이전트의 책임이다. 상세: [BLUEPRINT.md](./BLUEPRINT.md). - -### `/harness-plan` 감시 로그 - -`/harness-plan`은 확정 Task를 바로 쓰지 않고 `.harness/shared/planning/runs/{run_id}/` -아래에 `context.json`, `proposed-tasks.json`, `decomposition-report.md`를 먼저 만든다. -검증을 통과한 proposal만 `tasks/index.json`에 반영된다. - -planning 진행 상황은 `.harness/events/planning.jsonl`에 JSONL로 누적된다. 각 줄의 -최상위 필드는 개발자가 아닌 사용자도 이해할 수 있는 `step`, `result`, `message`, -`next_action`이며, 도구용 값은 `technical` 하위에만 둔다. - -v1 범위는 planning 단계뿐이다. `work.jsonl`, `review.jsonl`, SQLite, 모든 대화 턴 -기록은 만들지 않는다. - ---- - -## Claude Code Commands - -이 저장소엔 로컬 slash command 디렉토리(`.claude/commands/`)가 없다. -`/harness-*` 계열은 설치한 **claude-code-harness 플러그인**이 제공하고, -`/grill-me`만 이 저장소의 로컬 스킬(`.claude/skills/grill-me/SKILL.md`)이다. - -| 명령어 | 출처 | 동작 | -|--------|------|------| -| `/grill-me` | 로컬 스킬 (이 저장소) | 인터뷰 기반 PRD 작성 (기획 단계 진입점) | -| `/harness-plan` | claude-code-harness 플러그인 | planning context/proposal 생성 → 검증 통과 Task를 tasks/index.json에 반영 + Plans.md 갱신 | -| `/harness-work` | claude-code-harness 플러그인 | Task 실행 (worker 팀 가동) | -| `/harness-review` | claude-code-harness 플러그인 | 현재 코드·계획 리뷰 | -| `/harness-progress` | claude-code-harness 플러그인 | 진행 현황 대시보드 | -| `/harness-sync` | claude-code-harness 플러그인 | tasks/index.json ↔ Plans.md ↔ 구현 상태 동기화 확인 | -| `harness doctor` | claude-code-harness CLI | 설치 상태 전체 점검 | -| `harness sync` | claude-code-harness CLI | `harness.toml` 변경 후 적용 | -| `/caveman lite\|full\|ultra` | caveman 플러그인 | 응답 압축 강도 조절 | -| `/ponytail lite\|full\|ultra` | ponytail 플러그인 | lazy mode 강도 조절 | -| `/ponytail-review` | ponytail 플러그인 | 현재 diff 과잉 구현 리뷰 | -| `/itsvff` | value-for-fable 플러그인 | VFF 세션 모드 수동 활성화 | -| `/branch-checkout` | 로컬 custom command | 별도 작업 브랜치 생성·전환 | -| `/git-push` | 로컬 custom command | 현재 브랜치 안전 push | -| `/pr-create` | 로컬 custom command | 현재 브랜치에서 draft PR 작성 | -| `/rescue-from-main` | 로컬 custom command | main/master 변경사항을 작업 브랜치로 옮겨 draft PR 작성 | - -Codex용 동등 절차는 `.agents/skills/` 아래 repo-scoped skills로 제공한다. -Codex에서는 ponytail/caveman plugin 자동 hook을 가정하지 않고 -`agents/quality-gates.md`를 공통 기준으로 적용한다. - -### Task 상태 값 - -| JSON 값 | Plans.md 표시 | 의미 | -|------|------|------| -| `todo` | `cc:TODO` | 미시작. harness가 선택 대상으로 봄 | -| `wip` | `cc:WIP` | 진행 중. task 브랜치 착수 시 세션이 설정 | -| `done` | `cc:완료` | 완료. Acceptance와 관련 테스트 통과 후 세션이 직접 갱신 | -| `blocked` | `cc:BLOCKED` | 차단됨. `blocked_reason` 필수 | - ---- - -## Claude Code Hooks - -이 템플릿엔 현재 hooks가 설정돼 있지 않다. `.claude/settings.local.json.example`은 -권한(permissions) 예시일 뿐 hooks 항목은 비어 있다 — 아래는 추가 권장 사항이며 -있는 것처럼 쓰지 않는다. - -권장 hooks: - -- 파일 수정 후 formatter/lint 실행 -- 파일 수정 후 관련 테스트 실행 -- 위험한 shell command(`rm -r`, `git push --force` 등) 실행 전 확인 — - `harness.toml`의 `[safety.permissions] ask` 목록과 역할이 겹치므로 중복 등록 주의 -- 세션 종료 시 `.harness/tasks//STATE.md` 갱신 여부 확인 -- Acceptance 명령 미실행 상태에서 Task를 `done`으로 표시하는 것 방지 - -hooks 설정 예시는 이 README에 넣지 않고 `docs/claude-code-hooks.md`로 분리할 것을 -권장한다 (아래 [추가 권장 문서](#추가-권장-문서) 참고). - ---- - -## Session Recovery - -터미널 세션은 언제든 끊길 수 있다는 전제로 이 템플릿을 만들었다 (CLAUDE.md -상태 문서 규칙). 재개 시 읽는 순서는 고정돼 있다. - -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/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 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 -tasks/index.json에서 wip 또는 지정된 Task를 확인한 뒤, -.harness/tasks//STATE.md와 .harness/LESSONS.md 최근 항목, -Plans.md를 읽어줘. -마지막으로 기록된 상태부터 작업을 재개해줘. -Acceptance 재검증이 필요한 경우가 아니면 이미 완료된 Task는 반복하지 마. -계속하기 전에 현재 상태와 다음 작업을 먼저 요약해줘. -``` - ---- - -## Error Memory / 반복 실패 방지 - -에러 기록은 Task별 `.harness/tasks//LOG.md`(append-only, 원문 그대로)와 -전역 `.harness/LESSONS.md`(해결 후 재발 방지 요약)로 나뉜다 — 하나의 파일에 섞지 않는다. - -- `.harness/tasks//LOG.md`: 시간 역순 아님, 위에서 아래로 추가만. - 실패한 명령·에러 메시지·조치를 있는 그대로 남긴다. -- `.harness/LESSONS.md`: 최신 항목이 위. "무엇이 문제였고, 다음엔 어떻게 - 판단할지"를 근거와 함께 남긴다. 항상 지켜야 할 규칙으로 승격되면 - `CLAUDE.md`에도 반영한다. - -기록 프롬프트: - -```text -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/tasks//LOG.md에 남겨줘. -해결되면 원인과 재발 방지 규칙을 .harness/LESSONS.md에 요약해줘. -항상 지켜야 할 규칙이면 CLAUDE.md에도 반영해줘. -``` - ---- - -## 파일 구조 - -```text -cc-harness-template/ -│ -├── harness.toml # 프로젝트 이름·안전 규칙·review·test 설정 (실행 SSOT는 CLAUDE.md — 요약 인덱스) -├── CLAUDE.md # Claude Code가 항상 읽는 프로젝트 규칙 -├── AGENTS.md # Codex가 항상 읽는 프로젝트 규칙 진입점 (CLAUDE.md 규약 실행) -├── tasks/index.json # Task 상태 단일 출처 (todo / wip / done / blocked) -├── Plans.md # 사람이 읽는 Task snapshot (필요할 때 tasks/index.json에서 생성) -├── BLUEPRINT.md # 이 시스템 전체 아키텍처 설명 (읽기용) -├── init.sh # 새 프로젝트에 이 템플릿 적용 (아래 전부를 자동 복사) -├── LICENSE # MIT -│ -├── scripts/ -│ ├── setup-plugins.sh # ~/.claude/settings.json 플러그인 등록·설치 자동화 -│ ├── merge-settings.mjs # setup-plugins.sh가 호출하는 JSON 병합 로직 (Node) -│ ├── validate_tasks.py # tasks/index.json 검증 -│ ├── validate_task_proposal.py # proposed-tasks.json 검증 -│ ├── apply_task_proposal.py # 검증된 proposal → tasks/index.json 반영 + Plans.md 갱신 -│ ├── build_planning_context.py # /harness-plan 입력 context.json 생성 -│ ├── run_task_decomposer.py # 외부 decomposer 명령 계약 실행 + planning.jsonl 기록 -│ ├── planning_log.py # planning.jsonl에 사용자 친화 이벤트 append -│ ├── report_tasks.py # 진행률·WIP·다음 TODO 출력 -│ └── sync_plans.py # tasks/index.json → Plans.md snapshot 생성 -│ -├── agents/ # 절차 문서 — task-decomposer는 planning proposal 계약, test-agent는 세션 검증 절차 -│ ├── task-decomposer.md # 계획 세분화 + 구현 게이트 정의 (harness.toml [plan]) -│ └── test-agent.md # test-agent 정의 (Acceptance 실행 + 테스트 스위트) -│ -├── .agents/ -│ └── skills/ # Codex repo-scoped skills -│ ├── branch-checkout/SKILL.md -│ ├── git-push/SKILL.md -│ ├── grill-me/SKILL.md -│ ├── harness-plan/SKILL.md -│ ├── harness-work/SKILL.md -│ ├── harness-review/SKILL.md -│ ├── harness-progress/SKILL.md -│ ├── harness-sync/SKILL.md -│ ├── pr-create/SKILL.md -│ └── rescue-from-main/SKILL.md -│ -├── templates/skeleton/ # init.sh가 복사하는 tasks/·Plans.md·.harness/ 템플릿 구조 (dogfood 이력 없음) -│ ├── Plans.md -│ ├── tasks/index.json -│ └── .harness/ # 루트 템플릿 + tasks/.gitkeep -│ -├── .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 범위) -│ -├── .github/ # GitHub 연동 시 사용 (harness.toml enabled = true) -│ ├── workflows/ -│ │ ├── ci.yml # 빌드·테스트 CI + ci-ok 요약 잡(required check 이름 고정용) -│ │ └── plans-guard.yml # PR 시 tasks/index.json 검증 + Plans.md sync 확인 -│ ├── PULL_REQUEST_TEMPLATE.md -│ └── ISSUE_TEMPLATE/ -│ -├── .claude/ -│ ├── settings.local.json.example # 프로젝트 전용 권한 설정 (복사 후 rename) -│ ├── commands/ # Claude Code local custom commands -│ │ ├── branch-checkout.md -│ │ ├── git-push.md -│ │ ├── pr-create.md -│ │ └── rescue-from-main.md -│ ├── skills/ -│ │ └── grill-me/SKILL.md # 인터뷰 기반 PRD 작성 스킬 (기획 단계 진입점) -│ └── agent-memory/ -│ ├── claude-code-harness-worker/MEMORY.md # worker 행동 규칙 -│ ├── claude-code-harness-reviewer/MEMORY.md # reviewer 행동 규칙 -│ └── claude-code-harness-advisor/MEMORY.md # advisor 행동 규칙 -│ -└── docs/ - ├── templates/ # 기획 산출물 골격 (PRD·UserFlow·DESIGN·Architecture) - ├── specs/ # 이 템플릿 자체의 감사·설계 기록 (온보딩 자료 아님) - ├── setup-guide.md # 상세 설치 가이드 - ├── github-integration.md # GitHub 연동 상세 가이드 - └── global-settings-reference.md # ~/.claude/settings.json 레퍼런스 -``` - -> **MEMORY.md가 하는 일**: harness가 에이전트를 실행할 때 이 파일을 읽어서 -> "이 에이전트는 caveman lite로 응답해라", "VFF v2 전체를 적용해라"처럼 행동 규칙을 -> 주입한다. `.claude/agent-memory/` 경로가 고정이므로 위치를 바꾸면 안 된다. - ---- +Codex는 `AGENTS.md`를 읽힌 뒤 `$harness-progress`, `$harness-work` 순서로 진행한다. Claude Code는 `/grill-me`, `/harness-plan`, `/harness-work`, `/harness-progress`를 쓴다. ## Troubleshooting -### Claude Code가 `CLAUDE.md`를 따르지 않음 - -세션 시작 직후 `CLAUDE.md`를 실제로 읽었는지 첫 응답에서 확인한다. 안 읽었으면 -[첫 프롬프트](#첫-프롬프트)를 다시 붙여넣는다. - -### `CLAUDE.md`가 길어져 컨텍스트를 많이 차지함 - -실제로 이 템플릿을 dogfooding하는 동안 `CLAUDE.md`가 118줄, 이어서 123줄로 -늘어나며 분할 권고 훅 경고가 반복 발생한 이력이 있다(과거 로그와 Task별 -`.harness/tasks/*/LOG.md` 참고). -프로젝트 전역 규칙만 `CLAUDE.md`에 남기고, 세부 절차는 `docs/`나 `agents/`로 옮긴다. - -### 검증 명령을 실행하지 않고 완료라고 말함 - -`harness.toml`의 `[test] auto_run`은 요약 인덱스일 뿐 실제 강제력은 -`CLAUDE.md`의 테스트 규칙 + `agents/test-agent.md`에서 나온다. `CLAUDE.md`가 -로드됐는지, `tasks/index.json` 해당 Task에 Acceptance가 명령어 형태로 적혀 있는지 먼저 확인한다. - -### 같은 에러를 반복함 - -`.harness/LESSONS.md` 최근 5개를 프롬프트에서 명시적으로 읽게 했는지 확인한다 -(위 [Error Memory](#error-memory--반복-실패-방지) 참고). - -### 세션이 끊겨 작업 상태를 모름 - -[Session Recovery](#session-recovery)의 재개 프롬프트를 사용한다. - -### `/harness-*` 명령이 안 보임 - -로컬 명령이 아니라 플러그인 제공 명령이다. `claude plugin install -claude-code-harness@claude-code-harness-marketplace` 재실행 후 `harness doctor`로 확인한다. - -### Codex에서 `/harness-work`가 안 먹힘 - -Codex에서는 Claude Code slash command가 아니라 repo-scoped skill을 쓴다. -`/harness-work` 대신 `$harness-work`처럼 호출하고, 먼저 `AGENTS.md`를 읽게 한다. - -### Codex가 ponytail/caveman처럼 동작하지 않음 - -Codex에는 Claude Code plugin hook이 자동 적용되지 않는다. -`agents/quality-gates.md`가 Codex용 공통 기준이므로 scope/YAGNI, findings-first 리뷰, -짧은 검증 중심 보고를 세션에서 직접 적용한다. - -### hooks가 실행되지 않음 - -이 템플릿엔 애초에 hooks가 설정돼 있지 않다 — [Hooks](#claude-code-hooks) 섹션 참고, -추가 후 Claude Code를 재시작해야 훅이 로드된다. - -### 기존 프로젝트에 적용했는데 구조가 안 맞음 - -`init.sh` 전체 실행은 빈 프로젝트 기준이다. [기존 프로젝트에 적용](#기존-프로젝트에-적용)의 -개별 복사 절차를 따른다. - -### `harness doctor`에서 특정 항목 실패 - -```bash -harness sync -harness doctor -``` - -sync 후 재확인. 여전히 실패하면 해당 plugin을 재설치. - -### worker가 caveman full로 응답할 때 (lite여야 함) - -`.claude/agent-memory/claude-code-harness-worker/MEMORY.md`에 -`### caveman: lite 모드` 섹션이 있는지 확인. Claude Code를 재시작하면 -MEMORY.md를 다시 로드한다. - -### Task가 선택되지 않을 때 - -Task 상태가 `tasks/index.json`에서 `todo`인지 확인. `wip`는 이미 진행 중으로 간주되어 건너뜀. - ---- - -## Philosophy - -이 템플릿은 Claude Code를 더 똑똑하게 만드는 도구가 아니다. -Claude Code가 실수해도 프로젝트가 망가지지 않도록 작업 환경을 구조화하는 도구다. - -과잉 구현은 ponytail이, 장황한 응답은 caveman이, 역할 혼선은 harness의 -worker/reviewer/advisor 분리가, 상태 유실은 `.harness/`가 각각 담당한다 — -하나의 거대한 규칙이 아니라 문제별로 좁게 겨눈 조합이다. - ---- - -## Contributing - -- PR 전 `harness doctor` + 변경과 관련된 `tasks/index.json` Acceptance 명령을 실행한다. -- `CLAUDE.md`/`harness.toml`을 바꾸면 이유를 커밋 메시지나 `tasks/index.json`/Plans.md에 남긴다 — - 별도 ADR 파일은 만들지 않는다(결정이 쌓이면 그때 분리). -- 새 워크플로/명령을 추가하면 README와 `BLUEPRINT.md`를 함께 갱신한다 — - 문서 하나만 고치고 링크된 상세 가이드를 놓친 이력이 실제로 있었다 - (`.harness/LESSONS.md` 2026-07-04 항목). -- 재발 방지 규칙을 추가할 땐 실제 재현 사례를 `.harness/LESSONS.md`에 함께 기록한다. - ---- - -## 심화 문서 - -| 문서 | 내용 | -|------|------| -| [BLUEPRINT.md](./BLUEPRINT.md) | Plugin 간 협력 관계, 세션 타임라인, 에이전트 매트릭스 전체 설명 | -| [docs/setup-guide.md](./docs/setup-guide.md) | 설치 상세 절차, OS별 경로, 재설치 방법 | -| [docs/github-integration.md](./docs/github-integration.md) | GitHub Issues·PR·검증 CI 연동 상세 가이드 | -| [docs/global-settings-reference.md](./docs/global-settings-reference.md) | `~/.claude/settings.json` 전체 항목 설명 | - -## 추가 권장 문서 - -이 README에 다 담기엔 과한 항목들 — 필요해지면 아래로 분리한다. - -| 문서 | 담을 내용 | -|------|-----------| -| `docs/claude-code-hooks.md` | hooks 설정 예시, `harness.toml [safety.permissions]`와의 역할 분담 | -| `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`가 -겸하고 있어 별도로 분리하지 않는다 — 중복 문서를 만들지 않는다. - -### `docs/specs/` — 내부 감사·설계 기록 (온보딩 자료 아님) - -새 프로젝트 적용에는 필요 없는, 이 템플릿 자체의 개발 이력 문서. - -| 문서 | 내용 | -|------|------| -| `docs/specs/2026-07-04-template-audit.md` | Week 3 감사에서 발견한 빈틈(H1~H5)과 개선 계획 | -| `docs/specs/2026-07-03-planning-pipeline-design.md` | 기획 단계 산출물 파이프라인(PRD→UserFlow→Architecture) 설계 결정 | - ---- - -## Plugin 버전 (이 템플릿 작성 기준) - -이 표는 기록일 뿐 설치를 고정하지 않는다 — `claude plugin install`은 항상 -마켓플레이스의 최신 커밋을 받아온다(M8/2026-07-04 감사). 버전 태그가 없는 -플러그인(caveman 등)은 SHA만 유일한 식별자이므로, 아래 SHA를 "마지막으로 -정상 동작 확인한 시점"의 기준선으로 남긴다. - -| Plugin | 버전 | 확인된 SHA | 확인일 | GitHub | -|--------|------|-----------|--------|--------| -| claude-code-harness | 4.16.4 | `c220671` | 2026-07-07 | [Chachamaru127/claude-code-harness](https://github.com/Chachamaru127/claude-code-harness) | -| ponytail | 4.8.4 | `1b2760d` | 2026-07-07 | [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail) | -| caveman | 25d22f8 | `0d95a81` | 2026-07-04 | [JuliusBrussee/caveman](https://github.com/JuliusBrussee/caveman) | -| value-for-fable | 1.0.1 | `afbfff6` | 2026-07-04 | [itsinseong/value-for-fable](https://github.com/itsinseong/value-for-fable) | +- Claude Code가 규칙을 안 따르면 첫 응답에서 `CLAUDE.md`를 읽었는지 확인한다. +- Codex에서는 `/harness-work`가 아니라 `$harness-work`를 쓴다. +- Task가 선택되지 않으면 `tasks/index.json` 상태가 `todo`인지 확인한다. +- 완료라는데 검증이 없으면 해당 Task의 Acceptance 명령 실행 여부를 확인한다. +- 세션이 끊기면 Session Recovery 순서로 재개한다. +- GitHub check와 Task 상태가 다르면 `tasks/index.json`을 기준으로 본다. +- 같은 에러가 반복되면 `.harness/tasks//LOG.md`와 `.harness/LESSONS.md`를 확인한다. -**업데이트 전 확인 절차** (마켓플레이스 업데이트는 전 프로젝트의 세션 동작을 -한꺼번에 바꾼다 — 강제 버전 고정 기능은 플러그인 시스템 자체에 없으므로, -아래를 수동으로 지킨다): +## Plugin 버전 기록 -1. 업데이트 전 각 저장소의 최근 커밋/changelog를 확인한다(`git log`, GitHub - Releases, 또는 Compare 뷰로 현재 SHA ↔ 최신 커밋 diff 확인). -2. `/plugin` 메뉴 또는 마켓플레이스 클론에서 `git pull`로 갱신 후 Claude Code 재시작. -3. 이 템플릿이 의존하는 핵심 동작(세분화 게이트, caveman/ponytail 압축, - VFF 리마인더 주입)이 여전히 기대대로 동작하는지 짧게 스팟 체크한다. -4. 문제 없으면 위 표의 "확인된 SHA"·"확인일"을 갱신한다. +설치는 최신 커밋을 받을 수 있으므로 아래 값은 고정이 아니라 마지막 확인 기준선이다. 업데이트 전 diff 확인 후 SHA와 확인일을 갱신한다. ---- +기준선: claude-code-harness `c220671`, ponytail `1b2760d`, caveman `0d95a81`, value-for-fable `afbfff6`. ## License diff --git a/docs/error-memory.md b/docs/error-memory.md index 8e94045..75d018f 100644 --- a/docs/error-memory.md +++ b/docs/error-memory.md @@ -18,6 +18,8 @@ 루트 `.harness/LOG.md`는 복사용 템플릿이다. 실제 에러 원문은 반드시 해당 Task의 `.harness/tasks//LOG.md`에 남긴다. +Task가 끝나거나 중단될 때 `.harness/tasks//RUN_REPORT.md`에는 에러 원문을 +반복하지 않고 원인, 해결 요약, 검증 evidence, `LOG.md` 위치만 남긴다. 에러가 나면 먼저 Task별 `LOG.md`에 원문을 남기고, 해결되면 루트 `.harness/LESSONS.md`에 재발 방지 요약을 추가한다. `LOG.md`만 남기면 다음 세션이 diff --git a/docs/harness-observability-traceability.md b/docs/harness-observability-traceability.md new file mode 100644 index 0000000..433b844 --- /dev/null +++ b/docs/harness-observability-traceability.md @@ -0,0 +1,45 @@ +# Harness Observability / Traceability / Context Preservability + +이 문서는 실행 중 생긴 사실을 어디에 남길지 정하는 짧은 기준이다. 자동화를 +늘리기 위한 문서가 아니라, 다음 세션과 리뷰어가 같은 증거를 빠르게 찾게 하는 +운영 규칙이다. + +## Observability + +무슨 일이 있었는지는 아래 순서로 재구성한다. + +1. `tasks/index.json` — 어떤 Task가 대상인지 확인한다. +2. `.harness/tasks//RUN_REPORT.md` — 실행 요약, 변경 파일, 검증 evidence를 본다. +3. `.harness/tasks//LOG.md` — 실패한 명령, 에러 원문, 긴 stdout/stderr를 본다. +4. `.harness/tasks//CHECKPOINTS.md` — 완료 지점과 커밋 해시를 확인한다. +5. `.harness/events/planning.jsonl` — planning 단계에서 proposal 흐름이나 실패를 확인한다. + +`LOG.md`는 원문과 타임라인, `RUN_REPORT.md`는 사람이 빠르게 읽는 요약이다. 긴 +출력은 `RUN_REPORT.md`에 붙이지 않는다. + +## Traceability + +왜 바뀌었는지는 아래 연결로 남긴다. + +- 사용자 요청 또는 기획 문서 → `tasks/index.json` Task +- Task DoD/Acceptance → 실행 명령과 결과 +- 주요 판단 → `RUN_REPORT.md`의 `Traceability` 섹션 +- 반복될 수 있는 실수 → `.harness/LESSONS.md` +- 큰 제품/아키텍처 결정 → PRD `Decisions` 섹션 또는 필요 시 `docs/adr/` + +작은 운영 결정 때문에 ADR을 만들 필요는 없다. 대신 Task별 `RUN_REPORT.md`에 결정과 +근거를 한 줄로 남긴다. + +## Context Preservability + +세션이 끊기거나 context compaction이 일어나면 아래만 먼저 읽는다. + +1. `tasks/index.json` +2. `.harness/tasks//STATE.md` +3. `.harness/tasks//RUN_REPORT.md` +4. `.harness/LESSONS.md` 최근 항목 +5. `Plans.md` +6. `.harness/CONTEXT_INDEX.md`에서 필요한 추가 파일 + +위험한 context 자동화는 기본으로 켜지지 않는다. hooks를 쓰려면 +`docs/claude-code-hooks.md`의 optional 예시처럼 프로젝트별로 명시적으로 추가한다. diff --git a/docs/session-recovery.md b/docs/session-recovery.md index b0d1a21..e0b97b7 100644 --- a/docs/session-recovery.md +++ b/docs/session-recovery.md @@ -16,7 +16,8 @@ CLAUDE.md 상태 문서 규칙에 박혀 있는 순서다. 4. **`Plans.md`** — 사람이 읽는 snapshot. stale일 수 있으며 직접 편집하지 않는다. 5. 그 다음은 **필요할 때만**, `.harness/CONTEXT_INDEX.md`로 골라서 읽는다. -루트 `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`는 +루트 `.harness/STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`, +`RUN_REPORT.md`는 복사용 템플릿이다. 실제 진행 상태를 찾으려고 루트 템플릿을 읽지 않는다. --- @@ -30,6 +31,7 @@ CLAUDE.md 상태 문서 규칙에 박혀 있는 순서다. | `.harness/tasks//TASKS.md` | Task 내부 체크리스트 | Task 착수·완료 시 | | `.harness/tasks//LOG.md` | 해당 Task 작업·에러 append-only 로그 | 매 작업/에러 발생 시 | | `.harness/tasks//CHECKPOINTS.md` | 해당 Task 작업 단위 완료 + 커밋 해시 | 완료 지점마다 | +| `.harness/tasks//RUN_REPORT.md` | 실행 요약, 결정 근거, 검증 evidence | 완료/인수인계/감사 시 | | `.harness/tasks//tasks.index.snapshot.json` | 작업 시작 시점의 `tasks/index.json` 참고본 | Task 시작 시 | 루트 `.harness/LESSONS.md`는 전역 재발 방지 기록으로 유지한다. 같은 유형의 실수가 @@ -51,6 +53,7 @@ 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 .harness/RUN_REPORT.md .harness/tasks//RUN_REPORT.md cp tasks/index.json .harness/tasks//tasks.index.snapshot.json ``` @@ -76,12 +79,23 @@ slug를 함께 쓴다. --- +## 실행 보고서와 원문 로그 분리 + +`LOG.md`는 실패한 명령, 에러 원문, 세부 작업 타임라인을 append-only로 남기는 곳이다. +`RUN_REPORT.md`는 다음 세션이나 리뷰어가 빠르게 읽을 요약이다. Task 완료 또는 중단 +시점에는 `RUN_REPORT.md`에 변경 요약, 주요 결정 근거, Acceptance/test evidence, +남은 위험을 짧게 정리한다. 긴 stdout/stderr는 `RUN_REPORT.md`에 붙이지 말고 +`LOG.md` 위치만 링크한다. + +--- + ## 재개 프롬프트 ```text 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. +Then read .harness/tasks//STATE.md, +.harness/tasks//RUN_REPORT.md if it exists, +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. @@ -89,7 +103,8 @@ Before continuing, summarize the current state and next action. ```text tasks/index.json에서 wip 또는 지정된 Task를 확인한 뒤, -.harness/tasks//STATE.md와 .harness/LESSONS.md 최근 항목, +.harness/tasks//STATE.md, 있으면 +.harness/tasks//RUN_REPORT.md, .harness/LESSONS.md 최근 항목, Plans.md를 읽어줘. 마지막으로 기록된 상태부터 작업을 재개해줘. Acceptance 재검증이 필요한 경우가 아니면 이미 완료된 Task는 반복하지 마. diff --git a/templates/skeleton/.harness/CONTEXT_INDEX.md b/templates/skeleton/.harness/CONTEXT_INDEX.md index 0dff38c..ac6f0f1 100644 --- a/templates/skeleton/.harness/CONTEXT_INDEX.md +++ b/templates/skeleton/.harness/CONTEXT_INDEX.md @@ -12,25 +12,18 @@ ## Task별 맥락 디렉토리 -| 경로 | 역할 | 읽는 시점 | -|------|------|-----------| -| `.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/tasks//` 아래에 실제 작업 맥락을 둔다. + +- `STATE.md`: 현재 스냅샷 +- `LOG.md`: 작업·에러 원문 +- `RUN_REPORT.md`: 변경·결정·검증 요약 +- `HANDOFF.md`, `TASKS.md`, `CHECKPOINTS.md`: 필요할 때만 읽는 보조 기록 +- `tasks.index.snapshot.json`: 시작 시점 비교가 필요할 때만 읽는 참고본 ## 루트 템플릿과 전역 파일 -| 파일 | 역할 | 읽는 시점 | -|------|------|-----------| -| `.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 확인 시 | +- `.harness/{STATE,HANDOFF,TASKS,LOG,CHECKPOINTS,RUN_REPORT}.md`: 새 Task용 템플릿 +- `.harness/LESSONS.md`: 전역 재발 방지 기록 +- `.harness/CONTEXT_INDEX.md`: 필요한 파일만 고르는 인덱스 +- `.harness/events/planning.jsonl`: planning 실패·반영 흐름 추적 +- `.harness/shared/planning/latest.json`: 최신 planning run 위치 diff --git a/templates/skeleton/.harness/RUN_REPORT.md b/templates/skeleton/.harness/RUN_REPORT.md new file mode 100644 index 0000000..3b60769 --- /dev/null +++ b/templates/skeleton/.harness/RUN_REPORT.md @@ -0,0 +1,25 @@ +# RUN_REPORT.md — Task 실행 요약 템플릿 + +> 루트 파일은 템플릿이다. 실제 보고서는 `.harness/tasks//RUN_REPORT.md`에 둔다. +> 원문 로그는 `LOG.md`에 남기고, 여기는 다음 세션이 읽을 증거만 남긴다. + +## Summary + +- Task: `[id]` +- 상태: `[done|blocked|needs-review|in-progress]` +- 변경: `[핵심 변경 1-3줄]` + +## Evidence + +| 명령 | 결과 | 비고 | +|------|------|------| +| `[acceptance command]` | `[PASS|FAIL|SKIP]` | `[핵심 출력 또는 이유]` | +| `[test command]` | `[PASS|FAIL|SKIP]` | `[핵심 출력 또는 이유]` | + +## Notes + +- 결정: `[결정과 근거. 없으면 없음]` +- 변경 파일: `[path — 이유]` +- 실패/복구: `[LOG.md 위치 또는 없음]` +- 다음 행동: `[이어갈 위치 또는 없음]` +- 최종 갱신: `YYYY-MM-DD HH:MM KST` From dd2afffd0272c43d75d0b30bd14360645d032c66 Mon Sep 17 00:00:00 2001 From: devRonPark Date: Thu, 9 Jul 2026 11:55:13 +0900 Subject: [PATCH 2/2] trim harness docs and state surface --- .agents/skills/harness-plan/SKILL.md | 4 +- .agents/skills/rescue-from-main/SKILL.md | 84 +--- .claude/commands/branch-checkout.md | 22 +- .claude/commands/git-push.md | 22 +- .claude/commands/pr-create.md | 24 +- .claude/commands/rescue-from-main.md | 42 +- .github/workflows/ci.yml | 143 +----- .harness/CONTEXT_INDEX.md | 75 ++- .harness/shared/planning/latest.json | 7 - .../plan-20260708-150320-db655f/context.json | 271 ---------- .../decomposition-report.md | 21 - .../proposed-tasks.json | 17 - .../plan-20260708-155019-c28b5b/context.json | 277 ---------- .../decomposition-report.md | 16 - .../proposed-tasks.json | 16 - .../plan-20260708-164729-fdf4d8/context.json | 283 ----------- .../decomposition-report.md | 27 - .../proposed-tasks.json | 14 - .../plan-20260708-quality-gates/context.json | 265 ---------- .../decomposition-report.md | 22 - .../proposed-tasks.json | 16 - .harness/tasks/.gitkeep | 1 + .../CHECKPOINTS.md | 5 - .../HANDOFF.md | 16 - .../4.1-decomposer-expression-criteria/LOG.md | 9 - .../STATE.md | 31 -- .../TASKS.md | 9 - .../tasks.index.snapshot.json | 442 ---------------- .../4.11-rescue-from-main/CHECKPOINTS.md | 5 - .../tasks/4.11-rescue-from-main/HANDOFF.md | 16 - .harness/tasks/4.11-rescue-from-main/LOG.md | 16 - .harness/tasks/4.11-rescue-from-main/STATE.md | 33 -- .harness/tasks/4.11-rescue-from-main/TASKS.md | 8 - .../tasks.index.snapshot.json | 442 ---------------- .../4.12-task-harness-context/CHECKPOINTS.md | 6 - .../4.12-task-harness-context/HANDOFF.md | 17 - .../tasks/4.12-task-harness-context/LOG.md | 14 - .../tasks/4.12-task-harness-context/STATE.md | 34 -- .../tasks/4.12-task-harness-context/TASKS.md | 8 - .../tasks.index.snapshot.json | 442 ---------------- .../CHECKPOINTS.md | 5 - .../HANDOFF.md | 16 - .../4.2-test-agent-pretest-detection/LOG.md | 10 - .../4.2-test-agent-pretest-detection/STATE.md | 32 -- .../4.2-test-agent-pretest-detection/TASKS.md | 9 - .../tasks.index.snapshot.json | 442 ---------------- .../CHECKPOINTS.md | 5 - .../4.3-context-index-missing-docs/HANDOFF.md | 16 - .../4.3-context-index-missing-docs/LOG.md | 8 - .../4.3-context-index-missing-docs/STATE.md | 30 -- .../4.3-context-index-missing-docs/TASKS.md | 9 - .../tasks.index.snapshot.json | 442 ---------------- .../4.4-rm-danger-patterns/CHECKPOINTS.md | 5 - .../tasks/4.4-rm-danger-patterns/HANDOFF.md | 16 - .harness/tasks/4.4-rm-danger-patterns/LOG.md | 9 - .../tasks/4.4-rm-danger-patterns/STATE.md | 32 -- .../tasks/4.4-rm-danger-patterns/TASKS.md | 9 - .../tasks.index.snapshot.json | 442 ---------------- .../4.5-grill-me-output-path/CHECKPOINTS.md | 5 - .../tasks/4.5-grill-me-output-path/HANDOFF.md | 16 - .../tasks/4.5-grill-me-output-path/LOG.md | 9 - .../tasks/4.5-grill-me-output-path/STATE.md | 31 -- .../tasks/4.5-grill-me-output-path/TASKS.md | 9 - .../tasks.index.snapshot.json | 442 ---------------- .../4.6-grill-me-headless-mode/CHECKPOINTS.md | 5 - .../4.6-grill-me-headless-mode/HANDOFF.md | 16 - .../tasks/4.6-grill-me-headless-mode/LOG.md | 10 - .../tasks/4.6-grill-me-headless-mode/STATE.md | 31 -- .../tasks/4.6-grill-me-headless-mode/TASKS.md | 9 - .../tasks.index.snapshot.json | 442 ---------------- .../tasks/readme-user-friendly/CHECKPOINTS.md | 5 - .../tasks/readme-user-friendly/HANDOFF.md | 17 - .harness/tasks/readme-user-friendly/LOG.md | 17 - .harness/tasks/readme-user-friendly/STATE.md | 32 -- .harness/tasks/readme-user-friendly/TASKS.md | 6 - .../tasks.index.snapshot.json | 442 ---------------- BLUEPRINT.md | 474 +++--------------- CLAUDE.md | 218 +++----- README.md | 87 +--- docs/claude-code-hooks.md | 128 ----- docs/error-memory.md | 98 ---- docs/github-integration.md | 162 ++---- docs/global-settings-reference.md | 91 ---- docs/harness-observability-traceability.md | 45 -- docs/session-recovery.md | 120 ----- docs/setup-guide.md | 278 ++-------- .../2026-07-03-planning-pipeline-design.md | 53 -- .../2026-07-08-planning-observability.md | 131 ----- harness.toml | 6 +- init.sh | 4 +- scripts/merge-settings.mjs | 10 +- scripts/setup-plugins.sh | 28 +- 92 files changed, 357 insertions(+), 7879 deletions(-) delete mode 100644 .harness/shared/planning/latest.json delete mode 100644 .harness/shared/planning/runs/plan-20260708-150320-db655f/context.json delete mode 100644 .harness/shared/planning/runs/plan-20260708-150320-db655f/decomposition-report.md delete mode 100644 .harness/shared/planning/runs/plan-20260708-150320-db655f/proposed-tasks.json delete mode 100644 .harness/shared/planning/runs/plan-20260708-155019-c28b5b/context.json delete mode 100644 .harness/shared/planning/runs/plan-20260708-155019-c28b5b/decomposition-report.md delete mode 100644 .harness/shared/planning/runs/plan-20260708-155019-c28b5b/proposed-tasks.json delete mode 100644 .harness/shared/planning/runs/plan-20260708-164729-fdf4d8/context.json delete mode 100644 .harness/shared/planning/runs/plan-20260708-164729-fdf4d8/decomposition-report.md delete mode 100644 .harness/shared/planning/runs/plan-20260708-164729-fdf4d8/proposed-tasks.json delete mode 100644 .harness/shared/planning/runs/plan-20260708-quality-gates/context.json delete mode 100644 .harness/shared/planning/runs/plan-20260708-quality-gates/decomposition-report.md delete mode 100644 .harness/shared/planning/runs/plan-20260708-quality-gates/proposed-tasks.json create mode 100644 .harness/tasks/.gitkeep delete mode 100644 .harness/tasks/4.1-decomposer-expression-criteria/CHECKPOINTS.md delete mode 100644 .harness/tasks/4.1-decomposer-expression-criteria/HANDOFF.md delete mode 100644 .harness/tasks/4.1-decomposer-expression-criteria/LOG.md delete mode 100644 .harness/tasks/4.1-decomposer-expression-criteria/STATE.md delete mode 100644 .harness/tasks/4.1-decomposer-expression-criteria/TASKS.md delete mode 100644 .harness/tasks/4.1-decomposer-expression-criteria/tasks.index.snapshot.json delete mode 100644 .harness/tasks/4.11-rescue-from-main/CHECKPOINTS.md delete mode 100644 .harness/tasks/4.11-rescue-from-main/HANDOFF.md delete mode 100644 .harness/tasks/4.11-rescue-from-main/LOG.md delete mode 100644 .harness/tasks/4.11-rescue-from-main/STATE.md delete mode 100644 .harness/tasks/4.11-rescue-from-main/TASKS.md delete mode 100644 .harness/tasks/4.11-rescue-from-main/tasks.index.snapshot.json delete mode 100644 .harness/tasks/4.12-task-harness-context/CHECKPOINTS.md delete mode 100644 .harness/tasks/4.12-task-harness-context/HANDOFF.md delete mode 100644 .harness/tasks/4.12-task-harness-context/LOG.md delete mode 100644 .harness/tasks/4.12-task-harness-context/STATE.md delete mode 100644 .harness/tasks/4.12-task-harness-context/TASKS.md delete mode 100644 .harness/tasks/4.12-task-harness-context/tasks.index.snapshot.json delete mode 100644 .harness/tasks/4.2-test-agent-pretest-detection/CHECKPOINTS.md delete mode 100644 .harness/tasks/4.2-test-agent-pretest-detection/HANDOFF.md delete mode 100644 .harness/tasks/4.2-test-agent-pretest-detection/LOG.md delete mode 100644 .harness/tasks/4.2-test-agent-pretest-detection/STATE.md delete mode 100644 .harness/tasks/4.2-test-agent-pretest-detection/TASKS.md delete mode 100644 .harness/tasks/4.2-test-agent-pretest-detection/tasks.index.snapshot.json delete mode 100644 .harness/tasks/4.3-context-index-missing-docs/CHECKPOINTS.md delete mode 100644 .harness/tasks/4.3-context-index-missing-docs/HANDOFF.md delete mode 100644 .harness/tasks/4.3-context-index-missing-docs/LOG.md delete mode 100644 .harness/tasks/4.3-context-index-missing-docs/STATE.md delete mode 100644 .harness/tasks/4.3-context-index-missing-docs/TASKS.md delete mode 100644 .harness/tasks/4.3-context-index-missing-docs/tasks.index.snapshot.json delete mode 100644 .harness/tasks/4.4-rm-danger-patterns/CHECKPOINTS.md delete mode 100644 .harness/tasks/4.4-rm-danger-patterns/HANDOFF.md delete mode 100644 .harness/tasks/4.4-rm-danger-patterns/LOG.md delete mode 100644 .harness/tasks/4.4-rm-danger-patterns/STATE.md delete mode 100644 .harness/tasks/4.4-rm-danger-patterns/TASKS.md delete mode 100644 .harness/tasks/4.4-rm-danger-patterns/tasks.index.snapshot.json delete mode 100644 .harness/tasks/4.5-grill-me-output-path/CHECKPOINTS.md delete mode 100644 .harness/tasks/4.5-grill-me-output-path/HANDOFF.md delete mode 100644 .harness/tasks/4.5-grill-me-output-path/LOG.md delete mode 100644 .harness/tasks/4.5-grill-me-output-path/STATE.md delete mode 100644 .harness/tasks/4.5-grill-me-output-path/TASKS.md delete mode 100644 .harness/tasks/4.5-grill-me-output-path/tasks.index.snapshot.json delete mode 100644 .harness/tasks/4.6-grill-me-headless-mode/CHECKPOINTS.md delete mode 100644 .harness/tasks/4.6-grill-me-headless-mode/HANDOFF.md delete mode 100644 .harness/tasks/4.6-grill-me-headless-mode/LOG.md delete mode 100644 .harness/tasks/4.6-grill-me-headless-mode/STATE.md delete mode 100644 .harness/tasks/4.6-grill-me-headless-mode/TASKS.md delete mode 100644 .harness/tasks/4.6-grill-me-headless-mode/tasks.index.snapshot.json delete mode 100644 .harness/tasks/readme-user-friendly/CHECKPOINTS.md delete mode 100644 .harness/tasks/readme-user-friendly/HANDOFF.md delete mode 100644 .harness/tasks/readme-user-friendly/LOG.md delete mode 100644 .harness/tasks/readme-user-friendly/STATE.md delete mode 100644 .harness/tasks/readme-user-friendly/TASKS.md delete mode 100644 .harness/tasks/readme-user-friendly/tasks.index.snapshot.json delete mode 100644 docs/claude-code-hooks.md delete mode 100644 docs/error-memory.md delete mode 100644 docs/global-settings-reference.md delete mode 100644 docs/harness-observability-traceability.md delete mode 100644 docs/session-recovery.md delete mode 100644 docs/specs/2026-07-03-planning-pipeline-design.md delete mode 100644 docs/specs/2026-07-08-planning-observability.md diff --git a/.agents/skills/harness-plan/SKILL.md b/.agents/skills/harness-plan/SKILL.md index d889ab3..893a232 100644 --- a/.agents/skills/harness-plan/SKILL.md +++ b/.agents/skills/harness-plan/SKILL.md @@ -12,8 +12,8 @@ Codex에서 Claude Code `/harness-plan`에 해당하는 절차를 직접 수행 1. `AGENTS.md`, `CLAUDE.md`, `agents/quality-gates.md`, `tasks/index.json`, `Plans.md`, 필요한 기획 문서를 읽는다. 2. `python3 scripts/build_planning_context.py`로 planning context를 만든다. -3. `harness.toml [plan].decomposer_command`가 있으면 그 명령으로 proposal을 만든다. -4. 명령이 없거나 실패하고 `allow_inline_fallback = true`이면, 현재 Codex 세션이 `agents/task-decomposer.md` 기준으로 같은 proposal 파일 계약을 채운다. +3. 현재 Codex 세션이 `agents/task-decomposer.md` 기준으로 proposal 파일 계약을 채운다. +4. `harness.toml [plan].decomposer_command`가 명시되어 있으면 외부 명령으로 proposal 생성을 위임할 수 있다. 실패하면 쉬운 실패 로그를 남기고 inline fallback으로 돌아온다. 5. `python3 scripts/validate_task_proposal.py ...`로 proposal을 검증한다. 6. 통과한 경우에만 `python3 scripts/apply_task_proposal.py ...`로 `tasks/index.json`에 반영한다. 7. `python3 scripts/sync_plans.py`로 `Plans.md`를 재생성하고 `python3 scripts/validate_tasks.py`로 확인한다. diff --git a/.agents/skills/rescue-from-main/SKILL.md b/.agents/skills/rescue-from-main/SKILL.md index 7dd4d64..0f45f5d 100644 --- a/.agents/skills/rescue-from-main/SKILL.md +++ b/.agents/skills/rescue-from-main/SKILL.md @@ -5,68 +5,28 @@ description: main/master에서 만든 변경사항을 안전하게 작업 브랜 # rescue-from-main -`main`/`master`에서 실수로 작업한 변경사항을 내용 기반 작업 브랜치로 옮기고 -`commit -> push -> draft PR`까지 이어간다. 자동 reset이나 강제 push는 하지 않는다. - -## Preflight - -1. `git status --short --branch`로 현재 브랜치와 변경분을 확인한다. -2. `git branch --show-current`, `git branch -vv`, `git remote -v`로 현재 브랜치, - upstream, remote를 확인한다. -3. `gh auth status` 또는 `gh pr view`로 GitHub CLI 사용 가능 여부를 확인한다. - 인증/권한 오류는 원문을 요약하고 중단한다. -4. `git diff --stat`, `git diff --name-status`를 읽는다. staged 변경이 있으면 - `git diff --cached --stat`, `git diff --cached --name-status`도 읽는다. -5. 변경분이 없고 현재 브랜치에만 push되지 않은 commit도 없으면 중단한다. - -## 변경 분석과 브랜치명 - -1. 변경 파일, diff 요약, staged diff, 필요 시 최근 commit 제목을 근거로 짧은 - `{change-slug}`를 만든다. -2. Task ID가 명확하면 `task/{task-id}-{change-slug}`를 사용한다. Task가 없으면 - `work/{change-slug}`를 사용한다. -3. `{change-slug}`는 diff 내용에서 2-5개 단어를 뽑아 kebab-case로 만든다. -4. `fix`, `update`, `changes`, `misc`, `wip`처럼 내용이 불명확한 단독 slug는 금지한다. -5. `git branch --list {branch}`와 `git ls-remote --heads origin {branch}`로 충돌을 - 확인한다. 충돌하면 `-{n}` suffix를 붙인다. - -## 브랜치 처리 - -1. 현재 브랜치가 `main`/`master`이고 uncommitted 변경이 있으면 - `git switch -c {branch}`로 새 브랜치를 만든다. Git은 변경분을 그대로 보존한다. -2. 현재 브랜치가 `main`/`master`이고 upstream보다 앞선 local commit이 있으면 - 자동으로 옮기거나 reset하지 않고 중단한다. 새 브랜치에 commit을 보존하는 작업과 - `main` 복구는 사용자에게 별도 승인받은 뒤 진행한다. -3. 이미 작업 브랜치면 브랜치명이 변경 내용과 맞는지 확인한다. 맞으면 그대로 진행하고, - 불명확하면 rename 여부를 사용자에게 확인한다. - -## Commit - -1. `tasks/index.json`에서 대상 Task가 있으면 DoD/Acceptance를 확인한다. -2. `git add {files}` 또는 `git add -A`로 변경분을 stage한다. 사용자 요청 범위 밖 - 파일이 섞여 있으면 제외하거나 중단하고 보고한다. -3. 커밋 메시지는 Task가 있으면 `task {task-id}: {summary}`, 없으면 `{summary}`를 - 사용한다. -4. `git commit -m "{message}"`를 실행한다. - -## Push와 Draft PR - -1. `git push -u origin {branch}`를 실행한다. 강제 push는 사용하지 않는다. -2. Acceptance command와 관련 테스트 결과를 PR 본문에 적는다. -3. `gh pr create --draft`로 draft PR을 만든다. -4. PR 본문에는 다음 항목을 포함한다. - - 변경 요약 - - 검증 결과 - - Acceptance evidence - - residual risk - - Task `gh` 값이 `#N`이면 `Closes #N` +`main`/`master`에서 실수로 작업한 변경사항을 내용 기반 작업 브랜치로 옮긴다. 자동 reset이나 강제 push는 하지 않는다. + +## 절차 + +1. `git status --short --branch`, `git branch --show-current`, `git branch -vv`, `git remote -v`를 확인한다. +2. `gh auth status` 또는 `gh pr view`로 GitHub CLI 사용 가능 여부를 확인한다. +3. `git diff --stat`, `git diff --name-status`를 읽는다. staged 변경이 있으면 cached diff도 읽는다. +4. 변경분이 없고 현재 브랜치에만 push되지 않은 commit도 없으면 중단한다. +5. diff 내용에서 2-5개 단어의 kebab-case `{change-slug}`를 만든다. `fix`, `update`, `changes`, `misc`, `wip` 단독 이름은 쓰지 않는다. +6. Task ID가 명확하면 `task/{task-id}-{change-slug}`, 없으면 `work/{change-slug}`를 사용한다. +7. `git branch --list {branch}`와 `git ls-remote --heads origin {branch}`로 충돌을 확인하고, 필요하면 `-{n}` suffix를 붙인다. +8. 현재 브랜치가 `main`/`master`이고 uncommitted 변경이 있으면 `git switch -c {branch}`로 새 브랜치를 만든다. +9. 현재 브랜치가 `main`/`master`이고 upstream보다 앞선 local commit이 있으면 중단한다. 보존과 main 복구는 별도 승인 후 처리한다. +10. 이미 작업 브랜치면 브랜치명이 변경 내용과 맞는지 확인하고 진행한다. +11. 범위 밖 파일이 섞여 있지 않은지 확인한 뒤 `git add`로 stage한다. +12. Task가 있으면 `task {task-id}: {summary}`, 없으면 `{summary}`로 commit한다. +13. `git push -u origin {branch}` 후 `gh pr create --draft`를 실행한다. +14. PR 본문에는 변경 요약, 검증 결과, Acceptance evidence, residual risk, 연결 이슈가 있으면 `Closes #N`을 포함한다. ## 제한 -- `git reset --hard`, `git checkout --`, `git push --force`, `git push --force-with-lease`는 - 실행하지 않는다. -- `main`/`master`에 local commit이 있으면 자동 복구하지 않는다. -- 브랜치명은 반드시 diff 내용을 근거로 만든다. 날짜, 사용자명, `wip` 단독 이름은 - 사용하지 않는다. -- PR 생성 전 Acceptance evidence가 없으면 draft PR 본문에 미실행 사유를 명확히 - 적거나, 사용자가 요구한 경우 중단한다. +- `git reset --hard`, `git checkout --`, `git push --force`, `git push --force-with-lease`는 실행하지 않는다. +- 사용자 변경은 되돌리지 않는다. +- 인증, 권한, remote 오류는 원문을 요약하고 멈춘다. +- Acceptance evidence가 없으면 draft PR 본문에 미실행 사유를 적거나, 사용자가 요구한 경우 중단한다. diff --git a/.claude/commands/branch-checkout.md b/.claude/commands/branch-checkout.md index ac2f81f..c4af5d8 100644 --- a/.claude/commands/branch-checkout.md +++ b/.claude/commands/branch-checkout.md @@ -5,20 +5,10 @@ allowed-tools: Bash(git status:*), Bash(git branch:*), Bash(git switch:*), Bash( # /branch-checkout -별도 작업 브랜치를 만들거나 체크아웃한다. 사용자가 지정한 브랜치명이 있으면 사용하고, -없으면 대상 Task ID와 제목을 바탕으로 `task/{task-id}-{short-slug}` 형식을 제안한다. +절차 원본은 `.agents/skills/branch-checkout/SKILL.md`다. 이 command는 Claude Code 호출용 wrapper다. -## 절차 - -1. `git status --short`와 `git branch --show-current`로 현재 상태를 확인한다. -2. 변경분이 있으면 사용자 변경을 덮지 않도록 요약하고, 그대로 브랜치를 전환해도 되는지 확인한다. -3. 필요하면 `git fetch origin`으로 원격 기준을 최신화한다. -4. 기존 브랜치면 `git switch {branch}`를 실행한다. -5. 새 브랜치면 기본 브랜치 기준을 확인한 뒤 `git switch -c {branch}`를 실행한다. -6. 전환 후 현재 브랜치와 남은 변경분을 보고한다. - -## 주의 - -- `git checkout --`, `git reset --hard`, 강제 push는 실행하지 않는다. -- Task 브랜치는 `CLAUDE.md`의 GitHub 플로우에 맞춰 `task/{task-id}-{짧은-설명}`을 선호한다. -- 인자: `$ARGUMENTS` +1. `.agents/skills/branch-checkout/SKILL.md`를 읽고 같은 절차를 따른다. +2. `git status --short`와 `git branch --show-current`를 먼저 확인한다. +3. 사용자 변경은 되돌리지 않는다. +4. `git reset --hard`, `git checkout --`, 강제 push는 실행하지 않는다. +5. 인자: `$ARGUMENTS` diff --git a/.claude/commands/git-push.md b/.claude/commands/git-push.md index eadd745..371f653 100644 --- a/.claude/commands/git-push.md +++ b/.claude/commands/git-push.md @@ -5,20 +5,10 @@ allowed-tools: Bash(git status:*), Bash(git branch:*), Bash(git remote:*), Bash( # /git-push -현재 브랜치를 원격에 push한다. push 전에 브랜치, 변경분, upstream을 확인하고 -강제 push는 하지 않는다. +절차 원본은 `.agents/skills/git-push/SKILL.md`다. 이 command는 Claude Code 호출용 wrapper다. -## 절차 - -1. `git status --short`와 `git branch --show-current`를 확인한다. -2. 현재 브랜치가 `main`/`master`면 push하지 말고 사용자에게 확인을 요청한다. -3. 커밋되지 않은 변경분이 있으면 push 대상이 아님을 알리고 중단한다. -4. upstream이 있으면 `git push`를 실행한다. -5. upstream이 없으면 `git push -u origin {current-branch}`를 실행한다. -6. push 결과와 다음 단계(PR 작성 여부)를 보고한다. - -## 주의 - -- `--force`, `--force-with-lease`는 사용하지 않는다. -- 인증 실패나 remote 없음은 원문 에러를 보고하고 멈춘다. -- 인자: `$ARGUMENTS` +1. `.agents/skills/git-push/SKILL.md`를 읽고 같은 절차를 따른다. +2. `git status --short`와 `git branch --show-current`를 먼저 확인한다. +3. `main`/`master` push와 커밋되지 않은 변경분 push는 중단하고 보고한다. +4. `--force`, `--force-with-lease`는 사용하지 않는다. +5. 인자: `$ARGUMENTS` diff --git a/.claude/commands/pr-create.md b/.claude/commands/pr-create.md index b2aa6f8..5e44637 100644 --- a/.claude/commands/pr-create.md +++ b/.claude/commands/pr-create.md @@ -5,22 +5,10 @@ allowed-tools: Bash(git status:*), Bash(git branch:*), Bash(git log:*), Bash(gh # /pr-create -현재 작업 브랜치에서 GitHub PR을 작성한다. PR 본문에는 Task, DoD, Acceptance evidence, -리뷰 상태, 이슈 연결 정보를 포함한다. +절차 원본은 `.agents/skills/pr-create/SKILL.md`다. 이 command는 Claude Code 호출용 wrapper다. -## 절차 - -1. `git status --short`와 `git branch --show-current`를 확인한다. -2. 현재 브랜치가 `main`/`master`면 PR을 만들지 않는다. -3. 커밋되지 않은 변경분이 있으면 PR 생성 전에 커밋 필요 여부를 보고하고 중단한다. -4. 대상 Task를 `tasks/index.json`에서 확인하고, `gh`가 `#N`이면 PR 본문에 `Closes #N`을 넣는다. -5. Acceptance와 관련 테스트 실행 증거를 PR 본문에 요약한다. -6. `gh pr create --draft`를 기본으로 사용한다. 사용자가 ready PR을 명시하면 draft를 생략할 수 있다. -7. 생성 후 PR URL과 남은 merge gate를 보고한다. - -## 주의 - -- `REQUEST_CHANGES` 상태이거나 Acceptance evidence가 없으면 PR 생성 전 중단한다. -- Task 상태 변경은 PR 생성 전에 Acceptance evidence와 함께 이미 반영돼 있어야 한다. - GitHub Actions가 상태를 대신 전환하지 않는다. -- 인자: `$ARGUMENTS` +1. `.agents/skills/pr-create/SKILL.md`를 읽고 같은 절차를 따른다. +2. `git status --short`와 `git branch --show-current`를 먼저 확인한다. +3. Acceptance evidence와 리뷰 상태를 확인한다. +4. 기본은 draft PR이다. 연결 이슈가 있으면 `Closes #N`을 포함한다. +5. 인자: `$ARGUMENTS` diff --git a/.claude/commands/rescue-from-main.md b/.claude/commands/rescue-from-main.md index 7036174..eaba2b4 100644 --- a/.claude/commands/rescue-from-main.md +++ b/.claude/commands/rescue-from-main.md @@ -5,37 +5,11 @@ allowed-tools: Bash(git status:*), Bash(git branch:*), Bash(git remote:*), Bash( # /rescue-from-main -`main`/`master`에서 실수로 작업한 변경사항을 안전하게 작업 브랜치로 옮긴 뒤 -`commit -> push -> draft PR`까지 진행한다. 자동 reset이나 강제 push는 하지 않는다. - -## 절차 - -1. `git status --short --branch`, `git branch --show-current`, `git branch -vv`, - `git remote -v`로 현재 브랜치, upstream, remote, 변경분을 확인한다. -2. `gh auth status` 또는 `gh pr view`로 GitHub CLI 사용 가능 여부를 확인한다. -3. `git diff --stat`, `git diff --name-status`를 읽고, staged 변경이 있으면 - `git diff --cached --stat`, `git diff --cached --name-status`도 읽는다. -4. 변경 파일과 diff 요약, 필요 시 최근 commit 제목을 근거로 브랜치명을 정한다. - Task ID가 있으면 `task/{task-id}-{change-slug}`, 없으면 `work/{change-slug}`를 - 사용한다. slug는 2-5개 단어 kebab-case이며 `fix`, `update`, `changes`, `misc`, - `wip` 단독 이름은 금지한다. -5. `git branch --list {branch}`와 `git ls-remote --heads origin {branch}`로 충돌을 - 확인하고, 충돌하면 `-{n}` suffix를 붙인다. -6. 현재 브랜치가 `main`/`master`이고 uncommitted 변경이 있으면 - `git switch -c {branch}`를 실행해 변경사항을 그대로 보존한다. -7. 현재 브랜치가 `main`/`master`이고 upstream보다 앞선 local commit이 있으면 - 자동 reset하지 않고 중단한다. 새 브랜치 보존과 main 복구는 별도 승인 후 처리한다. -8. 이미 작업 브랜치면 브랜치명이 변경 내용과 맞는지 확인하고 그대로 진행한다. -9. 변경분을 `git add`로 stage한다. 범위 밖 파일이 섞여 있으면 제외하거나 중단한다. -10. Task가 있으면 `task {task-id}: {summary}`, 없으면 `{summary}` 형식으로 - `git commit`을 실행한다. -11. `git push -u origin {branch}`로 원격에 올린다. -12. `gh pr create --draft`로 draft PR을 만든다. PR 본문에는 변경 요약, 검증 결과, - Acceptance evidence, residual risk, Task `gh`가 `#N`이면 `Closes #N`을 포함한다. - -## 주의 - -- `git reset --hard`, `git checkout --`, 강제 push는 실행하지 않는다. -- 브랜치명은 반드시 변경사항 내용을 검사해 만든다. -- 인증/권한/remote 오류는 원문을 요약하고 멈춘다. -- 인자: `$ARGUMENTS` +절차 원본은 `.agents/skills/rescue-from-main/SKILL.md`다. 이 command는 Claude Code 호출용 wrapper다. + +1. `.agents/skills/rescue-from-main/SKILL.md`를 읽고 같은 절차를 따른다. +2. `git status --short --branch`, `git branch --show-current`, `git branch -vv`, `git remote -v`를 먼저 확인한다. +3. diff 내용을 근거로 `task/{task-id}-{change-slug}` 또는 `work/{change-slug}` 브랜치를 만든다. +4. `main`/`master` local commit은 자동 복구하지 않는다. +5. `git reset --hard`, `git checkout --`, 강제 push는 실행하지 않는다. +6. 인자: `$ARGUMENTS` diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7d8633..efd8908 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,18 +1,6 @@ # GitHub Actions CI — [PROJECT_NAME] -# -# 사용법: -# 1. 프로젝트 기술 스택 블록의 주석을 해제한다. -# 2. 불필요한 블록은 삭제한다. -# 3. placeholder job을 삭제하고, 아래 ci-ok job의 `needs:` 목록을 -# [check, test]로 바꾼다. branch protection의 required check는 -# "ci-ok" 하나만 등록 — 이 이름은 스택 전환과 무관하게 고정이므로 -# GitHub Settings → Branches에서 다시 등록할 필요가 없다(M6/2026-07-04 감사). -# -# /harness-setup 실행 시 기술 스택 자동 감지 → 해당 블록 자동 주석 해제 제안. -# -# 보안 권장: uses: action@TAG 를 SHA로 고정 권장. -# 예) actions/checkout@v4 → actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 -# 참고: gajae-code/.github/workflows/ci.yml +# 사용법: placeholder를 실제 check/test job으로 교체하고 ci-ok needs를 갱신한다. +# Branch protection required check는 고정 이름인 "ci-ok" 하나만 등록한다. name: CI @@ -28,136 +16,13 @@ concurrency: cancel-in-progress: true jobs: - - # ── [STACK: Node.js / Bun] ────────────────────────────────────────────────── - # check: - # name: Type check & lint - # runs-on: ubuntu-22.04 - # timeout-minutes: 15 - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-node@v4 - # with: - # node-version: "20" - # cache: "npm" # "yarn" / "pnpm" / "bun" 으로 변경 가능 - # - run: npm ci - # - run: npm run typecheck # tsconfig 기반; 없으면 삭제 - # - run: npm run lint - # - # test: - # name: Unit tests - # needs: [check] - # runs-on: ubuntu-22.04 - # timeout-minutes: 20 - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-node@v4 - # with: - # node-version: "20" - # cache: "npm" - # - run: npm ci - # - run: npm test - # ── [/STACK: Node.js / Bun] ───────────────────────────────────────────────── - - - # ── [STACK: Python] ────────────────────────────────────────────────────────── - # check: - # name: Lint & type check - # runs-on: ubuntu-22.04 - # timeout-minutes: 10 - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-python@v5 - # with: - # python-version: "3.12" - # cache: "pip" - # - run: pip install ruff mypy - # - run: ruff check . - # - run: mypy . # mypy.ini 또는 pyproject.toml 설정 필요 - # - # test: - # name: Unit tests - # needs: [check] - # runs-on: ubuntu-22.04 - # timeout-minutes: 20 - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-python@v5 - # with: - # python-version: "3.12" - # cache: "pip" - # - run: pip install -r requirements.txt - # - run: pytest - # ── [/STACK: Python] ───────────────────────────────────────────────────────── - - - # ── [STACK: Go] ────────────────────────────────────────────────────────────── - # check: - # name: Vet & lint - # runs-on: ubuntu-22.04 - # timeout-minutes: 10 - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-go@v5 - # with: - # go-version: "1.22" - # cache: true - # - run: go vet ./... - # - # test: - # name: Unit tests - # needs: [check] - # runs-on: ubuntu-22.04 - # timeout-minutes: 20 - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-go@v5 - # with: - # go-version: "1.22" - # cache: true - # - run: go test -race ./... - # ── [/STACK: Go] ───────────────────────────────────────────────────────────── - - - # ── [STACK: Rust] ──────────────────────────────────────────────────────────── - # check: - # name: Clippy & fmt - # runs-on: ubuntu-22.04 - # timeout-minutes: 20 - # steps: - # - uses: actions/checkout@v4 - # - uses: dtolnay/rust-toolchain@stable - # - uses: Swatinem/rust-cache@v2 - # - run: cargo clippy -- -D warnings - # - run: cargo fmt --check - # - # test: - # name: Unit tests - # needs: [check] - # runs-on: ubuntu-22.04 - # timeout-minutes: 30 - # steps: - # - uses: actions/checkout@v4 - # - uses: dtolnay/rust-toolchain@stable - # - uses: Swatinem/rust-cache@v2 - # - run: cargo test - # ── [/STACK: Rust] ─────────────────────────────────────────────────────────── - - - # 스택 블록 활성화 전까지 CI가 빈 job으로 실패하지 않도록 유지. - # 스택 블록 주석 해제 후 이 job 삭제 + 아래 ci-ok의 needs를 [check, test]로 변경. placeholder: - name: CI (스택 미설정 — ci.yml 블록 활성화 후 삭제) + name: CI (스택 미설정 — 실제 check/test job으로 교체) runs-on: ubuntu-22.04 timeout-minutes: 5 steps: - - run: echo "스택 블록 주석 해제 후 이 placeholder job 삭제 필요" + - run: echo "프로젝트 스택에 맞는 check/test job을 추가하세요" - # M6 (2026-07-04 감사): 스택 잡(check/test) 이름을 required check로 직접 - # 등록하면, 스택 블록을 켜거나 잡을 추가·삭제할 때마다 GitHub Settings → - # Branches의 required check가 깨진다(존재하지 않는 체크를 영구 대기하거나 - # 무방비 상태가 됨). 이 job 하나만 required check로 등록하면 이름이 - # 절대 안 바뀐다 — 아래 needs만 스택 상태에 맞춰 갱신하면 된다. ci-ok: name: ci-ok if: always() diff --git a/.harness/CONTEXT_INDEX.md b/.harness/CONTEXT_INDEX.md index d3209c7..3b7e340 100644 --- a/.harness/CONTEXT_INDEX.md +++ b/.harness/CONTEXT_INDEX.md @@ -1,59 +1,50 @@ # 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. 이 파일에서 필요한 추가 문서만 고른다. +3. 있으면 `.harness/tasks//RUN_REPORT.md`를 읽는다. +4. `.harness/LESSONS.md` 최근 항목을 읽는다. +5. `Plans.md`를 확인한다. +6. 아래 표에서 필요한 추가 문서만 고른다. -## Task별 맥락 디렉토리 +## Task별 맥락 -`.harness/tasks//` 아래에 실제 작업 맥락을 둔다. +- `.harness/tasks//STATE.md`: 현재 스냅샷 +- `.harness/tasks//LOG.md`: 작업·에러 원문 +- `.harness/tasks//RUN_REPORT.md`: 변경·결정·검증 요약 +- `.harness/tasks//{HANDOFF,TASKS,CHECKPOINTS}.md`: 필요할 때만 읽는 보조 기록 +- `.harness/tasks//tasks.index.snapshot.json`: 시작 시점 비교가 필요할 때만 읽는 참고본 -- `STATE.md`: 현재 스냅샷 -- `LOG.md`: 작업·에러 원문 -- `RUN_REPORT.md`: 변경·결정·검증 요약 -- `HANDOFF.md`, `TASKS.md`, `CHECKPOINTS.md`: 필요할 때만 읽는 보조 기록 -- `tasks.index.snapshot.json`: 시작 시점 비교가 필요할 때만 읽는 참고본 +## 기본 파일 -## 루트 `.harness/` 템플릿과 전역 파일 - -- `.harness/{STATE,HANDOFF,TASKS,LOG,CHECKPOINTS,RUN_REPORT}.md`: 새 Task용 템플릿 -- `.harness/LESSONS.md`: 전역 재발 방지 기록 -- `.harness/CONTEXT_INDEX.md`: 필요한 파일만 고르는 인덱스 -- `.harness/events/planning.jsonl`: planning 실패·반영 흐름 추적 -- `.harness/shared/planning/latest.json`: 최신 planning run 위치 -- `.harness/shared/planning/runs/`: 특정 planning run 감사 시만 읽는 작업대 +| 파일 | 역할 | 읽는 시점 | +|------|------|-----------| +| `CLAUDE.md` | 프로젝트 규칙 | 규칙 확인 시 | +| `AGENTS.md` | Codex 진입점 | Codex 절차 확인 시 | +| `tasks/index.json` | Task 상태 단일 출처 | 항상 먼저 | +| `Plans.md` | 사람이 읽는 Task snapshot | 진행 상황 확인 시 | +| `.harness/{STATE,HANDOFF,TASKS,LOG,CHECKPOINTS,RUN_REPORT}.md` | 새 Task용 템플릿 | Task 디렉토리 생성 시 | +| `.harness/LESSONS.md` | 전역 재발 방지 기록 | 세션 재개·반복 오류 확인 시 | +| `.harness/events/planning.jsonl` | planning 실패·반영 흐름 추적 | planning 문제 조사 시 | +| `.harness/shared/planning/runs/` | planning run 작업대 | 특정 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`, `$harness-yagni-trimmer`, `$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]) | 설정 변경 시 | -| `BLUEPRINT.md` | 시스템 전체 아키텍처 설명 (읽기용) | 구조 이해 필요 시 | -| `README.md` | 템플릿 사용법 (외부 사용자용) | 문서 갱신 시 | -| `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 | CI 수정 시 | -| `.github/workflows/ci.yml` | 스택 빌드·테스트 + ci-ok 요약 잡 | CI 수정 시 | -| `init.sh` | 새 프로젝트에 이 템플릿 전체(설정+CI+골격) 자동 복사 | 새 프로젝트 적용 시 | -| `templates/skeleton/` | init.sh가 복사하는 Plans.md·.harness/ 초기 템플릿 구조 | 골격 자체를 고칠 때 | -| `docs/templates/` | 기획 문서 골격 4종 (PRD·UserFlow·DESIGN·Architecture) | 새 기획 착수 시 | -| `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/harness-observability-traceability.md` | 실행 요약, 원문 로그, 결정 근거, context 보존 위치 | harness 운영 증거 위치 확인 시 | -| `docs/session-recovery.md` | `.harness/tasks/` 기반 재개 절차 심화 | 세션 복구 절차 상세 확인 시 | -| `docs/error-memory.md` | Task별 `LOG.md`와 전역 `LESSONS.md` 작성 규칙 | 에러 기록 규칙 확인 시 | +| `.agents/skills/` | Codex repo-scoped skills | Codex skill 절차 수정 시 | +| `.claude/commands/` | Claude Code local commands | Claude command 절차 수정 시 | +| `agents/quality-gates.md` | scope·YAGNI·review·reporting 게이트 | 구현·리뷰 전 | +| `agents/task-decomposer.md` | Task 세분화 기준 | 계획·구현 게이트 확인 시 | +| `agents/test-agent.md` | 런타임 검증 절차 | worker 완료 후 | +| `.github/workflows/` | CI와 plans guard | CI 수정 시 | +| `init.sh` | 새 프로젝트 복사 스크립트 | 템플릿 적용 방식 수정 시 | +| `templates/skeleton/` | init.sh가 복사하는 초기 골격 | 골격 자체 수정 시 | +| `docs/templates/` | 기획 문서 골격 | 새 기획 착수 시 | +| `docs/github-integration.md` | GitHub 연동 상세 | GitHub 연동 설정 시 | +| `docs/specs/` | 현재 Acceptance가 참조하는 감사·품질 gate 배경 | 배경 확인이 필요할 때 | +| `BLUEPRINT.md` | 시스템 구조 설명 | 구조 이해가 필요할 때 | diff --git a/.harness/shared/planning/latest.json b/.harness/shared/planning/latest.json deleted file mode 100644 index 1cc4e32..0000000 --- a/.harness/shared/planning/latest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "run_id": "plan-20260708-164729-fdf4d8", - "updated_at": "2026-07-08T16:47:29+09:00", - "context": ".harness/shared/planning/runs/plan-20260708-164729-fdf4d8/context.json", - "proposal": ".harness/shared/planning/runs/plan-20260708-164729-fdf4d8/proposed-tasks.json", - "report": ".harness/shared/planning/runs/plan-20260708-164729-fdf4d8/decomposition-report.md" -} diff --git a/.harness/shared/planning/runs/plan-20260708-150320-db655f/context.json b/.harness/shared/planning/runs/plan-20260708-150320-db655f/context.json deleted file mode 100644 index 8591992..0000000 --- a/.harness/shared/planning/runs/plan-20260708-150320-db655f/context.json +++ /dev/null @@ -1,271 +0,0 @@ -{ - "run_id": "plan-20260708-150320-db655f", - "created_at": "2026-07-08T15:03:20+09:00", - "request": "rescue-from-main workflow helper 추가: main/master 변경사항을 작업 브랜치로 안전하게 옮기고 commit, push, draft PR까지 진행하는 Claude command와 Codex skill, 문서 등록, init 복사 검증을 포함한다.", - "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 호환 환경 구성" - } - ], - "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-150320-db655f", - "proposal": ".harness/shared/planning/runs/plan-20260708-150320-db655f/proposed-tasks.json", - "report": ".harness/shared/planning/runs/plan-20260708-150320-db655f/decomposition-report.md" - }, - "technical": { - "schema_version": 1, - "proposal_dir": ".harness/shared/planning" - } -} diff --git a/.harness/shared/planning/runs/plan-20260708-150320-db655f/decomposition-report.md b/.harness/shared/planning/runs/plan-20260708-150320-db655f/decomposition-report.md deleted file mode 100644 index a3181a7..0000000 --- a/.harness/shared/planning/runs/plan-20260708-150320-db655f/decomposition-report.md +++ /dev/null @@ -1,21 +0,0 @@ -# decomposition report — rescue-from-main helper - -## 결과 - -새 Task `4.11` 하나로 분해한다. - -## 완료 기준 - -`rescue-from-main`은 기존 Git workflow helper 묶음의 후속 산출물이다. Claude Code -custom command와 Codex skill, 사용자 진입점 문서, 초기화 복사 경로가 함께 등록되어야 -사용자가 같은 절차를 양쪽 런타임에서 실행할 수 있다. - -## 확인 방법 - -Acceptance는 새 command/skill 파일 존재와 `AGENTS.md`, `README.md`, `BLUEPRINT.md` -등록 문구를 확인한다. 추가 검증으로 task sync, skill frontmatter, init smoke test를 -실행한다. - -## 먼저 끝나야 할 작업 - -기존 Git helper 구조와 공용 quality gate가 필요하므로 `4.9`, `4.10`에 의존한다. diff --git a/.harness/shared/planning/runs/plan-20260708-150320-db655f/proposed-tasks.json b/.harness/shared/planning/runs/plan-20260708-150320-db655f/proposed-tasks.json deleted file mode 100644 index 5f7debf..0000000 --- a/.harness/shared/planning/runs/plan-20260708-150320-db655f/proposed-tasks.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "tasks": [ - { - "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": "todo", - "gh": "-", - "section": "Week 4 — Codex 호환 환경 구성" - } - ] -} diff --git a/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/context.json b/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/context.json deleted file mode 100644 index 3afbf40..0000000 --- a/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/context.json +++ /dev/null @@ -1,277 +0,0 @@ -{ - "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 deleted file mode 100644 index e88d961..0000000 --- a/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/decomposition-report.md +++ /dev/null @@ -1,16 +0,0 @@ -# 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 deleted file mode 100644 index 2fbc942..0000000 --- a/.harness/shared/planning/runs/plan-20260708-155019-c28b5b/proposed-tasks.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "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/shared/planning/runs/plan-20260708-164729-fdf4d8/context.json b/.harness/shared/planning/runs/plan-20260708-164729-fdf4d8/context.json deleted file mode 100644 index 8bc4b8b..0000000 --- a/.harness/shared/planning/runs/plan-20260708-164729-fdf4d8/context.json +++ /dev/null @@ -1,283 +0,0 @@ -{ - "run_id": "plan-20260708-164729-fdf4d8", - "created_at": "2026-07-08T16:47:29+09:00", - "request": "README.md를 비개발자도 따라가기 쉬운 안내서로 개편한다. 첫 화면, Quick Start, Codex CLI Setup, 작업별 workflow 메뉴, Troubleshooting을 사용자 행동 순서 중심으로 정리한다.", - "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": "done", - "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" - }, - { - "id": "4.2", - "title": "test-agent pretest 오탐 스택 감지 수정 (L2)", - "status": "done", - "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" - }, - { - "id": "4.3", - "title": "CONTEXT_INDEX.md 미존재 파일 인덱스 정리 (L3)", - "status": "done", - "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" - }, - { - "id": "4.4", - "title": "rm 위험 패턴 매칭 범위 확대 (L4)", - "status": "done", - "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" - }, - { - "id": "4.5", - "title": "grill-me 산출 경로 인자 지원 (L5)", - "status": "done", - "section": "Week 4 — 백로그 정리 (기준 문서: docs/specs/2026-07-04-template-audit.md L1~L5)" - }, - { - "id": "4.6", - "title": "grill-me 비대화형 실행 호환 모드 (L5)", - "status": "done", - "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 호환 환경 구성" - }, - { - "id": "4.12", - "title": "Task별 .harness 맥락 디렉토리 도입", - "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-164729-fdf4d8", - "proposal": ".harness/shared/planning/runs/plan-20260708-164729-fdf4d8/proposed-tasks.json", - "report": ".harness/shared/planning/runs/plan-20260708-164729-fdf4d8/decomposition-report.md" - }, - "technical": { - "schema_version": 1, - "proposal_dir": ".harness/shared/planning" - } -} diff --git a/.harness/shared/planning/runs/plan-20260708-164729-fdf4d8/decomposition-report.md b/.harness/shared/planning/runs/plan-20260708-164729-fdf4d8/decomposition-report.md deleted file mode 100644 index 5fb32ce..0000000 --- a/.harness/shared/planning/runs/plan-20260708-164729-fdf4d8/decomposition-report.md +++ /dev/null @@ -1,27 +0,0 @@ -# Decomposition Report — README 사용자 친화 개편 - -## 완료 기준 - -README를 처음 보는 사용자가 순서대로 읽으며 다음 결정을 할 수 있어야 한다. - -- Claude Code만 쓸지, Codex도 함께 쓸지 먼저 고른다. -- 템플릿을 새 프로젝트에 복사하는 Quick Start를 바로 실행할 수 있다. -- Codex 사용자는 별도 CLI Setup 섹션에서 진입점과 필수 규칙을 확인할 수 있다. -- 기획, 구현, 리뷰, Git 작업별 workflow 메뉴에서 필요한 절차로 이동할 수 있다. -- 흔한 실패 상황은 Troubleshooting에서 먼저 확인할 수 있다. - -## 확인 방법 - -Acceptance는 README에 위 핵심 섹션 제목이 모두 존재하는지 확인한다. 문서 Task이므로 -기계 검증은 핵심 구조 존재를 확인하고, 내용 품질은 리뷰에서 문맥과 링크 기준으로 -확인한다. - -## 먼저 끝나야 할 작업 - -없다. 현재 repo checkout 안의 `README.md`만 주요 산출물이며, 기존 완료 Task의 -산출물을 전제로 읽기 쉽게 재배치하는 문서 변경이다. - -## 세분화 판단 - -한 파일의 외부 사용자 안내 구조를 바꾸는 단일 문서 산출물이다. 코드, CI, -런타임 동작, GitHub 설정 변경을 함께 묶지 않으므로 1 PR 이내 Task로 유지한다. diff --git a/.harness/shared/planning/runs/plan-20260708-164729-fdf4d8/proposed-tasks.json b/.harness/shared/planning/runs/plan-20260708-164729-fdf4d8/proposed-tasks.json deleted file mode 100644 index b89c46c..0000000 --- a/.harness/shared/planning/runs/plan-20260708-164729-fdf4d8/proposed-tasks.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "tasks": [ - { - "id": "4.13", - "title": "README 사용자 친화 개편", - "dod": "README.md가 첫 화면, Quick Start, Codex CLI Setup, 작업별 workflow 메뉴, Troubleshooting을 사용자 행동 순서로 설명함", - "acceptance": "grep -q '## 먼저 고를 것' README.md && grep -q '## Quick Start' README.md && grep -q '## Codex CLI Setup' README.md && grep -q '## 작업별 Workflow' README.md && grep -q '## Troubleshooting' README.md", - "depends": [], - "status": "todo", - "gh": "-", - "section": "Week 4 — Codex 호환 환경 구성" - } - ] -} diff --git a/.harness/shared/planning/runs/plan-20260708-quality-gates/context.json b/.harness/shared/planning/runs/plan-20260708-quality-gates/context.json deleted file mode 100644 index 2ac9827..0000000 --- a/.harness/shared/planning/runs/plan-20260708-quality-gates/context.json +++ /dev/null @@ -1,265 +0,0 @@ -{ - "run_id": "plan-20260708-quality-gates", - "created_at": "2026-07-08T13:12:44+09:00", - "request": "Claude/Codex 공용 Quality Gate 정리: 계획 문서 작성, agents/quality-gates.md 추가, Codex harness skills와 README/BLUEPRINT/AGENTS.md/init skeleton 연결, tasks/Plans 반영", - "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 검증 + plans-complete 워크플로", - "status": "done", - "section": "Week 2 — 템플릿 dogfooding (루틴 관리 SaaS로 실전 테스트, 커밋 제외)" - }, - { - "id": "3.1", - "title": "plans-complete 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 diff 보호 잡 (H2)", - "status": "done", - "section": "Week 3 — 감사 빈틈 개선 (기준 문서: docs/specs/2026-07-04-template-audit.md)" - }, - { - "id": "3.5", - "title": "plans-guard depends-check 잡 (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": "granularity 오탐지 정규식 정확도 개선 (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 호환 환경 구성" - } - ], - "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-quality-gates", - "proposal": ".harness/shared/planning/runs/plan-20260708-quality-gates/proposed-tasks.json", - "report": ".harness/shared/planning/runs/plan-20260708-quality-gates/decomposition-report.md" - }, - "technical": { - "schema_version": 1, - "proposal_dir": ".harness/shared/planning" - } -} diff --git a/.harness/shared/planning/runs/plan-20260708-quality-gates/decomposition-report.md b/.harness/shared/planning/runs/plan-20260708-quality-gates/decomposition-report.md deleted file mode 100644 index 9e4323e..0000000 --- a/.harness/shared/planning/runs/plan-20260708-quality-gates/decomposition-report.md +++ /dev/null @@ -1,22 +0,0 @@ -# Quality Gate Task Proposal - -## 완료 기준 - -- Claude-only plugin enhancement인 ponytail/caveman과 Codex 공통 품질 규칙의 경계를 문서화한다. -- `agents/quality-gates.md`를 공통 절차 문서로 추가한다. -- Codex harness skills가 구현 전 scope/YAGNI 체크와 리뷰 findings 기준을 같은 문서에서 참조한다. -- README, BLUEPRINT, AGENTS, init skeleton, context index가 새 품질 게이트의 역할을 설명한다. - -## 확인 방법 - -- proposal의 Acceptance 명령은 계획 문서와 품질 게이트 파일 존재를 확인한다. -- `YAGNI`, `caveman`, `agents/quality-gates.md` 핵심 연결 문구를 grep으로 확인한다. -- 전체 Task 검증과 Plans sync check는 구현 후 별도로 실행한다. - -## 먼저 끝나야 할 작업 - -- Codex skill 골격이 있어야 연결할 수 있으므로 `4.8`을 Depends로 둔다. - -## 분해 판단 - -이 작업은 문서와 절차 연결만 다루며 런타임 기능 변경을 포함하지 않는다. 산출물이 하나의 품질 게이트 기준으로 묶여 있고 독립 acceptance가 있으므로 추가 분해하지 않는다. diff --git a/.harness/shared/planning/runs/plan-20260708-quality-gates/proposed-tasks.json b/.harness/shared/planning/runs/plan-20260708-quality-gates/proposed-tasks.json deleted file mode 100644 index 2376e47..0000000 --- a/.harness/shared/planning/runs/plan-20260708-quality-gates/proposed-tasks.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "tasks": [ - { - "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": "todo", - "gh": "-", - "section": "Week 4 — Codex 호환 환경 구성" - } - ] -} diff --git a/.harness/tasks/.gitkeep b/.harness/tasks/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.harness/tasks/.gitkeep @@ -0,0 +1 @@ + diff --git a/.harness/tasks/4.1-decomposer-expression-criteria/CHECKPOINTS.md b/.harness/tasks/4.1-decomposer-expression-criteria/CHECKPOINTS.md deleted file mode 100644 index 65e07f5..0000000 --- a/.harness/tasks/4.1-decomposer-expression-criteria/CHECKPOINTS.md +++ /dev/null @@ -1,5 +0,0 @@ -# CHECKPOINTS.md — Task 4.1 완료 지점 - -| 일시 | Task | 내용 | 커밋 | 검증 | -|------|------|------|------|------| -| 2026-07-08 | 4.1 | Task Decomposer 표현 기준 보강 | 미커밋 | Acceptance·validate_tasks·sync check·unittest PASS | diff --git a/.harness/tasks/4.1-decomposer-expression-criteria/HANDOFF.md b/.harness/tasks/4.1-decomposer-expression-criteria/HANDOFF.md deleted file mode 100644 index a17131a..0000000 --- a/.harness/tasks/4.1-decomposer-expression-criteria/HANDOFF.md +++ /dev/null @@ -1,16 +0,0 @@ -# HANDOFF.md — Task 4.1 인수인계 - -## 다음 세션이 먼저 읽을 최소 파일 - -1. `.harness/tasks/4.1-decomposer-expression-criteria/STATE.md` -2. `tasks/index.json` -3. `Plans.md` -4. `agents/task-decomposer.md` - -## 재개 지점 - -- Task `4.1`은 완료됐다. 다음 작업은 `tasks/index.json`의 남은 `todo` Task 중에서 선택한다. - -## 주의사항 - -- 범위는 Task Decomposer 기준 문서의 표현 설명에 한정했다. diff --git a/.harness/tasks/4.1-decomposer-expression-criteria/LOG.md b/.harness/tasks/4.1-decomposer-expression-criteria/LOG.md deleted file mode 100644 index 58e1c75..0000000 --- a/.harness/tasks/4.1-decomposer-expression-criteria/LOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# LOG.md — Task 4.1 작업·에러 로그 - -## 2026-07-08 - -- Task `4.1` 착수. 대상은 `agents/task-decomposer.md`의 표현 기준 설명이다. -- 세분화 게이트 확인: 단일 문서·단일 관심사·Acceptance `grep -q '여러 관심사' agents/task-decomposer.md`로 검증 가능. -- `agents/task-decomposer.md`의 표현 기준을 "및/그리고" 자체 금지가 아니라 여러 관심사 열거 여부로 판단하도록 보강했다. -- Acceptance, task validation, plans sync check, unittest 모두 PASS. -- harness-review 결과 blocker 없음. diff --git a/.harness/tasks/4.1-decomposer-expression-criteria/STATE.md b/.harness/tasks/4.1-decomposer-expression-criteria/STATE.md deleted file mode 100644 index 8835752..0000000 --- a/.harness/tasks/4.1-decomposer-expression-criteria/STATE.md +++ /dev/null @@ -1,31 +0,0 @@ -# STATE.md — Task 4.1 스냅샷 - -## 현재 목표 - -`agents/task-decomposer.md`의 표현 기준이 정상 연결어와 여러 관심사 열거 표현을 구분하도록 명확히 한다. - -## 진행 중인 Task - -- Task ID: `4.1` -- 상태: `done` -- 기준 문서: `tasks/index.json` - -## 마지막 검증 결과 - -- Acceptance PASS: `grep -q '여러 관심사' agents/task-decomposer.md` -- `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) -- harness-review: APPROVE, blocker 없음 - -## 차단 요소 - -- 없음 - -## 마지막 커밋 - -- 없음 - -## 최종 갱신 - -- 2026-07-08 16:15 KST diff --git a/.harness/tasks/4.1-decomposer-expression-criteria/TASKS.md b/.harness/tasks/4.1-decomposer-expression-criteria/TASKS.md deleted file mode 100644 index 0bfcc73..0000000 --- a/.harness/tasks/4.1-decomposer-expression-criteria/TASKS.md +++ /dev/null @@ -1,9 +0,0 @@ -# TASKS.md — Task 4.1 내부 체크리스트 - -- [x] 세분화 기준 확인 -- [x] scope/YAGNI 기준 확인 -- [x] 구현 -- [x] Acceptance 실행 -- [x] 관련 테스트 실행 -- [x] 리뷰 -- [x] `tasks/index.json`/`Plans.md` 갱신 diff --git a/.harness/tasks/4.1-decomposer-expression-criteria/tasks.index.snapshot.json b/.harness/tasks/4.1-decomposer-expression-criteria/tasks.index.snapshot.json deleted file mode 100644 index 05ef5d7..0000000 --- a/.harness/tasks/4.1-decomposer-expression-criteria/tasks.index.snapshot.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "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": "done", - "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 deleted file mode 100644 index ce8ef25..0000000 --- a/.harness/tasks/4.11-rescue-from-main/CHECKPOINTS.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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 deleted file mode 100644 index e1e543f..0000000 --- a/.harness/tasks/4.11-rescue-from-main/HANDOFF.md +++ /dev/null @@ -1,16 +0,0 @@ -# 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 deleted file mode 100644 index 0774094..0000000 --- a/.harness/tasks/4.11-rescue-from-main/LOG.md +++ /dev/null @@ -1,16 +0,0 @@ -# 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 deleted file mode 100644 index 4c8aa36..0000000 --- a/.harness/tasks/4.11-rescue-from-main/STATE.md +++ /dev/null @@ -1,33 +0,0 @@ -# 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 deleted file mode 100644 index b45baa8..0000000 --- a/.harness/tasks/4.11-rescue-from-main/TASKS.md +++ /dev/null @@ -1,8 +0,0 @@ -# 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 deleted file mode 100644 index 2afec07..0000000 --- a/.harness/tasks/4.11-rescue-from-main/tasks.index.snapshot.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "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 deleted file mode 100644 index 4c4352d..0000000 --- a/.harness/tasks/4.12-task-harness-context/CHECKPOINTS.md +++ /dev/null @@ -1,6 +0,0 @@ -# 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 deleted file mode 100644 index d9a26d2..0000000 --- a/.harness/tasks/4.12-task-harness-context/HANDOFF.md +++ /dev/null @@ -1,17 +0,0 @@ -# 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 deleted file mode 100644 index 08531be..0000000 --- a/.harness/tasks/4.12-task-harness-context/LOG.md +++ /dev/null @@ -1,14 +0,0 @@ -# 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 deleted file mode 100644 index 2d941ab..0000000 --- a/.harness/tasks/4.12-task-harness-context/STATE.md +++ /dev/null @@ -1,34 +0,0 @@ -# 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 deleted file mode 100644 index 5c34456..0000000 --- a/.harness/tasks/4.12-task-harness-context/TASKS.md +++ /dev/null @@ -1,8 +0,0 @@ -# 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 deleted file mode 100644 index 2afec07..0000000 --- a/.harness/tasks/4.12-task-harness-context/tasks.index.snapshot.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "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.2-test-agent-pretest-detection/CHECKPOINTS.md b/.harness/tasks/4.2-test-agent-pretest-detection/CHECKPOINTS.md deleted file mode 100644 index f2ff085..0000000 --- a/.harness/tasks/4.2-test-agent-pretest-detection/CHECKPOINTS.md +++ /dev/null @@ -1,5 +0,0 @@ -# CHECKPOINTS.md — Task 4.2 완료 지점 - -| 일시 | Task | 내용 | 커밋 | 검증 | -|------|------|------|------|------| -| 2026-07-08 | 4.2 | test-agent npm test 감지 조건 수정 | 미커밋 | Acceptance·pretest negative check·validate_tasks·sync check·unittest PASS | diff --git a/.harness/tasks/4.2-test-agent-pretest-detection/HANDOFF.md b/.harness/tasks/4.2-test-agent-pretest-detection/HANDOFF.md deleted file mode 100644 index 357b62e..0000000 --- a/.harness/tasks/4.2-test-agent-pretest-detection/HANDOFF.md +++ /dev/null @@ -1,16 +0,0 @@ -# HANDOFF.md — Task 4.2 인수인계 - -## 다음 세션이 먼저 읽을 최소 파일 - -1. `.harness/tasks/4.2-test-agent-pretest-detection/STATE.md` -2. `tasks/index.json` -3. `Plans.md` -4. `agents/test-agent.md` - -## 재개 지점 - -- Task `4.2`는 완료됐다. 다음 작업은 `tasks/index.json`의 남은 `todo` Task 중에서 선택한다. - -## 주의사항 - -- 범위는 test-agent 문서의 stack detection 조건에 한정했다. diff --git a/.harness/tasks/4.2-test-agent-pretest-detection/LOG.md b/.harness/tasks/4.2-test-agent-pretest-detection/LOG.md deleted file mode 100644 index 3c5bdc4..0000000 --- a/.harness/tasks/4.2-test-agent-pretest-detection/LOG.md +++ /dev/null @@ -1,10 +0,0 @@ -# LOG.md — Task 4.2 작업·에러 로그 - -## 2026-07-08 - -- Task `4.2` 착수. 대상은 `agents/test-agent.md`의 npm test 스택 감지 조건이다. -- 세분화 게이트 확인: 단일 문서·단일 조건·Acceptance `grep -q '"test":' agents/test-agent.md`로 검증 가능. -- 기존 조건 `grep -q '"test"' package.json`은 `"pretest"`에도 매칭될 수 있어 `"test":` 키 확인으로 좁혔다. -- Acceptance, task validation, plans sync check, unittest PASS. -- 보강 확인 PASS: `! printf '{"scripts":{"pretest":"echo pre"}}\n' | grep -q '"test":'` -- 명령 오류: 처음에 `printf ... | ! grep -q '"test":'` 형태로 실행해 Bash syntax error가 났다. `!`를 pipeline 앞에 두는 형태로 재실행해 해결했다. diff --git a/.harness/tasks/4.2-test-agent-pretest-detection/STATE.md b/.harness/tasks/4.2-test-agent-pretest-detection/STATE.md deleted file mode 100644 index 7fcf719..0000000 --- a/.harness/tasks/4.2-test-agent-pretest-detection/STATE.md +++ /dev/null @@ -1,32 +0,0 @@ -# STATE.md — Task 4.2 스냅샷 - -## 현재 목표 - -`agents/test-agent.md`가 `"pretest"` 스크립트만 있는 `package.json`을 npm test 스택으로 오판하지 않게 한다. - -## 진행 중인 Task - -- Task ID: `4.2` -- 상태: `done` -- 기준 문서: `tasks/index.json` - -## 마지막 검증 결과 - -- Acceptance PASS: `grep -q '"test":' agents/test-agent.md` -- 보강 확인 PASS: `! printf '{"scripts":{"pretest":"echo pre"}}\n' | grep -q '"test":'` -- `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) -- harness-review: APPROVE, blocker 없음 - -## 차단 요소 - -- 없음 - -## 마지막 커밋 - -- Task `4.1`: `028f524` - -## 최종 갱신 - -- 2026-07-08 16:25 KST diff --git a/.harness/tasks/4.2-test-agent-pretest-detection/TASKS.md b/.harness/tasks/4.2-test-agent-pretest-detection/TASKS.md deleted file mode 100644 index ef7d756..0000000 --- a/.harness/tasks/4.2-test-agent-pretest-detection/TASKS.md +++ /dev/null @@ -1,9 +0,0 @@ -# TASKS.md — Task 4.2 내부 체크리스트 - -- [x] 세분화 기준 확인 -- [x] scope/YAGNI 기준 확인 -- [x] 구현 -- [x] Acceptance 실행 -- [x] 관련 테스트 실행 -- [x] 리뷰 -- [x] `tasks/index.json`/`Plans.md` 갱신 diff --git a/.harness/tasks/4.2-test-agent-pretest-detection/tasks.index.snapshot.json b/.harness/tasks/4.2-test-agent-pretest-detection/tasks.index.snapshot.json deleted file mode 100644 index e2605d8..0000000 --- a/.harness/tasks/4.2-test-agent-pretest-detection/tasks.index.snapshot.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "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": "done", - "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": "done", - "gh": "-", - "section": "Week 4 — Codex 호환 환경 구성" - } - ] -} diff --git a/.harness/tasks/4.3-context-index-missing-docs/CHECKPOINTS.md b/.harness/tasks/4.3-context-index-missing-docs/CHECKPOINTS.md deleted file mode 100644 index dfaf8dc..0000000 --- a/.harness/tasks/4.3-context-index-missing-docs/CHECKPOINTS.md +++ /dev/null @@ -1,5 +0,0 @@ -# CHECKPOINTS.md — Task 4.3 완료 지점 - -| 일시 | Task | 내용 | 커밋 | 검증 | -|------|------|------|------|------| -| 2026-07-08 | 4.3 | CONTEXT_INDEX 미존재 docs 항목 부재 확인 | 미커밋 | Acceptance·rg 확인·validate_tasks·sync check PASS | diff --git a/.harness/tasks/4.3-context-index-missing-docs/HANDOFF.md b/.harness/tasks/4.3-context-index-missing-docs/HANDOFF.md deleted file mode 100644 index 18bfbda..0000000 --- a/.harness/tasks/4.3-context-index-missing-docs/HANDOFF.md +++ /dev/null @@ -1,16 +0,0 @@ -# HANDOFF.md — Task 4.3 인수인계 - -## 다음 세션이 먼저 읽을 최소 파일 - -1. `.harness/tasks/4.3-context-index-missing-docs/STATE.md` -2. `tasks/index.json` -3. `Plans.md` -4. `.harness/CONTEXT_INDEX.md` - -## 재개 지점 - -- Task `4.3`은 완료됐다. 다음 작업은 `tasks/index.json`의 남은 `todo` Task 중에서 선택한다. - -## 주의사항 - -- 실제 문서 항목 제거는 이전 Task `4.12`에서 이미 반영된 상태였다. diff --git a/.harness/tasks/4.3-context-index-missing-docs/LOG.md b/.harness/tasks/4.3-context-index-missing-docs/LOG.md deleted file mode 100644 index e9ebe5c..0000000 --- a/.harness/tasks/4.3-context-index-missing-docs/LOG.md +++ /dev/null @@ -1,8 +0,0 @@ -# LOG.md — Task 4.3 작업·에러 로그 - -## 2026-07-08 - -- Task `4.3` 착수. 대상은 `.harness/CONTEXT_INDEX.md`의 미존재 docs 인덱스 정리다. -- 확인 결과 `.harness/CONTEXT_INDEX.md`와 `templates/skeleton/.harness/CONTEXT_INDEX.md`에는 이미 `docs/PRD.md`, `docs/UserFlow.md`, `docs/Architecture.md` 항목이 없었다. -- 이는 Task `4.12`의 `.harness/tasks/` 구조 정리 과정에서 함께 해소된 상태다. -- Acceptance와 관련 검증을 통과해 Task 상태만 `done`으로 전환했다. diff --git a/.harness/tasks/4.3-context-index-missing-docs/STATE.md b/.harness/tasks/4.3-context-index-missing-docs/STATE.md deleted file mode 100644 index ee54758..0000000 --- a/.harness/tasks/4.3-context-index-missing-docs/STATE.md +++ /dev/null @@ -1,30 +0,0 @@ -# STATE.md — Task 4.3 스냅샷 - -## 현재 목표 - -`.harness/CONTEXT_INDEX.md`에서 이 저장소에 없는 `docs/PRD.md`, `docs/UserFlow.md`, `docs/Architecture.md` 인덱스 항목을 제거한다. - -## 진행 중인 Task - -- Task ID: `4.3` -- 상태: `done` -- 기준 문서: `tasks/index.json` - -## 마지막 검증 결과 - -- Acceptance PASS: `! grep -q 'docs/PRD.md' .harness/CONTEXT_INDEX.md` -- 확인 PASS: `rg -n 'docs/(PRD|UserFlow|Architecture)\\.md' .harness/CONTEXT_INDEX.md templates/skeleton/.harness/CONTEXT_INDEX.md` 결과 없음 -- `python3 scripts/validate_tasks.py` PASS -- `python3 scripts/sync_plans.py --check` PASS - -## 차단 요소 - -- 없음 - -## 마지막 커밋 - -- Task `4.2`: `f47a6d4` - -## 최종 갱신 - -- 2026-07-08 16:30 KST diff --git a/.harness/tasks/4.3-context-index-missing-docs/TASKS.md b/.harness/tasks/4.3-context-index-missing-docs/TASKS.md deleted file mode 100644 index 6382798..0000000 --- a/.harness/tasks/4.3-context-index-missing-docs/TASKS.md +++ /dev/null @@ -1,9 +0,0 @@ -# TASKS.md — Task 4.3 내부 체크리스트 - -- [x] 세분화 기준 확인 -- [x] scope/YAGNI 기준 확인 -- [x] 현재 상태 확인 -- [x] Acceptance 실행 -- [x] 관련 검증 실행 -- [x] 리뷰 -- [x] `tasks/index.json`/`Plans.md` 갱신 diff --git a/.harness/tasks/4.3-context-index-missing-docs/tasks.index.snapshot.json b/.harness/tasks/4.3-context-index-missing-docs/tasks.index.snapshot.json deleted file mode 100644 index 449c9c9..0000000 --- a/.harness/tasks/4.3-context-index-missing-docs/tasks.index.snapshot.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "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": "done", - "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": "done", - "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": "done", - "gh": "-", - "section": "Week 4 — Codex 호환 환경 구성" - } - ] -} diff --git a/.harness/tasks/4.4-rm-danger-patterns/CHECKPOINTS.md b/.harness/tasks/4.4-rm-danger-patterns/CHECKPOINTS.md deleted file mode 100644 index fff5d83..0000000 --- a/.harness/tasks/4.4-rm-danger-patterns/CHECKPOINTS.md +++ /dev/null @@ -1,5 +0,0 @@ -# CHECKPOINTS.md — Task 4.4 완료 지점 - -| 일시 | Task | 내용 | 커밋 | 검증 | -|------|------|------|------|------| -| 2026-07-08 | 4.4 | rm 위험 패턴 ask 목록 확장 | 미커밋 | Acceptance·pattern grep·validate_tasks·sync check·unittest PASS | diff --git a/.harness/tasks/4.4-rm-danger-patterns/HANDOFF.md b/.harness/tasks/4.4-rm-danger-patterns/HANDOFF.md deleted file mode 100644 index 1d9ed6b..0000000 --- a/.harness/tasks/4.4-rm-danger-patterns/HANDOFF.md +++ /dev/null @@ -1,16 +0,0 @@ -# HANDOFF.md — Task 4.4 인수인계 - -## 다음 세션이 먼저 읽을 최소 파일 - -1. `.harness/tasks/4.4-rm-danger-patterns/STATE.md` -2. `tasks/index.json` -3. `Plans.md` -4. `harness.toml` - -## 재개 지점 - -- Task `4.4`는 완료됐다. 다음 작업은 `tasks/index.json`의 남은 `todo` Task 중에서 선택한다. - -## 주의사항 - -- 실제 destructive command는 실행하지 않았다. 문자열 검증으로 충분했다. diff --git a/.harness/tasks/4.4-rm-danger-patterns/LOG.md b/.harness/tasks/4.4-rm-danger-patterns/LOG.md deleted file mode 100644 index f97f8c4..0000000 --- a/.harness/tasks/4.4-rm-danger-patterns/LOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# LOG.md — Task 4.4 작업·에러 로그 - -## 2026-07-08 - -- Task `4.4` 착수. 대상은 `harness.toml`의 `[safety.permissions].ask` 목록이다. -- 세분화 게이트 확인: 단일 설정 파일·단일 safety 관심사·Acceptance `[ $(grep -c 'rm -' harness.toml) -gt 1 ]`로 검증 가능. -- 기존 `rm -r` 외에 `rm -rf`, `rm -fr`, `rm -R`, `rm -Rf`, `rm -fR` 패턴을 추가했다. -- Acceptance, explicit pattern grep, task validation, plans sync check, unittest PASS. -- harness-review 결과 blocker 없음. diff --git a/.harness/tasks/4.4-rm-danger-patterns/STATE.md b/.harness/tasks/4.4-rm-danger-patterns/STATE.md deleted file mode 100644 index 1af8353..0000000 --- a/.harness/tasks/4.4-rm-danger-patterns/STATE.md +++ /dev/null @@ -1,32 +0,0 @@ -# STATE.md — Task 4.4 스냅샷 - -## 현재 목표 - -`harness.toml` ask 목록이 `rm -fr`, `rm -R` 계열 위험 패턴도 포착하도록 확장한다. - -## 진행 중인 Task - -- Task ID: `4.4` -- 상태: `done` -- 기준 문서: `tasks/index.json` - -## 마지막 검증 결과 - -- Acceptance PASS: `[ $(grep -c 'rm -' harness.toml) -gt 1 ]` -- `grep -n 'Bash(rm -' harness.toml` 확인 PASS (`rm -r`, `rm -rf`, `rm -fr`, `rm -R`, `rm -Rf`, `rm -fR`) -- `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) -- harness-review: APPROVE, blocker 없음 - -## 차단 요소 - -- 없음 - -## 마지막 커밋 - -- Task `4.3`: `ba27138` - -## 최종 갱신 - -- 2026-07-08 16:40 KST diff --git a/.harness/tasks/4.4-rm-danger-patterns/TASKS.md b/.harness/tasks/4.4-rm-danger-patterns/TASKS.md deleted file mode 100644 index 9139921..0000000 --- a/.harness/tasks/4.4-rm-danger-patterns/TASKS.md +++ /dev/null @@ -1,9 +0,0 @@ -# TASKS.md — Task 4.4 내부 체크리스트 - -- [x] 세분화 기준 확인 -- [x] scope/YAGNI 기준 확인 -- [x] 구현 -- [x] Acceptance 실행 -- [x] 관련 테스트 실행 -- [x] 리뷰 -- [x] `tasks/index.json`/`Plans.md` 갱신 diff --git a/.harness/tasks/4.4-rm-danger-patterns/tasks.index.snapshot.json b/.harness/tasks/4.4-rm-danger-patterns/tasks.index.snapshot.json deleted file mode 100644 index 72a6b0f..0000000 --- a/.harness/tasks/4.4-rm-danger-patterns/tasks.index.snapshot.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "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": "done", - "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": "done", - "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": "done", - "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": "done", - "gh": "-", - "section": "Week 4 — Codex 호환 환경 구성" - } - ] -} diff --git a/.harness/tasks/4.5-grill-me-output-path/CHECKPOINTS.md b/.harness/tasks/4.5-grill-me-output-path/CHECKPOINTS.md deleted file mode 100644 index 6c0f7bd..0000000 --- a/.harness/tasks/4.5-grill-me-output-path/CHECKPOINTS.md +++ /dev/null @@ -1,5 +0,0 @@ -# CHECKPOINTS.md — Task 4.5 완료 지점 - -| 일시 | Task | 내용 | 커밋 | 검증 | -|------|------|------|------|------| -| 2026-07-08 | 4.5 | grill-me 산출 경로 인자 규약 추가 | 미커밋 | Acceptance·validate_tasks·sync check·unittest PASS | diff --git a/.harness/tasks/4.5-grill-me-output-path/HANDOFF.md b/.harness/tasks/4.5-grill-me-output-path/HANDOFF.md deleted file mode 100644 index e5b0f58..0000000 --- a/.harness/tasks/4.5-grill-me-output-path/HANDOFF.md +++ /dev/null @@ -1,16 +0,0 @@ -# HANDOFF.md — Task 4.5 인수인계 - -## 다음 세션이 먼저 읽을 최소 파일 - -1. `.harness/tasks/4.5-grill-me-output-path/STATE.md` -2. `tasks/index.json` -3. `Plans.md` -4. `.claude/skills/grill-me/SKILL.md` - -## 재개 지점 - -- Task `4.5`는 완료됐다. 다음 작업은 Task `4.6` 또는 `tasks/index.json`의 남은 `todo` Task 중에서 선택한다. - -## 주의사항 - -- 이번 Task는 산출 경로 인자 규약만 다뤘다. headless 호환 모드는 Task `4.6` 범위다. diff --git a/.harness/tasks/4.5-grill-me-output-path/LOG.md b/.harness/tasks/4.5-grill-me-output-path/LOG.md deleted file mode 100644 index 78c9a4c..0000000 --- a/.harness/tasks/4.5-grill-me-output-path/LOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# LOG.md — Task 4.5 작업·에러 로그 - -## 2026-07-08 - -- Task `4.5` 착수. 대상은 `.claude/skills/grill-me/SKILL.md`의 산출 경로 인자 규약이다. -- 세분화 게이트 확인: 단일 skill 문서·단일 사용법 관심사·Acceptance `grep -q '산출 경로' .claude/skills/grill-me/SKILL.md`로 검증 가능. -- 기본 산출 경로 `docs/`, 대상 디렉토리 인자, `--docs` 직접 지정 규약을 추가했다. -- Acceptance, task validation, plans sync check, unittest PASS. -- harness-review 결과 blocker 없음. diff --git a/.harness/tasks/4.5-grill-me-output-path/STATE.md b/.harness/tasks/4.5-grill-me-output-path/STATE.md deleted file mode 100644 index 84df2e8..0000000 --- a/.harness/tasks/4.5-grill-me-output-path/STATE.md +++ /dev/null @@ -1,31 +0,0 @@ -# STATE.md — Task 4.5 스냅샷 - -## 현재 목표 - -`.claude/skills/grill-me/SKILL.md`에 대상 디렉토리와 문서 디렉토리 산출 경로 인자 규약을 명시한다. - -## 진행 중인 Task - -- Task ID: `4.5` -- 상태: `done` -- 기준 문서: `tasks/index.json` - -## 마지막 검증 결과 - -- Acceptance PASS: `grep -q '산출 경로' .claude/skills/grill-me/SKILL.md` -- `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) -- harness-review: APPROVE, blocker 없음 - -## 차단 요소 - -- 없음 - -## 마지막 커밋 - -- Task `4.4`: `88fcbd4` - -## 최종 갱신 - -- 2026-07-08 16:50 KST diff --git a/.harness/tasks/4.5-grill-me-output-path/TASKS.md b/.harness/tasks/4.5-grill-me-output-path/TASKS.md deleted file mode 100644 index 987c4b3..0000000 --- a/.harness/tasks/4.5-grill-me-output-path/TASKS.md +++ /dev/null @@ -1,9 +0,0 @@ -# TASKS.md — Task 4.5 내부 체크리스트 - -- [x] 세분화 기준 확인 -- [x] scope/YAGNI 기준 확인 -- [x] 구현 -- [x] Acceptance 실행 -- [x] 관련 테스트 실행 -- [x] 리뷰 -- [x] `tasks/index.json`/`Plans.md` 갱신 diff --git a/.harness/tasks/4.5-grill-me-output-path/tasks.index.snapshot.json b/.harness/tasks/4.5-grill-me-output-path/tasks.index.snapshot.json deleted file mode 100644 index 158ea3d..0000000 --- a/.harness/tasks/4.5-grill-me-output-path/tasks.index.snapshot.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "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": "done", - "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": "done", - "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": "done", - "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": "done", - "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": "done", - "gh": "-", - "section": "Week 4 — Codex 호환 환경 구성" - } - ] -} diff --git a/.harness/tasks/4.6-grill-me-headless-mode/CHECKPOINTS.md b/.harness/tasks/4.6-grill-me-headless-mode/CHECKPOINTS.md deleted file mode 100644 index 66a1a8b..0000000 --- a/.harness/tasks/4.6-grill-me-headless-mode/CHECKPOINTS.md +++ /dev/null @@ -1,5 +0,0 @@ -# CHECKPOINTS.md — Task 4.6 완료 지점 - -| 일시 | Task | 내용 | 커밋 | 검증 | -|------|------|------|------|------| -| 2026-07-08 | 4.6 | grill-me headless 호환 모드 문서화 | 미커밋 | Acceptance·validate_tasks·sync check·unittest PASS | diff --git a/.harness/tasks/4.6-grill-me-headless-mode/HANDOFF.md b/.harness/tasks/4.6-grill-me-headless-mode/HANDOFF.md deleted file mode 100644 index 7013b05..0000000 --- a/.harness/tasks/4.6-grill-me-headless-mode/HANDOFF.md +++ /dev/null @@ -1,16 +0,0 @@ -# HANDOFF.md — Task 4.6 인수인계 - -## 다음 세션이 먼저 읽을 최소 파일 - -1. `.harness/tasks/4.6-grill-me-headless-mode/STATE.md` -2. `tasks/index.json` -3. `Plans.md` -4. `.claude/skills/grill-me/SKILL.md` - -## 재개 지점 - -- Task `4.6`은 완료됐다. Week 4 백로그 정리 Task `4.1`~`4.6`은 모두 완료됐다. - -## 주의사항 - -- 이번 Task는 비대화형/headless 호환 모드만 다뤘다. 산출 경로 인자 규약은 Task `4.5`에서 완료됐다. diff --git a/.harness/tasks/4.6-grill-me-headless-mode/LOG.md b/.harness/tasks/4.6-grill-me-headless-mode/LOG.md deleted file mode 100644 index f2e5cf1..0000000 --- a/.harness/tasks/4.6-grill-me-headless-mode/LOG.md +++ /dev/null @@ -1,10 +0,0 @@ -# LOG.md — Task 4.6 작업·에러 로그 - -## 2026-07-08 - -- Task `4.6` 착수. 대상은 `.claude/skills/grill-me/SKILL.md`의 비대화형·headless 호환 모드다. -- 세분화 게이트 확인: 단일 skill 문서·단일 실행 경로 관심사·Acceptance `grep -q 'headless' .claude/skills/grill-me/SKILL.md`로 검증 가능. -- 사용자가 응답하지 않거나 headless 환경이면 권장 답으로 초안을 진행하고 미확정 항목은 Open Questions에 남기는 규칙을 추가했다. -- 상태 완료 처리 중 첫 `apply_patch`가 다음 Task 객체 context까지 포함한 hunk 불일치로 실패했다. `grep -n '"id": "4.6"' -A12`로 대상 줄을 재확인한 뒤 status 줄 중심 hunk로 재적용했다. -- Acceptance, task validation, plans sync check, unittest PASS. -- harness-review 결과 blocker 없음. diff --git a/.harness/tasks/4.6-grill-me-headless-mode/STATE.md b/.harness/tasks/4.6-grill-me-headless-mode/STATE.md deleted file mode 100644 index 9b35fb9..0000000 --- a/.harness/tasks/4.6-grill-me-headless-mode/STATE.md +++ /dev/null @@ -1,31 +0,0 @@ -# STATE.md — Task 4.6 스냅샷 - -## 현재 목표 - -`.claude/skills/grill-me/SKILL.md`에 무응답·headless 환경의 비대화형 진행 규칙을 명시한다. - -## 진행 중인 Task - -- Task ID: `4.6` -- 상태: `done` -- 기준 문서: `tasks/index.json` - -## 마지막 검증 결과 - -- Acceptance PASS: `grep -q 'headless' .claude/skills/grill-me/SKILL.md` -- `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) -- harness-review: APPROVE, blocker 없음 - -## 차단 요소 - -- 없음 - -## 마지막 커밋 - -- Task `4.5`: `f6f420b` - -## 최종 갱신 - -- 2026-07-08 17:00 KST diff --git a/.harness/tasks/4.6-grill-me-headless-mode/TASKS.md b/.harness/tasks/4.6-grill-me-headless-mode/TASKS.md deleted file mode 100644 index d942fff..0000000 --- a/.harness/tasks/4.6-grill-me-headless-mode/TASKS.md +++ /dev/null @@ -1,9 +0,0 @@ -# TASKS.md — Task 4.6 내부 체크리스트 - -- [x] 세분화 기준 확인 -- [x] scope/YAGNI 기준 확인 -- [x] 구현 -- [x] Acceptance 실행 -- [x] 관련 테스트 실행 -- [x] 리뷰 -- [x] `tasks/index.json`/`Plans.md` 갱신 diff --git a/.harness/tasks/4.6-grill-me-headless-mode/tasks.index.snapshot.json b/.harness/tasks/4.6-grill-me-headless-mode/tasks.index.snapshot.json deleted file mode 100644 index 35b1a5c..0000000 --- a/.harness/tasks/4.6-grill-me-headless-mode/tasks.index.snapshot.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "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": "done", - "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": "done", - "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": "done", - "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": "done", - "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": "done", - "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": "done", - "gh": "-", - "section": "Week 4 — Codex 호환 환경 구성" - } - ] -} diff --git a/.harness/tasks/readme-user-friendly/CHECKPOINTS.md b/.harness/tasks/readme-user-friendly/CHECKPOINTS.md deleted file mode 100644 index 79cfb14..0000000 --- a/.harness/tasks/readme-user-friendly/CHECKPOINTS.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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 deleted file mode 100644 index ee4f5c1..0000000 --- a/.harness/tasks/readme-user-friendly/HANDOFF.md +++ /dev/null @@ -1,17 +0,0 @@ -# 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 deleted file mode 100644 index 93374ee..0000000 --- a/.harness/tasks/readme-user-friendly/LOG.md +++ /dev/null @@ -1,17 +0,0 @@ -# LOG.md — README 사용자 친화 개편 로그 - -## 2026-07-08 - -- 루트 `.harness/STATE.md`에 README 사용자 친화 개편 목표가 기록돼 있었으나, - 해당 작업은 별도 Task 없이 시작된 뒤 중단됐다. -- 이번 `4.12`에서는 해당 문구를 루트 템플릿에서 제거하고 이 Task별 디렉토리로 이관했다. -- README 개편은 후속 Task로 남긴다. - -## 2026-07-08 - -- `4.13` README 사용자 친화 개편 Task를 planning proposal로 추가했다. -- proposal 검증, 적용, `tasks/index.json`/`Plans.md` sync 검증을 통과했다. -- `4.13` 상태를 `wip`로 전환하고 README 편집을 시작한다. -- README 앞부분에 `먼저 고를 것`, `Quick Start`, `Codex CLI Setup`, `작업별 Workflow`를 추가하고 기존 중복 Quick Start를 제거했다. -- 기존 `Troubleshooting`에 Codex command/quality-gate 관련 항목을 보강했다. -- Acceptance는 통과했고, 감지된 프로젝트 테스트 스위트는 없어 skip했다. diff --git a/.harness/tasks/readme-user-friendly/STATE.md b/.harness/tasks/readme-user-friendly/STATE.md deleted file mode 100644 index a9a92b0..0000000 --- a/.harness/tasks/readme-user-friendly/STATE.md +++ /dev/null @@ -1,32 +0,0 @@ -# STATE.md — README 사용자 친화 개편 스냅샷 - -## 현재 목표 - -`README.md`를 비개발자도 따라가기 쉬운 안내서로 개편한다. - -## 진행 중인 Task - -- Task: `4.13` README 사용자 친화 개편 -- 상태: `done` -- 세분화 게이트: 통과. 단일 문서 산출물이며 Acceptance가 주요 README 섹션 존재를 확인한다. -- scope/YAGNI 게이트: 통과. `README.md`와 Task 상태 문서/계획 산출물만 변경한다. - -## 마지막 검증 결과 - -- `python3 scripts/validate_task_proposal.py --proposal .harness/shared/planning/runs/plan-20260708-164729-fdf4d8/proposed-tasks.json` 통과 -- `python3 scripts/apply_task_proposal.py --proposal .harness/shared/planning/runs/plan-20260708-164729-fdf4d8/proposed-tasks.json` 통과 -- `python3 scripts/validate_tasks.py && python3 scripts/sync_plans.py --check` 통과 -- Acceptance 통과: `grep -q '## 먼저 고를 것' README.md && grep -q '## Quick Start' README.md && grep -q '## Codex CLI Setup' README.md && grep -q '## 작업별 Workflow' README.md && grep -q '## Troubleshooting' README.md` -- 프로젝트 테스트 스위트: 감지된 스택 없음, skip - -## 차단 요소 - -- 없음 - -## 마지막 커밋 - -- 없음 - -## 최종 갱신 - -- 2026-07-08 17:05 KST diff --git a/.harness/tasks/readme-user-friendly/TASKS.md b/.harness/tasks/readme-user-friendly/TASKS.md deleted file mode 100644 index 3c6e254..0000000 --- a/.harness/tasks/readme-user-friendly/TASKS.md +++ /dev/null @@ -1,6 +0,0 @@ -# TASKS.md — README 사용자 친화 개편 내부 체크리스트 - -- [x] README 개편 전용 Task 추가 -- [x] 현재 README 구조 재확인 -- [x] 사용자 행동 순서 기준으로 섹션 재배치 -- [x] 문서 링크와 파일 존재 여부 검증 diff --git a/.harness/tasks/readme-user-friendly/tasks.index.snapshot.json b/.harness/tasks/readme-user-friendly/tasks.index.snapshot.json deleted file mode 100644 index 2afec07..0000000 --- a/.harness/tasks/readme-user-friendly/tasks.index.snapshot.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "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/BLUEPRINT.md b/BLUEPRINT.md index 0cc73fb..146d1c1 100644 --- a/BLUEPRINT.md +++ b/BLUEPRINT.md @@ -1,422 +1,108 @@ -# BLUEPRINT.md — Claude Code / Codex Harness 시스템 구조 +# BLUEPRINT.md — Claude Code / Codex Harness 구조 -> 이 문서는 설치된 harness 시스템이 어떻게 동작하는지 한눈에 파악하기 위한 설계도다. -> 코드가 아니라 "각 레이어가 무슨 역할을 하고, 언제 발동되며, 어떻게 맞물리는가"를 설명한다. +이 문서는 구조 색인이다. 실행 규칙의 단일 출처는 `CLAUDE.md`이고, Codex 호환 절차는 `AGENTS.md`와 `.agents/skills/*`가 맡는다. ---- +## 최소 성공 흐름 -## 전체 구조 한 줄 요약 +1. 목표를 한 문단으로 적는다. +2. `tasks/index.json`에 작은 Task, DoD, Acceptance를 둔다. +3. 구현 전 `agents/task-decomposer.md`와 `agents/quality-gates.md`를 확인한다. +4. 구현 후 Acceptance와 관련 테스트를 실행한다. +5. 실패는 `.harness/tasks//LOG.md`, 완료 요약은 `RUN_REPORT.md`에 남긴다. +6. `tasks/index.json`을 갱신하고 `python3 scripts/sync_plans.py`를 실행한다. -``` -사용자 요청 - → [Plugin Layer] 세션 시작·프롬프트 제출 시 자동 주입 - → [Harness Layer] 요청을 분석해 적절한 Agent에게 위임 - → [Agent Layer] Worker / Reviewer / Advisor 각자의 규칙으로 실행 - → 결과 반환 -``` - ---- - -## 1. Plugin Layer (전역 — user scope) - -세션이 시작되거나 프롬프트가 제출될 때 자동으로 동작하는 네 개의 플러그인. -Claude Code가 관리하며, 이 프로젝트에만 한정되지 않고 모든 세션에 적용된다. - -Codex에서는 이 플러그인 레이어가 자동 적용되지 않는다. 대신 루트 `AGENTS.md`가 -Codex 진입점으로 동작하며, `CLAUDE.md` 규약과 `agents/*.md` 절차, `scripts/` -검증 도구를 직접 실행해 동일한 planning/test/review/state 흐름을 맞춘다. -ponytail/caveman의 durable 원칙은 `agents/quality-gates.md`에 흡수한다. -Claude Code에서는 plugin enhancement가 이를 자동 보강할 수 있고, Codex에서는 -`.agents/skills/*`가 같은 파일을 직접 참조한다. - -### 1-1. claude-code-harness v4 (핵심 엔진) - -Harness 전체를 구동하는 엔진. `harness` 명령어로 직접 호출하거나, -스킬(`/harness-work`, `/harness-plan` 등)을 통해 간접 호출된다. -`tasks/index.json`/Plans.md의 Task를 읽어 worker·reviewer·advisor에게 배분하는 오케스트레이터 역할. - -**주요 명령어** -``` -harness init → 프로젝트 초기화 (harness.toml 생성) -harness sync → harness.toml → .claude-plugin/ 파일 동기화 -harness doctor → 설치 상태 전체 점검 -``` - -**설치** -```bash -# ~/.claude/settings.json의 extraKnownMarketplaces에 추가 후: -claude plugin install claude-code-harness@claude-code-harness-marketplace -``` - ---- - -### 1-2. ponytail (코드 효율 강제) - -"게으른 시니어 개발자" 모드. 코드를 작성하기 전에 7단계 의사결정 사다리를 실행해 -불필요한 코드 작성을 막는다. - -**발동 시점** - -| Hook | 타이밍 | 동작 | -|------|--------|------| -| `SessionStart` | 세션 시작 시 | lazy senior dev 시스템 프롬프트 주입 | -| `SubagentStart` | 서브에이전트 시작 시 | worker 등 서브에이전트에도 동일 규칙 주입 | -| `UserPromptSubmit` | 매 프롬프트 제출 시 | 현재 모드 상태 추적 | - -> 핵심: `SubagentStart` 훅 덕분에 harness가 worker를 spawning할 때 **자동으로** ponytail이 함께 적용된다. - -**7단계 의사결정 사다리** -``` -1. 정말 필요한가? (YAGNI) -2. 이미 코드베이스에 있는가? (재사용) -3. 표준 라이브러리로 가능한가? -4. 네이티브 플랫폼 기능인가? -5. 설치된 의존성으로 가능한가? -6. 한 줄로 가능한가? -7. 그제야: 최소 필수 코드만 작성 -``` - -**설치** -```bash -claude plugin install ponytail@ponytail -``` - ---- - -### 1-3. caveman (출력 토큰 압축) - -응답을 "스마트 원시인"처럼 압축해 출력 토큰을 평균 65% 줄인다. -기술적 정확성은 그대로 유지. - -**발동 시점** - -| Hook | 타이밍 | 동작 | -|------|--------|------| -| `SessionStart` | 세션 시작 시 | caveman 모드 주입 (기본: full) | -| `UserPromptSubmit` | 매 프롬프트 제출 시 | 모드 상태 추적 | - -**압축 강도** -``` -lite → filler/hedging만 제거. 문장 구조·조사 유지. -full → 관사 생략, 단편 문장 허용, 짧은 동의어. (기본값) -ultra → 극단적 압축. 단어도 약어화. -``` - -> worker 에이전트는 `lite`로 고정된다 (2절 참조). - -**설치** -```bash -claude plugin install caveman@caveman -``` - ---- - -### 1-4. value-for-fable (Fable 5 품질 구조, 선택) - -필수 3종(claude-code-harness·ponytail·caveman)과 달리 이 plugin은 optional이다 — -`scripts/setup-plugins.sh` 실행 시 설치 여부를 묻거나 `--skip-vff`/`--with-vff`로 -지정한다. 설치하지 않아도 나머지 3종·harness 규칙은 정상 동작한다. - -Sonnet 모델에 Fable 5의 운영 규율을 적용해 Opus 수준 품질을 -Sonnet 비용(약 70% 절감)으로 끌어낸다. 압축이 아니라 **진단 구조**가 핵심. - -**컴포넌트 구성** - -| 컴포넌트 | 활성화 방식 | 역할 | -|---------|-----------|------| -| Skill (`/itsvff`) | "VFF", "패블 모드" 수동 트리거 | 현재 세션에 즉시 적용 | -| Output Style (vff-v2) | reviewer/advisor MEMORY.md 지시 | 응답 구조 상시 적용 | -| Agent (itsvff) | 복잡한 과제 자동 위임 | 별도 컨텍스트에서 처리 | -| Hook (reminder.sh) | 컨텍스트 400KB 초과 시 자동 | 장시간 세션 드리프트 방지 | - -**VFF v2 핵심 원칙** -``` -- 첫 문장 = 결론 -- 단서 우선 가설 (모든 단서를 설명하는 원인 먼저) -- 측정 먼저 좁히기 (처방 전에 가장 싼 확인 수단 제시) -- 확신도 표시 (직접 보지 않은 것은 단정하지 않는다) -- 충실함 > 압축 -``` - -**설치** -```bash -# ~/.claude/settings.json의 extraKnownMarketplaces에 git URL 추가 후: -claude plugin install value-for-fable@itsinseong -``` - ---- - -## 2. Agent Layer (per-agent 규칙) - -harness가 요청을 처리할 때 spawning하는 세 종류의 플러그인 에이전트 + -프로젝트가 직접 추가한 두 종류의 companion 에이전트. -각각 다른 Plugin 조합을 적용한다. +## 레이어 ``` -.claude/agent-memory/ -├── claude-code-harness-worker/MEMORY.md ← worker 전용 규칙 -├── claude-code-harness-reviewer/MEMORY.md ← reviewer 전용 규칙 -└── claude-code-harness-advisor/MEMORY.md ← advisor 전용 규칙 - -agents/ ← 플러그인이 모르는 프로젝트 전용 절차 문서 -├── task-decomposer.md ← 계획 단계 세분화 + 구현 단계 게이트 (공용) -├── test-agent.md ← worker 완료 후 런타임 검증 -└── quality-gates.md ← scope/YAGNI + review/reporting 공통 기준 -``` - -> **M5 갱신 (2026-07-08) — `agents/*.md` 자체는 호출 가능한 Claude 서브에이전트가 아니다.** -> Claude Code 서브에이전트 경로는 `.claude/agents/`이고 프론트매터 필드는 -> `tools`다. 이 디렉토리의 `role:`·`allowed-tools:` 필드는 어떤 런타임도 -> 읽지 않는다. 다만 `/harness-plan`의 기본 흐름은 이제 `harness.toml [plan]`의 -> `decomposer_command`가 `context.json`을 읽고 proposal 파일을 만드는 **외부 명령 -> 계약**이다. 이 명령이 없거나 실패하면 planning JSONL에 쉬운 실패 메시지를 -> 남기고, 허용된 경우에만 오케스트레이터 Claude가 inline fallback으로 같은 -> proposal 파일 계약을 채운다. -> -> `test-agent`와 `/harness-work` 중 재분해 게이트는 여전히 세션 규칙으로 수행한다. -> v1은 planning 단계만 독립 proposal/감시 구조를 갖고, work/review 이벤트나 -> 범용 runner 추상화는 만들지 않는다. - -### Plugin 적용 매트릭스 - -| | worker | reviewer | advisor | -|--|:------:|:--------:|:-------:| -| **ponytail** (코드 효율) | 전체 | 전체 | 전체 | -| **caveman** (토큰 압축) | **lite** | OFF | OFF | -| **VFF v2** (진단 구조) | 검증·코드 규율만 | **전체** | **전체** | -| **VFF Hook** (드리프트 방지) | 전역 발동 | 전역 발동 | 전역 발동 | -| **quality-gates.md** (repo 기준) | scope/YAGNI | findings/reporting | scope/YAGNI | - -### worker -구현 담당. `tasks/index.json`의 Task를 실제로 코드로 만드는 역할. -- **caveman lite**: filler 제거, 문장 구조는 유지 → 간결하되 읽을 수 있는 응답 -- **ponytail 전체**: 코드 작성 전 7단계 사다리 → MVP 범위 외 구현 금지 -- **VFF 검증·코드 규율만**: 완료 선언 전 검증 의무 + 요청 범위 외 수정 금지 -- **quality-gates.md**: Codex에서도 같은 scope/YAGNI/split 조건을 직접 적용 - -### reviewer -완료된 구현을 검토하는 역할. -- **caveman OFF**: 판단 근거와 리뷰 내용은 압축하지 않는다 -- **ponytail 전체**: 과도한 추상화·오버엔지니어링 지적 기준으로 활용 -- **VFF v2 전체**: 단서 우선 진단, 확신도 표시, 핵심 변수 1~2개로 추천 -- **quality-gates.md**: findings-first, verification-first, 테스트 gap 보고 기준 - -### advisor -방침과 설계 방향을 결정하는 역할. -- **caveman OFF**: 설계 근거는 압축 없이 명확하게 -- **ponytail 전체**: YAGNI 원칙 우선 적용 -- **VFF v2 전체**: 의사결정 조언 시 핵심 변수 먼저, 일반론 나열 금지 -- **quality-gates.md**: 현재 Task 경계 안에서 가장 작은 실행 경로를 우선 - ---- - -## 3. Harness Layer (프로젝트 설정) - -harness 자체의 동작을 정의하는 파일들. - -``` -[project-root]/ -├── harness.toml ← 프로젝트명·버전·안전 규칙 정의 -├── .claude/ -│ ├── settings.local.json ← 프로젝트 스코프 권한 설정 -│ ├── commands/ ← Git helper local commands (/branch-checkout 등) -│ └── agent-memory/ ← 각 Agent MEMORY.md -├── .agents/ -│ └── skills/ ← Codex repo-scoped skills ($grill-me, $harness-work 등) -├── CLAUDE.md ← 프로젝트 전역 규칙 (기술 스택, 응답 포맷 등) -├── AGENTS.md ← Codex 진입점 (CLAUDE.md 규약을 Codex 절차로 실행) -├── tasks/index.json ← Task 상태 단일 출처 -└── Plans.md ← 사람이 읽는 Task 로드맵 (JSON에서 생성) -``` - -**harness.toml 주요 설정** -```toml -[project] -name = "my-project" - -[safety.permissions] -deny = ["Bash(sudo:*)"] -ask = ["Bash(rm -r:*)", "Bash(git push --force:*)"] -``` - ---- - -## 3.5 GitHub 통합 레이어 (선택) - -`harness.toml`의 `[github] enabled = true` 설정 시 활성화. - -> **주의**: `[github]`·`[review]`·`[test]` 섹션은 harness sync가 파싱하지 않는 -> 프로젝트 규약이다 (플러그인 지원 섹션: project/agent/env/safety/tdd). -> 실제 동작은 CLAUDE.md의 지시에 따라 Claude가 세션에서 gh CLI로 직접 수행한다. -> CI 게이트(ci.yml, plans-guard.yml)만 GitHub Actions가 기계적으로 강제한다. - -### 활성화 전제조건 -```bash -gh auth login # GitHub CLI 로그인 -gh repo view # 현재 디렉토리가 GitHub 원격 repo에 연결됐는지 확인 -harness sync # toml → plugin 파일 동기화 -``` - -### Planning 단계 (`/harness-plan`) - -| 액션 | tasks/index.json 입력 | GitHub 결과 | -|------|-------------|-------------| -| section 값 | `Week 1 — [주제]` | Milestone `Week 1` 생성 | -| Task 객체 | `{ "id": "1.1", "title": "...", ... }` | Issue `[1.1] 내용` 생성, Milestone 연결 | -| Issue 번호 기록 | `gh: "#N"` | `tasks/index.json`에 연결된 Issue 번호 보관 | - -### Implementation 단계 (`/harness-work`) - -``` -Task 선택 (todo) - → git checkout -b task/{task-id}-{설명} - → 세션이 tasks/index.json에서 해당 Task를 wip로 갱신하고 Plans.md 재생성 - → worker 구현 - → Acceptance + 관련 테스트 통과 - → 세션이 tasks/index.json에서 해당 Task를 done으로 갱신하고 Plans.md 재생성 - → reviewer 검토 - → gh pr create --title "[{task-id}] ..." --body "Closes #{issue}" - → CI 통과 + 승인 후 main 머지 -``` - -### CI 게이트 - -| Workflow | 트리거 | 목적 | -|----------|--------|------| -| `ci.yml` | push/PR → main | 기술 스택별 빌드·테스트 | -| `plans-guard.yml` | PR → main | `tasks/index.json` 검증 + `Plans.md` sync 확인 | - -### Task Acceptance - -`tasks/index.json` 각 Task의 `acceptance` 값에 기계 검증 명령을 기입한다. -세션 에이전트는 완료 전 해당 명령과 관련 테스트 스위트를 실행한다. GitHub Actions는 -manifest 품질만 확인하고 acceptance 명령을 실행하지 않는다. - -```markdown -| Task | 내용 | DoD | Acceptance | Depends | Status | GH | -| 1.1 | 로그인 구현 | 200 응답 | pytest tests/test_auth.py -k login | - | cc:WIP | #5 | -| 2.0 | DB 마이그레이션 | 스키마 적용 | python manage.py showmigrations \| grep '\[X\]' | 1.1 | cc:WIP | #8 | +사용자 요청 + -> CLAUDE.md / AGENTS.md 규칙 확인 + -> tasks/index.json에서 대상 Task 선택 + -> agents/* gate 적용 + -> 구현, 테스트, 리뷰 + -> Plans.md snapshot 갱신 ``` -- `-` 이면 acceptance 검증 skip (기계 검증 불가 항목) -- 명령이 0 외 종료 코드를 반환하면 Task를 `done`으로 바꾸지 않는다. -- CI에서 실행할 프로젝트 테스트는 `.github/workflows/ci.yml`의 스택 블록에 둔다. - -### Branch Protection 권장 설정 - -``` -GitHub → Settings → Branches → main: - ✓ Require status checks to pass: ci-ok, plans-guard / tasks/index.json 검증, plans-guard / Plans.md sync 검증 - ✓ Require pull request before merging - ✓ Dismiss stale pull request approvals -``` +## 파일 역할 -> 상세 설정 가이드: `docs/github-integration.md` +| 파일 | 역할 | +|---|---| +| `CLAUDE.md` | Claude Code 기준 rulebook. 기획, 구현, 테스트, 리뷰, 상태 문서 규칙의 원본 | +| `AGENTS.md` | Codex 진입점. Claude slash workflow를 Codex skill로 매핑 | +| `harness.toml` | harness 설정과 `[github]`, `[review]`, `[test]`, `[plan]` 요약 인덱스 | +| `tasks/index.json` | Task 상태 단일 출처 | +| `Plans.md` | `tasks/index.json`에서 생성한 사람용 snapshot | +| `.harness/` | Task별 재개 맥락, planning 이벤트, 템플릿 | +| `agents/quality-gates.md` | Claude/Codex 공통 scope, YAGNI, review, reporting gate | +| `agents/task-decomposer.md` | Task 세분화 게이트 | +| `agents/test-agent.md` | Acceptance와 관련 테스트 실행 절차 | +| `.agents/skills/` | Codex repo-scoped skills | +| `.claude/commands/` | Claude Code local commands | +| `.github/workflows/` | CI와 plans guard | +| `scripts/` | task 검증, planning proposal, Plans sync 도구 | ---- +## Claude Code와 Codex 차이 -## 4. 세션 타임라인 — 실제 실행 흐름 +Claude Code는 plugin과 slash command를 사용할 수 있다. Codex는 plugin hook을 자동으로 받지 않으므로 `AGENTS.md`와 `.agents/skills/*`를 통해 같은 절차를 직접 수행한다. -### 세션 시작 시 -``` -1. ponytail SessionStart 훅 → lazy senior dev 시스템 프롬프트 주입 -2. caveman SessionStart 훅 → caveman 모드 주입 (기본 full) - ※ worker spawning 시: worker MEMORY.md의 "lite" 지시로 전환 -``` +ponytail/caveman의 durable 원칙은 Codex에서 별도 plugin으로 실행된다고 가정하지 않는다. 공통 기준은 `agents/quality-gates.md`다. -### 매 프롬프트 제출 시 -``` -3. ponytail UserPromptSubmit 훅 → 현재 모드 상태 추적 -4. caveman UserPromptSubmit 훅 → 현재 모드 상태 추적 -5. VFF UserPromptSubmit 훅 → 컨텍스트 400KB 초과 + VFF 활성 상태면 - VFF 리마인더를 컨텍스트에 주입 -``` +## 수행 주체 -### harness-plan 실행 시 (`/harness-plan`) — 계획 단계 -``` -0. `scripts/build_planning_context.py`가 사용자 요청·기획 문서·기존 Task 요약을 - `.harness/shared/planning/runs/{run_id}/context.json`에 저장 -1. 독립 task-decomposer 명령이 context를 읽고 `proposed-tasks.json` + - `decomposition-report.md` 생성. 명령 미설정/실패 시 planning.jsonl에 쉬운 - 실패 이벤트를 기록하고, 허용된 경우 현재 세션이 inline fallback으로 같은 파일 계약 작성 -2. `scripts/validate_task_proposal.py`가 기존 `tasks/index.json`과 proposal을 - 합쳐 ID 충돌·Depends·Acceptance를 검증 -3. 통과한 proposal만 `scripts/apply_task_proposal.py`가 `tasks/index.json`에 - 반영하고 `Plans.md` 재생성 -4. `[github] enabled = true`면 Task → GitHub Issue 자동 생성 -``` +`agents/*.md`는 호출 가능한 Claude 서브에이전트 파일이 아니라 절차 문서다. 수행 주체는 현재 세션의 Claude Code 또는 Codex다. planning은 inline proposal이 기본이고, 외부 실행은 `harness.toml [plan].decomposer_command`가 있을 때만 위임한다. -### harness-work 실행 시 (`/harness-work`) — 구현 단계 -``` -6. harness가 `tasks/index.json`에서 `todo` Task 선택 -6-a. 세분화 + 품질 게이트: 선택된 Task가 task-decomposer 기준 또는 - `agents/quality-gates.md`의 scope/YAGNI 기준 미달이면(DoD·Acceptance - 미기재, 뭉뚱그린 표현, 관심사 혼재, 과잉 추상화 필요 등) worker에게 넘기지 - 않고 task-decomposer를 다시 호출해 하위 Task(`{task-id}.N`)로 쪼갠 뒤에만 진행 -7. advisor에게 방침 요청 (caveman OFF + VFF v2) -8. worker에게 구현 위임 (caveman lite + ponytail + VFF 검증) - └─ SubagentStart 훅 → ponytail이 worker에 자동 주입 - └─ worker가 작업 중 범위 초과를 발견하면(무관한 파일 3개+/관심사 혼재) 즉시 - 멈추고 task-decomposer를 재호출 — 남은 작업을 하위 Task로 분리 후 재개 -9. test-agent 검증 (Acceptance 명령 + 프로젝트 테스트 스위트) — FAIL 시 worker에 재위임 -10. reviewer에게 검토 요청 (caveman OFF + VFF v2) -11. Acceptance와 관련 테스트 통과 후 세션이 `tasks/index.json`의 대상 Task를 - `done`으로 갱신하고 `scripts/sync_plans.py`를 실행한다. GitHub 연동 시에도 - Actions는 Task 상태를 쓰지 않고 PR 검증만 수행한다. -``` +## Planning -> 6-a와 8의 재분해 게이트는 세션 내 수동 확인으로 강제된다. `plans-guard.yml`은 -> Task manifest와 snapshot sync만 확인한다 (3. Harness Layer 참고). +`/harness-plan` 또는 `$harness-plan`은 다음 순서를 따른다. ---- +1. `scripts/build_planning_context.py`로 `.harness/shared/planning/runs/{run_id}/context.json` 생성 +2. 현재 세션이 proposal 작성 +3. `decomposer_command`가 있으면 외부 명령으로 proposal 생성을 위임할 수 있음 +4. `scripts/validate_task_proposal.py`로 검증 +5. `scripts/apply_task_proposal.py`로 `tasks/index.json` 반영과 `Plans.md` 재생성 -## 5. 사용 가능한 스킬 명령어 +## Implementation -| 명령어 | 역할 | -|--------|------| -| `/grill-me` | 인터뷰 기반 PRD 작성 — 기획 단계 진입점 (프로젝트 스코프 스킬, `.claude/skills/grill-me/`) | -| `/harness-plan` | planning context/proposal 생성 → 검증 통과 Task를 tasks/index.json에 반영 + 읽기용 Plans.md snapshot 갱신 | -| `/harness-work` | tasks/index.json Task 실행 (worker 팀 가동) | -| `/harness-review` | 코드·계획 리뷰 | -| `/harness-sync` | tasks/index.json ↔ Plans.md ↔ 구현 상태 동기화 확인 | -| `/harness-progress` | 진행 현황 대시보드 | -| `/ponytail [lite\|full\|ultra]` | ponytail 강도 수동 조절 | -| `/caveman [lite\|full\|ultra]` | caveman 강도 수동 조절 | -| `/itsvff` | VFF 세션 모드 수동 활성화 | -| `/ponytail-review` | 현재 diff ponytail 기준 리뷰 | -| `/branch-checkout` | 별도 작업 브랜치 생성·전환 (로컬 custom command) | -| `/git-push` | 현재 브랜치 안전 push (로컬 custom command) | -| `/pr-create` | 현재 브랜치에서 draft PR 작성 (로컬 custom command) | -| `/rescue-from-main` | main/master 변경사항을 작업 브랜치로 옮겨 draft PR 작성 (로컬 custom command) | +`/harness-work` 또는 `$harness-work`는 다음 게이트를 통과해야 한다. -Codex에서는 `/grill-me`와 `/harness-*` top-level slash command 대신 -`.agents/skills/`의 `$grill-me`, `$harness-plan`, `$harness-work`, -`$harness-review`, `$harness-progress`, `$harness-sync`, -`$harness-yagni-trimmer`를 사용한다. Git helper는 -`$branch-checkout`, `$git-push`, `$pr-create`, `$rescue-from-main`를 사용한다. -Codex용 별도 `$ponytail`/`$caveman` skill은 제공하지 않는다. 해당 원칙은 -`agents/quality-gates.md`에서 공통 gate로 적용한다. +1. `todo` Task 선택 +2. `agents/task-decomposer.md` 세분화 게이트 확인 +3. `agents/quality-gates.md` scope/YAGNI 확인 +4. `.harness/tasks//STATE.md` 갱신 +5. 구현 +6. Acceptance와 관련 테스트 실행 +7. 리뷰 +8. 통과 시 `tasks/index.json` 상태 변경과 `Plans.md` 재생성 ---- +Actions는 Task 상태를 쓰지 않고 PR 검증만 수행한다. -## 6. Plugin 간 협력 관계 요약 +## GitHub 통합 -``` -ponytail ──────────────────────────────────────────▶ 모든 Agent - 코드를 쓰기 전에 "정말 필요한가?"를 강제 +`harness.toml [github].enabled = true`일 때만 적용한다. 상세 절차는 `CLAUDE.md`와 `docs/github-integration.md`를 따른다. -caveman ───────────────────────────────────────────▶ worker(lite), reviewer/advisor(OFF) - worker: 간결한 진행 응답 / reviewer·advisor: 판단 근거 명확히 +| 항목 | 기준 | +|---|---| +| 브랜치 | `task/{task-id}-{short-slug}` | +| 커밋 | `task {task-id}: {summary}` | +| PR | `gh pr create --draft`, 연결 이슈가 있으면 `Closes #N` | +| 필수 check | `ci-ok`, `plans-guard` | -VFF v2 ────────────────────────────────────────────▶ reviewer/advisor(전체), worker(검증만) - 진단 구조 + 확신도 + 결론 첫 문장 +## 명령 매핑 -VFF Hook ──────────────────────────────────────────▶ 전체 (400KB+ 세션) - 장시간 세션에서 VFF 원칙이 희미해지는 것을 자동으로 방지 +| 목적 | Claude Code | Codex | +|---|---|---| +| 기획 인터뷰 | `/grill-me` | `$grill-me` | +| Task 추가 | `/harness-plan` | `$harness-plan` | +| Task 구현 | `/harness-work` | `$harness-work` | +| 리뷰 | `/harness-review` | `$harness-review` | +| 진행 확인 | `/harness-progress` | `$harness-progress` | +| Plans sync | `/harness-sync` | `$harness-sync` | +| 브랜치 전환 | `/branch-checkout` | `$branch-checkout` | +| push | `/git-push` | `$git-push` | +| PR 생성 | `/pr-create` | `$pr-create` | +| main 작업 구조 | `/rescue-from-main` | `$rescue-from-main` | -harness ───────────────────────────────────────────▶ 전체 조율 - `tasks/index.json`/Plans.md 기반으로 위 세 Agent를 오케스트레이션 +## 남긴 확장 지점 -quality-gates.md ─────────────────────────────────▶ Claude/Codex 공통 절차 - plugin 자동 동작이 없는 환경에서도 scope/YAGNI/review/reporting 기준 유지 -``` +- `scripts/run_task_decomposer.py`: planning proposal 외부 명령 계약 확인용. 새 프로젝트 기본 복사에서는 제외 +- `.github/workflows/ci.yml`: 프로젝트별 스택 테스트 블록 활성화용 +- `.github/workflows/plans-guard.yml`: `tasks/index.json`과 `Plans.md` 드리프트 방지 diff --git a/CLAUDE.md b/CLAUDE.md index 8802d81..5e2b3ab 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,173 +1,91 @@ # [PROJECT_NAME] — CLAUDE.md -## 프로젝트 개요 +Claude Code 기준 rulebook이다. Codex는 `AGENTS.md`와 `.agents/skills/*`로 같은 절차를 수행한다. + +## 프로젝트 기본값 + +- 프로젝트: [프로젝트 한 줄 설명] +- 런타임: [Node.js / Python / Go / ...] +- 프레임워크: [...] +- 배포: [...] +- 저장소: [...] +- 응답 언어: 한국어. 코드, 명령어, 고유명사는 그대로 둔다. +- 코딩 규칙: [프로젝트별 컨벤션 기입] + +## 핵심 파일 + +| 파일 | 역할 | +|---|---| +| `tasks/index.json` | Task 상태 단일 출처 | +| `Plans.md` | `tasks/index.json`에서 생성한 읽기용 snapshot | +| `harness.toml` | harness 설정과 규칙 요약 인덱스 | +| `agents/quality-gates.md` | scope/YAGNI/review/reporting 공통 gate | +| `agents/task-decomposer.md` | 세분화 게이트 | +| `agents/test-agent.md` | Acceptance와 관련 테스트 실행 절차 | +| `.harness/tasks//` | live task 맥락 | -**[프로젝트 한 줄 설명]** -[추가 컨텍스트 — 공모전, 고객사, 내부 툴 등] - -## 기술 스택 - -- **런타임**: [Node.js / Python / Go / ...] -- **주요 프레임워크**: [...] -- **배포**: [...] -- **저장소**: [...] - -## 디렉토리 구조 - -``` -[project-name]/ -├── src/ -├── docs/ -├── tasks/index.json -├── Plans.md -├── harness.toml -└── package.json (또는 pyproject.toml 등) -``` - -## 언어 규칙 +## 기획 규칙 -- **모든 응답은 한국어로 작성한다.** 코드·명령어·고유명사는 그대로 유지. +- 새 프로젝트/기능 착수 시 코드보다 먼저 `/grill-me`를 실행한다. +- 기획 흐름: 인터뷰 -> `docs/PRD.md` 초안 -> 필요한 보완 문서 -> `/harness-plan`. +- 보완 문서는 `docs/templates/{UserFlow,DESIGN,Architecture}.md` 중 필요한 것만 복사한다. +- UI가 있으면 `docs/DESIGN.md`를 UI 구현의 single source of truth로 둔다. UI 없는 프로젝트는 생략한다. +- 확정 결정은 PRD의 Decisions 섹션에 기록한다. ADR은 큰 결정이 쌓일 때만 만든다. -## 코딩 규칙 +## Planning Proposal Gate -- [프로젝트별 코딩 컨벤션 기입] -- [예: 함수 네이밍 규칙, import 순서, 에러 처리 방식 등] +`/harness-plan`이 `tasks/index.json`에 Task를 쓰기 전 반드시 proposal 단계를 거친다. -## 기획 규칙 +1. `scripts/build_planning_context.py`로 `.harness/shared/planning/runs/{run_id}/context.json`을 만든다. +2. 기본은 현재 세션이 `agents/task-decomposer.md` 기준으로 proposal 계약을 채우는 inline 흐름이다. +3. `harness.toml [plan].decomposer_command`가 있으면 외부 명령이 `proposed-tasks.json`과 `decomposition-report.md`를 만들 수 있다. 명령이 없거나 실패하면 `.harness/events/planning.jsonl`에 쉬운 실패 메시지를 남기고, `allow_inline_fallback = true`일 때 현재 세션이 이어서 채운다. +4. `scripts/validate_task_proposal.py`가 기존 Task와 proposal을 합쳐 검증한다. +5. 통과한 경우에만 `scripts/apply_task_proposal.py`로 반영한다. 반영 후 `Plans.md`는 자동 재생성된다. -- **새 프로젝트/기능 착수 시 코드보다 먼저 `/grill-me`를 실행한다.** - 인터뷰 → `docs/PRD.md` 초안 → UserFlow·DESIGN·Architecture 보완 → `/harness-plan` 순서. -- 보완 문서 골격: `docs/templates/UserFlow.md`, `docs/templates/DESIGN.md`, - `docs/templates/Architecture.md` 복사 후 작성. -- **UI가 있는 프로젝트는 DESIGN.md가 UI 구현의 single source of truth다.** - UI 관련 Task는 `tasks/index.json` Depends에 DESIGN.md 작성 Task를 걸어 게이트한다 — - worker가 색·간격·톤을 Task마다 즉흥 결정하지 않게 하기 위함. UI 없는 - 프로젝트(CLI·라이브러리)는 DESIGN.md 생략. -- 기획 중 확정된 결정은 PRD의 Decisions 섹션에 근거와 함께 기록한다. - ADR 별도 파일은 만들지 않는다 — 큰 결정이 쌓이면 그때 `docs/adr/`로 분리. -- **`/harness-plan`이 `tasks/index.json`에 Task를 쓰기 전, 반드시 planning proposal - 단계를 거친다.** `scripts/build_planning_context.py`로 - `.harness/shared/planning/runs/{run_id}/context.json`을 만들고, - 독립 task-decomposer 명령(`harness.toml [plan].decomposer_command`)이 - `proposed-tasks.json`과 `decomposition-report.md`를 생성하게 한다. 명령이 - 비어 있거나 실패하면 `.harness/events/planning.jsonl`에 쉬운 실패 메시지를 - 남기고, `allow_inline_fallback = true`일 때만 현재 세션이 같은 proposal 파일 - 계약을 채운다. -- decomposer proposal은 확정본이 아니다. `scripts/validate_task_proposal.py`로 - 기존 `tasks/index.json`과 합쳐 검증하고, 통과한 경우에만 - `scripts/apply_task_proposal.py`로 `tasks/index.json`에 반영한다. 반영 후 - `Plans.md`는 자동 재생성된다. -- planning 로그는 개발자가 아닌 사용자도 이해할 수 있어야 한다. - `.harness/events/planning.jsonl`의 최상위 `step`·`result`·`message`· - `next_action`은 쉬운 문장으로 쓰고, 내부 이벤트명·run_id·파일 목록은 - `technical` 하위에만 둔다. - 이 순서를 건너뛰고 뭉뚱그린 Task를 바로 적으면 안 된다. -- 이 단계는 harness 플러그인이 자동 실행하지 않는다 — Claude가 이 규칙에 따라 - 세션에서 직접 수행한다 (테스트 규칙과 동일 패턴). +Planning 로그의 최상위 `step`, `result`, `message`, `next_action`은 사용자가 이해할 문장으로 쓴다. 내부 이벤트명, run id, 파일 목록은 `technical` 하위에 둔다. ## 상태 문서 규칙 -- **터미널 세션은 언제든 끊길 수 있다고 가정한다.** 작업 시작 전·작업 단위 - 종료 후마다 해당 Task의 `.harness/tasks//` 상태 문서를 갱신한다. -- **Task 상태의 단일 출처는 `tasks/index.json`이다.** `Plans.md`는 사람이 필요할 때 - `python3 scripts/sync_plans.py`로 갱신하는 읽기용 snapshot이며 stale일 수 있다. - 직접 편집하지 않는다. `.harness/tasks//`는 `tasks/index.json`이 담지 - 않는 세션 맥락만 담는다 — Task 상태를 `.harness/`에 단일 출처처럼 복제하지 않는다. -- 루트 `.harness/STATE.md`, `.harness/HANDOFF.md`, `.harness/TASKS.md`, - `.harness/LOG.md`, `.harness/CHECKPOINTS.md`, `.harness/RUN_REPORT.md`는 **복사용 템플릿**이다. 실제 - 진행 상태를 루트 템플릿에 쓰지 않는다. -- 새 Task 착수 시 `.harness/tasks//`를 만들고 루트 템플릿을 복사해 - `STATE.md`, `HANDOFF.md`, `TASKS.md`, `LOG.md`, `CHECKPOINTS.md`, `RUN_REPORT.md`를 - 둔다. 작업 시작 시점의 `tasks/index.json`은 참고본으로 - `.harness/tasks//tasks.index.snapshot.json`에 저장할 수 있다. -- 세션 재개 시 읽는 순서: `tasks/index.json`에서 `wip` 또는 사용자가 지정한 - Task 확인 → `.harness/tasks//STATE.md` → 있으면 - `.harness/tasks//RUN_REPORT.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`(작업 단위 완료 + 커밋 해시) · `RUN_REPORT.md`(실행 요약, - 결정 근거, 검증 evidence) · `tasks.index.snapshot.json` - (작업 시작 시점 참고본). 루트 `LESSONS.md`는 전역 재발 방지 기록으로 유지한다. - 루트 `CONTEXT_INDEX.md`는 파일 역할 인덱스다. -- 에러는 숨기지 말고 해당 Task의 `LOG.md`에 원문 기록, 해결하면 전역 - `.harness/LESSONS.md`에 재발 방지 항목 추가. 항상 지킬 규칙으로 승격되면 - 이 파일(CLAUDE.md)에도 반영한다. -- 새 파일을 만들거나 기존 파일 역할이 바뀌면 `.harness/CONTEXT_INDEX.md`를 갱신한다. -- 요청이 전제한 파일이 저장소에 없으면 임의 생성하지 않는다 — 스코프 결정이므로 - 보고 후 사용자 확인을 받는다. +- 터미널 세션은 언제든 끊길 수 있다고 가정한다. +- 작업 시작 전과 의미 있는 작업 단위 후 `.harness/tasks//STATE.md`를 갱신한다. +- Task 상태는 `tasks/index.json`만 믿는다. `.harness/tasks//`는 세션 맥락만 담는다. +- 루트 `.harness/{STATE,HANDOFF,TASKS,LOG,CHECKPOINTS,RUN_REPORT}.md`는 새 Task용 템플릿이다. +- 새 Task 착수 시 루트 템플릿을 `.harness/tasks//`로 복사한다. 필요하면 `tasks.index.snapshot.json`도 저장한다. +- 세션 재개 읽기 순서: `tasks/index.json` -> `.harness/tasks//STATE.md` -> 있으면 `RUN_REPORT.md` -> `.harness/LESSONS.md` 최근 항목 -> `Plans.md` -> 필요한 파일만 `.harness/CONTEXT_INDEX.md`에서 선택. +- 에러는 Task `LOG.md`에 원문 기록한다. 반복 방지 규칙은 `.harness/LESSONS.md`에 남긴다. +- 새 파일을 만들거나 파일 역할이 바뀌면 `.harness/CONTEXT_INDEX.md`를 갱신한다. +- 요청이 전제한 파일이 없으면 임의 생성하지 말고 사용자에게 보고한다. ## GitHub 플로우 -> `harness.toml`의 `[github] enabled = true` 시 적용. 미사용이면 이 섹션 삭제. - -- **브랜치 명명**: `task/{task-id}-{짧은-설명}` (예: `task/1.1-auth-login`) -- **커밋 메시지**: task 브랜치 커밋은 `task {task-id}: {내용}` 형태로 시작 — - 커밋↔Task 추적의 근거 (브랜치명만으로는 squash 머지 후 추적이 끊긴다) -- **Planning**: Week → Milestone은 `gh api repos/{owner}/{repo}/milestones -f title="..."` - (gh CLI에 milestone 기본 명령 없음). Task → Issue는 - `gh issue create --title "[{task-id}] {내용}" --milestone "..."` — 본문에 - DoD·Acceptance·Depends 기재. 생성된 이슈 번호를 `tasks/index.json`의 `gh` 값에 `#N`으로 기입 -- **Implementation**: Task당 브랜치 생성 → **브랜치에서 해당 Task를 `wip`로 마킹** - → 구현 → reviewer APPROVE 후 PR 오픈. PR 본문에 `Closes #{이슈번호}` 필수 - (누락 시 머지돼도 이슈가 안 닫힌다) -- **Merge 조건**: CI 통과 (`ci-ok` + `plans-guard`) + PR 승인 후 main 머지 -- **완료 전환**: Acceptance와 관련 테스트가 통과하면 세션 에이전트가 - `tasks/index.json`의 대상 Task를 `done`으로 직접 갱신하고 - `python3 scripts/sync_plans.py`로 snapshot을 재생성한다. GitHub Actions는 - Task 상태를 쓰지 않는다. -- **Task 상태 충돌 주의**: 여러 task 브랜치가 `tasks/index.json` 상태를 동시에 고치면 머지 - 충돌이 잦다 — PR 오픈 전 main을 머지해 최신화할 것 -- **branch protection**: plans-guard는 PR에만 걸린다. main 직접 push를 막으려면 - Settings → Branches에서 required checks 설정 필수 (`[github] require_ci` 참고) -- **CI 설정**: `.github/workflows/ci.yml` 기술 스택 블록 주석 해제 후 사용 +`harness.toml [github].enabled = true`일 때만 적용한다. 미사용이면 이 섹션은 무시해도 된다. + +- 브랜치: `task/{task-id}-{short-slug}` +- 커밋: `task {task-id}: {summary}` +- Planning: Week는 Milestone, Task는 Issue로 만들고 issue 번호를 `tasks/index.json`의 `gh`에 `#N`으로 기록한다. +- Implementation: task branch 생성 -> 해당 Task를 `wip`로 변경 -> 구현 -> Acceptance/test -> review -> PR. +- PR: 연결 이슈가 있으면 `Closes #N`을 본문에 포함한다. +- Merge 조건: `ci-ok`, `plans-guard`, PR 승인. +- 완료 전환: Acceptance와 관련 테스트가 통과하면 세션 에이전트가 `tasks/index.json`을 `done`으로 갱신하고 `python3 scripts/sync_plans.py`를 실행한다. GitHub Actions는 Task 상태를 바꾸지 않는다. +- CI 설정: `.github/workflows/ci.yml`의 기술 스택 블록을 프로젝트에 맞게 켠다. ## 구현 규칙 (세분화 게이트) -- **구현 전 `agents/quality-gates.md`를 scope/YAGNI 게이트로 함께 적용한다.** - ponytail이 설치된 Claude Code 세션에서는 plugin enhancement가 같은 원칙을 - 보강할 수 있지만, 저장소 기준은 이 파일이다. Codex는 ponytail/caveman 자동 - hook을 가정하지 않고 `AGENTS.md`와 `.agents/skills/*`에서 이 문서를 직접 참조한다. -- **`/harness-work` 실행 전, `tasks/index.json`의 대상 `todo` Task가 전부 - `agents/task-decomposer.md`의 세분화 기준을 통과했는지 먼저 확인한다.** - 하나라도 미달(DoD·Acceptance 미기재, "전체/모든/및"으로 뭉뚱그린 표현, - 여러 관심사 혼재 등)이면 worker에게 위임하지 않는다 — task-decomposer를 - 먼저 실행해 하위 Task로 쪼갠 뒤에만 `/harness-work`를 진행한다. -- 이 게이트는 세션 중 수동 확인으로 강제한다. `plans-guard.yml`은 - `tasks/index.json` 구조와 `Plans.md` sync만 검증하며, 세분화·scope/YAGNI - 판단은 `agents/task-decomposer.md`와 `agents/quality-gates.md`를 읽은 - 에이전트 책임이다. -- **worker가 작업 도중 범위가 예상보다 크다는 걸 발견하면**(관련 없는 파일 - 3개 이상을 동시에 고쳐야 하거나, 서로 다른 관심사가 뒤섞여 있음을 인지하면) - 즉시 구현을 멈추고 `agents/task-decomposer.md`를 다시 호출한다. 남은 작업을 - `{원본 task-id}.{n}` 형태 하위 Task로 분리하고, `python3 scripts/sync_plans.py`로 - `Plans.md`를 갱신한다. 원본 Task는 "분리 완료"로 - 마킹한 뒤 하위 Task 단위로 이어서 진행한다 — 같은 에이전트를 재사용해 - 계획 단계와 구현 단계 세분화를 하나의 기준으로 유지한다. -- 이 단계는 harness 플러그인이 자동 실행하지 않는다 — `/harness-work` 흐름에서 - Claude가 이 규칙에 따라 직접 수행한다 (`harness.toml [plan] gate_work` 참고). +- 구현 전 `agents/quality-gates.md`를 scope/YAGNI gate로 적용한다. +- `/harness-work` 실행 전 대상 `todo` Task가 `agents/task-decomposer.md`의 세분화 기준을 통과했는지 확인한다. +- DoD/Acceptance 미기재, 뭉뚱그린 표현, 여러 관심사 혼재, 1 PR 초과 징후가 있으면 구현하지 않는다. `/harness-plan`으로 하위 Task proposal을 먼저 만든다. +- 작업 중 범위가 커지면 멈추고 `agents/task-decomposer.md`와 `agents/quality-gates.md` 기준으로 재분해한다. +- `plans-guard.yml`은 구조와 sync만 검증한다. 세분화와 YAGNI 판단은 현재 세션의 책임이다. ## 테스트 규칙 -- **worker 구현 완료 후, reviewer 검토 전에 `agents/test-agent.md` 절차를 실행한다.** - `tasks/index.json` 해당 Task의 Acceptance 명령 + 프로젝트 테스트 스위트를 돌린다. -- Verdict FAIL이면 reviewer 진입 금지. 실패 내용을 근거로 수정 후 재실행. -- 이 단계는 harness 플러그인이 자동 실행하지 않는다 — `/harness-work` 흐름에서 - Claude가 이 규칙에 따라 직접 수행한다 (`harness.toml [test]` 참고). +- worker 구현 완료 후 reviewer 검토 전에 `agents/test-agent.md` 절차를 실행한다. +- 해당 Task의 Acceptance 명령과 관련 프로젝트 테스트 스위트를 모두 실행한다. +- Verdict FAIL이면 reviewer에 넘기지 않는다. 실패 내용을 근거로 수정 후 재실행한다. ## 리뷰 규칙 -- **worker 완료 후 PR 오픈 전에 반드시 `/harness-review`를 실행한다.** -- 리뷰는 `agents/quality-gates.md`의 review/reporting gate를 따른다. findings를 - 먼저 보고하고, Acceptance·테스트 evidence와 잔여 risk를 짧게 남긴다. -- `harness.toml`의 `[review] require_before_pr = true` 설정 시 harness가 자동 강제. -- `/harness-work` 사용 시 step 9(자동 리뷰 스테이지)가 내장 실행됨 — 별도 호출 불필요. -- `/harness-work` 없이 직접 구현한 경우: 커밋 후 PR 오픈 전 `/harness-review` 수동 실행. -- `REQUEST_CHANGES` 상태에서 PR 오픈 금지. 지적 해결 후 재리뷰 통과 필수. - -## 개발 일정 - -- Week 1: [...] -- Week 2: [...] -- Week N: [...] +- worker 완료 후 PR 오픈 전에 `/harness-review`를 실행한다. +- 리뷰는 `agents/quality-gates.md`의 review/reporting gate를 따른다. +- findings를 먼저 보고하고 Acceptance/test evidence와 잔여 risk를 짧게 남긴다. +- `REQUEST_CHANGES` 상태에서 PR을 열지 않는다. diff --git a/README.md b/README.md index 6611f5d..c44c4da 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,7 @@ Claude Code와 Codex가 같은 repo 규칙으로 계획, 구현, 검증, 리뷰를 진행하게 하는 개인용 harness 템플릿. -최소 성공 흐름: 템플릿 적용 → `CLAUDE.md` 작성 → `tasks/index.json`에 작은 작업 작성 → 구현 → Acceptance/test 실행 → 실패는 `LOG.md`, 완료 요약은 `RUN_REPORT.md`에 기록. - -## 먼저 고를 것 - -| 도구 | 시작점 | 명령 | -|---|---|---| -| Claude Code | `CLAUDE.md` | `/grill-me`, `/harness-plan`, `/harness-work` | -| Codex | `AGENTS.md` | `$grill-me`, `$harness-plan`, `$harness-work` | -| 둘 다 | `CLAUDE.md` 기준, `AGENTS.md` 호환 절차 | 같은 `tasks/index.json` 사용 | - -Claude Code의 ponytail/caveman plugin hook은 Codex에서 자동 실행되지 않는다. Codex는 `AGENTS.md`, `.agents/skills/*`, `agents/quality-gates.md`를 직접 따른다. +최소 성공 흐름: 템플릿 적용 -> `CLAUDE.md` 작성 -> `tasks/index.json`에 작은 작업 작성 -> 구현 -> Acceptance/test 실행 -> 실패는 `LOG.md`, 완료 요약은 `RUN_REPORT.md`에 기록. ## Quick Start @@ -20,25 +10,23 @@ Claude Code의 ponytail/caveman plugin hook은 Codex에서 자동 실행되지 git clone https://github.com/devRonPark/cc-harness-template /tmp/harness-tpl /tmp/harness-tpl/init.sh /path/to/my-project cd /path/to/my-project +python3 scripts/validate_tasks.py +python3 scripts/sync_plans.py --check ``` -복사 직후 아래 파일을 먼저 채운다. +복사 직후 먼저 채울 파일: `harness.toml`, `CLAUDE.md`, `tasks/index.json`, `.claude/agent-memory/*/MEMORY.md`. -- `harness.toml`: `[project] name`, `description` -- `CLAUDE.md`: 프로젝트 개요, 기술 스택, 코딩 규칙 -- `tasks/index.json`: 첫 작업, DoD, Acceptance 명령 -- `.claude/agent-memory/*/MEMORY.md`: Claude Code agent용 Project Context - -그다음: +## 먼저 고를 것 -```bash -python3 scripts/validate_tasks.py -python3 scripts/sync_plans.py -``` +| 도구 | 시작점 | 주요 호출 | +|---|---|---| +| Claude Code | `CLAUDE.md` | `/grill-me`, `/harness-plan`, `/harness-work` | +| Codex | `AGENTS.md` | `$grill-me`, `$harness-plan`, `$harness-work` | +| 둘 다 | `tasks/index.json` | 같은 Task 상태 사용 | -## Codex CLI Setup +Claude Code의 ponytail/caveman plugin hook은 Codex에서 자동 실행되지 않는다. Codex는 `AGENTS.md`, `.agents/skills/*`, `agents/quality-gates.md`를 직접 따른다. -Codex 세션 첫 프롬프트: +## Codex ```text AGENTS.md를 읽어줘. @@ -46,20 +34,9 @@ tasks/index.json과 Plans.md 기준으로 현재 상태를 확인해줘. $harness-progress로 진행 상황을 요약해줘. ``` -Codex skill 매핑: +주요 skill: `$grill-me`, `$harness-plan`, `$harness-work`, `$harness-review`, `$harness-progress`, `$harness-sync`, `$harness-yagni-trimmer`, `$branch-checkout`, `$git-push`, `$pr-create`, `$rescue-from-main`. -| 목적 | 호출 | -|---|---| -| 기획 인터뷰 | `$grill-me` | -| Task 추가 | `$harness-plan` | -| Task 구현 | `$harness-work` | -| 리뷰 | `$harness-review` | -| 진행 확인 | `$harness-progress` | -| Plans sync | `$harness-sync` | -| Harness YAGNI trim | `$harness-yagni-trimmer` | -| Git 작업 | `$branch-checkout`, `$git-push`, `$pr-create`, `$rescue-from-main` | - -## Claude Code Setup +## Claude Code ```bash /tmp/harness-tpl/scripts/setup-plugins.sh --skip-vff @@ -68,8 +45,6 @@ harness doctor 필수 plugin은 `claude-code-harness`, `ponytail`, `caveman`이다. `value-for-fable`은 선택이다. -Claude Code 세션 첫 프롬프트: - ```text 먼저 CLAUDE.md를 읽어줘. 그다음 harness.toml, tasks/index.json, Plans.md, BLUEPRINT.md를 확인해줘. @@ -77,7 +52,7 @@ Claude Code 세션 첫 프롬프트: 구현 후 tasks/index.json의 Acceptance 명령과 관련 테스트를 실행해줘. ``` -## 작업별 Workflow +## Workflow | 하고 싶은 일 | Claude Code | Codex | 완료 전 확인 | |---|---|---|---| @@ -90,12 +65,6 @@ Claude Code 세션 첫 프롬프트: GitHub Actions는 Task 상태를 바꾸지 않는다. Acceptance와 관련 테스트가 통과하면 세션 에이전트가 `tasks/index.json`을 갱신하고 `python3 scripts/sync_plans.py`를 실행한다. -## 포함된 파일 - -핵심 파일은 `CLAUDE.md`, `AGENTS.md`, `harness.toml`, `tasks/index.json`, `Plans.md`, `agents/*`, `.harness/`, `.agents/skills/*`, `.claude/commands/*`, `.github/workflows/*`, `scripts/*`다. - -상세 구조는 `BLUEPRINT.md`, 설치는 `docs/setup-guide.md`, GitHub 연동은 `docs/github-integration.md`를 본다. - ## Session Recovery 재개 시 읽는 순서: @@ -109,31 +78,11 @@ GitHub Actions는 Task 상태를 바꾸지 않는다. Acceptance와 관련 테 루트 `.harness/{STATE,HANDOFF,TASKS,LOG,CHECKPOINTS,RUN_REPORT}.md`는 템플릿이다. 실제 작업 상태는 `.harness/tasks//` 아래에 둔다. -## 기존 프로젝트에 적용 - -기존 README나 docs가 있으면 `init.sh` 전체 실행 대신 `harness.toml`, `CLAUDE.md`, `AGENTS.md`, `agents/`, `templates/skeleton/.harness`, `templates/skeleton/Plans.md`, `templates/skeleton/tasks`, `scripts/`만 골라 복사한다. - -기존 문서가 있으면 `docs/templates/*`를 복사하지 말고 `CLAUDE.md`에서 기존 문서를 링크한다. - -## Recommended Codex Workflow - -Codex는 `AGENTS.md`를 읽힌 뒤 `$harness-progress`, `$harness-work` 순서로 진행한다. Claude Code는 `/grill-me`, `/harness-plan`, `/harness-work`, `/harness-progress`를 쓴다. - -## Troubleshooting - -- Claude Code가 규칙을 안 따르면 첫 응답에서 `CLAUDE.md`를 읽었는지 확인한다. -- Codex에서는 `/harness-work`가 아니라 `$harness-work`를 쓴다. -- Task가 선택되지 않으면 `tasks/index.json` 상태가 `todo`인지 확인한다. -- 완료라는데 검증이 없으면 해당 Task의 Acceptance 명령 실행 여부를 확인한다. -- 세션이 끊기면 Session Recovery 순서로 재개한다. -- GitHub check와 Task 상태가 다르면 `tasks/index.json`을 기준으로 본다. -- 같은 에러가 반복되면 `.harness/tasks//LOG.md`와 `.harness/LESSONS.md`를 확인한다. - -## Plugin 버전 기록 +## 포함된 파일 -설치는 최신 커밋을 받을 수 있으므로 아래 값은 고정이 아니라 마지막 확인 기준선이다. 업데이트 전 diff 확인 후 SHA와 확인일을 갱신한다. +핵심 파일은 `CLAUDE.md`, `AGENTS.md`, `harness.toml`, `tasks/index.json`, `Plans.md`, `agents/*`, `.harness/`, `.agents/skills/*`, `.claude/commands/*`, `.github/workflows/*`, `scripts/*`다. -기준선: claude-code-harness `c220671`, ponytail `1b2760d`, caveman `0d95a81`, value-for-fable `afbfff6`. +상세 구조는 `BLUEPRINT.md`, 설치는 `docs/setup-guide.md`, GitHub 연동은 `docs/github-integration.md`를 본다. ## License diff --git a/docs/claude-code-hooks.md b/docs/claude-code-hooks.md deleted file mode 100644 index cfea19e..0000000 --- a/docs/claude-code-hooks.md +++ /dev/null @@ -1,128 +0,0 @@ -# Claude Code Hooks 설정 가이드 - -이 템플릿엔 현재 hooks가 설정돼 있지 않다. `.claude/settings.local.json.example`은 -`permissions`(deny/ask)만 담고 있고 `hooks` 키는 없다. 이 문서는 훅을 추가하려는 -사람을 위한 가이드다 — 여기 나온 예시는 전부 "추가 권장"이지 이 저장소에 -이미 켜져 있는 것이 아니다. - ---- - -## Hooks가 하는 일 - -Claude Code hooks는 특정 이벤트(도구 호출 전/후, 세션 종료 등)에 shell command를 -자동 실행한다. `.claude/settings.json` 또는 `.claude/settings.local.json`의 -`hooks` 키에 등록한다. - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit|Write", - "hooks": [{ "type": "command", "command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\"" }] - } - ] - } -} -``` - -주요 이벤트: `PreToolUse`(도구 실행 전, 차단 가능) · `PostToolUse`(실행 후) · -`Stop`(세션 응답 종료 시) · `SessionStart`(세션 시작 시). 정확한 스키마는 -Claude Code 공식 문서(`/help` 또는 설정 문서)를 기준으로 삼는다 — 버전마다 -달라질 수 있어 이 문서는 예시 골격만 제공한다. - ---- - -## `harness.toml [safety.permissions]`와의 역할 분담 - -이 템플릿은 위험한 명령 확인을 이미 `harness.toml`의 `[safety.permissions]` -(`deny`/`ask` 목록)로 처리한다. - -```toml -[safety.permissions] -deny = ["Bash(sudo:*)"] -ask = ["Bash(rm -r:*)", "Bash(git push --force:*)"] -``` - -`PreToolUse` 훅으로 같은 패턴을 또 막으면 이중 확인이 된다. 훅은 -**permissions로 표현 못 하는 것**(포매팅, 테스트 자동 실행, 파일 갱신 확인 등)에만 쓴다. - ---- - -## 이 템플릿에 맞는 권장 훅 - -### 1. 파일 수정 후 formatter/lint - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit|Write", - "hooks": [{ "type": "command", "command": "<프로젝트 formatter 명령>" }] - } - ] - } -} -``` - -프로젝트마다 명령이 다르므로 `<프로젝트 formatter 명령>`은 실제 값으로 채운다 -(예: `npm run lint:fix`, `black .` 등). 없는 프로젝트라면 이 훅을 추가하지 않는다. - -### 2. 위험 명령 확인 (permissions로 못 잡는 것만) - -`[safety.permissions]`가 이미 커버하는 패턴은 제외하고, 프로젝트 고유의 -위험 명령(예: 특정 배포 스크립트)만 `PreToolUse`로 별도 확인한다. - -### 3. 세션 종료 시 Task별 `STATE.md` 갱신 확인 - -CLAUDE.md는 "작업 시작 전·작업 단위 종료 후마다 `.harness/tasks//` 상태 문서를 -갱신한다"를 규칙으로 두지만, 강제하는 훅은 없다 — 세션 Claude가 규칙을 -따르는지에 의존한다. 자동 강제하려면 `Stop` 훅에서 현재 Task의 -`.harness/tasks//STATE.md` mtime이 세션 시작 이후로 갱신됐는지 -확인하는 스크립트를 붙인다. - -```json -{ - "hooks": { - "Stop": [ - { - "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" }] - } - ] - } -} -``` - -이 예시는 골격이다 — `/tmp/session-start-marker`를 세션 시작 시 만드는 -`SessionStart` 훅과 짝을 이뤄야 실제로 동작한다. 이 템플릿 자체엔 아직 -구현돼 있지 않다. - -### 4. Acceptance 미실행 상태에서 완료 처리 방지 - -CLAUDE.md 테스트 규칙(`worker 구현 완료 후, reviewer 검토 전에 -agents/test-agent.md 절차를 실행한다`)은 세션 규약이지 훅이 아니다. 기계적으로 -강제하려면 Plans.md에서 Task를 `cc:완료`로 바꾸는 Edit를 `PreToolUse`로 -가로채 `.harness/tasks//LOG.md`에 최근 Acceptance 실행 기록이 있는지 확인하는 훅을 -붙일 수 있다 — 다만 이 검증 로직은 프로젝트마다 Task 완료 절차가 다르므로 -직접 짜야 한다. 현재 GitHub Actions는 Acceptance 실행을 대신하지 않고 -`tasks/index.json`과 `Plans.md`의 검증만 수행한다. - ---- - -## 적용 방법 - -1. `.claude/settings.local.json`(또는 팀 공유용이면 `.claude/settings.json`)에 - `hooks` 키를 추가한다. -2. Claude Code를 재시작한다 — 훅은 세션 시작 시 로드되므로 실행 중 추가한 - 변경은 반영되지 않는다. -3. 의도한 이벤트에서 실제로 실행되는지 짧게 스팟 체크한다(예: 파일 하나 - 수정해보고 formatter가 도는지 확인). - ---- - -## 참고 - -- [../README.md](../README.md#claude-code-hooks) — 요약 -- [global-settings-reference.md](./global-settings-reference.md) — `~/.claude/settings.json` 전역 설정 레퍼런스 -- `harness.toml`의 `[safety.permissions]`, `[safety.sandbox]` — 이 템플릿의 1차 안전장치 diff --git a/docs/error-memory.md b/docs/error-memory.md deleted file mode 100644 index 75d018f..0000000 --- a/docs/error-memory.md +++ /dev/null @@ -1,98 +0,0 @@ -# Error Memory — 반복 실패 방지 규칙 - -에러를 숨기지 않고 기록해서, 같은 실수를 같은 원인으로 두 번 반복하지 않게 -하는 것이 Task별 `LOG.md`와 전역 `.harness/LESSONS.md`의 목적이다. - ---- - -## `LOG.md`와 `LESSONS.md`의 차이 - -| | Task별 `LOG.md` | 루트 `LESSONS.md` | -|---|---|---| -| 경로 | `.harness/tasks//LOG.md` | `.harness/LESSONS.md` | -| 성격 | 해당 Task 작업·에러 일지 | 해결 후 전역 재발 방지 요약 | -| 순서 | 위→아래로 추가만 (시간순) | 최신 항목 우선 | -| 내용 | 실패한 명령·에러 메시지 원문, 해당 Task 작업 기록 | 원인 + 다음엔 어떻게 판단할지 | -| 읽는 시점 | 해당 Task 재개 또는 에러 이력 확인 시 | 세션 시작 시 최근 항목 우선 | -| 승격 | — | 항상 지킬 규칙이면 `CLAUDE.md`에도 반영 | - -루트 `.harness/LOG.md`는 복사용 템플릿이다. 실제 에러 원문은 반드시 해당 Task의 -`.harness/tasks//LOG.md`에 남긴다. -Task가 끝나거나 중단될 때 `.harness/tasks//RUN_REPORT.md`에는 에러 원문을 -반복하지 않고 원인, 해결 요약, 검증 evidence, `LOG.md` 위치만 남긴다. - -에러가 나면 먼저 Task별 `LOG.md`에 원문을 남기고, 해결되면 루트 -`.harness/LESSONS.md`에 재발 방지 요약을 추가한다. `LOG.md`만 남기면 다음 세션이 -"왜"를 다시 찾아야 하고, `LESSONS.md`만 남기면 실제 에러 메시지가 사라져 재현이 -어렵다. - ---- - -## Task별 `LOG.md` 실제 형식 - -```markdown -# LOG.md — Task 4.12 작업·에러 로그 - -## 2026-07-08 - -- 무엇을 시도했고 어떤 결과가 났는지 시간순으로 기록한다. -- 실패한 명령: - `python3 scripts/example.py` -- 에러 원문: - `ValueError: example` -``` - -날짜 헤더 아래 불릿으로 그날의 작업·에러를 쌓는다. 에러는 "무엇을 시도했고 -무엇이 실패했는지"를 있는 그대로 적는다. - ---- - -## `LESSONS.md` 실제 형식 - -```markdown -# LESSONS.md — 재발 방지 기록 - -## 2026-07-08 — Task status 변경은 Task ID context와 함께 패치할 것 - -- `tasks/index.json`에는 `"status": "todo"` 같은 반복 문자열이 많다. -- 예방 규칙: status 패치는 반드시 `"id": "{task-id}"`와 title/acceptance 일부를 - 포함한 context hunk로 적용하고, 직후 대상 Task 상태를 확인한다. -``` - -각 항목은 **상황 → 왜 문제였는지 → 다음엔 어떻게 판단할지** 순서로 쓴다. -"CLAUDE.md 반영: 불필요/완료" 한 줄을 붙여, 일회성 판단 습관인지 항상 지킬 -규칙으로 승격됐는지 구분한다. - ---- - -## 언제 승격하는가 - -같은 유형의 실수가 두 번째 발생했거나, 프로젝트 전체에 적용되는 원칙이면 -`CLAUDE.md`로 승격한다. Task 하나에만 해당하는 세부 이력은 해당 Task 디렉토리에 -남기고, 다른 Task에서도 반복될 수 있는 판단 규칙만 `LESSONS.md`에 남긴다. - ---- - -## 기록 프롬프트 - -```text -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/tasks//LOG.md에 남겨줘. -해결되면 원인과 재발 방지 규칙을 .harness/LESSONS.md에 요약해줘. -항상 지켜야 할 규칙이면 CLAUDE.md에도 반영해줘. -``` - ---- - -## 참고 - -- [../README.md](../README.md#error-memory--반복-실패-방지) — 요약 -- [session-recovery.md](./session-recovery.md) — `.harness/tasks/` 기반 읽는 순서 -- [../CLAUDE.md](../CLAUDE.md) — 상태 문서 규칙 원본 diff --git a/docs/github-integration.md b/docs/github-integration.md index 33e78d6..6bdd024 100644 --- a/docs/github-integration.md +++ b/docs/github-integration.md @@ -1,156 +1,96 @@ -# GitHub 통합 가이드 +# GitHub Integration -harness 템플릿의 GitHub 연동은 Issue/PR 추적과 검증 CI만 맡는다. -`tasks/index.json`의 `todo`/`wip`/`done` 상태는 세션 에이전트가 직접 관리하며, -GitHub Actions는 Task 상태를 변경하지 않는다. +GitHub 연동은 Issue/PR 추적과 CI 검증만 맡는다. `tasks/index.json`의 `todo`/`wip`/`done` 상태는 세션 에이전트가 직접 바꾸며, GitHub Actions는 Task 상태를 변경하지 않는다. ---- +## Enable -## 사전 조건 +사전 조건: -- `gh` CLI 설치 및 로그인: `gh auth login` -- GitHub에 원격 repo 존재 (`git remote -v`로 확인) - ---- - -## Step 1. 활성화 +```bash +gh auth login +git remote -v +``` -`harness.toml`에서 `[github]` 섹션 수정: +`harness.toml`: ```toml [github] enabled = true -# remote = "origin" # 기본값, 변경 불필요 -# default_branch = "main" # 기본값 -milestone_per_week = true # Week → Milestone 자동 생성 -issue_per_task = true # Task → Issue 자동 생성 -require_ci = true # CI 통과 없이 main 머지 금지 +milestone_per_week = true +issue_per_task = true +require_ci = true ``` -이후: - ```bash harness sync ``` ---- +## CI + +`.github/workflows/ci.yml`에서 `placeholder`를 실제 `check`/`test` job으로 교체하고 `ci-ok`의 `needs`를 갱신한다. + +Branch protection required check는 이름이 고정된 `ci-ok` 하나를 기술 스택 CI 대표로 등록한다. -## Step 2. Branch Protection 설정 +## Branch Protection -GitHub 웹 → **Settings → Branches → Add branch ruleset → main**: +GitHub Settings -> Branches -> main: -| 항목 | 값 | -|------|----| +| 설정 | 값 | +|---|---| | Require status checks | `ci-ok` | | Require status checks | `plans-guard / tasks/index.json 검증` | | Require status checks | `plans-guard / Plans.md sync 검증` | -| Require pull request | ✓ | -| Dismiss stale reviews | ✓ | +| Require pull request | enabled | +| Dismiss stale reviews | enabled | -`ci-ok`를 required check로 등록하면 `.github/workflows/ci.yml`의 스택 블록을 -켜거나 잡을 바꿔도 이 이름은 유지된다. Task 상태 관련 check는 더 이상 필수로 -두지 않는다. +Task 상태 관련 check는 required로 두지 않는다. 상태 전환은 Acceptance/test를 본 세션 에이전트 책임이다. ---- +## Planning -## Step 3. CI 기술 스택 활성화 +`/harness-plan` 또는 `$harness-plan` 후 GitHub 연동 시: -`.github/workflows/ci.yml` 열고 프로젝트 스택 블록 주석 해제: +1. `tasks/index.json`의 section -> GitHub Milestone +2. 각 Task -> GitHub Issue +3. 생성된 issue 번호 -> Task `gh` 값 `#N` -```yaml -# 예: Node.js 프로젝트 -# ── [STACK: Node.js / Bun] 블록 주석 해제 후 ── -check: - name: Type check & lint - ... -``` - -활성화 후 `placeholder` job 삭제 + `ci-ok`의 `needs:`를 `[check, test]`로 -변경. required check 이름(`ci-ok`)은 바꿀 필요 없다. - ---- - -## Step 4. Planning 단계 사용법 - -```text -/harness-plan -``` - -GitHub 연동 시 추가 동작: - -1. `tasks/index.json`의 `section` → GitHub Milestone 생성 -2. 각 Task 객체 → GitHub Issue 생성 (`[1.1] 내용` 형식) -3. `tasks/index.json`의 `gh` 값에 `#N` 자동 기입 - -직접 생성 시: +수동 생성: ```bash -# Milestone -gh api repos/{owner}/{repo}/milestones -f title="Week 1" -f due_on="YYYY-MM-DDT00:00:00Z" - -# Issue +gh api repos/{owner}/{repo}/milestones -f title="Week 1" gh issue create --title "[1.1] 기능 구현" --body "DoD: ..." --milestone "Week 1" ``` ---- - -## Step 5. Implementation 단계 사용법 - -```text -/harness-work -``` - -GitHub 연동 시에도 상태 전환은 세션 에이전트가 수행한다: +## Implementation -1. Task 시작 → `task/{task-id}-{설명}` 브랜치 생성 -2. 대상 Task를 `wip`로 갱신하고 `python3 scripts/sync_plans.py` 실행 -3. 구현 + Acceptance + 관련 테스트 통과 -4. 대상 Task를 `done`으로 갱신하고 `python3 scripts/sync_plans.py` 실행 -5. PR 오픈 (`Closes #{issue}` 포함) -6. `ci-ok` + `plans-guard` 통과 + 승인 후 main 머지 +1. `task/{task-id}-{short-slug}` 브랜치 생성 +2. Task를 `wip`로 바꾸고 `python3 scripts/sync_plans.py` 실행 +3. 구현, Acceptance, 관련 테스트 통과 +4. Task를 `done`으로 바꾸고 `python3 scripts/sync_plans.py` 실행 +5. `gh pr create --draft` 실행. 연결 issue가 있으면 `Closes #N` 포함 +6. `ci-ok`, `plans-guard`, review 승인 후 merge -직접 브랜치/PR 생성 시: +수동 PR: ```bash -git checkout -b task/1.1-auth-login -# ... 구현 및 검증 ... +git switch -c task/1.1-auth-login git push -u origin task/1.1-auth-login -gh pr create \ - --title "[1.1] auth login 구현" \ - --body "Closes #5" \ - --base main +gh pr create --draft --title "[1.1] auth login 구현" --body "Closes #5" ``` ---- - -## plans-guard 동작 원리 +## plans-guard -PR → main 시 `plans-guard.yml`은 쓰기 없는 검증만 수행한다. - -```text -tasks/index.json 검증: - JSON 스키마, 중복 ID, Depends 존재 여부, 상태 값, blocked_reason 등 - manifest 품질을 scripts/validate_tasks.py로 검증 - -Plans.md sync 검증: - python3 scripts/sync_plans.py --check - tasks/index.json에서 생성된 읽기용 snapshot과 현재 Plans.md가 일치하는지 확인 -``` +`plans-guard.yml`은 PR에서 쓰기 없는 검증만 수행한다. -`plans-guard`는 브랜치명과 WIP 상태를 맞추거나, Acceptance 명령을 실행하거나, -Task 상태 변경 범위를 제한하지 않는다. 그 판단과 실행은 `CLAUDE.md`, -`agents/task-decomposer.md`, `agents/test-agent.md`, `agents/quality-gates.md`를 -따르는 세션 에이전트 책임이다. +- `python3 scripts/validate_tasks.py` +- `python3 scripts/sync_plans.py --check` ---- +Acceptance 명령 실행, branch와 WIP 상태 일치 확인, Task 상태 변경 범위 판단은 `CLAUDE.md`, `agents/test-agent.md`, `agents/quality-gates.md`를 따르는 세션 에이전트 책임이다. -## 자주 쓰는 명령어 +## Useful Commands ```bash -gh issue list # 현재 이슈 목록 -gh issue create --title "..." --body "..." -gh pr list # PR 목록 -gh pr create --title "..." --body "Closes #N" -gh run list --workflow=ci.yml # CI 실행 이력 -gh run watch # CI 실시간 모니터링 +gh issue list +gh pr list +gh run list --workflow=ci.yml +gh run watch ``` diff --git a/docs/global-settings-reference.md b/docs/global-settings-reference.md deleted file mode 100644 index 67f85c3..0000000 --- a/docs/global-settings-reference.md +++ /dev/null @@ -1,91 +0,0 @@ -# 전역 설정 레퍼런스 — `~/.claude/settings.json` - -이 파일은 모든 프로젝트에 전역으로 적용되는 Claude Code 설정이다. -프로젝트별 설정은 `.claude/settings.local.json`에 분리한다. - ---- - -## 완성본 예시 - -`value-for-fable@itsinseong` (및 `itsinseong` 마켓플레이스 항목)은 선택 plugin이다 — -설치하지 않기로 했다면 아래 예시에서 해당 항목을 빼면 된다. `scripts/setup-plugins.sh`를 -`--skip-vff`로 실행하면 자동으로 제외된 상태가 된다. - -```json -{ - "enabledPlugins": { - "claude-code-harness@claude-code-harness-marketplace": true, - "ponytail@ponytail": true, - "caveman@caveman": true, - "value-for-fable@itsinseong": true - }, - "extraKnownMarketplaces": { - "claude-code-harness-marketplace": { - "source": { - "source": "github", - "repo": "Chachamaru127/claude-code-harness" - } - }, - "ponytail": { - "source": { - "source": "github", - "repo": "DietrichGebert/ponytail" - } - }, - "caveman": { - "source": { - "source": "github", - "repo": "JuliusBrussee/caveman" - } - }, - "itsinseong": { - "source": { - "source": "git", - "url": "https://github.com/itsinseong/value-for-fable.git" - } - } - }, - "tui": "fullscreen", - "theme": "dark" -} -``` - ---- - -## 각 항목 설명 - -### `enabledPlugins` - -Plugin ID → `true/false` 맵. `false`로 설정하면 설치는 유지되지만 비활성화. - -### `extraKnownMarketplaces` - -Claude Code 공식 마켓플레이스 외에 커스텀 소스를 등록하는 섹션. -`source.github` → GitHub repo, `source.git` → 임의 Git URL. - -### `tui` - -터미널 UI 모드. `fullscreen`이 기본 권장값 (전체화면 인터페이스). - -### `theme` - -`dark` / `light` / `auto`. - ---- - -## 프로젝트 스코프 권한 설정 - -전역이 아닌 특정 프로젝트에만 적용할 권한은 `.claude/settings.local.json`에 기입. - -```json -{ - "permissions": { - "allow": [ - "Bash(npm run *)" - ] - } -} -``` - -`allow` 목록에 없는 명령은 실행 전 사용자 확인 요청. -`harness.toml`의 `deny` / `ask` 규칙이 여기보다 우선 적용된다. diff --git a/docs/harness-observability-traceability.md b/docs/harness-observability-traceability.md deleted file mode 100644 index 433b844..0000000 --- a/docs/harness-observability-traceability.md +++ /dev/null @@ -1,45 +0,0 @@ -# Harness Observability / Traceability / Context Preservability - -이 문서는 실행 중 생긴 사실을 어디에 남길지 정하는 짧은 기준이다. 자동화를 -늘리기 위한 문서가 아니라, 다음 세션과 리뷰어가 같은 증거를 빠르게 찾게 하는 -운영 규칙이다. - -## Observability - -무슨 일이 있었는지는 아래 순서로 재구성한다. - -1. `tasks/index.json` — 어떤 Task가 대상인지 확인한다. -2. `.harness/tasks//RUN_REPORT.md` — 실행 요약, 변경 파일, 검증 evidence를 본다. -3. `.harness/tasks//LOG.md` — 실패한 명령, 에러 원문, 긴 stdout/stderr를 본다. -4. `.harness/tasks//CHECKPOINTS.md` — 완료 지점과 커밋 해시를 확인한다. -5. `.harness/events/planning.jsonl` — planning 단계에서 proposal 흐름이나 실패를 확인한다. - -`LOG.md`는 원문과 타임라인, `RUN_REPORT.md`는 사람이 빠르게 읽는 요약이다. 긴 -출력은 `RUN_REPORT.md`에 붙이지 않는다. - -## Traceability - -왜 바뀌었는지는 아래 연결로 남긴다. - -- 사용자 요청 또는 기획 문서 → `tasks/index.json` Task -- Task DoD/Acceptance → 실행 명령과 결과 -- 주요 판단 → `RUN_REPORT.md`의 `Traceability` 섹션 -- 반복될 수 있는 실수 → `.harness/LESSONS.md` -- 큰 제품/아키텍처 결정 → PRD `Decisions` 섹션 또는 필요 시 `docs/adr/` - -작은 운영 결정 때문에 ADR을 만들 필요는 없다. 대신 Task별 `RUN_REPORT.md`에 결정과 -근거를 한 줄로 남긴다. - -## Context Preservability - -세션이 끊기거나 context compaction이 일어나면 아래만 먼저 읽는다. - -1. `tasks/index.json` -2. `.harness/tasks//STATE.md` -3. `.harness/tasks//RUN_REPORT.md` -4. `.harness/LESSONS.md` 최근 항목 -5. `Plans.md` -6. `.harness/CONTEXT_INDEX.md`에서 필요한 추가 파일 - -위험한 context 자동화는 기본으로 켜지지 않는다. hooks를 쓰려면 -`docs/claude-code-hooks.md`의 optional 예시처럼 프로젝트별로 명시적으로 추가한다. diff --git a/docs/session-recovery.md b/docs/session-recovery.md deleted file mode 100644 index e0b97b7..0000000 --- a/docs/session-recovery.md +++ /dev/null @@ -1,120 +0,0 @@ -# Session Recovery — 세션 복구 절차 심화 - -터미널 세션은 언제든 끊긴다는 전제로 이 템플릿을 만들었다. `.harness/`는 -그 전제에 대응하는 상태 문서 세트다. 이제 루트 `.harness/*.md`는 템플릿이고, -실제 작업 맥락은 `.harness/tasks//` 아래에 Task별로 보관한다. - ---- - -## 읽는 순서 (고정) - -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`, -`RUN_REPORT.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//RUN_REPORT.md` | 실행 요약, 결정 근거, 검증 evidence | 완료/인수인계/감사 시 | -| `.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/` 파일은 세션 맥락을 담을 뿐, -상태 판정의 단일 출처가 아니다. - ---- - -## 새 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 .harness/RUN_REPORT.md .harness/tasks//RUN_REPORT.md -cp tasks/index.json .harness/tasks//tasks.index.snapshot.json -``` - -``는 사람이 알아볼 수 있게 `4.12-task-harness-context`처럼 Task ID와 짧은 -slug를 함께 쓴다. - ---- - -## 여러 프로젝트를 동시에 운영할 때 - -이 템플릿을 여러 프로젝트에 각각 적용하면 `.harness/`도 프로젝트마다 독립적으로 -생긴다. 프로젝트 A의 `.harness/tasks/.../STATE.md`가 프로젝트 B의 재개에 영향을 -주지 않는다. 여러 프로젝트를 오갈 땐 세션 시작 시 `pwd`, `git status`, 그리고 -`tasks/index.json`의 `wip` Task부터 확인한다. - ---- - -## 모니터/훅이 주는 상태 요약은 참고만 - -세션 시작 시 어떤 모니터나 훅이 "WIP 1건" 같은 요약을 보여줄 수 있다. 이 요약이 -`tasks/index.json`·`git status`의 실제 상태와 어긋난 사례가 있었다. 요약은 -참고만 하고, 판단은 항상 `tasks/index.json`과 `git status` 직접 확인으로 한다. - ---- - -## 실행 보고서와 원문 로그 분리 - -`LOG.md`는 실패한 명령, 에러 원문, 세부 작업 타임라인을 append-only로 남기는 곳이다. -`RUN_REPORT.md`는 다음 세션이나 리뷰어가 빠르게 읽을 요약이다. Task 완료 또는 중단 -시점에는 `RUN_REPORT.md`에 변경 요약, 주요 결정 근거, Acceptance/test evidence, -남은 위험을 짧게 정리한다. 긴 stdout/stderr는 `RUN_REPORT.md`에 붙이지 말고 -`LOG.md` 위치만 링크한다. - ---- - -## 재개 프롬프트 - -```text -Read tasks/index.json to identify the wip or requested Task. -Then read .harness/tasks//STATE.md, -.harness/tasks//RUN_REPORT.md if it exists, -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 -tasks/index.json에서 wip 또는 지정된 Task를 확인한 뒤, -.harness/tasks//STATE.md, 있으면 -.harness/tasks//RUN_REPORT.md, .harness/LESSONS.md 최근 항목, -Plans.md를 읽어줘. -마지막으로 기록된 상태부터 작업을 재개해줘. -Acceptance 재검증이 필요한 경우가 아니면 이미 완료된 Task는 반복하지 마. -계속하기 전에 현재 상태와 다음 작업을 먼저 요약해줘. -``` - ---- - -## 참고 - -- [../README.md](../README.md#session-recovery) — 요약 -- [error-memory.md](./error-memory.md) — Task별 `LOG.md`와 전역 `LESSONS.md` 작성 규칙 -- [../CLAUDE.md](../CLAUDE.md) — 상태 문서 규칙 원본 diff --git a/docs/setup-guide.md b/docs/setup-guide.md index 2b30851..0d25fda 100644 --- a/docs/setup-guide.md +++ b/docs/setup-guide.md @@ -1,268 +1,72 @@ -# Claude Code Harness 설정 가이드 +# Setup Guide -새 프로젝트에 harness 템플릿을 적용하는 단계별 가이드. +새 프로젝트에는 수동 복사 대신 `init.sh`를 사용한다. ---- +## Prerequisites -## 사전 조건 +- Claude Code CLI +- Node.js 18+ +- Python 3 +- GitHub 연동 시 `gh` CLI -- Claude Code CLI 설치됨 -- Node.js 18+ (harness CLI 의존) -- GitHub 계정 (배포 선택 사항) +## Claude Plugin Setup ---- - -## Step 1. 전역 Plugin 설치 (최초 1회) - -### 1-1. 자동 스크립트 실행 (권장) - -`~/.claude/settings.json`을 손으로 편집하지 않는다 — 대신 스크립트가 -기존 설정을 백업하고 필요한 값만 병합한다. +최초 1회: ```bash git clone https://github.com/devRonPark/cc-harness-template /tmp/harness-tpl -/tmp/harness-tpl/scripts/setup-plugins.sh +/tmp/harness-tpl/scripts/setup-plugins.sh --skip-vff ``` -`~/.claude/settings.json`에 필수 plugin 3종(claude-code-harness·ponytail·caveman)을 -등록(기존 설정은 백업 후 보존)하고, `claude plugin install`로 설치한 뒤, -`harness doctor`까지 자동 실행한다. 여러 번 실행해도 안전(멱등적)하다. +`setup-plugins.sh`는 `~/.claude/settings.json`을 백업한 뒤 required plugin만 병합한다. +`value-for-fable`을 쓰려면 `--with-vff`를 사용한다. -`value-for-fable`은 선택 plugin이다 — 대화형 터미널이면 설치 여부를 묻고, -무인 실행 시에는 아래처럼 명시한다. - -```bash -./scripts/setup-plugins.sh --skip-vff # value-for-fable 제외 -./scripts/setup-plugins.sh --with-vff # value-for-fable 포함 -``` - -### 1-2. 수동 설치 (참고용) - -자동 스크립트 대신 직접 하고 싶다면 (아래 `value-for-fable`/`itsinseong` 블록과 -`claude plugin install value-for-fable@itsinseong`은 선택 사항이므로 원치 않으면 생략): - -```json -{ - "enabledPlugins": { - "claude-code-harness@claude-code-harness-marketplace": true, - "ponytail@ponytail": true, - "caveman@caveman": true, - "value-for-fable@itsinseong": true - }, - "extraKnownMarketplaces": { - "claude-code-harness-marketplace": { - "source": { - "source": "github", - "repo": "Chachamaru127/claude-code-harness" - } - }, - "ponytail": { - "source": { - "source": "github", - "repo": "DietrichGebert/ponytail" - } - }, - "caveman": { - "source": { - "source": "github", - "repo": "JuliusBrussee/caveman" - } - }, - "itsinseong": { - "source": { - "source": "git", - "url": "https://github.com/itsinseong/value-for-fable.git" - } - } - }, - "tui": "fullscreen", - "theme": "dark" -} -``` - -```bash -claude plugin install claude-code-harness@claude-code-harness-marketplace -claude plugin install ponytail@ponytail -claude plugin install caveman@caveman -claude plugin install value-for-fable@itsinseong # 선택 -``` - -### 1-3. 설치 확인 +확인: ```bash harness doctor ``` -전체 항목이 통과되면 완료 (자동 스크립트를 썼다면 이미 실행됨). - ---- - -## Step 2. 새 프로젝트에 템플릿 적용 - -### 2-1. 이 레포 클론 후 파일 복사 +## Apply Template ```bash -# 새 프로젝트 디렉토리로 이동 -cd /path/to/my-new-project - -# 템플릿 파일 복사 -cp /path/to/cc-harness-template/harness.toml . -cp /path/to/cc-harness-template/CLAUDE.md . -cp /path/to/cc-harness-template/AGENTS.md . -cp /path/to/cc-harness-template/templates/skeleton/Plans.md . -cp -r /path/to/cc-harness-template/templates/skeleton/tasks . -cp -r /path/to/cc-harness-template/scripts . -cp /path/to/cc-harness-template/BLUEPRINT.md . -mkdir -p .agents -cp -r /path/to/cc-harness-template/.agents/skills .agents/ -mkdir -p .claude -cp -r /path/to/cc-harness-template/.claude/commands .claude/ -mkdir -p .claude/skills -cp -r /path/to/cc-harness-template/.claude/skills/grill-me .claude/skills/ -mkdir -p .claude/agent-memory/claude-code-harness-worker -mkdir -p .claude/agent-memory/claude-code-harness-reviewer -mkdir -p .claude/agent-memory/claude-code-harness-advisor -cp /path/to/cc-harness-template/.claude/agent-memory/claude-code-harness-worker/MEMORY.md \ - .claude/agent-memory/claude-code-harness-worker/ -cp /path/to/cc-harness-template/.claude/agent-memory/claude-code-harness-reviewer/MEMORY.md \ - .claude/agent-memory/claude-code-harness-reviewer/ -cp /path/to/cc-harness-template/.claude/agent-memory/claude-code-harness-advisor/MEMORY.md \ - .claude/agent-memory/claude-code-harness-advisor/ -cp /path/to/cc-harness-template/.claude/settings.local.json.example .claude/settings.local.json -``` - -### 2-2. 프로젝트별 커스터마이징 - -**harness.toml** -```toml -[project] -name = "my-actual-project-name" # ← 변경 -description = "프로젝트 설명" # ← 변경 -``` - -**CLAUDE.md** — `[PROJECT_NAME]`, 기술 스택, 코딩 규칙 섹션 채우기. - -**AGENTS.md** — Codex가 같은 규약을 읽는 진입점. `[PROJECT_NAME]`을 확인하고, -프로젝트별로 Codex에만 필요한 예외가 있으면 `CLAUDE.md`와 드리프트 없이 함께 기록한다. - -**.agents/skills/** — Codex repo-scoped skills. `$harness-work`, `$branch-checkout`, -`$git-push`, `$pr-create` 등으로 호출한다. - -**.claude/commands/** — Claude Code local custom commands. `/branch-checkout`, -`/git-push`, `/pr-create`를 제공한다. - -**tasks/index.json** — Week 구조와 Task 상태 단일 출처. DoD는 검증 가능한 기준으로 작성. -사람이 읽는 로드맵이 필요하면 `python3 scripts/sync_plans.py`로 **Plans.md** snapshot을 갱신한다. - -**agent-memory/*.md** — `## Project Context` 섹션에 프로젝트 이름과 PRD 경로 입력. - -### 2-3. harness 초기화 - -```bash -harness sync -harness doctor +/tmp/harness-tpl/init.sh /path/to/my-project +cd /path/to/my-project +python3 scripts/validate_tasks.py +python3 scripts/sync_plans.py --check ``` ---- +복사 후 채울 파일: -## Step 3. GitHub 연동 (선택) +- `harness.toml`: `[project] name`, `description` +- `CLAUDE.md`: 프로젝트 개요, 기술 스택, 코딩 규칙 +- `AGENTS.md`: Codex에서 추가로 필요한 예외가 있는지 확인 +- `tasks/index.json`: 첫 Task, DoD, Acceptance +- `.claude/agent-memory/*/MEMORY.md`: Project Context -GitHub로 코드 변경사항을 관리하려면: +## GitHub Optional -### 3-1. 사전 조건 확인 +GitHub 연동을 쓰는 경우: ```bash -gh auth login # GitHub CLI 로그인 -git remote -v # 원격 repo 연결 확인 +gh auth login +git remote -v ``` -### 3-2. harness.toml 활성화 - -```toml -[github] -enabled = true -milestone_per_week = true -issue_per_task = true -require_ci = true -``` - -```bash -harness sync -``` - -### 3-3. CI 스택 블록 활성화 - -`.github/workflows/ci.yml`에서 프로젝트 기술 스택 블록 주석 해제. -`placeholder` job 삭제 후 `ci-ok`의 `needs:`를 활성화한 스택 잡으로 업데이트. - -### 3-4. Branch Protection 설정 - -GitHub → Settings → Branches → main: -- Require status checks: `ci-ok`, `plans-guard / tasks/index.json 검증`, `plans-guard / Plans.md sync 검증` -- Require pull request before merging - -> 상세 가이드: `docs/github-integration.md` - ---- - -## Step 4. 작업 시작 - -### tasks/index.json에 Task 추가 - -``` -/harness-plan -``` - -### Task 실행 (worker 팀 가동) - -``` -/harness-work -``` - -### 진행 상황 확인 - -``` -/harness-progress -/harness-sync -``` - ---- - -## 자주 쓰는 명령어 치트시트 - -| 명령어 | 동작 | -|--------|------| -| `harness doctor` | 설치 상태 점검 | -| `harness sync` | toml → plugin 파일 동기화 | -| `/harness-plan` | Task 추가·관리 | -| `/harness-work` | Task 실행 | -| `/harness-review` | 코드 리뷰 | -| `/harness-progress` | 진행 대시보드 | -| `/caveman lite\|full\|ultra` | 압축 강도 조절 | -| `/ponytail lite\|full\|ultra` | lazy mode 강도 조절 | -| `/itsvff` | VFF 세션 모드 활성화 | -| `gh issue list` | GitHub 이슈 목록 | -| `gh pr list` | GitHub PR 목록 | -| `gh run watch` | CI 실행 실시간 모니터링 | - ---- - -## 문제 해결 - -### `harness doctor` 항목 실패 시 - -```bash -# plugin 재설치 -claude plugin uninstall claude-code-harness@claude-code-harness-marketplace -claude plugin install claude-code-harness@claude-code-harness-marketplace -harness sync -``` +1. `harness.toml [github].enabled = true`로 바꾼다. +2. `.github/workflows/ci.yml`의 `placeholder`를 실제 `check`/`test` job으로 교체한다. +3. `ci-ok`의 `needs`를 실제 job 목록으로 바꾼다. +4. Branch protection required check는 `ci-ok`, `plans-guard / tasks/index.json 검증`, `plans-guard / Plans.md sync 검증`을 등록한다. -### worker가 caveman full로 응답할 때 +상세 설정은 `docs/github-integration.md`를 본다. -worker MEMORY.md의 `### caveman: lite 모드` 섹션이 제대로 작성됐는지 확인. -Claude Code 재시작 후 재시도. +## Daily Commands -### Task가 선택되지 않을 때 +| 목적 | Claude Code | Codex | +|---|---|---| +| 기획 | `/grill-me`, `/harness-plan` | `$grill-me`, `$harness-plan` | +| 구현 | `/harness-work` | `$harness-work` | +| 리뷰 | `/harness-review` | `$harness-review` | +| 진행 확인 | `/harness-progress`, `/harness-sync` | `$harness-progress`, `$harness-sync` | -Task status가 `tasks/index.json`에서 `todo`인지 확인. `wip`는 이미 진행 중으로 간주됨. +Task 상태는 `tasks/index.json`이 단일 출처다. `Plans.md`는 `python3 scripts/sync_plans.py`로 생성한다. diff --git a/docs/specs/2026-07-03-planning-pipeline-design.md b/docs/specs/2026-07-03-planning-pipeline-design.md deleted file mode 100644 index 753fe1b..0000000 --- a/docs/specs/2026-07-03-planning-pipeline-design.md +++ /dev/null @@ -1,53 +0,0 @@ -# 기획 단계 산출물 파이프라인 — 설계 - -작성일: 2026-07-03 -상태: 승인됨 - -## 문제 - -템플릿 파이프라인이 Plans.md Task 0.1 "PRD 작성"에서 시작하지만, -PRD를 **어떻게** 만드는지에 대한 규약·도구·골격이 없다. -기획 단계 산출물(PRD, User Flow, Architecture)이 공백. - -## 목표 - -- 아이디어 → PRD → 보완 문서 → Plans.md 로 이어지는 기획 파이프라인을 템플릿에 내장 -- 스킬 의존성 self-contained (유저 글로벌 스킬 불필요) - -## Non-goals - -- planner agent — grill-me로 부족할 때 추가 (합의됨) -- ADR.md 별도 파일 — PRD Decisions 섹션으로 시작, 개발 중 필요 시 `docs/adr/` 분리 -- UserFlow/Architecture 전용 스킬 — 템플릿 골격 + CLAUDE.md 규약으로 충분 - -## 흐름 - -``` -아이디어 → /grill-me (인터뷰) → docs/PRD.md 초안 - → UserFlow.md · Architecture.md 보완 - → /harness-plan 이 PRD 기반 Plans.md 생성 → 기존 harness 흐름 -``` - -## 변경 파일 - -| 파일 | 종류 | 내용 | -|------|------|------| -| `.claude/skills/grill-me/SKILL.md` | 신규 | 프로젝트 스코프 인터뷰 스킬. 질문 1개씩, 각 질문에 권장답 제시, 코드베이스로 답 가능하면 탐색으로 대체. 종료 시 `docs/PRD.md` 작성까지 스킬 책임 | -| `docs/templates/PRD.md` | 신규 | Goals / Non-goals / 요구사항 / 성공기준 / Decisions / Open Questions 골격 | -| `docs/templates/UserFlow.md` | 신규 | mermaid flowchart 골격 (화면·상태 전이) | -| `docs/templates/Architecture.md` | 신규 | 스택 / 컴포넌트 경계 / 데이터 흐름 골격 | -| `CLAUDE.md` | 수정 | 기획 규약 섹션 추가: 착수 시 `/grill-me` → PRD → 보완 → `/harness-plan`. 플러그인 자동 실행 아님 명시 (test 규칙과 동일 패턴) | -| `Plans.md` | 수정 | Task 0.1을 `/grill-me` 기반으로 갱신, Acceptance `test -f docs/PRD.md` | -| `README.md` / `BLUEPRINT.md` | 수정 | 파이프라인 다이어그램·문서 표에 기획 단계 반영 | - -## 엣지 케이스 - -- **인터뷰 중단**: PRD에 Open Questions 남긴 채 저장. 재실행 시 기존 PRD 읽고 이어서. -- **기존 PRD 보유 프로젝트**: 스킬이 기존 문서 읽고 gap만 인터뷰. -- **grill-me 이름 충돌**: 유저 글로벌 `grill-me`와 동명. 프로젝트 스코프가 우선되며 내용상 동일 계열이라 실질 충돌 없음. - -## 검증 - -- `test -f .claude/skills/grill-me/SKILL.md` -- `test -f docs/templates/PRD.md && test -f docs/templates/UserFlow.md && test -f docs/templates/Architecture.md` -- `grep -q 'grill-me' CLAUDE.md Plans.md README.md` diff --git a/docs/specs/2026-07-08-planning-observability.md b/docs/specs/2026-07-08-planning-observability.md deleted file mode 100644 index b9fdf7d..0000000 --- a/docs/specs/2026-07-08-planning-observability.md +++ /dev/null @@ -1,131 +0,0 @@ -# Planning Observability — 비개발자도 이해 가능한 Task 분해 감시 구조 - -## Summary - -- `/harness-plan`의 기본 흐름은 독립 task-decomposer proposal 방식으로 정의한다. -- v1의 독립 실행은 "외부 명령 계약"으로 제한한다. 설정된 decomposer 명령이 - 없거나 실패하면 쉬운 실패 로그를 남기고, 허용된 경우에만 inline fallback을 - 사용한다. -- 확정 Task의 SSOT는 계속 `tasks/index.json`이다. decomposer는 확정 파일을 - 직접 수정하지 않는다. -- planning 단계만 v1 감시 대상으로 삼는다. `/harness-work`, `/harness-review`, - SQLite, 범용 이벤트 프레임워크는 제외한다. -- 로그와 보고서는 개발자가 아닌 사용자도 이해할 수 있는 문장을 최상위에 두고, - 도구용 값은 `technical` 하위에 둔다. - -## Key Changes - -- 공유 planning 작업대는 run 단위로 분리한다. - - `.harness/shared/planning/runs/{run_id}/context.json` - - `.harness/shared/planning/runs/{run_id}/proposed-tasks.json` - - `.harness/shared/planning/runs/{run_id}/decomposition-report.md` - - `.harness/shared/planning/latest.json`: 최신 run의 경로만 가리키는 작은 인덱스 - - `.harness/events/planning.jsonl`: planning 단계 JSONL 로그 -- `planning.jsonl`의 사용자 친화 필드: - - `time`: 발생 시각 - - `step`: `요청 정리`, `작업 나누기 시작`, `성공 기준 검사`, `작업 목록 반영`, - `계획 문서 갱신`, `실패` - - `result`: `시작`, `성공`, `실패`, `반영됨` - - `message`: 사용자가 이해할 수 있는 설명 - - `next_action`: 실패하거나 멈췄을 때 할 일 - - `details_file`: 자세한 설명 파일 경로 - - `technical`: `event`, `run_id`, `files`, `command_exit_code` 등 도구용 값 -- `harness.toml`의 `[plan]` 요약 인덱스에 추가한다. 실행 SSOT는 계속 - `CLAUDE.md`다. - - `decomposer_mode = "process"` - - `decomposer_command = ""` - - `allow_inline_fallback = true` - - `proposal_dir = ".harness/shared/planning"` - - `planning_event_log = ".harness/events/planning.jsonl"` -- 독립 decomposer 명령 계약: - - 명령은 `context.json`을 입력으로 받고 `proposed-tasks.json`과 - `decomposition-report.md`를 생성해야 한다. - - 명령이 비어 있거나 실패하면 `planning.jsonl`에 사람이 이해 가능한 실패 - 이벤트를 남긴다. - - fallback이 허용되면 현재 세션이 같은 파일 계약을 채운다. - - fallback 사용도 반드시 로그에 남긴다. -- `proposed-tasks.json` 규칙: - - 기존 호환을 위해 Task 필드는 `id`, `title`, `dod`, `acceptance`, `depends`, - `status`, `gh`, `section`을 유지한다. - - 새 proposal의 `status`는 항상 `todo`, `gh`는 `-`로 시작한다. - - `dod`와 `title` 값은 비개발자도 이해 가능한 문장으로 쓴다. - - apply 직전에 현재 `tasks/index.json`을 다시 읽어 ID 충돌과 Depends를 - 재검증한다. -- `decomposition-report.md` 규칙: - - "이번에 만든 작업", "자동 반영하지 않은 항목", "사용자 확인이 필요한 결정" - 섹션을 둔다. - - `DoD`, `Acceptance`, `Depends`만 쓰지 않고 `완료 기준`, `확인 방법`, - `먼저 끝나야 할 작업`으로 풀어 쓴다. - - `Acceptance: -`는 왜 자동 확인이 어려운지 설명한다. - -## Implementation Changes - -- 골격 추가: - - 현재 repo와 `templates/skeleton/.harness/`에 - `shared/planning/runs/.gitkeep`와 `events/.gitkeep`를 추가한다. - - `init.sh`의 기존 `.harness` 복사 흐름으로 새 골격이 포함되게 한다. -- 스크립트 추가: - - `scripts/planning_log.py`: planning 전용 JSONL append. 범용 이벤트 - 프레임워크로 만들지 않는다. - - `scripts/build_planning_context.py`: 사용자 요청, 기획 문서 경로, 기존 Task - 요약, task-decomposer 규칙 경로를 run 디렉토리의 `context.json`에 저장한다. - - `scripts/run_task_decomposer.py`: 외부 decomposer 명령 계약을 실행하고, - 명령 미설정·실패·산출물 누락을 사용자 친화 JSONL로 기록한다. - - `scripts/validate_task_proposal.py`: proposal과 현재 task 목록을 함께 - 검증한다. - - `scripts/apply_task_proposal.py`: apply 직전 재검증 후 `tasks/index.json`에 - append하고 `scripts/sync_plans.py`를 실행한다. -- 문서 갱신: - - `agents/task-decomposer.md`: 독립 proposal 기본, 직접 apply 금지, 쉬운 문장 - 작성 규칙 명시. - - `CLAUDE.md`, `README.md`, `BLUEPRINT.md`, `docs/session-recovery.md`, - `CONTEXT_INDEX.md`: planning run 디렉토리, JSONL 감시, fallback, 실패 처리 - 흐름 문서화. -- 실패 처리: - - JSON 파싱 실패, 필수 파일 누락, validation 실패, apply 전 충돌은 모두 - `planning.jsonl`에 쉬운 메시지로 기록한다. - - 원문 에러가 있으면 기존 규칙대로 해당 Task의 `.harness/tasks//LOG.md`에도 기록한다. - -## Explicitly Out Of V1 - -- `work.jsonl` -- `review.jsonl` -- `/harness-work` 이벤트 -- `/harness-review` 이벤트 -- 범용 `harness_events.py` 추상화 -- SQLite 또는 `.sql` -- 복잡한 decomposer runner 추상화 -- 모든 대화 턴 결과 기록 - -## Test Plan - -- 단위 테스트: - - `planning_log.py`가 사용자 친화 필드와 `technical` 필드를 포함한 JSONL 한 - 줄을 append한다. - - `build_planning_context.py`가 run별 디렉토리를 만들고 `latest.json`을 갱신한다. - - proposal 검증이 정상 proposal을 통과시킨다. - - `true`, `|| echo skip`, repo 밖 경로 acceptance가 proposal에서도 실패한다. - - 기존 Task ID와 중복되는 proposal이 실패한다. - - apply 직전 `tasks/index.json`이 바뀐 경우 재검증에서 실패한다. -- 통합 시나리오: - - decomposer 명령이 비어 있으면 `실패` 이벤트와 `next_action`이 기록된다. - - fallback 허용 시 inline proposal을 만들어 검증과 apply를 완료한다. - - 적용 후 `python3 scripts/sync_plans.py --check`가 통과한다. - - `python3 scripts/validate_tasks.py`가 통과한다. - - `tail -f .harness/events/planning.jsonl`로 봤을 때 비개발자도 단계와 다음 - 행동을 이해할 수 있다. -- 회귀 테스트: - - 기존 `python3 -m unittest tests.test_tasks -v` 통과. - - `init.sh`로 새 임시 프로젝트에 복사했을 때 `.harness/shared/planning/runs/`와 - `.harness/events/`가 포함된다. - -## Assumptions - -- v1의 "독립 decomposer 기본"은 외부 명령 계약을 기본 실행 방식으로 둔다는 - 뜻이다. 템플릿 자체가 특정 LLM/agent provider를 강제하지 않는다. -- `decomposer_command`가 비어 있으면 독립 실행은 명확히 실패로 기록되고, - `allow_inline_fallback = true`일 때만 현재 세션 fallback으로 이어진다. -- 기존 `tasks/index.json` 필드명은 호환성 때문에 유지한다. 대신 값과 보고서는 - 쉬운 표현을 우선한다. -- `.harness/tasks//LOG.md`는 에러 원문과 중요 작업 이력을 남기는 사람이 읽는 로그이며, - planning 자동 감시는 `.harness/events/planning.jsonl`만 사용한다. diff --git a/harness.toml b/harness.toml index ad39a5c..dcae6f6 100644 --- a/harness.toml +++ b/harness.toml @@ -69,9 +69,9 @@ fail_blocks_review = true # FAIL이면 reviewer 진입 금지, worker에 재위 [plan] auto_run = true # /harness-plan이 Task 작성 전 task-decomposer proposal 실행 agent = "agents/task-decomposer.md" -decomposer_mode = "process" # 기본: 외부 명령 계약 기반 독립 proposal. 미설정 시 실패 로그 후 fallback 가능 -decomposer_command = "" # context.json을 읽고 proposed-tasks.json/report.md를 생성하는 외부 명령 -allow_inline_fallback = true # decomposer_command 미설정/실패 시 현재 세션이 같은 proposal 계약을 채울 수 있음 +decomposer_mode = "inline" # 기본: 현재 세션이 proposal 계약을 채움. 외부 명령은 선택 escape hatch +decomposer_command = "" # 선택: context.json을 읽고 proposed-tasks.json/report.md를 생성하는 외부 명령 +allow_inline_fallback = true # 외부 명령 미설정/실패 시 현재 세션이 같은 proposal 계약을 채울 수 있음 proposal_dir = ".harness/shared/planning" planning_event_log = ".harness/events/planning.jsonl" gate_work = true # 세분화 기준 미달 Task 있으면 /harness-work 실행 자체를 차단 diff --git a/init.sh b/init.sh index 2e48502..52b27f6 100755 --- a/init.sh +++ b/init.sh @@ -6,8 +6,7 @@ # /tmp/harness-tpl/init.sh /path/to/my-new-project # # README.md "새 프로젝트에 적용" Step 1의 수동 cp 목록을 스크립트로 대체. -# 감사(H5/2026-07-04)에서 발견된 누락 항목(ci.yml, .harness/ 골격, -# PR/Issue 템플릿)을 포함한 복사 목록을 사용한다. +# ci.yml, .harness/ 골격, PR/Issue 템플릿을 포함한다. # Plans.md·tasks/index.json·.harness/는 이 저장소 자신의 dogfood 이력이 아니라 # templates/skeleton/의 초기 상태 버전에서 복사한다. @@ -45,7 +44,6 @@ cp "$SRC_DIR/scripts/build_planning_context.py" "$TARGET_DIR/scripts/" cp "$SRC_DIR/scripts/validate_task_proposal.py" "$TARGET_DIR/scripts/" cp "$SRC_DIR/scripts/apply_task_proposal.py" "$TARGET_DIR/scripts/" cp "$SRC_DIR/scripts/planning_log.py" "$TARGET_DIR/scripts/" -cp "$SRC_DIR/scripts/run_task_decomposer.py" "$TARGET_DIR/scripts/" # companion 에이전트 cp -r "$SRC_DIR/agents/." "$TARGET_DIR/agents/" diff --git a/scripts/merge-settings.mjs b/scripts/merge-settings.mjs index b58ec1e..357f314 100644 --- a/scripts/merge-settings.mjs +++ b/scripts/merge-settings.mjs @@ -1,10 +1,6 @@ #!/usr/bin/env node -// merge-settings.mjs — settings.json에 이 템플릿이 요구하는 plugin 설정만 -// 병합한다. 기존에 사용자가 넣어둔 다른 plugin·permissions·설정은 그대로 둔다. -// setup-plugins.sh가 백업본을 만든 뒤에 이 스크립트를 호출한다. -// -// value-for-fable은 optional plugin이다 — 세 번째 인자로 "--skip-vff"를 -// 넘기면 enabledPlugins·extraKnownMarketplaces에서 제외한다. +// merge-settings.mjs — required plugin 설정만 병합한다. +// 기존 사용자 설정은 보존하고, "--skip-vff"면 value-for-fable을 제외한다. import { readFileSync, writeFileSync } from "node:fs"; @@ -46,7 +42,7 @@ let raw = "{}"; try { raw = readFileSync(target, "utf8"); } catch { - // 파일이 없으면 빈 객체로 시작 — setup-plugins.sh가 이미 만들어두지만 방어적으로 처리 + // 파일이 없으면 빈 객체로 시작한다. } let settings; diff --git a/scripts/setup-plugins.sh b/scripts/setup-plugins.sh index a3910fa..87c8d9c 100755 --- a/scripts/setup-plugins.sh +++ b/scripts/setup-plugins.sh @@ -1,28 +1,8 @@ #!/usr/bin/env bash -# setup-plugins.sh — ~/.claude/settings.json에 이 템플릿이 요구하는 plugin을 -# 자동으로 등록하고 설치한다. -# -# 문제: README/setup-guide.md의 "Step 1"은 지금까지 사용자가 JSON 파일을 직접 -# 열어 손으로 병합하는 방식이었다 — 콤마 하나만 틀려도 Claude Code 전체가 -# 깨지고, 기존 설정을 실수로 덮어쓰기 쉽다. 이 스크립트는 그 단계를 대체한다. -# -# 사용법: -# ./scripts/setup-plugins.sh [--skip-vff|--with-vff] -# -# value-for-fable은 optional plugin이다 (Sonnet에 Fable 5 진단 규율을 적용하는 -# 개인 취향 플러그인). 필수 3종(claude-code-harness·ponytail·caveman)과 분리해 -# 아래 순서로 포함 여부를 결정한다: -# 1. --skip-vff / --with-vff 플래그 -# 2. SETUP_SKIP_VFF 환경변수 (1이면 스킵) -# 3. 위 둘 다 없고 대화형 터미널이면 y/N 프롬프트 -# 4. 비대화형(CI 등)이고 위 셋 다 없으면 기존 동작 유지 차원에서 설치 -# -# 동작: -# 1. ~/.claude/settings.json이 없으면 새로 만들고, 있으면 기존 값을 보존한 채 -# enabledPlugins·extraKnownMarketplaces만 병합한다 (Node.js로 JSON 병합). -# 2. 수정 전 파일을 settings.json.bak.로 백업한다. -# 3. claude plugin install로 필수 3종 + (선택 시) value-for-fable을 설치한다. -# 4. harness doctor로 설치 상태를 확인한다. +# setup-plugins.sh — required Claude plugins를 settings.json에 병합하고 설치한다. +# 사용법: ./scripts/setup-plugins.sh [--skip-vff|--with-vff] +# value-for-fable은 optional이다. 플래그, SETUP_SKIP_VFF, 대화형 prompt 순서로 결정한다. +# 기존 settings.json은 백업하고 enabledPlugins/extraKnownMarketplaces만 병합한다. set -euo pipefail