# Harness Engineering Guide 이 문서는 PDFtoMD 프로젝트에서 장기 agent 작업을 관리하는 Harness 운영 규칙입니다. 기준은 Anthropic의 "Harness design for long-running application development" 글에서 강조한 planner, generator, evaluator 분리, 파일 기반 handoff, sprint contract, 독립 평가 루프입니다. ## Purpose - 긴 변환 엔진 개발을 작은 self-contained step으로 나눕니다. - 새 agent가 이전 대화 맥락 없이도 `AGENTS.md`, `PLAN.md`, `PROGRESS.md`, `phases/` 파일만 읽고 일을 이어받게 합니다. - 구현 agent와 평가 agent를 분리해 자기 평가 편향을 줄입니다. - 각 step의 성공 조건을 코드 작성 전에 파일로 고정합니다. - Harness 자체는 단순하게 유지하고, 복잡성은 필요한 검증 기준과 step 경계에만 둡니다. ## Roles ### Planner - 제품 목표와 아키텍처 문서를 읽고 phase와 step을 작성합니다. - 구현 세부를 과도하게 지정하지 않고 산출물, 책임 범위, 수락 기준, 금지 범위를 명확히 합니다. - 산출물: - `PLAN.md` 업데이트 - `phases/index.json` - `phases/{phase}/index.json` - `phases/{phase}/stepN.md` ### Generator - 한 번에 하나의 `stepN.md`만 수행합니다. - 작업 전 step의 "Sprint Contract"를 읽고, 애매하면 구현 전에 `PROGRESS.md`에 blocker로 남깁니다. - TDD가 필요한 구현 step에서는 테스트를 먼저 작성합니다. - 산출물: - step 범위 내 코드, 테스트, 문서 변경 - `phases/{phase}/index.json` step status 업데이트 - `PROGRESS.md` handoff 업데이트 ### Evaluator - generator가 만든 결과를 독립적으로 검토합니다. - 합의된 기준 중 하나라도 hard threshold를 넘지 못하면 step을 통과시키지 않습니다. - 통과 여부만 보지 않고, 재작업 가능한 구체적 실패 원인을 남깁니다. - 산출물: - review finding 또는 pass 기록 - 필요한 경우 `phases/{phase}/index.json`의 `error_message` 또는 `blocked_reason` - `PROGRESS.md` 검증 결과 ## File Protocol - `AGENTS.md`: 변하지 않는 저장소 규칙. - `PLAN.md`: 전체 작업 계획의 단일 출처. - `PROGRESS.md`: 현재 진행 상태와 handoff의 단일 출처. - `docs/*.md`: 제품, 아키텍처, 결정, 도구 체인, Harness 운영 지식. - `phases/index.json`: 실행 가능한 phase registry. - `phases/{phase}/index.json`: 해당 phase step 상태의 단일 출처. - `phases/{phase}/stepN.md`: 새 agent가 독립 실행할 수 있는 ticket. ## Step Contract Template 각 `stepN.md`는 다음 정보를 포함해야 합니다. ````markdown # Step N: step-name ## Read First - /AGENTS.md - /PLAN.md - /PROGRESS.md - /docs/HARNESS.md - /docs/ARCHITECTURE.md - /docs/ADR.md - /docs/CONVERSION_POLICY.md ## Task 이 step에서 만들어야 하는 산출물과 수정 가능한 파일을 구체적으로 적습니다. ## Sprint Contract - Done means: 사용자가 관찰할 수 있거나 테스트로 확인 가능한 완료 조건. - Hard thresholds: 하나라도 실패하면 step 실패로 보는 기준. - Files owned: 이 step에서 수정할 수 있는 파일 또는 디렉터리. - Dependencies: 이전 step 산출물 또는 필요한 문서. ## Acceptance Criteria ```powershell python scripts\validate_workspace.py ``` ## Verification 1. 테스트와 검증 명령을 실행합니다. 2. `PROGRESS.md`에 결과와 다음 handoff를 기록합니다. 3. `phases/{phase}/index.json`의 해당 step을 `completed`, `blocked`, `error` 중 하나로 갱신합니다. ## Do Not - step 범위 밖 기능을 구현하지 않습니다. - 새 parser나 외부 API를 도입하지 않습니다. - 생성 Markdown 출력 contract를 임의로 넓히지 않습니다. ```` ## Evaluation Criteria PDFtoMD의 evaluator는 다음 hard threshold를 우선 적용합니다. | Area | Hard Threshold | | --- | --- | | Architecture | Marker, Nougat, PyMuPDF 책임 경계를 깨지 않는다. | | TDD | 구현 step은 실패하는 테스트가 먼저 추가되거나, 테스트가 필요 없는 이유가 step에 명시된다. | | Determinism | 같은 입력과 옵션은 같은 slug, asset path, anchor, Markdown 구조를 만든다. | | Markdown quality | heading, math delimiter, table, image link, caption, chunk frontmatter 검증이 가능하다. | | Runtime | Windows path, Korean filename, CUDA/CPU runtime 정책을 훼손하지 않는다. | | Scope | PyQt UI, hosted API, LLM correction, sidecar output을 1차 구현에 끌어오지 않는다. | | Handoff | `PROGRESS.md`와 phase index가 다음 agent에게 충분한 상태를 제공한다. | ## When To Use The Full Loop - Full planner/generator/evaluator loop를 사용합니다: - 새 phase를 시작할 때 - parser adapter, chunk planner, renderer, quality validator처럼 실패 비용이 큰 작업 - sample corpus나 runtime 정책처럼 여러 파일과 문서가 동시에 바뀌는 작업 - 단순한 문서 오타, 작은 command 설명, 명확한 단일 테스트 수정은 일반 Codex 작업으로 처리해도 됩니다. 그래도 `PROGRESS.md`는 갱신합니다. ## Simplification Rule Harness 구성 요소는 실제로 품질을 높일 때만 유지합니다. - 같은 검증을 두 곳에서 반복하면 하나로 줄입니다. - hook은 보조 장치로 취급하고, step의 acceptance criteria와 evaluator 판단을 대체하지 않습니다. - agent에게 너무 많은 컨텍스트를 주지 말고, step에 필요한 문서와 파일만 지정합니다.