init: readme 작성 하네스 설계
This commit is contained in:
@@ -0,0 +1,211 @@
|
||||
# README Harness
|
||||
|
||||
<!-- readme-harness:metadata owner=readme-harness -->
|
||||
|
||||
저장소에서 확인한 사실과 사용자가 정한 요구를 바탕으로 README 초안을 만드는 도구입니다.
|
||||
<!-- claim-id: C-PROJECT-001 -->
|
||||
|
||||
명령·링크·경로를 검사한 뒤, 사람이 검토하고 적용할 수 있는 패치를 생성합니다.
|
||||
<!-- claim-id: C-OUTPUT-001 -->
|
||||
|
||||
현재 지원하는 작성·검증 흐름은 Codex용입니다. <!-- claim-id: C-CODEX-001 -->
|
||||
|
||||
Claude와 Antigravity에서 같은 동작을 하는지는 아직 미검증 상태입니다.
|
||||
<!-- claim-id: C-XTOOL-001 -->
|
||||
|
||||
<!-- readme-harness:start overview -->
|
||||
<!-- section-id: overview -->
|
||||
## 무엇을 만드는가
|
||||
|
||||
README를 새로 만들거나 기존 문서를 안전하게 갱신하려는 개발자를 위한 도구입니다.
|
||||
|
||||
- 새 README 작성
|
||||
- 기존 README 점검
|
||||
- 사람 작성 내용을 보존한 갱신
|
||||
- 특정 섹션만 다시 작성
|
||||
- 검토한 패치만 직접 적용
|
||||
|
||||
<!-- readme-harness:end overview -->
|
||||
|
||||
<!-- readme-harness:start proof -->
|
||||
<!-- section-id: proof -->
|
||||
## 실제 결과
|
||||
|
||||
아래 내용은 검토를 통과한 이전 실행의 패치 일부입니다.
|
||||
<!-- claim-id: C-PROOF-001 -->
|
||||
|
||||
```diff
|
||||
-A GitHub-README-specialized harness built around a shared core with entrypoints
|
||||
-for **Codex**, **Antigravity**, and **Claude**. It does not "prettify" READMEs —
|
||||
-it analyzes the facts that exist in a repository, judges project type and
|
||||
-audience, then iteratively produces and maintains a README with a readable
|
||||
+이 하네스는 저장소의 실제 코드와 사용 목적을 바탕으로 문서 후보를 만들고,
|
||||
+명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다.
|
||||
```
|
||||
|
||||
<!-- visual-id: reviewed-patch-preview -->
|
||||
|
||||
[전체 패치와 출처](examples/readme-showcase/README.patch)에서 더 긴 변경 내용을 확인할 수 있습니다.
|
||||
|
||||
<!-- readme-harness:end proof -->
|
||||
|
||||
<!-- readme-harness:start quick-start -->
|
||||
<!-- section-id: quick-start -->
|
||||
## 빠른 시작
|
||||
|
||||
현재 실행 경로는 Codex 작업 공간의 `requirement-driven-readme` 스킬입니다.
|
||||
<!-- claim-id: C-INVOCATION-001 -->
|
||||
|
||||
<!-- quick-start-step: invocation -->
|
||||
Codex에 다음과 같이 요청합니다.
|
||||
|
||||
> 이 저장소의 README를 `bootstrap` 모드로 작성해 주세요.
|
||||
> 주 독자는 백엔드 개발자이며, 설치와 첫 실행 방법을 우선해 주세요.
|
||||
|
||||
<!-- quick-start-step: expected-result -->
|
||||
작업 뒤 확인할 파일은 `README.generated.md`와 `README.patch`입니다.
|
||||
<!-- claim-id: C-RESULTS-001 -->
|
||||
|
||||
<!-- quick-start-step: success-check -->
|
||||
생성된 README의 명령과 링크를 읽고, 패치가 의도한 범위만 바꾸는지 검토합니다.
|
||||
|
||||
대상 `README.md`는 적용 명령을 실행하기 전까지 바뀌지 않습니다.
|
||||
<!-- claim-id: C-NO-AUTO-APPLY-001 -->
|
||||
|
||||
<!-- quick-start-step: apply -->
|
||||
검토가 끝난 패치만 직접 적용합니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/<repo-id>/<run-id> --repo /path/to/repository
|
||||
```
|
||||
|
||||
적용 직전에 생성 파일과 대상 README, 저장소 기준 정보가 바뀌지 않았는지 다시 확인합니다.
|
||||
<!-- claim-id: C-APPLY-CHECK-001 -->
|
||||
|
||||
<!-- readme-harness:end quick-start -->
|
||||
|
||||
<!-- readme-harness:start usage -->
|
||||
<!-- section-id: usage -->
|
||||
## 어떤 작업을 지원하는가
|
||||
|
||||
새 README 작성과 전면 재작성의 기본 선택은 `bootstrap`입니다.
|
||||
<!-- claim-id: C-MODE-BOOTSTRAP-001 -->
|
||||
|
||||
현재 README의 문제만 찾는 작업은 `audit`입니다.
|
||||
<!-- claim-id: C-MODE-AUDIT-001 -->
|
||||
|
||||
사람이 작성한 영역을 보존하는 갱신은 `refresh`입니다.
|
||||
<!-- claim-id: C-MODE-REFRESH-001 -->
|
||||
|
||||
한 섹션과 영향을 받는 검사 결과의 갱신은 `section-update`입니다.
|
||||
<!-- claim-id: C-MODE-SECTION-001 -->
|
||||
|
||||
<!-- readme-harness:end usage -->
|
||||
|
||||
<!-- readme-harness:start safeguards -->
|
||||
<!-- section-id: safeguards -->
|
||||
## 안전하게 다루는 방법
|
||||
|
||||
코드에서 확인한 사실과 사용자가 정한 문서 요구는 따로 둡니다.
|
||||
<!-- claim-id: C-SOURCE-SPLIT-001 -->
|
||||
|
||||
명령, 경로, 버전처럼 오류 영향이 큰 정보는 근거 파일과 연결합니다.
|
||||
<!-- claim-id: C-FACT-TRACE-001 -->
|
||||
|
||||
갱신 작업은 보호 영역과 마커 밖의 사람이 작성한 문장을 보존합니다.
|
||||
<!-- claim-id: C-PRESERVE-001 -->
|
||||
|
||||
사람이 고친 영역과 새 초안이 충돌하면 자동 병합과 적용이 중단됩니다.
|
||||
<!-- claim-id: C-CONFLICT-001 -->
|
||||
|
||||
비밀 값이나 저장소 밖 경로가 발견되면 패치를 준비하지 않습니다.
|
||||
<!-- claim-id: C-SECRET-PATH-001 -->
|
||||
|
||||
검토 뒤 저장소나 생성 파일이 바뀌어도 적용을 중단합니다.
|
||||
<!-- claim-id: C-STALE-001 -->
|
||||
|
||||
<!-- readme-harness:end safeguards -->
|
||||
|
||||
<!-- readme-harness:start workflow -->
|
||||
<!-- section-id: workflow -->
|
||||
## 동작 방식
|
||||
|
||||
사용자 요청 → 저장소 사실 확인 → README 작성 → 명령·링크·문장 검사 → 독립 검토 → 패치 확인 → 직접 적용
|
||||
<!-- claim-id: C-WORKFLOW-001 -->
|
||||
|
||||
검사에서 문제가 나오면 해당 내용을 맡은 단계부터 다시 작성합니다.
|
||||
<!-- claim-id: C-REWORK-001 -->
|
||||
|
||||
<!-- readme-harness:end workflow -->
|
||||
|
||||
<!-- readme-harness:start inputs -->
|
||||
<!-- section-id: inputs -->
|
||||
## 입력과 생성 파일
|
||||
|
||||
`readme-request.yaml`에는 독자, 목적, 언어, 보존 범위와 그림 정책을 적습니다.
|
||||
<!-- claim-id: C-REQUEST-001 -->
|
||||
|
||||
사용자는 다음 두 결과를 주로 확인합니다.
|
||||
|
||||
- `README.generated.md`: 생성된 README
|
||||
- `README.patch`: 현재 README와의 차이
|
||||
|
||||
각 작업의 파일은 `runs/<repo-id>/<run-id>` 아래에 따로 저장됩니다.
|
||||
<!-- claim-id: C-RUN-DIR-001 -->
|
||||
|
||||
<!-- readme-harness:end inputs -->
|
||||
|
||||
<!-- readme-harness:start development -->
|
||||
<!-- section-id: development -->
|
||||
## 개발
|
||||
|
||||
개발에는 Python 3.12 이상이 필요하며, 개발 의존성에는 `pytest`가 포함됩니다.
|
||||
<!-- claim-id: C-DEV-PREREQ-001 -->
|
||||
|
||||
저장소 루트에서 개발 모드로 설치합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
전체 테스트는 다음 명령으로 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pytest -q
|
||||
```
|
||||
|
||||
<!-- readme-harness:end development -->
|
||||
|
||||
<!-- readme-harness:start documentation -->
|
||||
<!-- section-id: documentation -->
|
||||
## 상세 문서
|
||||
|
||||
- [구성요소와 책임](docs/architecture.md)
|
||||
- [시각 자료와 실제 결과 증명](docs/visuals.md)
|
||||
- [모드별 처리 단계와 차단 조건](docs/state-machine.md)
|
||||
- [모델 사용량 기록](docs/usage-metrics.md)
|
||||
- [블라인드 README 품질 비교](docs/quality-benchmark.md)
|
||||
- [전체 설계 명세](docs/superpowers/specs/2026-07-16-readme-harness-design.md)
|
||||
|
||||
주요 구현은 `src/readme_harness`, 규칙과 워크플로는 `.agents`, 테스트는 `tests`에 있습니다.
|
||||
<!-- claim-id: C-LAYOUT-001 -->
|
||||
|
||||
<!-- readme-harness:end documentation -->
|
||||
|
||||
<!-- readme-harness:start limitations -->
|
||||
<!-- section-id: limitations -->
|
||||
## 현재 한계
|
||||
|
||||
- README 문장은 모델이 작성하고 검사 스크립트는 준비된 파일을 확인합니다.
|
||||
<!-- claim-id: C-WRITING-LIMIT-001 -->
|
||||
|
||||
- 실행 기록이 없는 명령은 정적으로만 확인합니다.
|
||||
<!-- claim-id: C-VERIFY-LIMIT-001 -->
|
||||
|
||||
- `Claude`와 `Antigravity`에서 `Codex`와 같은 동작을 하는지는 아직 검증하지 않았습니다.
|
||||
<!-- claim-id: C-XTOOL-LIMIT-001 -->
|
||||
|
||||
- 블라인드 품질 비교는 아직 실행하지 않았으며 더 좋은 결과를 낸다고 주장하지 않습니다.
|
||||
<!-- claim-id: C-BENCH-LIMIT-001 -->
|
||||
|
||||
<!-- readme-harness:end limitations -->
|
||||
@@ -0,0 +1,211 @@
|
||||
# README Harness
|
||||
|
||||
<!-- readme-harness:metadata owner=readme-harness -->
|
||||
|
||||
저장소에서 확인한 사실과 사용자가 정한 요구를 바탕으로 README 초안을 만드는 도구입니다.
|
||||
<!-- claim-id: C-PROJECT-001 -->
|
||||
|
||||
명령·링크·경로를 검사한 뒤, 사람이 검토하고 적용할 수 있는 패치를 생성합니다.
|
||||
<!-- claim-id: C-OUTPUT-001 -->
|
||||
|
||||
현재 지원하는 작성·검증 흐름은 Codex용입니다. <!-- claim-id: C-CODEX-001 -->
|
||||
|
||||
Claude와 Antigravity에서 같은 동작을 하는지는 아직 미검증 상태입니다.
|
||||
<!-- claim-id: C-XTOOL-001 -->
|
||||
|
||||
<!-- readme-harness:start overview -->
|
||||
<!-- section-id: overview -->
|
||||
## 무엇을 만드는가
|
||||
|
||||
README를 새로 만들거나 기존 문서를 안전하게 갱신하려는 개발자를 위한 도구입니다.
|
||||
|
||||
- 새 README 작성
|
||||
- 기존 README 점검
|
||||
- 사람 작성 내용을 보존한 갱신
|
||||
- 특정 섹션만 다시 작성
|
||||
- 검토한 패치만 직접 적용
|
||||
|
||||
<!-- readme-harness:end overview -->
|
||||
|
||||
<!-- readme-harness:start proof -->
|
||||
<!-- section-id: proof -->
|
||||
## 실제 결과
|
||||
|
||||
아래 내용은 검토를 통과한 이전 실행의 패치 일부입니다.
|
||||
<!-- claim-id: C-PROOF-001 -->
|
||||
|
||||
```diff
|
||||
-A GitHub-README-specialized harness built around a shared core with entrypoints
|
||||
-for **Codex**, **Antigravity**, and **Claude**. It does not "prettify" READMEs —
|
||||
-it analyzes the facts that exist in a repository, judges project type and
|
||||
-audience, then iteratively produces and maintains a README with a readable
|
||||
+이 하네스는 저장소의 실제 코드와 사용 목적을 바탕으로 문서 후보를 만들고,
|
||||
+명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다.
|
||||
```
|
||||
|
||||
<!-- visual-id: reviewed-patch-preview -->
|
||||
|
||||
[전체 패치와 출처](examples/readme-showcase/README.patch)에서 더 긴 변경 내용을 확인할 수 있습니다.
|
||||
|
||||
<!-- readme-harness:end proof -->
|
||||
|
||||
<!-- readme-harness:start quick-start -->
|
||||
<!-- section-id: quick-start -->
|
||||
## 빠른 시작
|
||||
|
||||
현재 실행 경로는 Codex 작업 공간의 `requirement-driven-readme` 스킬입니다.
|
||||
<!-- claim-id: C-INVOCATION-001 -->
|
||||
|
||||
<!-- quick-start-step: invocation -->
|
||||
Codex에 다음과 같이 요청합니다.
|
||||
|
||||
> 이 저장소의 README를 `bootstrap` 모드로 작성해 주세요.
|
||||
> 주 독자는 백엔드 개발자이며, 설치와 첫 실행 방법을 우선해 주세요.
|
||||
|
||||
<!-- quick-start-step: expected-result -->
|
||||
작업 뒤 확인할 파일은 `README.generated.md`와 `README.patch`입니다.
|
||||
<!-- claim-id: C-RESULTS-001 -->
|
||||
|
||||
<!-- quick-start-step: success-check -->
|
||||
생성된 README의 명령과 링크를 읽고, 패치가 의도한 범위만 바꾸는지 검토합니다.
|
||||
|
||||
대상 `README.md`는 적용 명령을 실행하기 전까지 바뀌지 않습니다.
|
||||
<!-- claim-id: C-NO-AUTO-APPLY-001 -->
|
||||
|
||||
<!-- quick-start-step: apply -->
|
||||
검토가 끝난 패치만 직접 적용합니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/<repo-id>/<run-id> --repo /path/to/repository
|
||||
```
|
||||
|
||||
적용 직전에 생성 파일과 대상 README, 저장소 기준 정보가 바뀌지 않았는지 다시 확인합니다.
|
||||
<!-- claim-id: C-APPLY-CHECK-001 -->
|
||||
|
||||
<!-- readme-harness:end quick-start -->
|
||||
|
||||
<!-- readme-harness:start usage -->
|
||||
<!-- section-id: usage -->
|
||||
## 어떤 작업을 지원하는가
|
||||
|
||||
새 README 작성과 전면 재작성의 기본 선택은 `bootstrap`입니다.
|
||||
<!-- claim-id: C-MODE-BOOTSTRAP-001 -->
|
||||
|
||||
현재 README의 문제만 찾는 작업은 `audit`입니다.
|
||||
<!-- claim-id: C-MODE-AUDIT-001 -->
|
||||
|
||||
사람이 작성한 영역을 보존하는 갱신은 `refresh`입니다.
|
||||
<!-- claim-id: C-MODE-REFRESH-001 -->
|
||||
|
||||
한 섹션과 영향을 받는 검사 결과의 갱신은 `section-update`입니다.
|
||||
<!-- claim-id: C-MODE-SECTION-001 -->
|
||||
|
||||
<!-- readme-harness:end usage -->
|
||||
|
||||
<!-- readme-harness:start safeguards -->
|
||||
<!-- section-id: safeguards -->
|
||||
## 안전하게 다루는 방법
|
||||
|
||||
코드에서 확인한 사실과 사용자가 정한 문서 요구는 따로 둡니다.
|
||||
<!-- claim-id: C-SOURCE-SPLIT-001 -->
|
||||
|
||||
명령, 경로, 버전처럼 오류 영향이 큰 정보는 근거 파일과 연결합니다.
|
||||
<!-- claim-id: C-FACT-TRACE-001 -->
|
||||
|
||||
갱신 작업은 보호 영역과 마커 밖의 사람이 작성한 문장을 보존합니다.
|
||||
<!-- claim-id: C-PRESERVE-001 -->
|
||||
|
||||
사람이 고친 영역과 새 초안이 충돌하면 자동 병합과 적용이 중단됩니다.
|
||||
<!-- claim-id: C-CONFLICT-001 -->
|
||||
|
||||
비밀 값이나 저장소 밖 경로가 발견되면 패치를 준비하지 않습니다.
|
||||
<!-- claim-id: C-SECRET-PATH-001 -->
|
||||
|
||||
검토 뒤 저장소나 생성 파일이 바뀌어도 적용을 중단합니다.
|
||||
<!-- claim-id: C-STALE-001 -->
|
||||
|
||||
<!-- readme-harness:end safeguards -->
|
||||
|
||||
<!-- readme-harness:start workflow -->
|
||||
<!-- section-id: workflow -->
|
||||
## 동작 방식
|
||||
|
||||
사용자 요청 → 저장소 사실 확인 → README 작성 → 명령·링크·문장 검사 → 독립 검토 → 패치 확인 → 직접 적용
|
||||
<!-- claim-id: C-WORKFLOW-001 -->
|
||||
|
||||
검사에서 문제가 나오면 해당 내용을 맡은 단계부터 다시 작성합니다.
|
||||
<!-- claim-id: C-REWORK-001 -->
|
||||
|
||||
<!-- readme-harness:end workflow -->
|
||||
|
||||
<!-- readme-harness:start inputs -->
|
||||
<!-- section-id: inputs -->
|
||||
## 입력과 생성 파일
|
||||
|
||||
`readme-request.yaml`에는 독자, 목적, 언어, 보존 범위와 그림 정책을 적습니다.
|
||||
<!-- claim-id: C-REQUEST-001 -->
|
||||
|
||||
사용자는 다음 두 결과를 주로 확인합니다.
|
||||
|
||||
- `README.generated.md`: 생성된 README
|
||||
- `README.patch`: 현재 README와의 차이
|
||||
|
||||
각 작업의 파일은 `runs/<repo-id>/<run-id>` 아래에 따로 저장됩니다.
|
||||
<!-- claim-id: C-RUN-DIR-001 -->
|
||||
|
||||
<!-- readme-harness:end inputs -->
|
||||
|
||||
<!-- readme-harness:start development -->
|
||||
<!-- section-id: development -->
|
||||
## 개발
|
||||
|
||||
개발에는 Python 3.12 이상이 필요하며, 개발 의존성에는 `pytest`가 포함됩니다.
|
||||
<!-- claim-id: C-DEV-PREREQ-001 -->
|
||||
|
||||
저장소 루트에서 개발 모드로 설치합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
전체 테스트는 다음 명령으로 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pytest -q
|
||||
```
|
||||
|
||||
<!-- readme-harness:end development -->
|
||||
|
||||
<!-- readme-harness:start documentation -->
|
||||
<!-- section-id: documentation -->
|
||||
## 상세 문서
|
||||
|
||||
- [구성요소와 책임](docs/architecture.md)
|
||||
- [시각 자료와 실제 결과 증명](docs/visuals.md)
|
||||
- [모드별 처리 단계와 차단 조건](docs/state-machine.md)
|
||||
- [모델 사용량 기록](docs/usage-metrics.md)
|
||||
- [블라인드 README 품질 비교](docs/quality-benchmark.md)
|
||||
- [전체 설계 명세](docs/superpowers/specs/2026-07-16-readme-harness-design.md)
|
||||
|
||||
주요 구현은 `src/readme_harness`, 규칙과 워크플로는 `.agents`, 테스트는 `tests`에 있습니다.
|
||||
<!-- claim-id: C-LAYOUT-001 -->
|
||||
|
||||
<!-- readme-harness:end documentation -->
|
||||
|
||||
<!-- readme-harness:start limitations -->
|
||||
<!-- section-id: limitations -->
|
||||
## 현재 한계
|
||||
|
||||
- README 문장은 모델이 작성하고 검사 스크립트는 준비된 파일을 확인합니다.
|
||||
<!-- claim-id: C-WRITING-LIMIT-001 -->
|
||||
|
||||
- 실행 기록이 없는 명령은 정적으로만 확인합니다.
|
||||
<!-- claim-id: C-VERIFY-LIMIT-001 -->
|
||||
|
||||
- `Claude`와 `Antigravity`에서 `Codex`와 같은 동작을 하는지는 아직 검증하지 않았습니다.
|
||||
<!-- claim-id: C-XTOOL-LIMIT-001 -->
|
||||
|
||||
- 블라인드 품질 비교는 아직 실행하지 않았으며 더 좋은 결과를 낸다고 주장하지 않습니다.
|
||||
<!-- claim-id: C-BENCH-LIMIT-001 -->
|
||||
|
||||
<!-- readme-harness:end limitations -->
|
||||
@@ -0,0 +1,413 @@
|
||||
--- README.md (current)
|
||||
+++ README.md (candidate)
|
||||
@@ -1,224 +1,211 @@
|
||||
# README Harness
|
||||
|
||||
-이 하네스는 저장소의 실제 코드와 사용 목적을 바탕으로 문서 후보를 만들고,
|
||||
-명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다. <!-- claim-id: C-PROJECT-001 -->
|
||||
-
|
||||
-- 새 README 작성
|
||||
-- 기존 문서 점검
|
||||
-- 사람 작성 영역을 보존한 갱신
|
||||
-- 특정 섹션과 관련 검증 산출물의 재생성
|
||||
-- 검토 후 별도로 실행하는 적용
|
||||
-
|
||||
+<!-- readme-harness:metadata owner=readme-harness -->
|
||||
+
|
||||
+저장소에서 확인한 사실과 사용자가 정한 요구를 바탕으로 README 초안을 만드는 도구입니다.
|
||||
+<!-- claim-id: C-PROJECT-001 -->
|
||||
+
|
||||
+명령·링크·경로를 검사한 뒤, 사람이 검토하고 적용할 수 있는 패치를 생성합니다.
|
||||
+<!-- claim-id: C-OUTPUT-001 -->
|
||||
+
|
||||
+현재 지원하는 작성·검증 흐름은 Codex용입니다. <!-- claim-id: C-CODEX-001 -->
|
||||
+
|
||||
+Claude와 Antigravity에서 같은 동작을 하는지는 아직 미검증 상태입니다.
|
||||
+<!-- claim-id: C-XTOOL-001 -->
|
||||
+
|
||||
+<!-- readme-harness:start overview -->
|
||||
<!-- section-id: overview -->
|
||||
## 무엇을 만드는가
|
||||
|
||||
README를 새로 만들거나 기존 문서를 안전하게 갱신하려는 개발자를 위한 도구입니다.
|
||||
|
||||
-`bootstrap`, `audit`, `refresh`, `section-update` 네 모드를 구현했습니다. <!-- claim-id: C-MODE-001 -->
|
||||
-
|
||||
-저장소 근거와 사용자 요구를 분리해 읽고, 고위험 사실을 근거에 연결합니다. 그림을
|
||||
-넣기로 했다면 실제 소스나 자산까지 확인하고, 품질 심사는 원문의 줄과 해시에 묶인
|
||||
-근거를 사용합니다. 패치 준비가 끝나도 대상 `README.md`는 자동으로 바뀌지 않습니다.
|
||||
-<!-- claim-id: C-SAFETY-SUMMARY-001 -->
|
||||
-
|
||||
-결정론적 Codex 경로는 구현됐습니다. 후보 문장 작성은 모델 파이프라인이 담당하며,
|
||||
-다른 도구와의 런타임 동등성은 Phase 4 검증 전까지 보장하지 않습니다.
|
||||
-<!-- claim-id: C-LIMIT-001 -->
|
||||
-
|
||||
-<!-- section-id: installation -->
|
||||
-## 설치
|
||||
-
|
||||
-`Python` 3.12 이상이 필요합니다.
|
||||
-런타임 의존성은 `jsonschema`와 `PyYAML`입니다.
|
||||
-개발 의존성은 `pytest`입니다. <!-- claim-id: C-RUNTIME-001 -->
|
||||
-
|
||||
-저장소 루트에서 개발 의존성을 포함한 편집 가능 설치를 실행합니다.
|
||||
+- 새 README 작성
|
||||
+- 기존 README 점검
|
||||
+- 사람 작성 내용을 보존한 갱신
|
||||
+- 특정 섹션만 다시 작성
|
||||
+- 검토한 패치만 직접 적용
|
||||
+
|
||||
+<!-- readme-harness:end overview -->
|
||||
+
|
||||
+<!-- readme-harness:start proof -->
|
||||
+<!-- section-id: proof -->
|
||||
+## 실제 결과
|
||||
+
|
||||
+아래 내용은 검토를 통과한 이전 실행의 패치 일부입니다.
|
||||
+<!-- claim-id: C-PROOF-001 -->
|
||||
+
|
||||
+```diff
|
||||
+-A GitHub-README-specialized harness built around a shared core with entrypoints
|
||||
+-for **Codex**, **Antigravity**, and **Claude**. It does not "prettify" READMEs —
|
||||
+-it analyzes the facts that exist in a repository, judges project type and
|
||||
+-audience, then iteratively produces and maintains a README with a readable
|
||||
++이 하네스는 저장소의 실제 코드와 사용 목적을 바탕으로 문서 후보를 만들고,
|
||||
++명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다.
|
||||
+```
|
||||
+
|
||||
+<!-- visual-id: reviewed-patch-preview -->
|
||||
+
|
||||
+[전체 패치와 출처](examples/readme-showcase/README.patch)에서 더 긴 변경 내용을 확인할 수 있습니다.
|
||||
+
|
||||
+<!-- readme-harness:end proof -->
|
||||
+
|
||||
+<!-- readme-harness:start quick-start -->
|
||||
+<!-- section-id: quick-start -->
|
||||
+## 빠른 시작
|
||||
+
|
||||
+현재 실행 경로는 Codex 작업 공간의 `requirement-driven-readme` 스킬입니다.
|
||||
+<!-- claim-id: C-INVOCATION-001 -->
|
||||
+
|
||||
+<!-- quick-start-step: invocation -->
|
||||
+Codex에 다음과 같이 요청합니다.
|
||||
+
|
||||
+> 이 저장소의 README를 `bootstrap` 모드로 작성해 주세요.
|
||||
+> 주 독자는 백엔드 개발자이며, 설치와 첫 실행 방법을 우선해 주세요.
|
||||
+
|
||||
+<!-- quick-start-step: expected-result -->
|
||||
+작업 뒤 확인할 파일은 `README.generated.md`와 `README.patch`입니다.
|
||||
+<!-- claim-id: C-RESULTS-001 -->
|
||||
+
|
||||
+<!-- quick-start-step: success-check -->
|
||||
+생성된 README의 명령과 링크를 읽고, 패치가 의도한 범위만 바꾸는지 검토합니다.
|
||||
+
|
||||
+대상 `README.md`는 적용 명령을 실행하기 전까지 바뀌지 않습니다.
|
||||
+<!-- claim-id: C-NO-AUTO-APPLY-001 -->
|
||||
+
|
||||
+<!-- quick-start-step: apply -->
|
||||
+검토가 끝난 패치만 직접 적용합니다.
|
||||
+
|
||||
+```bash
|
||||
+python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/<repo-id>/<run-id> --repo /path/to/repository
|
||||
+```
|
||||
+
|
||||
+적용 직전에 생성 파일과 대상 README, 저장소 기준 정보가 바뀌지 않았는지 다시 확인합니다.
|
||||
+<!-- claim-id: C-APPLY-CHECK-001 -->
|
||||
+
|
||||
+<!-- readme-harness:end quick-start -->
|
||||
+
|
||||
+<!-- readme-harness:start usage -->
|
||||
+<!-- section-id: usage -->
|
||||
+## 어떤 작업을 지원하는가
|
||||
+
|
||||
+새 README 작성과 전면 재작성의 기본 선택은 `bootstrap`입니다.
|
||||
+<!-- claim-id: C-MODE-BOOTSTRAP-001 -->
|
||||
+
|
||||
+현재 README의 문제만 찾는 작업은 `audit`입니다.
|
||||
+<!-- claim-id: C-MODE-AUDIT-001 -->
|
||||
+
|
||||
+사람이 작성한 영역을 보존하는 갱신은 `refresh`입니다.
|
||||
+<!-- claim-id: C-MODE-REFRESH-001 -->
|
||||
+
|
||||
+한 섹션과 영향을 받는 검사 결과의 갱신은 `section-update`입니다.
|
||||
+<!-- claim-id: C-MODE-SECTION-001 -->
|
||||
+
|
||||
+<!-- readme-harness:end usage -->
|
||||
+
|
||||
+<!-- readme-harness:start safeguards -->
|
||||
+<!-- section-id: safeguards -->
|
||||
+## 안전하게 다루는 방법
|
||||
+
|
||||
+코드에서 확인한 사실과 사용자가 정한 문서 요구는 따로 둡니다.
|
||||
+<!-- claim-id: C-SOURCE-SPLIT-001 -->
|
||||
+
|
||||
+명령, 경로, 버전처럼 오류 영향이 큰 정보는 근거 파일과 연결합니다.
|
||||
+<!-- claim-id: C-FACT-TRACE-001 -->
|
||||
+
|
||||
+갱신 작업은 보호 영역과 마커 밖의 사람이 작성한 문장을 보존합니다.
|
||||
+<!-- claim-id: C-PRESERVE-001 -->
|
||||
+
|
||||
+사람이 고친 영역과 새 초안이 충돌하면 자동 병합과 적용이 중단됩니다.
|
||||
+<!-- claim-id: C-CONFLICT-001 -->
|
||||
+
|
||||
+비밀 값이나 저장소 밖 경로가 발견되면 패치를 준비하지 않습니다.
|
||||
+<!-- claim-id: C-SECRET-PATH-001 -->
|
||||
+
|
||||
+검토 뒤 저장소나 생성 파일이 바뀌어도 적용을 중단합니다.
|
||||
+<!-- claim-id: C-STALE-001 -->
|
||||
+
|
||||
+<!-- readme-harness:end safeguards -->
|
||||
+
|
||||
+<!-- readme-harness:start workflow -->
|
||||
+<!-- section-id: workflow -->
|
||||
+## 동작 방식
|
||||
+
|
||||
+사용자 요청 → 저장소 사실 확인 → README 작성 → 명령·링크·문장 검사 → 독립 검토 → 패치 확인 → 직접 적용
|
||||
+<!-- claim-id: C-WORKFLOW-001 -->
|
||||
+
|
||||
+검사에서 문제가 나오면 해당 내용을 맡은 단계부터 다시 작성합니다.
|
||||
+<!-- claim-id: C-REWORK-001 -->
|
||||
+
|
||||
+<!-- readme-harness:end workflow -->
|
||||
+
|
||||
+<!-- readme-harness:start inputs -->
|
||||
+<!-- section-id: inputs -->
|
||||
+## 입력과 생성 파일
|
||||
+
|
||||
+`readme-request.yaml`에는 독자, 목적, 언어, 보존 범위와 그림 정책을 적습니다.
|
||||
+<!-- claim-id: C-REQUEST-001 -->
|
||||
+
|
||||
+사용자는 다음 두 결과를 주로 확인합니다.
|
||||
+
|
||||
+- `README.generated.md`: 생성된 README
|
||||
+- `README.patch`: 현재 README와의 차이
|
||||
+
|
||||
+각 작업의 파일은 `runs/<repo-id>/<run-id>` 아래에 따로 저장됩니다.
|
||||
+<!-- claim-id: C-RUN-DIR-001 -->
|
||||
+
|
||||
+<!-- readme-harness:end inputs -->
|
||||
+
|
||||
+<!-- readme-harness:start development -->
|
||||
+<!-- section-id: development -->
|
||||
+## 개발
|
||||
+
|
||||
+개발에는 Python 3.12 이상이 필요하며, 개발 의존성에는 `pytest`가 포함됩니다.
|
||||
+<!-- claim-id: C-DEV-PREREQ-001 -->
|
||||
+
|
||||
+저장소 루트에서 개발 모드로 설치합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
-이 설치 명령은 프로젝트 선언에서 확인했지만, 현재 작업에서는 새 가상환경 설치까지
|
||||
-실행해 증명하지 않았습니다. <!-- claim-id: C-INSTALL-001 -->
|
||||
-
|
||||
-<!-- section-id: quick-start -->
|
||||
-## 빠른 시작
|
||||
-
|
||||
-먼저 전체 테스트를 실행합니다.
|
||||
+전체 테스트는 다음 명령으로 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pytest -q
|
||||
```
|
||||
|
||||
-종료 코드 0과 실패 항목 없는 통과 요약이 성공 기준입니다. 이 후보는 아직 현재
|
||||
-README를 바꾸지 않았으므로 최종 전체 결과는 명시적 적용 뒤 다시 확인합니다.
|
||||
-
|
||||
-자체 README 테스트는 이 명령을 최소 실행 경로로 요구합니다. 다른 운영체제와 새
|
||||
-가상환경의 동일한 결과까지 보장하는 계약은 아닙니다. <!-- claim-id: C-TEST-COMMAND-001 -->
|
||||
-
|
||||
-이 프로젝트는 명령 하나로 문서를 완성하는 독립 실행 도구가 아닙니다. Codex 작업 공간에서
|
||||
-`requirement-driven-readme` 스킬로 대상 저장소의 `bootstrap` 실행을 요청하면 작성
|
||||
-역할이 사용자 요구, 저장소 근거, 개요, 후보, 주장 지도, 그림 계획과 품질 심사
|
||||
-산출물을 준비합니다. <!-- claim-id: C-AUTHORING-001 -->
|
||||
-
|
||||
-대상 저장소용 실행 디렉터리를 만듭니다.
|
||||
-
|
||||
-```bash
|
||||
-python3 .agents/skills/requirement-driven-readme/scripts/init_run.py --repo-id demo --run-id first --mode bootstrap --target-repository /path/to/repository --tool-adapter codex
|
||||
-```
|
||||
-
|
||||
-이 명령은 `runs/demo/first`에 상태와 실행 매니페스트를 초기화합니다.
|
||||
-<!-- claim-id: C-INIT-001 -->
|
||||
-
|
||||
-실행 디렉터리에 `readme-request.yaml`, `repository-facts.yaml`, `readme-brief.yaml`,
|
||||
-`readme-outline.yaml`, `README.candidate.md`, `claim-map.yaml`, `visual-plan.yaml`,
|
||||
-`review-findings.yaml`이 준비되면 모든 결정론적 게이트를 재생합니다.
|
||||
-
|
||||
-```bash
|
||||
-python3 .agents/skills/requirement-driven-readme/scripts/run_bootstrap.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
-```
|
||||
-
|
||||
-드라이버는 후보를 새로 쓰지 않고 준비된 산출물을 `QUALITY_REVIEWED`까지
|
||||
-검증합니다. <!-- claim-id: C-BOOTSTRAP-001 -->
|
||||
-
|
||||
-<!-- section-id: usage -->
|
||||
-## 사용 모드
|
||||
-
|
||||
-| 작업 | 모드 | 결과 |
|
||||
-|---|---|---|
|
||||
-| README가 없거나 전면 재작성 | `bootstrap` | 검증된 후보와 적용 준비용 패치 |
|
||||
-| 기존 문서의 결함만 점검 | `audit` | 감사 결과와 검증 보고서, 후보·패치 없음 |
|
||||
-| 사람 작성 영역을 보존한 갱신 | `refresh` | 3방향 병합과 병합본 전체 재검증 |
|
||||
-| 한 섹션과 파급 산출물 갱신 | `section-update` | 관련 산출물 무효화 후 갱신 검증 재실행 |
|
||||
-
|
||||
-네 모드는 요청 스키마에 선언되어 있고 각 흐름의 상태·게이트 계약이 구현되어
|
||||
-있습니다. <!-- claim-id: C-USAGE-001 -->
|
||||
-
|
||||
-<!-- section-id: api -->
|
||||
-## 요청 API, 설정과 산출물
|
||||
-
|
||||
-`readme-request.yaml`은 독자, 언어, 길이, 보존 범위, 공개 용어, 그림 정책을
|
||||
-정합니다. 기술 사실은 `repository-facts.yaml`에 저장하고, 각 실행은
|
||||
-`runs/<repo-id>/<run-id>` 아래에서 격리합니다. <!-- claim-id: C-INPUT-001 -->
|
||||
-
|
||||
-어댑터가 제공하는 단계별 모델 사용량은 실행 매니페스트에 누적합니다. 제공되지
|
||||
-않은 값은 0으로 추정하지 않습니다. <!-- claim-id: C-USAGE-METRICS-001 -->
|
||||
-
|
||||
-대표 산출물은 다음 순서로 이어집니다.
|
||||
-
|
||||
-```text
|
||||
-readme-brief.yaml + readme-outline.yaml
|
||||
-README.candidate.md + claim-map.yaml + visual-plan.yaml
|
||||
-prose-report.json + verification.json + review-findings.yaml
|
||||
-quality-manifest.yaml
|
||||
-README.generated.md + README.patch + apply-manifest.yaml
|
||||
-```
|
||||
-
|
||||
-품질 검토를 통과한 뒤 다음 명령으로 패치를 준비합니다.
|
||||
-
|
||||
-```bash
|
||||
-python3 .agents/skills/requirement-driven-readme/scripts/generate_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
-```
|
||||
-
|
||||
-이 단계는 `README.generated.md`, `README.patch`, `apply-manifest.yaml`을 만들고
|
||||
-상태를 `READY_FOR_APPLY`로 전진시킵니다. <!-- claim-id: C-PREPARE-001 -->
|
||||
-
|
||||
-검토가 끝난 패치만 별도 명령으로 적용합니다.
|
||||
-
|
||||
-```bash
|
||||
-python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
-```
|
||||
-
|
||||
-적용 직전에 후보·저장소·대상 README 해시와 경로 경계를 다시 검사합니다.
|
||||
-<!-- claim-id: C-APPLY-001 -->
|
||||
-
|
||||
-<!-- section-id: architecture -->
|
||||
-## 동작 방식
|
||||
-
|
||||
-사용자 요구는 독자 흐름과 공개 용어, 그림 결정을 만듭니다. 대상 저장소에서는
|
||||
-근거와 프로젝트 유형을 수집합니다. 두 입력이 합쳐진 후보와 시각 자료는 결정론적
|
||||
-게이트와 독립 품질 심사를 통과해야 패치가 됩니다. <!-- claim-id: C-FLOW-001 -->
|
||||
-
|
||||
-```mermaid
|
||||
-flowchart LR
|
||||
- T[Codex / Claude / Antigravity] --> O[실행 조정]
|
||||
- U[사용자 요구] --> P[독자 흐름·용어·그림 결정]
|
||||
- R[대상 저장소] --> E[근거 수집·프로젝트 분류]
|
||||
- O --> E
|
||||
- O --> P
|
||||
- E --> P
|
||||
- P --> W[README 작성]
|
||||
- P --> V[그림 소스·자산 생성]
|
||||
- W --> G[근거·명령·경로·문체 검사]
|
||||
- V --> G
|
||||
- G --> Q[독립 품질 심사]
|
||||
- Q -->|수정 필요| P
|
||||
- Q -->|통과| A[패치 준비·명시적 적용]
|
||||
- H[(해시 기반 실행 산출물)] --- E
|
||||
- H --- P
|
||||
- H --- G
|
||||
- H --- A
|
||||
-```
|
||||
-
|
||||
-<!-- visual-id: harness-flow -->
|
||||
-
|
||||
-구성요소 책임과 컨텍스트 경계는 [아키텍처 문서](docs/architecture.md)에,
|
||||
-모드별 전이는 [상태기계 문서](docs/state-machine.md)에 정리했습니다.
|
||||
-
|
||||
-<!-- section-id: safeguards -->
|
||||
-## 안전장치
|
||||
-
|
||||
-- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.
|
||||
-- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을
|
||||
- 차단합니다. <!-- claim-id: C-TERM-001 -->
|
||||
-- 그림을 포함하기로 한 개요 결정, 계획 항목, README 마커, 생성 소스나 자산이
|
||||
- 일치해야 시각 자료 게이트를 통과합니다. <!-- claim-id: C-VISUAL-001 -->
|
||||
-- 품질 점수와 독자 과업 근거의 줄 범위와 해시를 실제 후보에 대조하고,
|
||||
- `review.md`는 검증된 YAML에서 렌더링합니다. <!-- claim-id: C-REVIEW-001 -->
|
||||
-- 감사 모드는 결과 스키마를 확인하고 산출물을 원자적으로 기록한 다음 완료 상태로
|
||||
- 전진합니다. <!-- claim-id: C-AUDIT-001 -->
|
||||
-- 갱신 모드는 보호 영역과 마커 밖 문장을 보존하며, 사람이 고친 관리 영역과 새
|
||||
- 후보가 충돌하면 자동 적용을 막습니다. <!-- claim-id: C-MERGE-001 -->
|
||||
-- 비밀 값, 저장소 밖 경로, 오래된 스냅숏, 검토 뒤 바뀐 산출물은 패치 준비나
|
||||
- 적용을 차단합니다. <!-- claim-id: C-APPLY-SAFETY-001 -->
|
||||
-
|
||||
-시각 자료의 소스·자산·대체 텍스트·신선도 규칙은
|
||||
-[시각 자료 정책](docs/visuals.md)에서 확인할 수 있습니다.
|
||||
-
|
||||
-<!-- section-id: tests -->
|
||||
-## 테스트
|
||||
-
|
||||
-전체 회귀 테스트는 다음 명령으로 실행합니다.
|
||||
-
|
||||
-```bash
|
||||
-python3 -m pytest -q
|
||||
-```
|
||||
-
|
||||
-GitHub Actions는 의존성을 설치한 뒤 전체 테스트를 실행합니다. 실행 환경은
|
||||
-Python 3.12입니다. 자체 README 테스트는 라이브러리 프로파일, 30초 독자 흐름, 최소 실행
|
||||
-경로, Mermaid 그림 결정을 확인합니다. <!-- claim-id: C-CI-001 -->
|
||||
-
|
||||
+<!-- readme-harness:end development -->
|
||||
+
|
||||
+<!-- readme-harness:start documentation -->
|
||||
<!-- section-id: documentation -->
|
||||
## 상세 문서
|
||||
|
||||
-- [구성요소와 컨텍스트 경계](docs/architecture.md)
|
||||
-- [그림 결정과 소스·자산 계약](docs/visuals.md)
|
||||
-- [모드별 상태와 차단 조건](docs/state-machine.md)
|
||||
-- [모델 사용량 계측](docs/usage-metrics.md)
|
||||
-- [블라인드 README 품질 벤치마크](docs/quality-benchmark.md)
|
||||
+- [구성요소와 책임](docs/architecture.md)
|
||||
+- [시각 자료와 실제 결과 증명](docs/visuals.md)
|
||||
+- [모드별 처리 단계와 차단 조건](docs/state-machine.md)
|
||||
+- [모델 사용량 기록](docs/usage-metrics.md)
|
||||
+- [블라인드 README 품질 비교](docs/quality-benchmark.md)
|
||||
- [전체 설계 명세](docs/superpowers/specs/2026-07-16-readme-harness-design.md)
|
||||
|
||||
-주요 구현은 `src/readme_harness`, 스키마·규칙·워크플로는 `.agents`, 테스트는
|
||||
-`tests`에 있습니다. <!-- claim-id: C-LAYOUT-001 -->
|
||||
-
|
||||
+주요 구현은 `src/readme_harness`, 규칙과 워크플로는 `.agents`, 테스트는 `tests`에 있습니다.
|
||||
+<!-- claim-id: C-LAYOUT-001 -->
|
||||
+
|
||||
+<!-- readme-harness:end documentation -->
|
||||
+
|
||||
+<!-- readme-harness:start limitations -->
|
||||
<!-- section-id: limitations -->
|
||||
## 현재 한계
|
||||
|
||||
-- 후보 작성은 LLM 파이프라인의 판단에 의존합니다. 결정론적 드라이버는 준비된
|
||||
- 산출물을 검증하고 상태를 전진시킵니다.
|
||||
-- 네 모드의 결정론적 경로는 구현됐지만 도구 간 런타임 동등성은 Phase 4 검증
|
||||
- 목표입니다. <!-- claim-id: C-LIMIT-002 -->
|
||||
-- 명령 검증 보고서의 기본 수준은 정적 검사입니다. 실행을 별도로 기록하지 않은
|
||||
- 명령은 실제 실행 성공을 뜻하지 않습니다. <!-- claim-id: C-VERIFY-LIMIT-001 -->
|
||||
-- 여덟 저장소 유형의 블라인드 비교 계약은 마련했지만 결과 상태는 아직 `not-run`입니다.
|
||||
- `PASS` 결과 전에는 품질 우월성을 주장하지 않습니다. <!-- claim-id: C-BENCH-LIMIT-001 -->
|
||||
+- README 문장은 모델이 작성하고 검사 스크립트는 준비된 파일을 확인합니다.
|
||||
+ <!-- claim-id: C-WRITING-LIMIT-001 -->
|
||||
+
|
||||
+- 실행 기록이 없는 명령은 정적으로만 확인합니다.
|
||||
+ <!-- claim-id: C-VERIFY-LIMIT-001 -->
|
||||
+
|
||||
+- `Claude`와 `Antigravity`에서 `Codex`와 같은 동작을 하는지는 아직 검증하지 않았습니다.
|
||||
+ <!-- claim-id: C-XTOOL-LIMIT-001 -->
|
||||
+
|
||||
+- 블라인드 품질 비교는 아직 실행하지 않았으며 더 좋은 결과를 낸다고 주장하지 않습니다.
|
||||
+ <!-- claim-id: C-BENCH-LIMIT-001 -->
|
||||
+
|
||||
+<!-- readme-harness:end limitations -->
|
||||
@@ -0,0 +1,7 @@
|
||||
schema-version: 1
|
||||
mode: bootstrap
|
||||
target-rel: README.md
|
||||
generated-hash: sha256:b54317f98e0bea64cc31f489caca9a541b24bbdfec3aab6af3be41d0dd4dab22
|
||||
target-before-hash: sha256:dd241b6b8b7a0972086226c73b217128d98224cf30ab87505a6d5e8e0d2dcedf
|
||||
repository-snapshot-hash: sha256:2ff902bd9a7de01648f972d099614584bc26fa84c1492cec61dc6da82e4f6275
|
||||
review-score: 90
|
||||
+211
@@ -0,0 +1,211 @@
|
||||
# README Harness
|
||||
|
||||
<!-- readme-harness:metadata owner=readme-harness -->
|
||||
|
||||
저장소에서 확인한 사실과 사용자가 정한 요구를 바탕으로 README 초안을 만드는 도구입니다.
|
||||
<!-- claim-id: C-PROJECT-001 -->
|
||||
|
||||
명령·링크·경로를 검사한 뒤, 사람이 검토하고 적용할 수 있는 패치를 생성합니다.
|
||||
<!-- claim-id: C-OUTPUT-001 -->
|
||||
|
||||
현재 지원하는 작성·검증 흐름은 Codex용입니다. <!-- claim-id: C-CODEX-001 -->
|
||||
|
||||
Claude와 Antigravity에서 같은 동작을 하는지는 아직 미검증 상태입니다.
|
||||
<!-- claim-id: C-XTOOL-001 -->
|
||||
|
||||
<!-- readme-harness:start overview -->
|
||||
<!-- section-id: overview -->
|
||||
## 무엇을 만드는가
|
||||
|
||||
README를 새로 만들거나 기존 문서를 안전하게 갱신하려는 개발자를 위한 도구입니다.
|
||||
|
||||
- 새 README 작성
|
||||
- 기존 README 점검
|
||||
- 사람 작성 내용을 보존한 갱신
|
||||
- 특정 섹션만 다시 작성
|
||||
- 검토한 패치만 직접 적용
|
||||
|
||||
<!-- readme-harness:end overview -->
|
||||
|
||||
<!-- readme-harness:start proof -->
|
||||
<!-- section-id: proof -->
|
||||
## 실제 결과
|
||||
|
||||
아래 내용은 검토와 적용을 마친 이전 실행의 패치 일부입니다.
|
||||
<!-- claim-id: C-PROOF-001 -->
|
||||
|
||||
```diff
|
||||
-A GitHub-README-specialized harness built around a shared core with entrypoints
|
||||
-for **Codex**, **Antigravity**, and **Claude**. It does not "prettify" READMEs —
|
||||
-it analyzes the facts that exist in a repository, judges project type and
|
||||
-audience, then iteratively produces and maintains a README with a readable
|
||||
+이 하네스는 저장소의 실제 코드와 사용 목적을 바탕으로 문서 후보를 만들고,
|
||||
+명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다.
|
||||
```
|
||||
|
||||
<!-- visual-id: reviewed-patch-preview -->
|
||||
|
||||
[전체 패치와 출처](examples/readme-showcase/README.patch)에서 더 긴 변경 내용을 확인할 수 있습니다.
|
||||
|
||||
<!-- readme-harness:end proof -->
|
||||
|
||||
<!-- readme-harness:start quick-start -->
|
||||
<!-- section-id: quick-start -->
|
||||
## 빠른 시작
|
||||
|
||||
현재 실행 경로는 Codex 작업 공간의 `requirement-driven-readme` 스킬입니다.
|
||||
<!-- claim-id: C-INVOCATION-001 -->
|
||||
|
||||
<!-- quick-start-step: invocation -->
|
||||
Codex에 다음과 같이 요청합니다.
|
||||
|
||||
> 이 저장소의 README를 `bootstrap` 모드로 작성해 주세요.
|
||||
> 주 독자는 백엔드 개발자이며, 설치와 첫 실행 방법을 우선해 주세요.
|
||||
|
||||
<!-- quick-start-step: expected-result -->
|
||||
작업 뒤 확인할 파일은 `README.generated.md`와 `README.patch`입니다.
|
||||
<!-- claim-id: C-RESULTS-001 -->
|
||||
|
||||
<!-- quick-start-step: success-check -->
|
||||
생성된 README의 명령과 링크를 읽고, 패치가 의도한 범위만 바꾸는지 검토합니다.
|
||||
|
||||
대상 `README.md`는 적용 명령을 실행하기 전까지 바뀌지 않습니다.
|
||||
<!-- claim-id: C-NO-AUTO-APPLY-001 -->
|
||||
|
||||
<!-- quick-start-step: apply -->
|
||||
검토가 끝난 패치만 직접 적용합니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/<repo-id>/<run-id> --repo /path/to/repository
|
||||
```
|
||||
|
||||
적용 직전에 생성 파일과 대상 README, 저장소 기준 정보가 바뀌지 않았는지 다시 확인합니다.
|
||||
<!-- claim-id: C-APPLY-CHECK-001 -->
|
||||
|
||||
<!-- readme-harness:end quick-start -->
|
||||
|
||||
<!-- readme-harness:start usage -->
|
||||
<!-- section-id: usage -->
|
||||
## 어떤 작업을 지원하는가
|
||||
|
||||
새 README 작성과 전면 재작성의 기본 선택은 `bootstrap`입니다.
|
||||
<!-- claim-id: C-MODE-BOOTSTRAP-001 -->
|
||||
|
||||
현재 README의 문제만 찾는 작업은 `audit`입니다.
|
||||
<!-- claim-id: C-MODE-AUDIT-001 -->
|
||||
|
||||
사람이 작성한 영역을 보존하는 갱신은 `refresh`입니다.
|
||||
<!-- claim-id: C-MODE-REFRESH-001 -->
|
||||
|
||||
한 섹션과 영향을 받는 검사 결과의 갱신은 `section-update`입니다.
|
||||
<!-- claim-id: C-MODE-SECTION-001 -->
|
||||
|
||||
<!-- readme-harness:end usage -->
|
||||
|
||||
<!-- readme-harness:start safeguards -->
|
||||
<!-- section-id: safeguards -->
|
||||
## 안전하게 다루는 방법
|
||||
|
||||
코드에서 확인한 사실과 사용자가 정한 문서 요구는 따로 둡니다.
|
||||
<!-- claim-id: C-SOURCE-SPLIT-001 -->
|
||||
|
||||
명령, 경로, 버전처럼 오류 영향이 큰 정보는 근거 파일과 연결합니다.
|
||||
<!-- claim-id: C-FACT-TRACE-001 -->
|
||||
|
||||
갱신 작업은 보호 영역과 마커 밖의 사람이 작성한 문장을 보존합니다.
|
||||
<!-- claim-id: C-PRESERVE-001 -->
|
||||
|
||||
사람이 고친 영역과 새 초안이 충돌하면 자동 병합과 적용이 중단됩니다.
|
||||
<!-- claim-id: C-CONFLICT-001 -->
|
||||
|
||||
비밀 값이나 저장소 밖 경로가 발견되면 패치를 준비하지 않습니다.
|
||||
<!-- claim-id: C-SECRET-PATH-001 -->
|
||||
|
||||
검토 뒤 저장소나 생성 파일이 바뀌어도 적용을 중단합니다.
|
||||
<!-- claim-id: C-STALE-001 -->
|
||||
|
||||
<!-- readme-harness:end safeguards -->
|
||||
|
||||
<!-- readme-harness:start workflow -->
|
||||
<!-- section-id: workflow -->
|
||||
## 동작 방식
|
||||
|
||||
사용자 요청 → 저장소 사실 확인 → README 작성 → 명령·링크·문장 검사 → 독립 검토 → 패치 확인 → 직접 적용
|
||||
<!-- claim-id: C-WORKFLOW-001 -->
|
||||
|
||||
검사에서 문제가 나오면 해당 내용을 맡은 단계부터 다시 작성합니다.
|
||||
<!-- claim-id: C-REWORK-001 -->
|
||||
|
||||
<!-- readme-harness:end workflow -->
|
||||
|
||||
<!-- readme-harness:start inputs -->
|
||||
<!-- section-id: inputs -->
|
||||
## 입력과 생성 파일
|
||||
|
||||
`readme-request.yaml`에는 독자, 목적, 언어, 보존 범위와 그림 정책을 적습니다.
|
||||
<!-- claim-id: C-REQUEST-001 -->
|
||||
|
||||
사용자는 다음 두 결과를 주로 확인합니다.
|
||||
|
||||
- `README.generated.md`: 생성된 README
|
||||
- `README.patch`: 현재 README와의 차이
|
||||
|
||||
각 작업의 파일은 `runs/<repo-id>/<run-id>` 아래에 따로 저장됩니다.
|
||||
<!-- claim-id: C-RUN-DIR-001 -->
|
||||
|
||||
<!-- readme-harness:end inputs -->
|
||||
|
||||
<!-- readme-harness:start development -->
|
||||
<!-- section-id: development -->
|
||||
## 개발
|
||||
|
||||
개발에는 Python 3.12 이상이 필요하며, 개발 의존성에는 `pytest`가 포함됩니다.
|
||||
<!-- claim-id: C-DEV-PREREQ-001 -->
|
||||
|
||||
저장소 루트에서 개발 모드로 설치합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
전체 테스트는 다음 명령으로 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pytest -q
|
||||
```
|
||||
|
||||
<!-- readme-harness:end development -->
|
||||
|
||||
<!-- readme-harness:start documentation -->
|
||||
<!-- section-id: documentation -->
|
||||
## 상세 문서
|
||||
|
||||
- [구성요소와 책임](docs/architecture.md)
|
||||
- [시각 자료와 실제 결과 증명](docs/visuals.md)
|
||||
- [모드별 처리 단계와 차단 조건](docs/state-machine.md)
|
||||
- [모델 사용량 기록](docs/usage-metrics.md)
|
||||
- [블라인드 README 품질 비교](docs/quality-benchmark.md)
|
||||
- [전체 설계 명세](docs/superpowers/specs/2026-07-16-readme-harness-design.md)
|
||||
|
||||
주요 구현은 `src/readme_harness`, 규칙과 워크플로는 `.agents`, 테스트는 `tests`에 있습니다.
|
||||
<!-- claim-id: C-LAYOUT-001 -->
|
||||
|
||||
<!-- readme-harness:end documentation -->
|
||||
|
||||
<!-- readme-harness:start limitations -->
|
||||
<!-- section-id: limitations -->
|
||||
## 현재 한계
|
||||
|
||||
- README 문장은 모델이 작성하고 검사 스크립트는 준비된 파일을 확인합니다.
|
||||
<!-- claim-id: C-WRITING-LIMIT-001 -->
|
||||
|
||||
- 실행 기록이 없는 명령은 정적으로만 확인합니다.
|
||||
<!-- claim-id: C-VERIFY-LIMIT-001 -->
|
||||
|
||||
- `Claude`와 `Antigravity`에서 `Codex`와 같은 동작을 하는지는 아직 검증하지 않았습니다.
|
||||
<!-- claim-id: C-XTOOL-LIMIT-001 -->
|
||||
|
||||
- 블라인드 품질 비교는 아직 실행하지 않았으며 더 좋은 결과를 낸다고 주장하지 않습니다.
|
||||
<!-- claim-id: C-BENCH-LIMIT-001 -->
|
||||
|
||||
<!-- readme-harness:end limitations -->
|
||||
@@ -0,0 +1,147 @@
|
||||
schema-version: 1
|
||||
claims:
|
||||
- id: C-PROJECT-001
|
||||
type: factual
|
||||
section: document
|
||||
sources: [{fact-id: F-PROJECT-001}]
|
||||
status: supported
|
||||
- id: C-OUTPUT-001
|
||||
type: factual
|
||||
section: document
|
||||
sources: [{fact-id: F-VERIFY-001}, {fact-id: F-OUTPUT-001}]
|
||||
status: supported
|
||||
- id: C-CODEX-001
|
||||
type: factual
|
||||
section: document
|
||||
sources: [{fact-id: F-CODEX-001}]
|
||||
status: supported
|
||||
- id: C-XTOOL-001
|
||||
type: factual
|
||||
section: document
|
||||
sources: [{fact-id: F-CODEX-001}]
|
||||
status: supported
|
||||
- id: C-PROOF-001
|
||||
type: factual
|
||||
section: proof
|
||||
sources: [{fact-id: F-PROOF-001}]
|
||||
status: supported
|
||||
- id: C-INVOCATION-001
|
||||
type: factual
|
||||
section: quick-start
|
||||
sources: [{fact-id: F-CODEX-001}]
|
||||
status: supported
|
||||
- id: C-RESULTS-001
|
||||
type: factual
|
||||
section: quick-start
|
||||
sources: [{fact-id: F-OUTPUT-001}]
|
||||
status: supported
|
||||
- id: C-NO-AUTO-APPLY-001
|
||||
type: factual
|
||||
section: quick-start
|
||||
sources: [{fact-id: F-APPLY-001}]
|
||||
status: supported
|
||||
- id: C-APPLY-CHECK-001
|
||||
type: factual
|
||||
section: quick-start
|
||||
sources: [{fact-id: F-APPLY-001}]
|
||||
status: supported
|
||||
- id: C-MODE-BOOTSTRAP-001
|
||||
type: factual
|
||||
section: usage
|
||||
sources: [{fact-id: F-MODES-001}, {fact-id: F-OUTPUT-001}]
|
||||
status: supported
|
||||
- id: C-MODE-AUDIT-001
|
||||
type: factual
|
||||
section: usage
|
||||
sources: [{fact-id: F-MODES-001}, {fact-id: F-AUDIT-001}]
|
||||
status: supported
|
||||
- id: C-MODE-REFRESH-001
|
||||
type: factual
|
||||
section: usage
|
||||
sources: [{fact-id: F-MODES-001}, {fact-id: F-REFRESH-001}]
|
||||
status: supported
|
||||
- id: C-MODE-SECTION-001
|
||||
type: factual
|
||||
section: usage
|
||||
sources: [{fact-id: F-MODES-001}, {fact-id: F-SECTION-001}]
|
||||
status: supported
|
||||
- id: C-SOURCE-SPLIT-001
|
||||
type: factual
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-AUTHORITY-001}]
|
||||
status: supported
|
||||
- id: C-FACT-TRACE-001
|
||||
type: factual
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-CLAIM-001}, {fact-id: F-VERIFY-001}]
|
||||
status: supported
|
||||
- id: C-PRESERVE-001
|
||||
type: factual
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-REFRESH-001}]
|
||||
status: supported
|
||||
- id: C-CONFLICT-001
|
||||
type: factual
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-REFRESH-001}]
|
||||
status: supported
|
||||
- id: C-SECRET-PATH-001
|
||||
type: factual
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-SAFETY-001}]
|
||||
status: supported
|
||||
- id: C-STALE-001
|
||||
type: factual
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-SAFETY-001}, {fact-id: F-APPLY-001}]
|
||||
status: supported
|
||||
- id: C-WORKFLOW-001
|
||||
type: factual
|
||||
section: workflow
|
||||
sources: [{fact-id: F-WORKFLOW-001}]
|
||||
status: supported
|
||||
- id: C-REWORK-001
|
||||
type: factual
|
||||
section: workflow
|
||||
sources: [{fact-id: F-WORKFLOW-001}]
|
||||
status: supported
|
||||
- id: C-REQUEST-001
|
||||
type: factual
|
||||
section: inputs
|
||||
sources: [{fact-id: F-AUTHORITY-001}, {fact-id: F-REPO-LAYOUT-001}]
|
||||
status: supported
|
||||
- id: C-RUN-DIR-001
|
||||
type: factual
|
||||
section: inputs
|
||||
sources: [{fact-id: F-RUN-LAYOUT-001}]
|
||||
status: supported
|
||||
- id: C-DEV-PREREQ-001
|
||||
type: factual
|
||||
section: development
|
||||
sources: [{fact-id: F-RUNTIME-001}]
|
||||
status: supported
|
||||
- id: C-LAYOUT-001
|
||||
type: factual
|
||||
section: documentation
|
||||
sources: [{fact-id: F-REPO-LAYOUT-001}]
|
||||
status: supported
|
||||
- id: C-WRITING-LIMIT-001
|
||||
type: factual
|
||||
section: limitations
|
||||
sources: [{fact-id: F-VERIFY-001}]
|
||||
status: supported
|
||||
- id: C-VERIFY-LIMIT-001
|
||||
type: factual
|
||||
section: limitations
|
||||
sources: [{fact-id: F-VERIFY-001}]
|
||||
status: supported
|
||||
- id: C-XTOOL-LIMIT-001
|
||||
type: factual
|
||||
section: limitations
|
||||
sources: [{fact-id: F-CODEX-001}]
|
||||
status: supported
|
||||
- id: C-BENCH-LIMIT-001
|
||||
type: factual
|
||||
section: limitations
|
||||
sources: [{fact-id: F-BENCH-001}]
|
||||
status: supported
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"policy-id": "korean-reader-prose-v1",
|
||||
"language": "ko-KR",
|
||||
"applicable": true,
|
||||
"scope": "candidate",
|
||||
"state": "PASS",
|
||||
"summary": {
|
||||
"errors": 0,
|
||||
"warnings": 0,
|
||||
"sentences": 52,
|
||||
"prose-characters": 1196,
|
||||
"hangul-characters": 1007
|
||||
},
|
||||
"findings": []
|
||||
}
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
schema-version: 1
|
||||
verdict: NEEDS_FIX
|
||||
score: 90
|
||||
scores:
|
||||
project-specificity:
|
||||
score: 5
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: quick-start
|
||||
line-start: 56
|
||||
line-end: 83
|
||||
content-hash: sha256:1f849db919339542195b10e26c2db6028e2acfdc0c057fcddc8cc535932c829d
|
||||
observation: Codex 스킬 식별자, 생성 파일, 명시적 적용 명령과 적용 전 재확인을 프로젝트 고유 경로로 연결한다.
|
||||
reader-journey:
|
||||
score: 5
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 16
|
||||
line-end: 85
|
||||
content-hash: sha256:588e0fa1ad93f95c3f945ad2a8c7dcceeb414c77dd6395048955568c783a0540
|
||||
observation: 사용자 결과, 대표 패치, Codex 요청, 생성 파일 확인, 성공 점검, 직접 적용 순서로 이어진다.
|
||||
technical-explanation:
|
||||
score: 4
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 105
|
||||
line-end: 125
|
||||
content-hash: sha256:a4bd099a77602b1510fad18ef3023498c8c6c3efb700a2d4ebdf67a1182c0f0e
|
||||
observation: 근거 분리, 추적, 보존, 충돌·비밀·변경 차단 책임을 결과 중심으로 구분한다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 129
|
||||
line-end: 137
|
||||
content-hash: sha256:47be1e061b740eb6e3acd12179b0420cb0a3c5a6df4f599df30adbb3662dd04e
|
||||
observation: 처리 흐름과 재작성 동작을 짧게 설명하고 상세 책임은 별도 문서로 보낸다.
|
||||
task-usability:
|
||||
score: 4
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: quick-start
|
||||
line-start: 56
|
||||
line-end: 83
|
||||
content-hash: sha256:1f849db919339542195b10e26c2db6028e2acfdc0c057fcddc8cc535932c829d
|
||||
observation: 요청 예시부터 결과 파일 확인과 적용까지 한 절에서 수행할 수 있다.
|
||||
prose-clarity:
|
||||
score: 4
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 5
|
||||
line-end: 14
|
||||
content-hash: sha256:c0843d3bcaf94929872e5e7ab675f77b9bbbaf66d50e8c61b6ce7d478e11c617
|
||||
observation: 첫 문장부터 결과와 근거를 직접 밝히고 지원 범위와 미검증 범위를 분리한다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 195
|
||||
line-end: 209
|
||||
content-hash: sha256:93ace992f3430bfc7395d56e231a9c9892f959b7311d1da91f7296a8aefc29cd
|
||||
observation: 모델 작성, 정적 확인, 도구 간 동작, 품질 비교의 한계를 짧은 항목으로 분리한다.
|
||||
visual-judgment:
|
||||
score: 5
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 30
|
||||
line-end: 48
|
||||
content-hash: sha256:ad44797cc7abc92964f888bccafdc54cc71358f07057234f9975d728d91e4927
|
||||
observation: 대표 패치를 내부 구조보다 먼저 보여 주고 전체 패치 경로를 연결한다.
|
||||
hard-gates:
|
||||
passed: false
|
||||
failures: [unsupported-high-risk-claim]
|
||||
reader-simulations:
|
||||
30-seconds:
|
||||
outcome: PASS
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 1
|
||||
line-end: 14
|
||||
content-hash: sha256:5b23dc0b21cf361bff806f69c8ed0e527528daefd523cca4ffe17ff9d3674196
|
||||
observation: README 초안과 패치를 만드는 도구라는 점과 현재 Codex 범위를 첫 화면에서 확인한다.
|
||||
5-minutes:
|
||||
outcome: PASS
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 52
|
||||
line-end: 139
|
||||
content-hash: sha256:002ddd5d129170e198da9c5f2b202b0b1c35e01bcefcbfe6bd3df070c04cec7e
|
||||
observation: 최소 사용자 경로, 네 가지 모드, 안전장치와 전체 처리 흐름을 찾을 수 있다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 195
|
||||
line-end: 209
|
||||
content-hash: sha256:93ace992f3430bfc7395d56e231a9c9892f959b7311d1da91f7296a8aefc29cd
|
||||
observation: 검증 수준, 도구 간 동일 동작과 품질 우월성의 한계를 확인할 수 있다.
|
||||
contributor:
|
||||
outcome: PASS
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: document
|
||||
line-start: 158
|
||||
line-end: 191
|
||||
content-hash: sha256:5dd4d4f75a0efbc470683bc6c995acdf3084d7416dccd012ff6bd7fe47b0b4f7
|
||||
observation: Python 전제조건, 개발 설치와 테스트 명령, 구현·규칙·테스트 위치를 찾을 수 있다.
|
||||
findings:
|
||||
- id: R-001
|
||||
severity: major
|
||||
category: technical-correctness
|
||||
subject: C-PROOF-001
|
||||
section: proof
|
||||
message: 대표 패치의 적용 완료 주장은 연결된 저장소 사실의 범위를 넘으므로 검토 통과 사실로 좁혀야 한다.
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: proof
|
||||
line-start: 34
|
||||
line-end: 35
|
||||
content-hash: sha256:00e36e843e3370132b9c62718c3da3778bb251c1def0374182edf1723ca26df2
|
||||
observation: C-PROOF-001은 검토와 적용 완료를 함께 말하지만 F-PROOF-001에는 PASS 출처 상태만 있다.
|
||||
route-to: README_DRAFTED
|
||||
status: open
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"state": "PASS_WITH_MANUAL",
|
||||
"verification-level": "static",
|
||||
"execution-verified": false,
|
||||
"checks": {
|
||||
"commands": {
|
||||
"total": 3,
|
||||
"verified": 1,
|
||||
"manual-required": 2,
|
||||
"failed": 0
|
||||
},
|
||||
"paths": {
|
||||
"total": 7,
|
||||
"verified": 7,
|
||||
"failed": 0
|
||||
},
|
||||
"anchors": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
},
|
||||
"readme-contracts": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
}
|
||||
},
|
||||
"failures": [],
|
||||
"limitations": [
|
||||
"manual verification required: python3 -m pip install -e \".[dev]\" (unsupported-static-verifier)",
|
||||
"manual verification required: python3 -m pytest -q (unsupported-static-verifier)"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
schema-version: 1
|
||||
visuals:
|
||||
- id: reviewed-patch-preview
|
||||
section: proof
|
||||
type: artifact-showcase
|
||||
purpose: 검토와 적용을 마친 실제 README 패치의 핵심 변경을 보여 줍니다.
|
||||
placeholder-text: 영문 중심 소개가 한국어 사용자 중심 소개로 바뀐 실제 diff 일부
|
||||
must-show:
|
||||
- 변경 전 영문 소개
|
||||
- 변경 후 한국어 소개
|
||||
relationships: []
|
||||
emphasize:
|
||||
- 입력 문서와 생성 문서의 차이
|
||||
avoid:
|
||||
- 저장소 근거가 없는 품질 우월성 표현
|
||||
require-provenance: true
|
||||
placement:
|
||||
after-section-id: proof
|
||||
accessibility:
|
||||
alt-text: 영문 소개를 한국어 사용자 중심 소개로 바꾼 README 패치 미리보기
|
||||
production:
|
||||
format: diff
|
||||
status: source-created
|
||||
source-path: examples/readme-showcase/README.patch
|
||||
source-hash: sha256:3f930c70600d6530afa4a6b486be7f467f8650d28f4f2b057b889ef97f545e19
|
||||
asset:
|
||||
path: examples/readme-showcase/README.patch
|
||||
provenance: examples/readme-showcase/provenance.yaml
|
||||
source-run: runs/readme-harness/20260720-review-remediation
|
||||
sha256: sha256:3f930c70600d6530afa4a6b486be7f467f8650d28f4f2b057b889ef97f545e19
|
||||
caption: 검토와 적용을 마친 이전 README 실행의 실제 패치 일부입니다.
|
||||
@@ -0,0 +1,31 @@
|
||||
schema-version: 1
|
||||
claims:
|
||||
- {id: C-PROJECT-001, type: factual, section: document, sources: [{fact-id: F-PROJECT-001}], status: supported}
|
||||
- {id: C-OUTPUT-001, type: factual, section: document, sources: [{fact-id: F-VERIFY-001}, {fact-id: F-OUTPUT-001}], status: supported}
|
||||
- {id: C-CODEX-001, type: factual, section: document, sources: [{fact-id: F-CODEX-001}], status: supported}
|
||||
- {id: C-XTOOL-001, type: factual, section: document, sources: [{fact-id: F-CODEX-001}], status: supported}
|
||||
- {id: C-PROOF-001, type: factual, section: proof, sources: [{fact-id: F-PROOF-001}], status: supported}
|
||||
- {id: C-INVOCATION-001, type: factual, section: quick-start, sources: [{fact-id: F-CODEX-001}], status: supported}
|
||||
- {id: C-RESULTS-001, type: factual, section: quick-start, sources: [{fact-id: F-OUTPUT-001}], status: supported}
|
||||
- {id: C-NO-AUTO-APPLY-001, type: factual, section: quick-start, sources: [{fact-id: F-APPLY-001}], status: supported}
|
||||
- {id: C-APPLY-CHECK-001, type: factual, section: quick-start, sources: [{fact-id: F-APPLY-001}], status: supported}
|
||||
- {id: C-MODE-BOOTSTRAP-001, type: factual, section: usage, sources: [{fact-id: F-MODES-001}, {fact-id: F-OUTPUT-001}], status: supported}
|
||||
- {id: C-MODE-AUDIT-001, type: factual, section: usage, sources: [{fact-id: F-MODES-001}, {fact-id: F-AUDIT-001}], status: supported}
|
||||
- {id: C-MODE-REFRESH-001, type: factual, section: usage, sources: [{fact-id: F-MODES-001}, {fact-id: F-REFRESH-001}], status: supported}
|
||||
- {id: C-MODE-SECTION-001, type: factual, section: usage, sources: [{fact-id: F-MODES-001}, {fact-id: F-SECTION-001}], status: supported}
|
||||
- {id: C-SOURCE-SPLIT-001, type: factual, section: safeguards, sources: [{fact-id: F-AUTHORITY-001}], status: supported}
|
||||
- {id: C-FACT-TRACE-001, type: factual, section: safeguards, sources: [{fact-id: F-CLAIM-001}, {fact-id: F-VERIFY-001}], status: supported}
|
||||
- {id: C-PRESERVE-001, type: factual, section: safeguards, sources: [{fact-id: F-REFRESH-001}], status: supported}
|
||||
- {id: C-CONFLICT-001, type: factual, section: safeguards, sources: [{fact-id: F-REFRESH-001}], status: supported}
|
||||
- {id: C-SECRET-PATH-001, type: factual, section: safeguards, sources: [{fact-id: F-SAFETY-001}], status: supported}
|
||||
- {id: C-STALE-001, type: factual, section: safeguards, sources: [{fact-id: F-SAFETY-001}, {fact-id: F-APPLY-001}], status: supported}
|
||||
- {id: C-WORKFLOW-001, type: factual, section: workflow, sources: [{fact-id: F-WORKFLOW-001}], status: supported}
|
||||
- {id: C-REWORK-001, type: factual, section: workflow, sources: [{fact-id: F-WORKFLOW-001}], status: supported}
|
||||
- {id: C-REQUEST-001, type: factual, section: inputs, sources: [{fact-id: F-AUTHORITY-001}, {fact-id: F-REPO-LAYOUT-001}], status: supported}
|
||||
- {id: C-RUN-DIR-001, type: factual, section: inputs, sources: [{fact-id: F-RUN-LAYOUT-001}], status: supported}
|
||||
- {id: C-DEV-PREREQ-001, type: factual, section: development, sources: [{fact-id: F-RUNTIME-001}], status: supported}
|
||||
- {id: C-LAYOUT-001, type: factual, section: documentation, sources: [{fact-id: F-REPO-LAYOUT-001}], status: supported}
|
||||
- {id: C-WRITING-LIMIT-001, type: factual, section: limitations, sources: [{fact-id: F-VERIFY-001}], status: supported}
|
||||
- {id: C-VERIFY-LIMIT-001, type: factual, section: limitations, sources: [{fact-id: F-VERIFY-001}], status: supported}
|
||||
- {id: C-XTOOL-LIMIT-001, type: factual, section: limitations, sources: [{fact-id: F-CODEX-001}], status: supported}
|
||||
- {id: C-BENCH-LIMIT-001, type: factual, section: limitations, sources: [{fact-id: F-BENCH-001}], status: supported}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"policy-id": "korean-reader-prose-v1",
|
||||
"language": "ko-KR",
|
||||
"applicable": true,
|
||||
"scope": "candidate",
|
||||
"state": "PASS",
|
||||
"summary": {
|
||||
"errors": 0,
|
||||
"warnings": 0,
|
||||
"sentences": 52,
|
||||
"prose-characters": 1194,
|
||||
"hangul-characters": 1005
|
||||
},
|
||||
"findings": []
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
schema-version: 2
|
||||
mode: bootstrap
|
||||
profile: tool
|
||||
repository-snapshot-hash: sha256:2ff902bd9a7de01648f972d099614584bc26fa84c1492cec61dc6da82e4f6275
|
||||
artifacts:
|
||||
readme-request.yaml: sha256:545161085f426a1774dec0db5d66189f817b62d5991da253115677d99746f8c2
|
||||
repository-facts.yaml: sha256:0113f0f6acd124348d4987264ba8600492a2fe26278abb2a65309977b2ff7a69
|
||||
readme-brief.yaml: sha256:651ac6a29ac2592ef96779b8a7387085bbdcd36575d2edd97b8bfd72a2621374
|
||||
readme-outline.yaml: sha256:f2f5169f12e20ec51692c6341facd49689b2057fd7ea4a38b17446eb219d2f97
|
||||
README.candidate.md: sha256:b54317f98e0bea64cc31f489caca9a541b24bbdfec3aab6af3be41d0dd4dab22
|
||||
claim-map.yaml: sha256:194995416648414c0a18078477b0bbfd7e61ddad264efeff531bdda35ce92206
|
||||
visual-plan.yaml: sha256:0f306a9c1ccf0c39fd636f52d4348f694bbb79e82530dbf37e08d0df063e5418
|
||||
prose-report.json: sha256:f35a4b2bb25d3e0e1435ed3b6065313ae90e4ca4a6ef739e72c74515fb3a887f
|
||||
review-findings.yaml: sha256:a91d19b05e2c6364dd9b424fd23d71c3829f2b244eeea9bd1a072962cfcae69e
|
||||
@@ -0,0 +1,47 @@
|
||||
schema-version: 1
|
||||
project-profile:
|
||||
primary: tool
|
||||
audiences:
|
||||
primary:
|
||||
- 저장소 README를 새로 만들거나 안전하게 갱신하려는 개발자
|
||||
secondary:
|
||||
- 하네스 검사와 프로파일을 확장하는 기여자
|
||||
reader-outcomes:
|
||||
- 첫 두 문장에서 README 초안과 패치를 만드는 도구임을 판단한다.
|
||||
- Codex에 작업을 요청하고 생성된 README와 패치를 확인한다.
|
||||
- 작업에 맞는 모드를 고르고 검토한 패치만 직접 적용한다.
|
||||
- 개발 환경과 상세 설계는 사용자 경로 뒤에서 찾는다.
|
||||
project-story:
|
||||
value-proposition: 저장소 사실과 문서 요구를 바탕으로 README 초안을 만들고 검토용 패치로 제공합니다.
|
||||
problem: README 작성 도구가 없는 명령을 쓰거나 사람의 문장을 덮어쓰면 검토 비용과 적용 위험이 커집니다.
|
||||
target-reader: README를 만들거나 갱신하려는 개발자
|
||||
notable-traits:
|
||||
- text: 네 가지 문서 작업을 지원하며 결과를 검토용 패치로 분리합니다.
|
||||
fact-ids: [F-MODES-001, F-OUTPUT-001]
|
||||
- text: 명령과 경로를 확인하고 검토 전 대상 README를 바꾸지 않습니다.
|
||||
fact-ids: [F-VERIFY-001, F-APPLY-001]
|
||||
- text: 공개 README에는 실제 검토를 통과한 패치 예시를 연결합니다.
|
||||
fact-ids: [F-PROOF-001]
|
||||
maturity: Codex용 흐름은 구현됐고 Claude와 Antigravity의 같은 동작은 아직 검증하지 않았습니다.
|
||||
limitations:
|
||||
- README 문장은 모델이 작성하며 검사 스크립트가 문장을 대신 만들지는 않습니다.
|
||||
- 명령 검증은 실행 기록이 없으면 정적 확인 수준입니다.
|
||||
- 도구 간 같은 동작과 품질 우월성은 아직 주장하지 않습니다.
|
||||
narrative-variant: tool
|
||||
reader-journey:
|
||||
- reader-question: 이 도구가 만드는 결과는 무엇입니까?
|
||||
section-id: overview
|
||||
- reader-question: 실제 결과는 어떤 모습입니까?
|
||||
section-id: proof
|
||||
- reader-question: 가장 짧은 사용자 경로는 무엇입니까?
|
||||
section-id: quick-start
|
||||
- reader-question: 작업에 맞는 모드는 무엇입니까?
|
||||
section-id: usage
|
||||
- reader-question: 적용 전에 무엇을 확인합니까?
|
||||
section-id: safeguards
|
||||
- reader-question: 하네스는 어떤 순서로 일합니까?
|
||||
section-id: workflow
|
||||
- reader-question: 사용자에게 필요한 파일은 무엇입니까?
|
||||
section-id: inputs
|
||||
- reader-question: 개발과 상세 설계는 어디서 확인합니까?
|
||||
section-id: development
|
||||
@@ -0,0 +1,78 @@
|
||||
schema-version: 1
|
||||
sections:
|
||||
- id: overview
|
||||
title-guidance: 무엇을 만드는가
|
||||
level: 2
|
||||
purpose: 프로젝트 결과와 현재 지원 범위를 첫 화면에서 설명합니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
content-requirements:
|
||||
- README 초안과 패치
|
||||
- Codex 지원과 다른 도구의 미검증 범위
|
||||
- id: proof
|
||||
title-guidance: 실제 결과
|
||||
level: 2
|
||||
purpose: 검토를 통과한 실제 패치 일부를 먼저 보여 줍니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
content-requirements:
|
||||
- 실제 이전 실행의 패치 미리보기
|
||||
- 전체 패치와 출처 링크
|
||||
visual-slot:
|
||||
decision: include
|
||||
reader-question: 이 도구가 만든 실제 README 변경은 어떤 모습입니까?
|
||||
rationale: 결과가 문서인 도구는 내부 구조도보다 실제 변경 내용을 먼저 보여 줘야 합니다.
|
||||
purpose: 이전 실행에서 검토와 적용을 마친 README 패치 일부를 보여 줍니다.
|
||||
- id: quick-start
|
||||
title-guidance: 빠른 시작
|
||||
level: 2
|
||||
purpose: Codex 요청부터 결과 확인과 명시적 적용까지의 기본 경로를 제공합니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
content-requirements:
|
||||
- 사용자 요청
|
||||
- 생성 파일
|
||||
- 성공 확인
|
||||
- 명시적 적용
|
||||
- id: usage
|
||||
title-guidance: 어떤 작업을 지원하는가
|
||||
level: 2
|
||||
purpose: 기본 모드와 세 보조 모드를 독자 작업 기준으로 구분합니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
- id: safeguards
|
||||
title-guidance: 안전하게 다루는 방법
|
||||
level: 2
|
||||
purpose: 근거 확인과 사람 작성 내용 보존, 자동 적용 금지를 설명합니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
- id: workflow
|
||||
title-guidance: 동작 방식
|
||||
level: 2
|
||||
purpose: 사용자 관점의 처리 순서만 짧게 보여 줍니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
- id: inputs
|
||||
title-guidance: 입력과 생성 파일
|
||||
level: 2
|
||||
purpose: 사용자가 준비하고 확인할 파일만 설명합니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
- id: development
|
||||
title-guidance: 개발
|
||||
level: 2
|
||||
purpose: 기여자용 설치와 테스트 경로를 사용자 경로 뒤에 둡니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
- id: documentation
|
||||
title-guidance: 상세 문서
|
||||
level: 2
|
||||
purpose: 내부 구조와 정책을 정본 문서로 연결합니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
- id: limitations
|
||||
title-guidance: 현재 한계
|
||||
level: 2
|
||||
purpose: 모델 작성과 검증 수준, 도구 지원 범위를 한곳에 정리합니다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
@@ -0,0 +1,78 @@
|
||||
schema-version: 1
|
||||
target:
|
||||
repository: /home/donghyeon/workspace/ai-tool/readme-harness
|
||||
readme-path: README.md
|
||||
mode: bootstrap
|
||||
profile-override: tool
|
||||
project-intent:
|
||||
purpose: 저장소에서 확인한 사실과 사용자가 정한 요구를 바탕으로 README 초안과 검토용 패치를 만드는 도구를 설명한다.
|
||||
positioning: 사용자 경로를 먼저 보여 주고, 명령·경로·문장 근거 검사와 사람 작성 내용 보존은 필요한 수준에서만 설명한다.
|
||||
maturity: 현재 Codex용 작성·검증 흐름을 지원하며 Claude와 Antigravity의 동일 동작은 아직 검증하지 않았다.
|
||||
audience:
|
||||
primary:
|
||||
- 저장소 README를 새로 만들거나 안전하게 갱신하려는 개발자
|
||||
secondary:
|
||||
- 하네스 검사와 프로파일을 확장하는 기여자
|
||||
reader-actions:
|
||||
- 첫 두 문장에서 어떤 결과를 만드는 도구인지 판단한다.
|
||||
- Codex에 README 작업을 요청하고 생성된 README와 패치를 확인한다.
|
||||
- 작업 목적에 맞는 모드를 고른다.
|
||||
- 검토한 패치만 명시적으로 적용한다.
|
||||
- 개발 환경과 테스트 방법은 별도의 개발 절에서 찾는다.
|
||||
content-policy:
|
||||
language: ko-KR
|
||||
tone: 독자 행동을 먼저 밝히는 직접적인 기술 설명체
|
||||
target-length: medium
|
||||
preserve-existing-copy: false
|
||||
detail-docs-policy: summary-and-link
|
||||
visual-policy:
|
||||
mode: when-useful
|
||||
max-visuals: 1
|
||||
preferred-formats:
|
||||
- diff
|
||||
placeholder-format: HTML 주석 기반 제작 사양
|
||||
terminology-policy:
|
||||
exact-identifiers: []
|
||||
explain-on-first-use: {}
|
||||
internal-only:
|
||||
family: 작업 담당 방식
|
||||
fan-out: 여러 담당자가 나눠 검토
|
||||
collapse: 한 담당자가 맡아 처리
|
||||
concrete worker: 실제 변경 담당자
|
||||
verification family: 검증 담당 역할
|
||||
route-to: 다시 작성할 지점
|
||||
public-surface-terms:
|
||||
allowed:
|
||||
- bootstrap
|
||||
- audit
|
||||
- refresh
|
||||
- section-update
|
||||
- readme-request.yaml
|
||||
- README.generated.md
|
||||
- README.patch
|
||||
- requirement-driven-readme
|
||||
explain-on-first-use: {}
|
||||
docs-only:
|
||||
- QUALITY_REVIEWED
|
||||
- READY_FOR_APPLY
|
||||
- claim-map.yaml
|
||||
- visual-plan.yaml
|
||||
- review-findings.yaml
|
||||
- quality-manifest.yaml
|
||||
must-include:
|
||||
- 한 문장 설명과 Codex 지원 범위
|
||||
- 실제 검토를 통과한 패치 미리보기와 원본 파일 링크
|
||||
- Codex 스킬 요청부터 생성 파일 확인, 성공 확인, 명시적 적용까지의 기본 사용자 경로
|
||||
- bootstrap을 기본 경로로 두고 audit, refresh, section-update를 보조 경로로 설명
|
||||
- 코드에서 확인한 사실, 사람 작성 내용 보존, 자동 적용 금지, 변경·비밀 값 차단 요약
|
||||
- 사용자 입력과 생성 파일을 세 개에서 네 개 수준으로 요약
|
||||
- 개발 환경 설치와 전체 테스트를 사용자 경로 뒤의 개발 절에 배치
|
||||
- 아키텍처, 시각 자료, 상태, 사용량, 품질 비교 상세 문서 링크
|
||||
- 현재 Codex 지원과 다른 도구의 동일 동작 미검증 한계
|
||||
must-exclude:
|
||||
- 빠른 시작의 첫 행동으로 테스트나 개발 의존성 설치를 제시하는 구성
|
||||
- 공개 README에서 내부 상태 이름, 내부 결과 파일, 게이트 계약을 설명하는 문장
|
||||
- 저장소 근거 없는 성능·품질 우월성 주장
|
||||
- 한 주장 마커가 여러 사실 문장을 덮는 구성
|
||||
- 제품 결과보다 먼저 나오는 내부 구조도
|
||||
protected-sections: []
|
||||
@@ -0,0 +1,387 @@
|
||||
schema-version: 1
|
||||
repository-snapshot-hash: sha256:2ff902bd9a7de01648f972d099614584bc26fa84c1492cec61dc6da82e4f6275
|
||||
project-name: readme-harness
|
||||
languages: [Python, Markdown, YAML]
|
||||
frameworks: []
|
||||
facts:
|
||||
- id: F-PROJECT-001
|
||||
category: project
|
||||
key: identity
|
||||
value:
|
||||
name: readme-harness
|
||||
version: 0.1.0
|
||||
purpose: 저장소 사실과 사용자 요구를 바탕으로 GitHub README를 분석·설계·작성·검증합니다.
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 2
|
||||
line-end: 6
|
||||
- path: pyproject.toml
|
||||
source-kind: build-manifest
|
||||
line-start: 1
|
||||
line-end: 4
|
||||
- id: F-RUNTIME-001
|
||||
category: prerequisites
|
||||
key: python-and-development
|
||||
value:
|
||||
python-minimum: "3.12"
|
||||
runtime-packages: [jsonschema, PyYAML]
|
||||
development-tool: pytest
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: pyproject.toml
|
||||
source-kind: build-manifest
|
||||
line-start: 1
|
||||
line-end: 13
|
||||
- id: F-TOOL-PROFILE-001
|
||||
category: audience
|
||||
key: tool-profile
|
||||
value:
|
||||
primary-outcome: reviewed-patch-created
|
||||
max-primary-steps: 4
|
||||
development-command-as-first-step: false
|
||||
representative-proof-required: true
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .agents/profiles/tool.yaml
|
||||
source-kind: profile
|
||||
line-start: 1
|
||||
line-end: 21
|
||||
- id: F-MODES-001
|
||||
category: capability
|
||||
key: implemented-modes
|
||||
value: [bootstrap, audit, refresh, section-update]
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 10
|
||||
line-end: 13
|
||||
- id: F-WORKFLOW-001
|
||||
category: workflow
|
||||
key: public-flow
|
||||
value: 사용자 요구와 저장소 근거를 분리해 계획하고, 모델 작성 뒤 검사와 독립 검토를 거쳐 패치 준비와 명시적 적용으로 이어집니다.
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: docs/architecture.md
|
||||
source-kind: documentation
|
||||
line-start: 3
|
||||
line-end: 49
|
||||
- path: .agents/skills/requirement-driven-readme/SKILL.md
|
||||
source-kind: skill-contract
|
||||
line-start: 27
|
||||
line-end: 45
|
||||
- id: F-AUDIT-001
|
||||
category: workflow
|
||||
key: audit-behavior
|
||||
value: audit는 기존 README를 점검하며 대체 README나 패치를 만들지 않습니다.
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: docs/state-machine.md
|
||||
source-kind: documentation
|
||||
line-start: 19
|
||||
line-end: 23
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 53
|
||||
line-end: 55
|
||||
- id: F-REFRESH-001
|
||||
category: safeguard
|
||||
key: refresh-merge-policy
|
||||
value:
|
||||
protected: never-modify
|
||||
unmarked: preserve
|
||||
managed: regenerate-or-3way-merge
|
||||
conflict-result: block
|
||||
post-merge-validation: required
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 82
|
||||
line-end: 100
|
||||
- path: docs/state-machine.md
|
||||
source-kind: documentation
|
||||
line-start: 25
|
||||
line-end: 29
|
||||
- id: F-SECTION-001
|
||||
category: workflow
|
||||
key: section-update-behavior
|
||||
value: section-update는 선택한 섹션의 의존 결과를 무효화한 뒤 전체 문서 검증과 명시적 적용 경계를 다시 거칩니다.
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: docs/state-machine.md
|
||||
source-kind: documentation
|
||||
line-start: 31
|
||||
line-end: 36
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 116
|
||||
line-end: 122
|
||||
- id: F-VERIFY-001
|
||||
category: architecture
|
||||
key: editorial-and-verification-separation
|
||||
value: 모델 역할이 문장을 작성하고 Python 검사가 근거, 문장, 명령, 경로, 링크, 비밀 값, 그림, 해시와 적용 경계를 확인합니다.
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: docs/architecture.md
|
||||
source-kind: documentation
|
||||
line-start: 3
|
||||
line-end: 6
|
||||
- path: docs/architecture.md
|
||||
source-kind: documentation
|
||||
line-start: 40
|
||||
line-end: 49
|
||||
- id: F-AUTHORITY-001
|
||||
category: trust
|
||||
key: evidence-authority
|
||||
value:
|
||||
technical-facts-source: repository-facts.yaml
|
||||
intent-source: readme-request.yaml
|
||||
repository-content-trust: untrusted-data
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .agents/skills/requirement-driven-readme/SKILL.md
|
||||
source-kind: skill-contract
|
||||
line-start: 27
|
||||
line-end: 29
|
||||
- path: docs/architecture.md
|
||||
source-kind: documentation
|
||||
line-start: 67
|
||||
line-end: 72
|
||||
- id: F-CLAIM-001
|
||||
category: safeguard
|
||||
key: factual-claim-traceability
|
||||
value: 사실 주장은 알려진 근거 ID를 참조해야 하며 한 claim-id 마커는 정확히 한 문장만 가리킵니다.
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: src/readme_harness/claims.py
|
||||
source-kind: implementation
|
||||
symbol: validate_claim_map
|
||||
line-start: 45
|
||||
line-end: 100
|
||||
- id: F-PROSE-001
|
||||
category: safeguard
|
||||
key: reader-prose-validation
|
||||
value: 같은 문단의 연속 줄을 합친 뒤 문장 길이와 표현을 검사하며 목록과 표의 각 항목은 따로 검사합니다.
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: src/readme_harness/prose.py
|
||||
source-kind: implementation
|
||||
symbol: _visible_lines
|
||||
line-start: 82
|
||||
line-end: 150
|
||||
- path: tests/unit/test_prose.py
|
||||
source-kind: test
|
||||
symbol: test_hard_wrapped_paragraph_is_joined_before_sentence_length_check
|
||||
line-start: 110
|
||||
line-end: 126
|
||||
- id: F-VISUAL-001
|
||||
category: visual
|
||||
key: representative-output-policy
|
||||
value: 실제 결과 증명은 저장소의 지속 경로와 검토된 출처, 파일 해시를 가져야 합니다.
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: docs/visuals.md
|
||||
source-kind: documentation
|
||||
line-start: 3
|
||||
line-end: 27
|
||||
- path: .agents/profiles/tool.yaml
|
||||
source-kind: profile
|
||||
line-start: 15
|
||||
line-end: 21
|
||||
- id: F-OUTPUT-001
|
||||
category: safeguard
|
||||
key: patch-preparation
|
||||
value:
|
||||
target: README.md
|
||||
outputs: [README.generated.md, README.patch, apply-manifest.yaml]
|
||||
checks: [repository-freshness, reviewed-artifact-hashes, target-path-containment]
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .agents/skills/requirement-driven-readme/scripts/generate_patch.py
|
||||
source-kind: implementation
|
||||
symbol: main
|
||||
line-start: 25
|
||||
line-end: 89
|
||||
- id: F-APPLY-001
|
||||
category: safeguard
|
||||
key: explicit-apply
|
||||
value:
|
||||
command-identifier: apply_patch.py
|
||||
target: README.md
|
||||
checks: [generated-hash, repository-freshness, path-containment, target-before-hash]
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .agents/skills/requirement-driven-readme/scripts/apply_patch.py
|
||||
source-kind: implementation
|
||||
symbol: main
|
||||
line-start: 22
|
||||
line-end: 67
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 141
|
||||
line-end: 148
|
||||
- id: F-BENCH-001
|
||||
category: limitation
|
||||
key: quality-superiority
|
||||
value:
|
||||
current-status: not-run
|
||||
claim-policy: prohibited-until-benchmark-pass
|
||||
benchmark: benchmarks/quality-benchmark.yaml
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 109
|
||||
line-end: 114
|
||||
- path: docs/quality-benchmark.md
|
||||
source-kind: documentation
|
||||
line-start: 3
|
||||
line-end: 36
|
||||
- id: F-PROOF-001
|
||||
category: representative-output
|
||||
key: reviewed-patch-showcase
|
||||
value:
|
||||
path: examples/readme-showcase/README.patch
|
||||
media-type: text/x-diff
|
||||
source-status: PASS
|
||||
sha256: 3f930c70600d6530afa4a6b486be7f467f8650d28f4f2b057b889ef97f545e19
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: examples/readme-showcase/provenance.yaml
|
||||
source-kind: provenance-record
|
||||
line-start: 1
|
||||
line-end: 9
|
||||
- id: F-CODEX-001
|
||||
category: capability
|
||||
key: codex-skill-and-cross-tool-support
|
||||
value:
|
||||
skill-identifier: requirement-driven-readme
|
||||
codex-path-drivers: implemented
|
||||
supported-tools: [codex, antigravity, claude]
|
||||
claude-antigravity-runtime-equivalence: phase-4-conformance-goal
|
||||
assertion-type: derived
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .agents/skills/requirement-driven-readme/SKILL.md
|
||||
source-kind: skill-contract
|
||||
line-start: 2
|
||||
line-end: 9
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 8
|
||||
line-end: 13
|
||||
- path: docs/architecture.md
|
||||
source-kind: documentation
|
||||
line-start: 32
|
||||
line-end: 34
|
||||
- id: F-RUN-LAYOUT-001
|
||||
category: layout
|
||||
key: run-directory
|
||||
value:
|
||||
canonical: "runs/<repo-id>/<run-id>/"
|
||||
public-form: "runs/<repo-id>/<run-id>"
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 137
|
||||
line-end: 139
|
||||
- path: .agents/skills/requirement-driven-readme/SKILL.md
|
||||
source-kind: skill-contract
|
||||
line-start: 38
|
||||
line-end: 39
|
||||
- id: F-REPO-LAYOUT-001
|
||||
category: layout
|
||||
key: repository-paths
|
||||
value:
|
||||
implementation: src/readme_harness
|
||||
rules-and-workflows: .agents
|
||||
tests: tests
|
||||
request-file: readme-request.yaml
|
||||
assertion-type: derived
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
source-kind: project-manifest
|
||||
line-start: 132
|
||||
line-end: 139
|
||||
- path: pyproject.toml
|
||||
source-kind: build-manifest
|
||||
line-start: 14
|
||||
line-end: 19
|
||||
- path: docs/architecture.md
|
||||
source-kind: documentation
|
||||
line-start: 7
|
||||
line-end: 49
|
||||
- id: F-SAFETY-001
|
||||
category: safeguard
|
||||
key: stale-secret-and-path-protection
|
||||
value:
|
||||
stale-snapshot: blocks-patch-generation-and-apply
|
||||
secret-values: forbidden-in-facts-and-readme
|
||||
target-path: must-resolve-inside-repository
|
||||
out-of-tree-symlinks: findings-not-traversal-targets
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .agents/skills/requirement-driven-readme/scripts/generate_patch.py
|
||||
source-kind: implementation
|
||||
line-start: 46
|
||||
line-end: 68
|
||||
- path: .agents/skills/requirement-driven-readme/scripts/apply_patch.py
|
||||
source-kind: implementation
|
||||
line-start: 46
|
||||
line-end: 61
|
||||
- path: .agents/rules/repository-content-trust.md
|
||||
source-kind: policy
|
||||
line-start: 13
|
||||
line-end: 28
|
||||
commands:
|
||||
- id: CMD-001
|
||||
command: python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/<repo-id>/<run-id> --repo /path/to/repository
|
||||
cwd: .
|
||||
source:
|
||||
path: .agents/skills/requirement-driven-readme/scripts/apply_patch.py
|
||||
source-kind: implementation
|
||||
verification:
|
||||
status: discovered
|
||||
method: python-script-existence
|
||||
- id: CMD-002
|
||||
command: python3 -m pip install -e ".[dev]"
|
||||
cwd: .
|
||||
source:
|
||||
path: pyproject.toml
|
||||
source-kind: build-manifest
|
||||
verification:
|
||||
status: declared
|
||||
method: pyproject-optional-dependencies
|
||||
- id: CMD-003
|
||||
command: python3 -m pytest -q
|
||||
cwd: .
|
||||
source:
|
||||
path: pyproject.toml
|
||||
source-kind: build-manifest
|
||||
verification:
|
||||
status: declared
|
||||
method: pytest-configuration
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"git-sha": "636617ccd9f20440f21339f808557c096b55fec2",
|
||||
"dirty": true,
|
||||
"diff-hash": "sha256:2ff902bd9a7de01648f972d099614584bc26fa84c1492cec61dc6da82e4f6275",
|
||||
"scanned-at": null,
|
||||
"file-count": 231
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
schema-version: 1
|
||||
verdict: PASS
|
||||
score: 90
|
||||
scores:
|
||||
project-specificity:
|
||||
score: 5
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: quick-start, line-start: 56, line-end: 83, content-hash: "sha256:1f849db919339542195b10e26c2db6028e2acfdc0c057fcddc8cc535932c829d", observation: "Codex 스킬부터 생성 파일과 명시적 적용까지 프로젝트 고유 경로를 보여 준다."}
|
||||
reader-journey:
|
||||
score: 5
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: document, line-start: 16, line-end: 85, content-hash: "sha256:b321d79f0e9891648e916dd64a486bf562e54950ad960d1d898f4a4ccf3efa72", observation: "사용자 결과와 대표 패치, 요청, 확인, 적용 순서로 이어진다."}
|
||||
technical-explanation:
|
||||
score: 4
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: document, line-start: 105, line-end: 125, content-hash: "sha256:a4bd099a77602b1510fad18ef3023498c8c6c3efb700a2d4ebdf67a1182c0f0e", observation: "근거 분리와 보존, 충돌·비밀·변경 차단 책임을 결과 중심으로 구분한다."}
|
||||
task-usability:
|
||||
score: 4
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: quick-start, line-start: 56, line-end: 83, content-hash: "sha256:1f849db919339542195b10e26c2db6028e2acfdc0c057fcddc8cc535932c829d", observation: "요청 예시부터 결과 파일 확인과 적용까지 한 절에서 수행할 수 있다."}
|
||||
prose-clarity:
|
||||
score: 4
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: document, line-start: 5, line-end: 14, content-hash: "sha256:c0843d3bcaf94929872e5e7ab675f77b9bbbaf66d50e8c61b6ce7d478e11c617", observation: "첫 문장부터 결과와 범위를 직접 밝히며 한국어 문체 검사 경고가 없다."}
|
||||
visual-judgment:
|
||||
score: 5
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: document, line-start: 30, line-end: 48, content-hash: "sha256:aa73ed11c4b75d71efa7899fbdff8803d6cbd59ba9c9c20597b1d8c6fa9dca90", observation: "검토 통과 상태의 대표 패치를 내부 구조보다 먼저 보여 준다."}
|
||||
hard-gates:
|
||||
passed: true
|
||||
failures: []
|
||||
reader-simulations:
|
||||
30-seconds:
|
||||
outcome: PASS
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: document, line-start: 1, line-end: 14, content-hash: "sha256:5b23dc0b21cf361bff806f69c8ed0e527528daefd523cca4ffe17ff9d3674196", observation: "README 초안과 패치를 만드는 도구와 현재 Codex 범위를 첫 화면에서 확인한다."}
|
||||
5-minutes:
|
||||
outcome: PASS
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: document, line-start: 52, line-end: 139, content-hash: "sha256:002ddd5d129170e198da9c5f2b202b0b1c35e01bcefcbfe6bd3df070c04cec7e", observation: "최소 사용자 경로, 네 모드, 안전장치와 전체 처리 흐름을 찾을 수 있다."}
|
||||
contributor:
|
||||
outcome: PASS
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: document, line-start: 158, line-end: 191, content-hash: "sha256:5dd4d4f75a0efbc470683bc6c995acdf3084d7416dccd012ff6bd7fe47b0b4f7", observation: "개발 설치와 테스트 명령, 구현·규칙·테스트 위치를 찾을 수 있다."}
|
||||
findings:
|
||||
- id: R-001
|
||||
severity: major
|
||||
category: technical-correctness
|
||||
subject: C-PROOF-001
|
||||
section: proof
|
||||
message: 적용 완료 과잉 주장을 제거하고 검토 통과 사실만 남겼다.
|
||||
evidence:
|
||||
- {artifact: README.candidate.md, section-id: proof, line-start: 34, line-end: 35, content-hash: "sha256:dedc8a48d038f220392c136a4e6cf0544c53d12f6f2572744cf4f936892f4517", observation: "현재 문장은 F-PROOF-001이 기록한 검토 통과 상태만 주장한다."}
|
||||
route-to: README_DRAFTED
|
||||
status: resolved
|
||||
@@ -0,0 +1,22 @@
|
||||
# README quality review
|
||||
|
||||
Verdict: **PASS** — 90/100
|
||||
|
||||
## Dimension scores
|
||||
|
||||
- project-specificity: 5/5
|
||||
- reader-journey: 5/5
|
||||
- technical-explanation: 4/5
|
||||
- task-usability: 4/5
|
||||
- prose-clarity: 4/5
|
||||
- visual-judgment: 5/5
|
||||
|
||||
## Reader simulations
|
||||
|
||||
- 30-seconds: PASS
|
||||
- 5-minutes: PASS
|
||||
- contributor: PASS
|
||||
|
||||
## Findings
|
||||
|
||||
- [major] R-001 (proof): 적용 완료 과잉 주장을 제거하고 검토 통과 사실만 남겼다.
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"run-id": "20260720-public-readme-r2",
|
||||
"repo-id": "readme-harness",
|
||||
"mode": "bootstrap",
|
||||
"target-repository": "/home/donghyeon/workspace/ai-tool/readme-harness",
|
||||
"harness-version": "0.1.0",
|
||||
"started-at": null,
|
||||
"tool-adapter": "codex",
|
||||
"input-hashes": {},
|
||||
"usage": {}
|
||||
}
|
||||
@@ -0,0 +1,567 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"mode": "bootstrap",
|
||||
"current": "READY_FOR_APPLY",
|
||||
"history": [
|
||||
{
|
||||
"state": "INITIALIZED"
|
||||
},
|
||||
{
|
||||
"state": "INPUT_CAPTURED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "request",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "REPOSITORY_SNAPSHOTTED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "snapshot",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"diff-hash": "sha256:77b1a19a536615064a4894d23c78b2e7aa54a9ef4cf13bad194ae40565407951"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "FACTS_EXTRACTED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "facts",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"fact_ids": [
|
||||
"F-PROJECT-001",
|
||||
"F-RUNTIME-001",
|
||||
"F-TOOL-PROFILE-001",
|
||||
"F-MODES-001",
|
||||
"F-WORKFLOW-001",
|
||||
"F-AUDIT-001",
|
||||
"F-REFRESH-001",
|
||||
"F-SECTION-001",
|
||||
"F-VERIFY-001",
|
||||
"F-AUTHORITY-001",
|
||||
"F-CLAIM-001",
|
||||
"F-PROSE-001",
|
||||
"F-VISUAL-001",
|
||||
"F-OUTPUT-001",
|
||||
"F-APPLY-001",
|
||||
"F-BENCH-001",
|
||||
"F-PROOF-001",
|
||||
"F-CODEX-001",
|
||||
"F-RUN-LAYOUT-001",
|
||||
"F-REPO-LAYOUT-001",
|
||||
"F-SAFETY-001"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "PROJECT_PROFILED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "profile",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"profile": "tool"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "README_PLANNED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "brief",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
},
|
||||
{
|
||||
"name": "outline",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"section_ids": [
|
||||
"overview",
|
||||
"proof",
|
||||
"quick-start",
|
||||
"usage",
|
||||
"safeguards",
|
||||
"workflow",
|
||||
"inputs",
|
||||
"development",
|
||||
"documentation",
|
||||
"limitations"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "README_DRAFTED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "conformance",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"sections": [
|
||||
"overview",
|
||||
"proof",
|
||||
"quick-start",
|
||||
"usage",
|
||||
"safeguards",
|
||||
"workflow",
|
||||
"inputs",
|
||||
"development",
|
||||
"documentation",
|
||||
"limitations"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "claim_map",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"claims": [
|
||||
"C-PROJECT-001",
|
||||
"C-OUTPUT-001",
|
||||
"C-CODEX-001",
|
||||
"C-XTOOL-001",
|
||||
"C-PROOF-001",
|
||||
"C-INVOCATION-001",
|
||||
"C-RESULTS-001",
|
||||
"C-NO-AUTO-APPLY-001",
|
||||
"C-APPLY-CHECK-001",
|
||||
"C-MODE-BOOTSTRAP-001",
|
||||
"C-MODE-AUDIT-001",
|
||||
"C-MODE-REFRESH-001",
|
||||
"C-MODE-SECTION-001",
|
||||
"C-SOURCE-SPLIT-001",
|
||||
"C-FACT-TRACE-001",
|
||||
"C-PRESERVE-001",
|
||||
"C-CONFLICT-001",
|
||||
"C-SECRET-PATH-001",
|
||||
"C-STALE-001",
|
||||
"C-WORKFLOW-001",
|
||||
"C-REWORK-001",
|
||||
"C-REQUEST-001",
|
||||
"C-RUN-DIR-001",
|
||||
"C-DEV-PREREQ-001",
|
||||
"C-LAYOUT-001",
|
||||
"C-WRITING-LIMIT-001",
|
||||
"C-VERIFY-LIMIT-001",
|
||||
"C-XTOOL-LIMIT-001",
|
||||
"C-BENCH-LIMIT-001"
|
||||
],
|
||||
"derived-statements": {
|
||||
"C-PROJECT-001": "저장소에서 확인한 사실과 사용자가 정한 요구를 바탕으로 README 초안을 만드는 도구입니다.",
|
||||
"C-OUTPUT-001": "명령·링크·경로를 검사한 뒤, 사람이 검토하고 적용할 수 있는 패치를 생성합니다.",
|
||||
"C-CODEX-001": "현재 지원하는 작성·검증 흐름은 Codex용입니다.",
|
||||
"C-XTOOL-001": "Claude와 Antigravity에서 같은 동작을 하는지는 아직 미검증 상태입니다.",
|
||||
"C-PROOF-001": "아래 내용은 검토와 적용을 마친 이전 실행의 패치 일부입니다.",
|
||||
"C-INVOCATION-001": "현재 실행 경로는 Codex 작업 공간의 `requirement-driven-readme` 스킬입니다.",
|
||||
"C-RESULTS-001": "<!-- quick-start-step: expected-result -->\n작업 뒤 확인할 파일은 `README.generated.md`와 `README.patch`입니다.",
|
||||
"C-NO-AUTO-APPLY-001": "대상 `README.md`는 적용 명령을 실행하기 전까지 바뀌지 않습니다.",
|
||||
"C-APPLY-CHECK-001": "적용 직전에 생성 파일과 대상 README, 저장소 기준 정보가 바뀌지 않았는지 다시 확인합니다.",
|
||||
"C-MODE-BOOTSTRAP-001": "새 README 작성과 전면 재작성의 기본 선택은 `bootstrap`입니다.",
|
||||
"C-MODE-AUDIT-001": "현재 README의 문제만 찾는 작업은 `audit`입니다.",
|
||||
"C-MODE-REFRESH-001": "사람이 작성한 영역을 보존하는 갱신은 `refresh`입니다.",
|
||||
"C-MODE-SECTION-001": "한 섹션과 영향을 받는 검사 결과의 갱신은 `section-update`입니다.",
|
||||
"C-SOURCE-SPLIT-001": "코드에서 확인한 사실과 사용자가 정한 문서 요구는 따로 둡니다.",
|
||||
"C-FACT-TRACE-001": "명령, 경로, 버전처럼 오류 영향이 큰 정보는 근거 파일과 연결합니다.",
|
||||
"C-PRESERVE-001": "갱신 작업은 보호 영역과 마커 밖의 사람이 작성한 문장을 보존합니다.",
|
||||
"C-CONFLICT-001": "사람이 고친 영역과 새 초안이 충돌하면 자동 병합과 적용이 중단됩니다.",
|
||||
"C-SECRET-PATH-001": "비밀 값이나 저장소 밖 경로가 발견되면 패치를 준비하지 않습니다.",
|
||||
"C-STALE-001": "검토 뒤 저장소나 생성 파일이 바뀌어도 적용을 중단합니다.",
|
||||
"C-WORKFLOW-001": "사용자 요청 → 저장소 사실 확인 → README 작성 → 명령·링크·문장 검사 → 독립 검토 → 패치 확인 → 직접 적용",
|
||||
"C-REWORK-001": "검사에서 문제가 나오면 해당 내용을 맡은 단계부터 다시 작성합니다.",
|
||||
"C-REQUEST-001": "`readme-request.yaml`에는 독자, 목적, 언어, 보존 범위와 그림 정책을 적습니다.",
|
||||
"C-RUN-DIR-001": "각 작업의 파일은 `runs/<repo-id>/<run-id>` 아래에 따로 저장됩니다.",
|
||||
"C-DEV-PREREQ-001": "개발에는 Python 3.12 이상이 필요하며, 개발 의존성에는 `pytest`가 포함됩니다.",
|
||||
"C-LAYOUT-001": "주요 구현은 `src/readme_harness`, 규칙과 워크플로는 `.agents`, 테스트는 `tests`에 있습니다.",
|
||||
"C-WRITING-LIMIT-001": "- README 문장은 모델이 작성하고 검사 스크립트는 준비된 파일을 확인합니다.",
|
||||
"C-VERIFY-LIMIT-001": "- 실행 기록이 없는 명령은 정적으로만 확인합니다.",
|
||||
"C-XTOOL-LIMIT-001": "- `Claude`와 `Antigravity`에서 `Codex`와 같은 동작을 하는지는 아직 검증하지 않았습니다.",
|
||||
"C-BENCH-LIMIT-001": "- 블라인드 품질 비교는 아직 실행하지 않았으며 더 좋은 결과를 낸다고 주장하지 않습니다."
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "VISUALS_PLANNED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "visual_plan",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"visuals": [
|
||||
"reviewed-patch-preview"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "STRUCTURALLY_VALIDATED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "github_markdown",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
},
|
||||
{
|
||||
"name": "reader_prose",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"schema-version": 1,
|
||||
"policy-id": "korean-reader-prose-v1",
|
||||
"language": "ko-KR",
|
||||
"applicable": true,
|
||||
"scope": "candidate",
|
||||
"state": "PASS",
|
||||
"summary": {
|
||||
"errors": 0,
|
||||
"warnings": 0,
|
||||
"sentences": 52,
|
||||
"prose-characters": 1196,
|
||||
"hangul-characters": 1007
|
||||
},
|
||||
"findings": []
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "TECHNICALLY_VERIFIED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "verify",
|
||||
"ok": true,
|
||||
"warnings": [
|
||||
"manual verification required: python3 -m pip install -e \".[dev]\" (unsupported-static-verifier)",
|
||||
"manual verification required: python3 -m pytest -q (unsupported-static-verifier)"
|
||||
],
|
||||
"data": {
|
||||
"schema-version": 1,
|
||||
"state": "PASS_WITH_MANUAL",
|
||||
"verification-level": "static",
|
||||
"execution-verified": false,
|
||||
"checks": {
|
||||
"commands": {
|
||||
"total": 3,
|
||||
"verified": 1,
|
||||
"manual-required": 2,
|
||||
"failed": 0
|
||||
},
|
||||
"paths": {
|
||||
"total": 7,
|
||||
"verified": 7,
|
||||
"failed": 0
|
||||
},
|
||||
"anchors": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
},
|
||||
"readme-contracts": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
}
|
||||
},
|
||||
"failures": [],
|
||||
"limitations": [
|
||||
"manual verification required: python3 -m pip install -e \".[dev]\" (unsupported-static-verifier)",
|
||||
"manual verification required: python3 -m pytest -q (unsupported-static-verifier)"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "secret_scan",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "README_PLANNED",
|
||||
"from": "TECHNICALLY_VERIFIED",
|
||||
"resumed": true,
|
||||
"resume-from": "README_DRAFTED",
|
||||
"invalidated": [
|
||||
"README.candidate.md",
|
||||
"claim-map.yaml",
|
||||
"visual-plan.yaml",
|
||||
"prose-report.json",
|
||||
"verification.json",
|
||||
"review-findings.yaml"
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "README_DRAFTED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "conformance",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"sections": [
|
||||
"overview",
|
||||
"proof",
|
||||
"quick-start",
|
||||
"usage",
|
||||
"safeguards",
|
||||
"workflow",
|
||||
"inputs",
|
||||
"development",
|
||||
"documentation",
|
||||
"limitations"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "claim_map",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"claims": [
|
||||
"C-PROJECT-001",
|
||||
"C-OUTPUT-001",
|
||||
"C-CODEX-001",
|
||||
"C-XTOOL-001",
|
||||
"C-PROOF-001",
|
||||
"C-INVOCATION-001",
|
||||
"C-RESULTS-001",
|
||||
"C-NO-AUTO-APPLY-001",
|
||||
"C-APPLY-CHECK-001",
|
||||
"C-MODE-BOOTSTRAP-001",
|
||||
"C-MODE-AUDIT-001",
|
||||
"C-MODE-REFRESH-001",
|
||||
"C-MODE-SECTION-001",
|
||||
"C-SOURCE-SPLIT-001",
|
||||
"C-FACT-TRACE-001",
|
||||
"C-PRESERVE-001",
|
||||
"C-CONFLICT-001",
|
||||
"C-SECRET-PATH-001",
|
||||
"C-STALE-001",
|
||||
"C-WORKFLOW-001",
|
||||
"C-REWORK-001",
|
||||
"C-REQUEST-001",
|
||||
"C-RUN-DIR-001",
|
||||
"C-DEV-PREREQ-001",
|
||||
"C-LAYOUT-001",
|
||||
"C-WRITING-LIMIT-001",
|
||||
"C-VERIFY-LIMIT-001",
|
||||
"C-XTOOL-LIMIT-001",
|
||||
"C-BENCH-LIMIT-001"
|
||||
],
|
||||
"derived-statements": {
|
||||
"C-PROJECT-001": "저장소에서 확인한 사실과 사용자가 정한 요구를 바탕으로 README 초안을 만드는 도구입니다.",
|
||||
"C-OUTPUT-001": "명령·링크·경로를 검사한 뒤, 사람이 검토하고 적용할 수 있는 패치를 생성합니다.",
|
||||
"C-CODEX-001": "현재 지원하는 작성·검증 흐름은 Codex용입니다.",
|
||||
"C-XTOOL-001": "Claude와 Antigravity에서 같은 동작을 하는지는 아직 미검증 상태입니다.",
|
||||
"C-PROOF-001": "아래 내용은 검토를 통과한 이전 실행의 패치 일부입니다.",
|
||||
"C-INVOCATION-001": "현재 실행 경로는 Codex 작업 공간의 `requirement-driven-readme` 스킬입니다.",
|
||||
"C-RESULTS-001": "<!-- quick-start-step: expected-result -->\n작업 뒤 확인할 파일은 `README.generated.md`와 `README.patch`입니다.",
|
||||
"C-NO-AUTO-APPLY-001": "대상 `README.md`는 적용 명령을 실행하기 전까지 바뀌지 않습니다.",
|
||||
"C-APPLY-CHECK-001": "적용 직전에 생성 파일과 대상 README, 저장소 기준 정보가 바뀌지 않았는지 다시 확인합니다.",
|
||||
"C-MODE-BOOTSTRAP-001": "새 README 작성과 전면 재작성의 기본 선택은 `bootstrap`입니다.",
|
||||
"C-MODE-AUDIT-001": "현재 README의 문제만 찾는 작업은 `audit`입니다.",
|
||||
"C-MODE-REFRESH-001": "사람이 작성한 영역을 보존하는 갱신은 `refresh`입니다.",
|
||||
"C-MODE-SECTION-001": "한 섹션과 영향을 받는 검사 결과의 갱신은 `section-update`입니다.",
|
||||
"C-SOURCE-SPLIT-001": "코드에서 확인한 사실과 사용자가 정한 문서 요구는 따로 둡니다.",
|
||||
"C-FACT-TRACE-001": "명령, 경로, 버전처럼 오류 영향이 큰 정보는 근거 파일과 연결합니다.",
|
||||
"C-PRESERVE-001": "갱신 작업은 보호 영역과 마커 밖의 사람이 작성한 문장을 보존합니다.",
|
||||
"C-CONFLICT-001": "사람이 고친 영역과 새 초안이 충돌하면 자동 병합과 적용이 중단됩니다.",
|
||||
"C-SECRET-PATH-001": "비밀 값이나 저장소 밖 경로가 발견되면 패치를 준비하지 않습니다.",
|
||||
"C-STALE-001": "검토 뒤 저장소나 생성 파일이 바뀌어도 적용을 중단합니다.",
|
||||
"C-WORKFLOW-001": "사용자 요청 → 저장소 사실 확인 → README 작성 → 명령·링크·문장 검사 → 독립 검토 → 패치 확인 → 직접 적용",
|
||||
"C-REWORK-001": "검사에서 문제가 나오면 해당 내용을 맡은 단계부터 다시 작성합니다.",
|
||||
"C-REQUEST-001": "`readme-request.yaml`에는 독자, 목적, 언어, 보존 범위와 그림 정책을 적습니다.",
|
||||
"C-RUN-DIR-001": "각 작업의 파일은 `runs/<repo-id>/<run-id>` 아래에 따로 저장됩니다.",
|
||||
"C-DEV-PREREQ-001": "개발에는 Python 3.12 이상이 필요하며, 개발 의존성에는 `pytest`가 포함됩니다.",
|
||||
"C-LAYOUT-001": "주요 구현은 `src/readme_harness`, 규칙과 워크플로는 `.agents`, 테스트는 `tests`에 있습니다.",
|
||||
"C-WRITING-LIMIT-001": "- README 문장은 모델이 작성하고 검사 스크립트는 준비된 파일을 확인합니다.",
|
||||
"C-VERIFY-LIMIT-001": "- 실행 기록이 없는 명령은 정적으로만 확인합니다.",
|
||||
"C-XTOOL-LIMIT-001": "- `Claude`와 `Antigravity`에서 `Codex`와 같은 동작을 하는지는 아직 검증하지 않았습니다.",
|
||||
"C-BENCH-LIMIT-001": "- 블라인드 품질 비교는 아직 실행하지 않았으며 더 좋은 결과를 낸다고 주장하지 않습니다."
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "VISUALS_PLANNED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "visual_plan",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"visuals": [
|
||||
"reviewed-patch-preview"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "STRUCTURALLY_VALIDATED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "github_markdown",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
},
|
||||
{
|
||||
"name": "reader_prose",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"schema-version": 1,
|
||||
"policy-id": "korean-reader-prose-v1",
|
||||
"language": "ko-KR",
|
||||
"applicable": true,
|
||||
"scope": "candidate",
|
||||
"state": "PASS",
|
||||
"summary": {
|
||||
"errors": 0,
|
||||
"warnings": 0,
|
||||
"sentences": 52,
|
||||
"prose-characters": 1194,
|
||||
"hangul-characters": 1005
|
||||
},
|
||||
"findings": []
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "TECHNICALLY_VERIFIED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "verify",
|
||||
"ok": true,
|
||||
"warnings": [
|
||||
"manual verification required: python3 -m pip install -e \".[dev]\" (unsupported-static-verifier)",
|
||||
"manual verification required: python3 -m pytest -q (unsupported-static-verifier)"
|
||||
],
|
||||
"data": {
|
||||
"schema-version": 1,
|
||||
"state": "PASS_WITH_MANUAL",
|
||||
"verification-level": "static",
|
||||
"execution-verified": false,
|
||||
"checks": {
|
||||
"commands": {
|
||||
"total": 3,
|
||||
"verified": 1,
|
||||
"manual-required": 2,
|
||||
"failed": 0
|
||||
},
|
||||
"paths": {
|
||||
"total": 7,
|
||||
"verified": 7,
|
||||
"failed": 0
|
||||
},
|
||||
"anchors": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
},
|
||||
"readme-contracts": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
}
|
||||
},
|
||||
"failures": [],
|
||||
"limitations": [
|
||||
"manual verification required: python3 -m pip install -e \".[dev]\" (unsupported-static-verifier)",
|
||||
"manual verification required: python3 -m pytest -q (unsupported-static-verifier)"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "secret_scan",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "QUALITY_REVIEWED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "review",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"verdict": "PASS",
|
||||
"score": 90,
|
||||
"findings": [
|
||||
{
|
||||
"id": "R-001",
|
||||
"severity": "major",
|
||||
"category": "technical-correctness",
|
||||
"subject": "C-PROOF-001",
|
||||
"section": "proof",
|
||||
"message": "적용 완료 과잉 주장을 제거하고 검토 통과 사실만 남겼다.",
|
||||
"evidence": [
|
||||
{
|
||||
"artifact": "README.candidate.md",
|
||||
"section-id": "proof",
|
||||
"line-start": 34,
|
||||
"line-end": 35,
|
||||
"content-hash": "sha256:dedc8a48d038f220392c136a4e6cf0544c53d12f6f2572744cf4f936892f4517",
|
||||
"observation": "현재 문장은 F-PROOF-001이 기록한 검토 통과 상태만 주장한다."
|
||||
}
|
||||
],
|
||||
"route-to": "README_DRAFTED",
|
||||
"status": "resolved"
|
||||
}
|
||||
],
|
||||
"report-valid": true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "READY_FOR_APPLY",
|
||||
"gates": []
|
||||
}
|
||||
],
|
||||
"rework": {
|
||||
"iterations": 1,
|
||||
"findings": {
|
||||
"sha256:9c9a7da5c0916b83": {
|
||||
"attempts": 1,
|
||||
"status": "open",
|
||||
"latest-id": "R-001"
|
||||
}
|
||||
}
|
||||
},
|
||||
"reasons": [
|
||||
"R-001"
|
||||
],
|
||||
"resume-from": "README_DRAFTED"
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"state": "PASS_WITH_MANUAL",
|
||||
"verification-level": "static",
|
||||
"execution-verified": false,
|
||||
"checks": {
|
||||
"commands": {
|
||||
"total": 3,
|
||||
"verified": 1,
|
||||
"manual-required": 2,
|
||||
"failed": 0
|
||||
},
|
||||
"paths": {
|
||||
"total": 7,
|
||||
"verified": 7,
|
||||
"failed": 0
|
||||
},
|
||||
"anchors": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
},
|
||||
"readme-contracts": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
}
|
||||
},
|
||||
"failures": [],
|
||||
"limitations": [
|
||||
"manual verification required: python3 -m pip install -e \".[dev]\" (unsupported-static-verifier)",
|
||||
"manual verification required: python3 -m pytest -q (unsupported-static-verifier)"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
schema-version: 1
|
||||
visuals:
|
||||
- id: reviewed-patch-preview
|
||||
section: proof
|
||||
type: artifact-showcase
|
||||
purpose: 검토를 통과한 실제 README 패치의 핵심 변경을 보여 줍니다.
|
||||
placeholder-text: 영문 중심 소개가 한국어 사용자 중심 소개로 바뀐 실제 diff 일부
|
||||
must-show: [변경 전 영문 소개, 변경 후 한국어 소개]
|
||||
relationships: []
|
||||
emphasize: [입력 문서와 생성 문서의 차이]
|
||||
avoid: [저장소 근거가 없는 품질 우월성 표현]
|
||||
require-provenance: true
|
||||
placement: {after-section-id: proof}
|
||||
accessibility:
|
||||
alt-text: 영문 소개를 한국어 사용자 중심 소개로 바꾼 README 패치 미리보기
|
||||
production:
|
||||
format: diff
|
||||
status: source-created
|
||||
source-path: examples/readme-showcase/README.patch
|
||||
source-hash: sha256:3f930c70600d6530afa4a6b486be7f467f8650d28f4f2b057b889ef97f545e19
|
||||
asset:
|
||||
path: examples/readme-showcase/README.patch
|
||||
provenance: examples/readme-showcase/provenance.yaml
|
||||
source-run: runs/readme-harness/20260720-review-remediation
|
||||
sha256: sha256:3f930c70600d6530afa4a6b486be7f467f8650d28f4f2b057b889ef97f545e19
|
||||
caption: 검토를 통과한 이전 README 실행의 실제 패치 일부입니다.
|
||||
@@ -0,0 +1,78 @@
|
||||
schema-version: 1
|
||||
target:
|
||||
repository: /home/donghyeon/workspace/ai-tool/readme-harness
|
||||
readme-path: README.md
|
||||
mode: refresh
|
||||
profile-override: tool
|
||||
project-intent:
|
||||
purpose: 저장소에서 확인한 사실과 사용자가 정한 요구를 바탕으로 README 초안과 검토용 패치를 만드는 도구를 설명한다.
|
||||
positioning: 사용자 경로를 먼저 보여 주고, 명령·경로·문장 근거 검사와 사람 작성 내용 보존은 필요한 수준에서만 설명한다.
|
||||
maturity: 현재 Codex용 작성·검증 흐름을 지원하며 Claude와 Antigravity의 동일 동작은 아직 검증하지 않았다.
|
||||
audience:
|
||||
primary:
|
||||
- 저장소 README를 새로 만들거나 안전하게 갱신하려는 개발자
|
||||
secondary:
|
||||
- 하네스 검사와 프로파일을 확장하는 기여자
|
||||
reader-actions:
|
||||
- 첫 두 문장에서 어떤 결과를 만드는 도구인지 판단한다.
|
||||
- Codex에 README 작업을 요청하고 생성된 README와 패치를 확인한다.
|
||||
- 작업 목적에 맞는 모드를 고른다.
|
||||
- 검토한 패치만 명시적으로 적용한다.
|
||||
- 개발 환경과 테스트 방법은 별도의 개발 절에서 찾는다.
|
||||
content-policy:
|
||||
language: ko-KR
|
||||
tone: 독자 행동을 먼저 밝히는 직접적인 기술 설명체
|
||||
target-length: medium
|
||||
preserve-existing-copy: true
|
||||
detail-docs-policy: summary-and-link
|
||||
visual-policy:
|
||||
mode: when-useful
|
||||
max-visuals: 1
|
||||
preferred-formats:
|
||||
- diff
|
||||
placeholder-format: HTML 주석 기반 제작 사양
|
||||
terminology-policy:
|
||||
exact-identifiers: []
|
||||
explain-on-first-use: {}
|
||||
internal-only:
|
||||
family: 작업 담당 방식
|
||||
fan-out: 여러 담당자가 나눠 검토
|
||||
collapse: 한 담당자가 맡아 처리
|
||||
concrete worker: 실제 변경 담당자
|
||||
verification family: 검증 담당 역할
|
||||
route-to: 다시 작성할 지점
|
||||
public-surface-terms:
|
||||
allowed:
|
||||
- bootstrap
|
||||
- audit
|
||||
- refresh
|
||||
- section-update
|
||||
- readme-request.yaml
|
||||
- README.generated.md
|
||||
- README.patch
|
||||
- requirement-driven-readme
|
||||
explain-on-first-use: {}
|
||||
docs-only:
|
||||
- QUALITY_REVIEWED
|
||||
- READY_FOR_APPLY
|
||||
- claim-map.yaml
|
||||
- visual-plan.yaml
|
||||
- review-findings.yaml
|
||||
- quality-manifest.yaml
|
||||
must-include:
|
||||
- 한 문장 설명과 Codex 지원 범위
|
||||
- 실제 검토를 통과한 패치 미리보기와 원본 파일 링크
|
||||
- Codex 스킬 요청부터 생성 파일 확인, 성공 확인, 명시적 적용까지의 기본 사용자 경로
|
||||
- bootstrap을 기본 경로로 두고 audit, refresh, section-update를 보조 경로로 설명
|
||||
- 코드에서 확인한 사실, 사람 작성 내용 보존, 자동 적용 금지, 변경·비밀 값 차단 요약
|
||||
- 사용자 입력과 생성 파일을 세 개에서 네 개 수준으로 요약
|
||||
- 개발 환경 설치와 전체 테스트를 사용자 경로 뒤의 개발 절에 배치
|
||||
- 아키텍처, 시각 자료, 상태, 사용량, 품질 비교 상세 문서 링크
|
||||
- 현재 Codex 지원과 다른 도구의 동일 동작 미검증 한계
|
||||
must-exclude:
|
||||
- 빠른 시작의 첫 행동으로 테스트나 개발 의존성 설치를 제시하는 구성
|
||||
- 공개 README에서 내부 상태 이름, 내부 결과 파일, 게이트 계약을 설명하는 문장
|
||||
- 저장소 근거 없는 성능·품질 우월성 주장
|
||||
- 한 주장 마커가 여러 사실 문장을 덮는 구성
|
||||
- 제품 결과보다 먼저 나오는 내부 구조도
|
||||
protected-sections: []
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"git-sha": "636617ccd9f20440f21339f808557c096b55fec2",
|
||||
"dirty": true,
|
||||
"diff-hash": "sha256:77b1a19a536615064a4894d23c78b2e7aa54a9ef4cf13bad194ae40565407951",
|
||||
"scanned-at": null,
|
||||
"file-count": 231
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"run-id": "20260720-public-readme",
|
||||
"repo-id": "readme-harness",
|
||||
"mode": "refresh",
|
||||
"target-repository": "/home/donghyeon/workspace/ai-tool/readme-harness",
|
||||
"harness-version": "0.1.0",
|
||||
"started-at": null,
|
||||
"tool-adapter": "codex",
|
||||
"input-hashes": {},
|
||||
"usage": {}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"mode": "refresh",
|
||||
"current": "REPOSITORY_SNAPSHOTTED",
|
||||
"history": [
|
||||
{
|
||||
"state": "INITIALIZED"
|
||||
},
|
||||
{
|
||||
"state": "INPUT_CAPTURED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "request",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "REPOSITORY_SNAPSHOTTED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "snapshot",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"diff-hash": "sha256:77b1a19a536615064a4894d23c78b2e7aa54a9ef4cf13bad194ae40565407951"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"rework": {
|
||||
"iterations": 0,
|
||||
"findings": {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,224 @@
|
||||
# README Harness
|
||||
|
||||
이 하네스는 저장소의 실제 코드와 사용 목적을 바탕으로 문서 후보를 만들고,
|
||||
명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다. <!-- claim-id: C-PROJECT-001 -->
|
||||
|
||||
- 새 README 작성
|
||||
- 기존 문서 점검
|
||||
- 사람 작성 영역을 보존한 갱신
|
||||
- 특정 섹션과 관련 검증 산출물의 재생성
|
||||
- 검토 후 별도로 실행하는 적용
|
||||
|
||||
<!-- section-id: overview -->
|
||||
## 무엇을 만드는가
|
||||
|
||||
README를 새로 만들거나 기존 문서를 안전하게 갱신하려는 개발자를 위한 도구입니다.
|
||||
|
||||
`bootstrap`, `audit`, `refresh`, `section-update` 네 모드를 구현했습니다. <!-- claim-id: C-MODE-001 -->
|
||||
|
||||
저장소 근거와 사용자 요구를 분리해 읽고, 고위험 사실을 근거에 연결합니다. 그림을
|
||||
넣기로 했다면 실제 소스나 자산까지 확인하고, 품질 심사는 원문의 줄과 해시에 묶인
|
||||
근거를 사용합니다. 패치 준비가 끝나도 대상 `README.md`는 자동으로 바뀌지 않습니다.
|
||||
<!-- claim-id: C-SAFETY-SUMMARY-001 -->
|
||||
|
||||
결정론적 Codex 경로는 구현됐습니다. 후보 문장 작성은 모델 파이프라인이 담당하며,
|
||||
다른 도구와의 런타임 동등성은 Phase 4 검증 전까지 보장하지 않습니다.
|
||||
<!-- claim-id: C-LIMIT-001 -->
|
||||
|
||||
<!-- section-id: installation -->
|
||||
## 설치
|
||||
|
||||
`Python` 3.12 이상이 필요합니다.
|
||||
런타임 의존성은 `jsonschema`와 `PyYAML`입니다.
|
||||
개발 의존성은 `pytest`입니다. <!-- claim-id: C-RUNTIME-001 -->
|
||||
|
||||
저장소 루트에서 개발 의존성을 포함한 편집 가능 설치를 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
이 설치 명령은 프로젝트 선언에서 확인했지만, 현재 작업에서는 새 가상환경 설치까지
|
||||
실행해 증명하지 않았습니다. <!-- claim-id: C-INSTALL-001 -->
|
||||
|
||||
<!-- section-id: quick-start -->
|
||||
## 빠른 시작
|
||||
|
||||
먼저 전체 테스트를 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pytest -q
|
||||
```
|
||||
|
||||
종료 코드 0과 실패 항목 없는 통과 요약이 성공 기준입니다. 이 후보는 아직 현재
|
||||
README를 바꾸지 않았으므로 최종 전체 결과는 명시적 적용 뒤 다시 확인합니다.
|
||||
|
||||
자체 README 테스트는 이 명령을 최소 실행 경로로 요구합니다. 다른 운영체제와 새
|
||||
가상환경의 동일한 결과까지 보장하는 계약은 아닙니다. <!-- claim-id: C-TEST-COMMAND-001 -->
|
||||
|
||||
이 프로젝트는 명령 하나로 문서를 완성하는 독립 실행 도구가 아닙니다. Codex 작업 공간에서
|
||||
`requirement-driven-readme` 스킬로 대상 저장소의 `bootstrap` 실행을 요청하면 작성
|
||||
역할이 사용자 요구, 저장소 근거, 개요, 후보, 주장 지도, 그림 계획과 품질 심사
|
||||
산출물을 준비합니다. <!-- claim-id: C-AUTHORING-001 -->
|
||||
|
||||
대상 저장소용 실행 디렉터리를 만듭니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/init_run.py --repo-id demo --run-id first --mode bootstrap --target-repository /path/to/repository --tool-adapter codex
|
||||
```
|
||||
|
||||
이 명령은 `runs/demo/first`에 상태와 실행 매니페스트를 초기화합니다.
|
||||
<!-- claim-id: C-INIT-001 -->
|
||||
|
||||
실행 디렉터리에 `readme-request.yaml`, `repository-facts.yaml`, `readme-brief.yaml`,
|
||||
`readme-outline.yaml`, `README.candidate.md`, `claim-map.yaml`, `visual-plan.yaml`,
|
||||
`review-findings.yaml`이 준비되면 모든 결정론적 게이트를 재생합니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/run_bootstrap.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
```
|
||||
|
||||
드라이버는 후보를 새로 쓰지 않고 준비된 산출물을 `QUALITY_REVIEWED`까지
|
||||
검증합니다. <!-- claim-id: C-BOOTSTRAP-001 -->
|
||||
|
||||
<!-- section-id: usage -->
|
||||
## 사용 모드
|
||||
|
||||
| 작업 | 모드 | 결과 |
|
||||
|---|---|---|
|
||||
| README가 없거나 전면 재작성 | `bootstrap` | 검증된 후보와 적용 준비용 패치 |
|
||||
| 기존 문서의 결함만 점검 | `audit` | 감사 결과와 검증 보고서, 후보·패치 없음 |
|
||||
| 사람 작성 영역을 보존한 갱신 | `refresh` | 3방향 병합과 병합본 전체 재검증 |
|
||||
| 한 섹션과 파급 산출물 갱신 | `section-update` | 관련 산출물 무효화 후 갱신 검증 재실행 |
|
||||
|
||||
네 모드는 요청 스키마에 선언되어 있고 각 흐름의 상태·게이트 계약이 구현되어
|
||||
있습니다. <!-- claim-id: C-USAGE-001 -->
|
||||
|
||||
<!-- section-id: api -->
|
||||
## 요청 API, 설정과 산출물
|
||||
|
||||
`readme-request.yaml`은 독자, 언어, 길이, 보존 범위, 공개 용어, 그림 정책을
|
||||
정합니다. 기술 사실은 `repository-facts.yaml`에 저장하고, 각 실행은
|
||||
`runs/<repo-id>/<run-id>` 아래에서 격리합니다. <!-- claim-id: C-INPUT-001 -->
|
||||
|
||||
어댑터가 제공하는 단계별 모델 사용량은 실행 매니페스트에 누적합니다. 제공되지
|
||||
않은 값은 0으로 추정하지 않습니다. <!-- claim-id: C-USAGE-METRICS-001 -->
|
||||
|
||||
대표 산출물은 다음 순서로 이어집니다.
|
||||
|
||||
```text
|
||||
readme-brief.yaml + readme-outline.yaml
|
||||
README.candidate.md + claim-map.yaml + visual-plan.yaml
|
||||
prose-report.json + verification.json + review-findings.yaml
|
||||
quality-manifest.yaml
|
||||
README.generated.md + README.patch + apply-manifest.yaml
|
||||
```
|
||||
|
||||
품질 검토를 통과한 뒤 다음 명령으로 패치를 준비합니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/generate_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
```
|
||||
|
||||
이 단계는 `README.generated.md`, `README.patch`, `apply-manifest.yaml`을 만들고
|
||||
상태를 `READY_FOR_APPLY`로 전진시킵니다. <!-- claim-id: C-PREPARE-001 -->
|
||||
|
||||
검토가 끝난 패치만 별도 명령으로 적용합니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
```
|
||||
|
||||
적용 직전에 후보·저장소·대상 README 해시와 경로 경계를 다시 검사합니다.
|
||||
<!-- claim-id: C-APPLY-001 -->
|
||||
|
||||
<!-- section-id: architecture -->
|
||||
## 동작 방식
|
||||
|
||||
사용자 요구는 독자 흐름과 공개 용어, 그림 결정을 만듭니다. 대상 저장소에서는
|
||||
근거와 프로젝트 유형을 수집합니다. 두 입력이 합쳐진 후보와 시각 자료는 결정론적
|
||||
게이트와 독립 품질 심사를 통과해야 패치가 됩니다. <!-- claim-id: C-FLOW-001 -->
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
T[Codex / Claude / Antigravity] --> O[실행 조정]
|
||||
U[사용자 요구] --> P[독자 흐름·용어·그림 결정]
|
||||
R[대상 저장소] --> E[근거 수집·프로젝트 분류]
|
||||
O --> E
|
||||
O --> P
|
||||
E --> P
|
||||
P --> W[README 작성]
|
||||
P --> V[그림 소스·자산 생성]
|
||||
W --> G[근거·명령·경로·문체 검사]
|
||||
V --> G
|
||||
G --> Q[독립 품질 심사]
|
||||
Q -->|수정 필요| P
|
||||
Q -->|통과| A[패치 준비·명시적 적용]
|
||||
H[(해시 기반 실행 산출물)] --- E
|
||||
H --- P
|
||||
H --- G
|
||||
H --- A
|
||||
```
|
||||
|
||||
<!-- visual-id: harness-flow -->
|
||||
|
||||
구성요소 책임과 컨텍스트 경계는 [아키텍처 문서](docs/architecture.md)에,
|
||||
모드별 전이는 [상태기계 문서](docs/state-machine.md)에 정리했습니다.
|
||||
|
||||
<!-- section-id: safeguards -->
|
||||
## 안전장치
|
||||
|
||||
- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.
|
||||
- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을
|
||||
차단합니다. <!-- claim-id: C-TERM-001 -->
|
||||
- 그림을 포함하기로 한 개요 결정, 계획 항목, README 마커, 생성 소스나 자산이
|
||||
일치해야 시각 자료 게이트를 통과합니다. <!-- claim-id: C-VISUAL-001 -->
|
||||
- 품질 점수와 독자 과업 근거의 줄 범위와 해시를 실제 후보에 대조하고,
|
||||
`review.md`는 검증된 YAML에서 렌더링합니다. <!-- claim-id: C-REVIEW-001 -->
|
||||
- 감사 모드는 결과 스키마를 확인하고 산출물을 원자적으로 기록한 다음 완료 상태로
|
||||
전진합니다. <!-- claim-id: C-AUDIT-001 -->
|
||||
- 갱신 모드는 보호 영역과 마커 밖 문장을 보존하며, 사람이 고친 관리 영역과 새
|
||||
후보가 충돌하면 자동 적용을 막습니다. <!-- claim-id: C-MERGE-001 -->
|
||||
- 비밀 값, 저장소 밖 경로, 오래된 스냅숏, 검토 뒤 바뀐 산출물은 패치 준비나
|
||||
적용을 차단합니다. <!-- claim-id: C-APPLY-SAFETY-001 -->
|
||||
|
||||
시각 자료의 소스·자산·대체 텍스트·신선도 규칙은
|
||||
[시각 자료 정책](docs/visuals.md)에서 확인할 수 있습니다.
|
||||
|
||||
<!-- section-id: tests -->
|
||||
## 테스트
|
||||
|
||||
전체 회귀 테스트는 다음 명령으로 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pytest -q
|
||||
```
|
||||
|
||||
GitHub Actions는 의존성을 설치한 뒤 전체 테스트를 실행합니다. 실행 환경은
|
||||
Python 3.12입니다. 자체 README 테스트는 라이브러리 프로파일, 30초 독자 흐름, 최소 실행
|
||||
경로, Mermaid 그림 결정을 확인합니다. <!-- claim-id: C-CI-001 -->
|
||||
|
||||
<!-- section-id: documentation -->
|
||||
## 상세 문서
|
||||
|
||||
- [구성요소와 컨텍스트 경계](docs/architecture.md)
|
||||
- [그림 결정과 소스·자산 계약](docs/visuals.md)
|
||||
- [모드별 상태와 차단 조건](docs/state-machine.md)
|
||||
- [모델 사용량 계측](docs/usage-metrics.md)
|
||||
- [블라인드 README 품질 벤치마크](docs/quality-benchmark.md)
|
||||
- [전체 설계 명세](docs/superpowers/specs/2026-07-16-readme-harness-design.md)
|
||||
|
||||
주요 구현은 `src/readme_harness`, 스키마·규칙·워크플로는 `.agents`, 테스트는
|
||||
`tests`에 있습니다. <!-- claim-id: C-LAYOUT-001 -->
|
||||
|
||||
<!-- section-id: limitations -->
|
||||
## 현재 한계
|
||||
|
||||
- 후보 작성은 LLM 파이프라인의 판단에 의존합니다. 결정론적 드라이버는 준비된
|
||||
산출물을 검증하고 상태를 전진시킵니다.
|
||||
- 네 모드의 결정론적 경로는 구현됐지만 도구 간 런타임 동등성은 Phase 4 검증
|
||||
목표입니다. <!-- claim-id: C-LIMIT-002 -->
|
||||
- 명령 검증 보고서의 기본 수준은 정적 검사입니다. 실행을 별도로 기록하지 않은
|
||||
명령은 실제 실행 성공을 뜻하지 않습니다. <!-- claim-id: C-VERIFY-LIMIT-001 -->
|
||||
- 여덟 저장소 유형의 블라인드 비교 계약은 마련했지만 결과 상태는 아직 `not-run`입니다.
|
||||
`PASS` 결과 전에는 품질 우월성을 주장하지 않습니다. <!-- claim-id: C-BENCH-LIMIT-001 -->
|
||||
@@ -0,0 +1,224 @@
|
||||
# README Harness
|
||||
|
||||
이 하네스는 저장소의 실제 코드와 사용 목적을 바탕으로 문서 후보를 만들고,
|
||||
명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다. <!-- claim-id: C-PROJECT-001 -->
|
||||
|
||||
- 새 README 작성
|
||||
- 기존 문서 점검
|
||||
- 사람 작성 영역을 보존한 갱신
|
||||
- 특정 섹션과 관련 검증 산출물의 재생성
|
||||
- 검토 후 별도로 실행하는 적용
|
||||
|
||||
<!-- section-id: overview -->
|
||||
## 무엇을 만드는가
|
||||
|
||||
README를 새로 만들거나 기존 문서를 안전하게 갱신하려는 개발자를 위한 도구입니다.
|
||||
|
||||
`bootstrap`, `audit`, `refresh`, `section-update` 네 모드를 구현했습니다. <!-- claim-id: C-MODE-001 -->
|
||||
|
||||
저장소 근거와 사용자 요구를 분리해 읽고, 고위험 사실을 근거에 연결합니다. 그림을
|
||||
넣기로 했다면 실제 소스나 자산까지 확인하고, 품질 심사는 원문의 줄과 해시에 묶인
|
||||
근거를 사용합니다. 패치 준비가 끝나도 대상 `README.md`는 자동으로 바뀌지 않습니다.
|
||||
<!-- claim-id: C-SAFETY-SUMMARY-001 -->
|
||||
|
||||
결정론적 Codex 경로는 구현됐습니다. 후보 문장 작성은 모델 파이프라인이 담당하며,
|
||||
다른 도구와의 런타임 동등성은 Phase 4 검증 전까지 보장하지 않습니다.
|
||||
<!-- claim-id: C-LIMIT-001 -->
|
||||
|
||||
<!-- section-id: installation -->
|
||||
## 설치
|
||||
|
||||
`Python` 3.12 이상이 필요합니다.
|
||||
런타임 의존성은 `jsonschema`와 `PyYAML`입니다.
|
||||
개발 의존성은 `pytest`입니다. <!-- claim-id: C-RUNTIME-001 -->
|
||||
|
||||
저장소 루트에서 개발 의존성을 포함한 편집 가능 설치를 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
이 설치 명령은 프로젝트 선언에서 확인했지만, 현재 작업에서는 새 가상환경 설치까지
|
||||
실행해 증명하지 않았습니다. <!-- claim-id: C-INSTALL-001 -->
|
||||
|
||||
<!-- section-id: quick-start -->
|
||||
## 빠른 시작
|
||||
|
||||
먼저 전체 테스트를 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pytest -q
|
||||
```
|
||||
|
||||
종료 코드 0과 실패 항목 없는 통과 요약이 성공 기준입니다. 이 후보는 아직 현재
|
||||
README를 바꾸지 않았으므로 최종 전체 결과는 명시적 적용 뒤 다시 확인합니다.
|
||||
|
||||
자체 README 테스트는 이 명령을 최소 실행 경로로 요구합니다. 다른 운영체제와 새
|
||||
가상환경의 동일한 결과까지 보장하는 계약은 아닙니다. <!-- claim-id: C-TEST-COMMAND-001 -->
|
||||
|
||||
이 프로젝트는 명령 하나로 문서를 완성하는 독립 실행 도구가 아닙니다. Codex 작업 공간에서
|
||||
`requirement-driven-readme` 스킬로 대상 저장소의 `bootstrap` 실행을 요청하면 작성
|
||||
역할이 사용자 요구, 저장소 근거, 개요, 후보, 주장 지도, 그림 계획과 품질 심사
|
||||
산출물을 준비합니다. <!-- claim-id: C-AUTHORING-001 -->
|
||||
|
||||
대상 저장소용 실행 디렉터리를 만듭니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/init_run.py --repo-id demo --run-id first --mode bootstrap --target-repository /path/to/repository --tool-adapter codex
|
||||
```
|
||||
|
||||
이 명령은 `runs/demo/first`에 상태와 실행 매니페스트를 초기화합니다.
|
||||
<!-- claim-id: C-INIT-001 -->
|
||||
|
||||
실행 디렉터리에 `readme-request.yaml`, `repository-facts.yaml`, `readme-brief.yaml`,
|
||||
`readme-outline.yaml`, `README.candidate.md`, `claim-map.yaml`, `visual-plan.yaml`,
|
||||
`review-findings.yaml`이 준비되면 모든 결정론적 게이트를 재생합니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/run_bootstrap.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
```
|
||||
|
||||
드라이버는 후보를 새로 쓰지 않고 준비된 산출물을 `QUALITY_REVIEWED`까지
|
||||
검증합니다. <!-- claim-id: C-BOOTSTRAP-001 -->
|
||||
|
||||
<!-- section-id: usage -->
|
||||
## 사용 모드
|
||||
|
||||
| 작업 | 모드 | 결과 |
|
||||
|---|---|---|
|
||||
| README가 없거나 전면 재작성 | `bootstrap` | 검증된 후보와 적용 준비용 패치 |
|
||||
| 기존 문서의 결함만 점검 | `audit` | 감사 결과와 검증 보고서, 후보·패치 없음 |
|
||||
| 사람 작성 영역을 보존한 갱신 | `refresh` | 3방향 병합과 병합본 전체 재검증 |
|
||||
| 한 섹션과 파급 산출물 갱신 | `section-update` | 관련 산출물 무효화 후 갱신 검증 재실행 |
|
||||
|
||||
네 모드는 요청 스키마에 선언되어 있고 각 흐름의 상태·게이트 계약이 구현되어
|
||||
있습니다. <!-- claim-id: C-USAGE-001 -->
|
||||
|
||||
<!-- section-id: api -->
|
||||
## 요청 API, 설정과 산출물
|
||||
|
||||
`readme-request.yaml`은 독자, 언어, 길이, 보존 범위, 공개 용어, 그림 정책을
|
||||
정합니다. 기술 사실은 `repository-facts.yaml`에 저장하고, 각 실행은
|
||||
`runs/<repo-id>/<run-id>` 아래에서 격리합니다. <!-- claim-id: C-INPUT-001 -->
|
||||
|
||||
어댑터가 제공하는 단계별 모델 사용량은 실행 매니페스트에 누적합니다. 제공되지
|
||||
않은 값은 0으로 추정하지 않습니다. <!-- claim-id: C-USAGE-METRICS-001 -->
|
||||
|
||||
대표 산출물은 다음 순서로 이어집니다.
|
||||
|
||||
```text
|
||||
readme-brief.yaml + readme-outline.yaml
|
||||
README.candidate.md + claim-map.yaml + visual-plan.yaml
|
||||
prose-report.json + verification.json + review-findings.yaml
|
||||
quality-manifest.yaml
|
||||
README.generated.md + README.patch + apply-manifest.yaml
|
||||
```
|
||||
|
||||
품질 검토를 통과한 뒤 다음 명령으로 패치를 준비합니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/generate_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
```
|
||||
|
||||
이 단계는 `README.generated.md`, `README.patch`, `apply-manifest.yaml`을 만들고
|
||||
상태를 `READY_FOR_APPLY`로 전진시킵니다. <!-- claim-id: C-PREPARE-001 -->
|
||||
|
||||
검토가 끝난 패치만 별도 명령으로 적용합니다.
|
||||
|
||||
```bash
|
||||
python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
```
|
||||
|
||||
적용 직전에 후보·저장소·대상 README 해시와 경로 경계를 다시 검사합니다.
|
||||
<!-- claim-id: C-APPLY-001 -->
|
||||
|
||||
<!-- section-id: architecture -->
|
||||
## 동작 방식
|
||||
|
||||
사용자 요구는 독자 흐름과 공개 용어, 그림 결정을 만듭니다. 대상 저장소에서는
|
||||
근거와 프로젝트 유형을 수집합니다. 두 입력이 합쳐진 후보와 시각 자료는 결정론적
|
||||
게이트와 독립 품질 심사를 통과해야 패치가 됩니다. <!-- claim-id: C-FLOW-001 -->
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
T[Codex / Claude / Antigravity] --> O[실행 조정]
|
||||
U[사용자 요구] --> P[독자 흐름·용어·그림 결정]
|
||||
R[대상 저장소] --> E[근거 수집·프로젝트 분류]
|
||||
O --> E
|
||||
O --> P
|
||||
E --> P
|
||||
P --> W[README 작성]
|
||||
P --> V[그림 소스·자산 생성]
|
||||
W --> G[근거·명령·경로·문체 검사]
|
||||
V --> G
|
||||
G --> Q[독립 품질 심사]
|
||||
Q -->|수정 필요| P
|
||||
Q -->|통과| A[패치 준비·명시적 적용]
|
||||
H[(해시 기반 실행 산출물)] --- E
|
||||
H --- P
|
||||
H --- G
|
||||
H --- A
|
||||
```
|
||||
|
||||
<!-- visual-id: harness-flow -->
|
||||
|
||||
구성요소 책임과 컨텍스트 경계는 [아키텍처 문서](docs/architecture.md)에,
|
||||
모드별 전이는 [상태기계 문서](docs/state-machine.md)에 정리했습니다.
|
||||
|
||||
<!-- section-id: safeguards -->
|
||||
## 안전장치
|
||||
|
||||
- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.
|
||||
- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을
|
||||
차단합니다. <!-- claim-id: C-TERM-001 -->
|
||||
- 그림을 포함하기로 한 개요 결정, 계획 항목, README 마커, 생성 소스나 자산이
|
||||
일치해야 시각 자료 게이트를 통과합니다. <!-- claim-id: C-VISUAL-001 -->
|
||||
- 품질 점수와 독자 과업 근거의 줄 범위와 해시를 실제 후보에 대조하고,
|
||||
`review.md`는 검증된 YAML에서 렌더링합니다. <!-- claim-id: C-REVIEW-001 -->
|
||||
- 감사 모드는 결과 스키마를 확인하고 산출물을 원자적으로 기록한 다음 완료 상태로
|
||||
전진합니다. <!-- claim-id: C-AUDIT-001 -->
|
||||
- 갱신 모드는 보호 영역과 마커 밖 문장을 보존하며, 사람이 고친 관리 영역과 새
|
||||
후보가 충돌하면 자동 적용을 막습니다. <!-- claim-id: C-MERGE-001 -->
|
||||
- 비밀 값, 저장소 밖 경로, 오래된 스냅숏, 검토 뒤 바뀐 산출물은 패치 준비나
|
||||
적용을 차단합니다. <!-- claim-id: C-APPLY-SAFETY-001 -->
|
||||
|
||||
시각 자료의 소스·자산·대체 텍스트·신선도 규칙은
|
||||
[시각 자료 정책](docs/visuals.md)에서 확인할 수 있습니다.
|
||||
|
||||
<!-- section-id: tests -->
|
||||
## 테스트
|
||||
|
||||
전체 회귀 테스트는 다음 명령으로 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pytest -q
|
||||
```
|
||||
|
||||
GitHub Actions는 의존성을 설치한 뒤 전체 테스트를 실행합니다. 실행 환경은
|
||||
Python 3.12입니다. 자체 README 테스트는 라이브러리 프로파일, 30초 독자 흐름, 최소 실행
|
||||
경로, Mermaid 그림 결정을 확인합니다. <!-- claim-id: C-CI-001 -->
|
||||
|
||||
<!-- section-id: documentation -->
|
||||
## 상세 문서
|
||||
|
||||
- [구성요소와 컨텍스트 경계](docs/architecture.md)
|
||||
- [그림 결정과 소스·자산 계약](docs/visuals.md)
|
||||
- [모드별 상태와 차단 조건](docs/state-machine.md)
|
||||
- [모델 사용량 계측](docs/usage-metrics.md)
|
||||
- [블라인드 README 품질 벤치마크](docs/quality-benchmark.md)
|
||||
- [전체 설계 명세](docs/superpowers/specs/2026-07-16-readme-harness-design.md)
|
||||
|
||||
주요 구현은 `src/readme_harness`, 스키마·규칙·워크플로는 `.agents`, 테스트는
|
||||
`tests`에 있습니다. <!-- claim-id: C-LAYOUT-001 -->
|
||||
|
||||
<!-- section-id: limitations -->
|
||||
## 현재 한계
|
||||
|
||||
- 후보 작성은 LLM 파이프라인의 판단에 의존합니다. 결정론적 드라이버는 준비된
|
||||
산출물을 검증하고 상태를 전진시킵니다.
|
||||
- 네 모드의 결정론적 경로는 구현됐지만 도구 간 런타임 동등성은 Phase 4 검증
|
||||
목표입니다. <!-- claim-id: C-LIMIT-002 -->
|
||||
- 명령 검증 보고서의 기본 수준은 정적 검사입니다. 실행을 별도로 기록하지 않은
|
||||
명령은 실제 실행 성공을 뜻하지 않습니다. <!-- claim-id: C-VERIFY-LIMIT-001 -->
|
||||
- 여덟 저장소 유형의 블라인드 비교 계약은 마련했지만 결과 상태는 아직 `not-run`입니다.
|
||||
`PASS` 결과 전에는 품질 우월성을 주장하지 않습니다. <!-- claim-id: C-BENCH-LIMIT-001 -->
|
||||
@@ -0,0 +1,295 @@
|
||||
--- README.md (current)
|
||||
+++ README.md (candidate)
|
||||
@@ -1,77 +1,224 @@
|
||||
# README Harness
|
||||
|
||||
-A GitHub-README-specialized harness built around a shared core with entrypoints
|
||||
-for **Codex**, **Antigravity**, and **Claude**. It does not "prettify" READMEs —
|
||||
-it analyzes the facts that exist in a repository, judges project type and
|
||||
-audience, then iteratively produces and maintains a README with a readable
|
||||
-structure, verified run instructions, and planned (not decorative) visuals.
|
||||
-
|
||||
-> **Status:** `bootstrap`, `audit`, `refresh`, and `section-update` have
|
||||
-> deterministic Codex-path drivers and gates. The repository does **not** yet
|
||||
-> claim Claude/Antigravity runtime equivalence; that remains the Phase 4
|
||||
-> conformance goal.
|
||||
-
|
||||
-## Core idea
|
||||
-
|
||||
-Two authority sources: the **repository** (technical facts, always
|
||||
-evidence-backed) and **`readme-request.yaml`** (why the project exists, audience,
|
||||
-language, length, what to preserve). Every state transition is blocked by a
|
||||
-deterministic gate script. High-risk factual claims—commands, versions,
|
||||
-prerequisites, modules, dependency directions, endpoints, guarantees, and
|
||||
-limitations—are traced to repository facts via `claim-map.yaml`.
|
||||
-
|
||||
-## Layout
|
||||
+이 하네스는 저장소의 실제 코드와 사용 목적을 바탕으로 문서 후보를 만들고,
|
||||
+명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다. <!-- claim-id: C-PROJECT-001 -->
|
||||
+
|
||||
+- 새 README 작성
|
||||
+- 기존 문서 점검
|
||||
+- 사람 작성 영역을 보존한 갱신
|
||||
+- 특정 섹션과 관련 검증 산출물의 재생성
|
||||
+- 검토 후 별도로 실행하는 적용
|
||||
+
|
||||
+<!-- section-id: overview -->
|
||||
+## 무엇을 만드는가
|
||||
+
|
||||
+README를 새로 만들거나 기존 문서를 안전하게 갱신하려는 개발자를 위한 도구입니다.
|
||||
+
|
||||
+`bootstrap`, `audit`, `refresh`, `section-update` 네 모드를 구현했습니다. <!-- claim-id: C-MODE-001 -->
|
||||
+
|
||||
+저장소 근거와 사용자 요구를 분리해 읽고, 고위험 사실을 근거에 연결합니다. 그림을
|
||||
+넣기로 했다면 실제 소스나 자산까지 확인하고, 품질 심사는 원문의 줄과 해시에 묶인
|
||||
+근거를 사용합니다. 패치 준비가 끝나도 대상 `README.md`는 자동으로 바뀌지 않습니다.
|
||||
+<!-- claim-id: C-SAFETY-SUMMARY-001 -->
|
||||
+
|
||||
+결정론적 Codex 경로는 구현됐습니다. 후보 문장 작성은 모델 파이프라인이 담당하며,
|
||||
+다른 도구와의 런타임 동등성은 Phase 4 검증 전까지 보장하지 않습니다.
|
||||
+<!-- claim-id: C-LIMIT-001 -->
|
||||
+
|
||||
+<!-- section-id: installation -->
|
||||
+## 설치
|
||||
+
|
||||
+`Python` 3.12 이상이 필요합니다.
|
||||
+런타임 의존성은 `jsonschema`와 `PyYAML`입니다.
|
||||
+개발 의존성은 `pytest`입니다. <!-- claim-id: C-RUNTIME-001 -->
|
||||
+
|
||||
+저장소 루트에서 개발 의존성을 포함한 편집 가능 설치를 실행합니다.
|
||||
+
|
||||
+```bash
|
||||
+python3 -m pip install -e ".[dev]"
|
||||
+```
|
||||
+
|
||||
+이 설치 명령은 프로젝트 선언에서 확인했지만, 현재 작업에서는 새 가상환경 설치까지
|
||||
+실행해 증명하지 않았습니다. <!-- claim-id: C-INSTALL-001 -->
|
||||
+
|
||||
+<!-- section-id: quick-start -->
|
||||
+## 빠른 시작
|
||||
+
|
||||
+먼저 전체 테스트를 실행합니다.
|
||||
+
|
||||
+```bash
|
||||
+python3 -m pytest -q
|
||||
+```
|
||||
+
|
||||
+종료 코드 0과 실패 항목 없는 통과 요약이 성공 기준입니다. 이 후보는 아직 현재
|
||||
+README를 바꾸지 않았으므로 최종 전체 결과는 명시적 적용 뒤 다시 확인합니다.
|
||||
+
|
||||
+자체 README 테스트는 이 명령을 최소 실행 경로로 요구합니다. 다른 운영체제와 새
|
||||
+가상환경의 동일한 결과까지 보장하는 계약은 아닙니다. <!-- claim-id: C-TEST-COMMAND-001 -->
|
||||
+
|
||||
+이 프로젝트는 명령 하나로 문서를 완성하는 독립 실행 도구가 아닙니다. Codex 작업 공간에서
|
||||
+`requirement-driven-readme` 스킬로 대상 저장소의 `bootstrap` 실행을 요청하면 작성
|
||||
+역할이 사용자 요구, 저장소 근거, 개요, 후보, 주장 지도, 그림 계획과 품질 심사
|
||||
+산출물을 준비합니다. <!-- claim-id: C-AUTHORING-001 -->
|
||||
+
|
||||
+대상 저장소용 실행 디렉터리를 만듭니다.
|
||||
+
|
||||
+```bash
|
||||
+python3 .agents/skills/requirement-driven-readme/scripts/init_run.py --repo-id demo --run-id first --mode bootstrap --target-repository /path/to/repository --tool-adapter codex
|
||||
+```
|
||||
+
|
||||
+이 명령은 `runs/demo/first`에 상태와 실행 매니페스트를 초기화합니다.
|
||||
+<!-- claim-id: C-INIT-001 -->
|
||||
+
|
||||
+실행 디렉터리에 `readme-request.yaml`, `repository-facts.yaml`, `readme-brief.yaml`,
|
||||
+`readme-outline.yaml`, `README.candidate.md`, `claim-map.yaml`, `visual-plan.yaml`,
|
||||
+`review-findings.yaml`이 준비되면 모든 결정론적 게이트를 재생합니다.
|
||||
+
|
||||
+```bash
|
||||
+python3 .agents/skills/requirement-driven-readme/scripts/run_bootstrap.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
+```
|
||||
+
|
||||
+드라이버는 후보를 새로 쓰지 않고 준비된 산출물을 `QUALITY_REVIEWED`까지
|
||||
+검증합니다. <!-- claim-id: C-BOOTSTRAP-001 -->
|
||||
+
|
||||
+<!-- section-id: usage -->
|
||||
+## 사용 모드
|
||||
+
|
||||
+| 작업 | 모드 | 결과 |
|
||||
+|---|---|---|
|
||||
+| README가 없거나 전면 재작성 | `bootstrap` | 검증된 후보와 적용 준비용 패치 |
|
||||
+| 기존 문서의 결함만 점검 | `audit` | 감사 결과와 검증 보고서, 후보·패치 없음 |
|
||||
+| 사람 작성 영역을 보존한 갱신 | `refresh` | 3방향 병합과 병합본 전체 재검증 |
|
||||
+| 한 섹션과 파급 산출물 갱신 | `section-update` | 관련 산출물 무효화 후 갱신 검증 재실행 |
|
||||
+
|
||||
+네 모드는 요청 스키마에 선언되어 있고 각 흐름의 상태·게이트 계약이 구현되어
|
||||
+있습니다. <!-- claim-id: C-USAGE-001 -->
|
||||
+
|
||||
+<!-- section-id: api -->
|
||||
+## 요청 API, 설정과 산출물
|
||||
+
|
||||
+`readme-request.yaml`은 독자, 언어, 길이, 보존 범위, 공개 용어, 그림 정책을
|
||||
+정합니다. 기술 사실은 `repository-facts.yaml`에 저장하고, 각 실행은
|
||||
+`runs/<repo-id>/<run-id>` 아래에서 격리합니다. <!-- claim-id: C-INPUT-001 -->
|
||||
+
|
||||
+어댑터가 제공하는 단계별 모델 사용량은 실행 매니페스트에 누적합니다. 제공되지
|
||||
+않은 값은 0으로 추정하지 않습니다. <!-- claim-id: C-USAGE-METRICS-001 -->
|
||||
+
|
||||
+대표 산출물은 다음 순서로 이어집니다.
|
||||
|
||||
```text
|
||||
-.agents/ portable core shared by all three tools
|
||||
- skills/requirement-driven-readme/{SKILL.md,references/,scripts/}
|
||||
- workflows/ profiles/ schemas/ rules/ rubrics/ templates/ adapters/
|
||||
-AGENTS.md / GEMINI.md / CLAUDE.md thin tool entrypoints
|
||||
-.codex/ .claude/ tool-native subagents & config
|
||||
-src/readme_harness/ deterministic gate logic (Python)
|
||||
-runs/<repo-id>/<run-id>/ per-run artifacts (git-ignored)
|
||||
-```
|
||||
-
|
||||
-## Modes
|
||||
-
|
||||
-`bootstrap` · `refresh` · `audit` · `section-update` are implemented. Candidate
|
||||
-authoring remains an LLM role; state transitions, merge/apply safety, and
|
||||
-verification are deterministic.
|
||||
-
|
||||
-```bash
|
||||
-# Claude
|
||||
-/readme-harness bootstrap
|
||||
-# Codex / Antigravity: follow AGENTS.md / GEMINI.md
|
||||
-```
|
||||
-
|
||||
-## State machine
|
||||
-
|
||||
-`INITIALIZED → INPUT_CAPTURED → REPOSITORY_SNAPSHOTTED → FACTS_EXTRACTED →
|
||||
-PROJECT_PROFILED → README_PLANNED → README_DRAFTED → VISUALS_PLANNED →
|
||||
-STRUCTURALLY_VALIDATED → TECHNICALLY_VERIFIED → QUALITY_REVIEWED →
|
||||
-READY_FOR_APPLY → APPLIED`
|
||||
-
|
||||
-`READY_FOR_APPLY` writes `README.generated.md` + `README.patch`; applying to the
|
||||
-target README is an explicit step. The reviewed candidate is sealed in
|
||||
-`quality-manifest.yaml`; apply rechecks repository freshness, target and
|
||||
-generated hashes, and path containment through `apply-manifest.yaml`.
|
||||
-
|
||||
-After the logical roles have authored the run artifacts, the bootstrap gates
|
||||
-can be replayed as one deterministic command:
|
||||
-
|
||||
-```bash
|
||||
-python3 .agents/skills/requirement-driven-readme/scripts/run_bootstrap.py \
|
||||
- --run-dir runs/<repo-id>/<run-id> --repo /path/to/repository
|
||||
-```
|
||||
-
|
||||
-The driver stops at `QUALITY_REVIEWED`. `generate_patch.py` prepares the sealed
|
||||
-candidate, and `apply_patch.py` is the separate explicit apply step.
|
||||
-
|
||||
-## Development
|
||||
+readme-brief.yaml + readme-outline.yaml
|
||||
+README.candidate.md + claim-map.yaml + visual-plan.yaml
|
||||
+prose-report.json + verification.json + review-findings.yaml
|
||||
+quality-manifest.yaml
|
||||
+README.generated.md + README.patch + apply-manifest.yaml
|
||||
+```
|
||||
+
|
||||
+품질 검토를 통과한 뒤 다음 명령으로 패치를 준비합니다.
|
||||
+
|
||||
+```bash
|
||||
+python3 .agents/skills/requirement-driven-readme/scripts/generate_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
+```
|
||||
+
|
||||
+이 단계는 `README.generated.md`, `README.patch`, `apply-manifest.yaml`을 만들고
|
||||
+상태를 `READY_FOR_APPLY`로 전진시킵니다. <!-- claim-id: C-PREPARE-001 -->
|
||||
+
|
||||
+검토가 끝난 패치만 별도 명령으로 적용합니다.
|
||||
+
|
||||
+```bash
|
||||
+python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
+```
|
||||
+
|
||||
+적용 직전에 후보·저장소·대상 README 해시와 경로 경계를 다시 검사합니다.
|
||||
+<!-- claim-id: C-APPLY-001 -->
|
||||
+
|
||||
+<!-- section-id: architecture -->
|
||||
+## 동작 방식
|
||||
+
|
||||
+사용자 요구는 독자 흐름과 공개 용어, 그림 결정을 만듭니다. 대상 저장소에서는
|
||||
+근거와 프로젝트 유형을 수집합니다. 두 입력이 합쳐진 후보와 시각 자료는 결정론적
|
||||
+게이트와 독립 품질 심사를 통과해야 패치가 됩니다. <!-- claim-id: C-FLOW-001 -->
|
||||
+
|
||||
+```mermaid
|
||||
+flowchart LR
|
||||
+ T[Codex / Claude / Antigravity] --> O[실행 조정]
|
||||
+ U[사용자 요구] --> P[독자 흐름·용어·그림 결정]
|
||||
+ R[대상 저장소] --> E[근거 수집·프로젝트 분류]
|
||||
+ O --> E
|
||||
+ O --> P
|
||||
+ E --> P
|
||||
+ P --> W[README 작성]
|
||||
+ P --> V[그림 소스·자산 생성]
|
||||
+ W --> G[근거·명령·경로·문체 검사]
|
||||
+ V --> G
|
||||
+ G --> Q[독립 품질 심사]
|
||||
+ Q -->|수정 필요| P
|
||||
+ Q -->|통과| A[패치 준비·명시적 적용]
|
||||
+ H[(해시 기반 실행 산출물)] --- E
|
||||
+ H --- P
|
||||
+ H --- G
|
||||
+ H --- A
|
||||
+```
|
||||
+
|
||||
+<!-- visual-id: harness-flow -->
|
||||
+
|
||||
+구성요소 책임과 컨텍스트 경계는 [아키텍처 문서](docs/architecture.md)에,
|
||||
+모드별 전이는 [상태기계 문서](docs/state-machine.md)에 정리했습니다.
|
||||
+
|
||||
+<!-- section-id: safeguards -->
|
||||
+## 안전장치
|
||||
+
|
||||
+- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.
|
||||
+- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을
|
||||
+ 차단합니다. <!-- claim-id: C-TERM-001 -->
|
||||
+- 그림을 포함하기로 한 개요 결정, 계획 항목, README 마커, 생성 소스나 자산이
|
||||
+ 일치해야 시각 자료 게이트를 통과합니다. <!-- claim-id: C-VISUAL-001 -->
|
||||
+- 품질 점수와 독자 과업 근거의 줄 범위와 해시를 실제 후보에 대조하고,
|
||||
+ `review.md`는 검증된 YAML에서 렌더링합니다. <!-- claim-id: C-REVIEW-001 -->
|
||||
+- 감사 모드는 결과 스키마를 확인하고 산출물을 원자적으로 기록한 다음 완료 상태로
|
||||
+ 전진합니다. <!-- claim-id: C-AUDIT-001 -->
|
||||
+- 갱신 모드는 보호 영역과 마커 밖 문장을 보존하며, 사람이 고친 관리 영역과 새
|
||||
+ 후보가 충돌하면 자동 적용을 막습니다. <!-- claim-id: C-MERGE-001 -->
|
||||
+- 비밀 값, 저장소 밖 경로, 오래된 스냅숏, 검토 뒤 바뀐 산출물은 패치 준비나
|
||||
+ 적용을 차단합니다. <!-- claim-id: C-APPLY-SAFETY-001 -->
|
||||
+
|
||||
+시각 자료의 소스·자산·대체 텍스트·신선도 규칙은
|
||||
+[시각 자료 정책](docs/visuals.md)에서 확인할 수 있습니다.
|
||||
+
|
||||
+<!-- section-id: tests -->
|
||||
+## 테스트
|
||||
+
|
||||
+전체 회귀 테스트는 다음 명령으로 실행합니다.
|
||||
|
||||
```bash
|
||||
python3 -m pytest -q
|
||||
```
|
||||
|
||||
-Design spec: `docs/superpowers/specs/2026-07-16-readme-harness-design.md`.
|
||||
-Phase 1 plan: `docs/superpowers/plans/2026-07-16-readme-harness-phase1.md`.
|
||||
+GitHub Actions는 의존성을 설치한 뒤 전체 테스트를 실행합니다. 실행 환경은
|
||||
+Python 3.12입니다. 자체 README 테스트는 라이브러리 프로파일, 30초 독자 흐름, 최소 실행
|
||||
+경로, Mermaid 그림 결정을 확인합니다. <!-- claim-id: C-CI-001 -->
|
||||
+
|
||||
+<!-- section-id: documentation -->
|
||||
+## 상세 문서
|
||||
+
|
||||
+- [구성요소와 컨텍스트 경계](docs/architecture.md)
|
||||
+- [그림 결정과 소스·자산 계약](docs/visuals.md)
|
||||
+- [모드별 상태와 차단 조건](docs/state-machine.md)
|
||||
+- [모델 사용량 계측](docs/usage-metrics.md)
|
||||
+- [블라인드 README 품질 벤치마크](docs/quality-benchmark.md)
|
||||
+- [전체 설계 명세](docs/superpowers/specs/2026-07-16-readme-harness-design.md)
|
||||
+
|
||||
+주요 구현은 `src/readme_harness`, 스키마·규칙·워크플로는 `.agents`, 테스트는
|
||||
+`tests`에 있습니다. <!-- claim-id: C-LAYOUT-001 -->
|
||||
+
|
||||
+<!-- section-id: limitations -->
|
||||
+## 현재 한계
|
||||
+
|
||||
+- 후보 작성은 LLM 파이프라인의 판단에 의존합니다. 결정론적 드라이버는 준비된
|
||||
+ 산출물을 검증하고 상태를 전진시킵니다.
|
||||
+- 네 모드의 결정론적 경로는 구현됐지만 도구 간 런타임 동등성은 Phase 4 검증
|
||||
+ 목표입니다. <!-- claim-id: C-LIMIT-002 -->
|
||||
+- 명령 검증 보고서의 기본 수준은 정적 검사입니다. 실행을 별도로 기록하지 않은
|
||||
+ 명령은 실제 실행 성공을 뜻하지 않습니다. <!-- claim-id: C-VERIFY-LIMIT-001 -->
|
||||
+- 여덟 저장소 유형의 블라인드 비교 계약은 마련했지만 결과 상태는 아직 `not-run`입니다.
|
||||
+ `PASS` 결과 전에는 품질 우월성을 주장하지 않습니다. <!-- claim-id: C-BENCH-LIMIT-001 -->
|
||||
@@ -0,0 +1,7 @@
|
||||
schema-version: 1
|
||||
mode: bootstrap
|
||||
target-rel: README.md
|
||||
generated-hash: sha256:dd241b6b8b7a0972086226c73b217128d98224cf30ab87505a6d5e8e0d2dcedf
|
||||
target-before-hash: sha256:53b671528d4f99b6e806145e7b687b61a5a443ceffb1fd225059f92fdc50c456
|
||||
repository-snapshot-hash: sha256:8ea3e3693ce644a2576f9a8670088a36e5964ac8edaca5b279f7281e44aa428b
|
||||
review-score: 90
|
||||
@@ -0,0 +1,160 @@
|
||||
schema-version: 1
|
||||
claims:
|
||||
- id: C-PROJECT-001
|
||||
type: factual
|
||||
statement: 명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다.
|
||||
section: overview
|
||||
sources: [{fact-id: F-PROJECT-001}]
|
||||
status: supported
|
||||
- id: C-MODE-001
|
||||
type: factual
|
||||
statement: '`bootstrap`, `audit`, `refresh`, `section-update` 네 모드를 구현했습니다.'
|
||||
section: overview
|
||||
sources: [{fact-id: F-MODE-001}]
|
||||
status: supported
|
||||
- id: C-SAFETY-SUMMARY-001
|
||||
type: factual
|
||||
statement: '패치 준비가 끝나도 대상 `README.md`는 자동으로 바뀌지 않습니다.'
|
||||
section: overview
|
||||
sources: [{fact-id: F-APPLY-001}]
|
||||
status: supported
|
||||
- id: C-LIMIT-001
|
||||
type: factual
|
||||
statement: 다른 도구와의 런타임 동등성은 Phase 4 검증 전까지 보장하지 않습니다.
|
||||
section: overview
|
||||
sources: [{fact-id: F-TOOL-001}, {fact-id: F-LIMIT-001}]
|
||||
status: supported
|
||||
- id: C-RUNTIME-001
|
||||
type: factual
|
||||
section: installation
|
||||
sources: [{fact-id: F-RUNTIME-001}, {fact-id: F-DEPENDENCY-001}]
|
||||
status: supported
|
||||
- id: C-INSTALL-001
|
||||
type: factual
|
||||
statement: 실행해 증명하지 않았습니다.
|
||||
section: installation
|
||||
sources: [{fact-id: F-DEPENDENCY-001}]
|
||||
status: supported
|
||||
- id: C-TEST-COMMAND-001
|
||||
type: factual
|
||||
statement: 가상환경의 동일한 결과까지 보장하는 계약은 아닙니다.
|
||||
section: quick-start
|
||||
sources: [{fact-id: F-SELF-README-001}, {fact-id: F-LIMIT-001}]
|
||||
status: supported
|
||||
- id: C-AUTHORING-001
|
||||
type: factual
|
||||
section: quick-start
|
||||
sources: [{fact-id: F-AUTHORING-001}, {fact-id: F-DRIVER-001}]
|
||||
status: supported
|
||||
- id: C-INIT-001
|
||||
type: factual
|
||||
statement: '이 명령은 `runs/demo/first`에 상태와 실행 매니페스트를 초기화합니다.'
|
||||
section: quick-start
|
||||
sources: [{fact-id: F-DRIVER-001}]
|
||||
status: supported
|
||||
- id: C-BOOTSTRAP-001
|
||||
type: factual
|
||||
statement: 검증합니다.
|
||||
section: quick-start
|
||||
sources: [{fact-id: F-DRIVER-001}, {fact-id: F-STATE-001}]
|
||||
status: supported
|
||||
- id: C-USAGE-001
|
||||
type: factual
|
||||
statement: 네 모드는 요청 스키마에 선언되어 있고 각 흐름의 상태·게이트 계약이 구현되어
|
||||
section: usage
|
||||
sources: [{fact-id: F-MODE-001}, {fact-id: F-STATE-001}]
|
||||
status: supported
|
||||
- id: C-INPUT-001
|
||||
type: factual
|
||||
statement: '`runs/<repo-id>/<run-id>` 아래에서 격리합니다.'
|
||||
section: api
|
||||
sources: [{fact-id: F-ARTIFACT-001}, {fact-id: F-LAYOUT-001}]
|
||||
status: supported
|
||||
- id: C-USAGE-METRICS-001
|
||||
type: factual
|
||||
section: api
|
||||
sources: [{fact-id: F-USAGE-001}]
|
||||
status: supported
|
||||
- id: C-PREPARE-001
|
||||
type: factual
|
||||
statement: '상태를 `READY_FOR_APPLY`로 전진시킵니다.'
|
||||
section: api
|
||||
sources: [{fact-id: F-APPLY-001}]
|
||||
status: supported
|
||||
- id: C-APPLY-001
|
||||
type: factual
|
||||
statement: 적용 직전에 후보·저장소·대상 README 해시와 경로 경계를 다시 검사합니다.
|
||||
section: api
|
||||
sources: [{fact-id: F-APPLY-001}]
|
||||
status: supported
|
||||
- id: C-FLOW-001
|
||||
type: factual
|
||||
statement: 게이트와 독립 품질 심사를 통과해야 패치가 됩니다.
|
||||
section: architecture
|
||||
sources: [{fact-id: F-STATE-001}, {fact-id: F-REVIEW-001}, {fact-id: F-APPLY-001}]
|
||||
status: supported
|
||||
- id: C-TERM-001
|
||||
type: factual
|
||||
statement: 차단합니다.
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-TERM-001}]
|
||||
status: supported
|
||||
- id: C-VISUAL-001
|
||||
type: factual
|
||||
statement: 일치해야 시각 자료 게이트를 통과합니다.
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-VISUAL-001}]
|
||||
status: supported
|
||||
- id: C-REVIEW-001
|
||||
type: factual
|
||||
statement: '`review.md`는 검증된 YAML에서 렌더링합니다.'
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-REVIEW-001}]
|
||||
status: supported
|
||||
- id: C-AUDIT-001
|
||||
type: factual
|
||||
statement: 전진합니다.
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-AUDIT-001}]
|
||||
status: supported
|
||||
- id: C-MERGE-001
|
||||
type: factual
|
||||
statement: 후보가 충돌하면 자동 적용을 막습니다.
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-MERGE-001}]
|
||||
status: supported
|
||||
- id: C-APPLY-SAFETY-001
|
||||
type: factual
|
||||
statement: 적용을 차단합니다.
|
||||
section: safeguards
|
||||
sources: [{fact-id: F-APPLY-001}]
|
||||
status: supported
|
||||
- id: C-CI-001
|
||||
type: factual
|
||||
statement: 경로, Mermaid 그림 결정을 확인합니다.
|
||||
section: tests
|
||||
sources: [{fact-id: F-CI-001}, {fact-id: F-SELF-README-001}]
|
||||
status: supported
|
||||
- id: C-LAYOUT-001
|
||||
type: factual
|
||||
statement: '`tests`에 있습니다.'
|
||||
section: documentation
|
||||
sources: [{fact-id: F-LAYOUT-001}]
|
||||
status: supported
|
||||
- id: C-LIMIT-002
|
||||
type: factual
|
||||
statement: 목표입니다.
|
||||
section: limitations
|
||||
sources: [{fact-id: F-TOOL-001}, {fact-id: F-LIMIT-001}]
|
||||
status: supported
|
||||
- id: C-VERIFY-LIMIT-001
|
||||
type: factual
|
||||
statement: 명령은 실제 실행 성공을 뜻하지 않습니다.
|
||||
section: limitations
|
||||
sources: [{fact-id: F-LIMIT-001}]
|
||||
status: supported
|
||||
- id: C-BENCH-LIMIT-001
|
||||
type: factual
|
||||
section: limitations
|
||||
sources: [{fact-id: F-BENCH-001}]
|
||||
status: supported
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"policy-id": "korean-reader-prose-v1",
|
||||
"language": "ko-KR",
|
||||
"applicable": true,
|
||||
"scope": "candidate",
|
||||
"state": "PASS_WITH_WARNINGS",
|
||||
"summary": {
|
||||
"errors": 0,
|
||||
"warnings": 1,
|
||||
"sentences": 108,
|
||||
"prose-characters": 2081,
|
||||
"hangul-characters": 1839
|
||||
},
|
||||
"findings": [
|
||||
{
|
||||
"rule-id": "KO-REPEATED-ENDING",
|
||||
"severity": "warning",
|
||||
"line": 4,
|
||||
"section": "README Harness",
|
||||
"region-kind": "candidate",
|
||||
"excerpt": "합니다 (29/43문장)",
|
||||
"message": "같은 문장 종결이 이어져 설명이 기계적으로 들릴 수 있습니다.",
|
||||
"suggestion": "정의, 절차, 제한에 맞춰 현재형 동사와 명사형 표제를 섞어 쓰세요.",
|
||||
"source-ids": [
|
||||
"NIKL-EASY-PUBLIC-LANGUAGE"
|
||||
],
|
||||
"id": "P-001"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
schema-version: 2
|
||||
mode: bootstrap
|
||||
profile: library
|
||||
repository-snapshot-hash: sha256:8ea3e3693ce644a2576f9a8670088a36e5964ac8edaca5b279f7281e44aa428b
|
||||
artifacts:
|
||||
readme-request.yaml: sha256:5aaa41c2d4131ea1587660751c73b6a92894c684737fb3315de44dd210e03a0f
|
||||
repository-facts.yaml: sha256:61f1fb4b892ca6b21ad4a54634e687f2e231d1582315ff37bda31b28e4a68735
|
||||
readme-brief.yaml: sha256:a17a7877ee3799ddd9e240f75fd59f285f79d8f95364c701f61fa0b280f89529
|
||||
readme-outline.yaml: sha256:9748f1e59bfb884044e685970f319fca3e54c8b7b1cdad7861993cd15cf0e57b
|
||||
README.candidate.md: sha256:dd241b6b8b7a0972086226c73b217128d98224cf30ab87505a6d5e8e0d2dcedf
|
||||
claim-map.yaml: sha256:886526bb672493d1846270540b422858f2a68985b2be5c79cdddd8a285e77ee6
|
||||
visual-plan.yaml: sha256:8e610350b341ce517de9a39746f83c62f0e97197916d41b3f857e67c4ce153d7
|
||||
prose-report.json: sha256:6c34d9c7d068786688dea529478b5a88ef2017b05d772b45c32374f1888a17fb
|
||||
review-findings.yaml: sha256:6d19d78927d7255f39ef7fb3f859dca715d2128ed1b96ab5bad3d65bc8aeaa32
|
||||
@@ -0,0 +1,47 @@
|
||||
schema-version: 1
|
||||
project-profile:
|
||||
primary: library
|
||||
secondary: [documentation-tooling]
|
||||
audiences:
|
||||
primary:
|
||||
- 저장소 README를 만들거나 갱신하는 개발자
|
||||
secondary:
|
||||
- 결정론적 게이트와 도구 어댑터를 확장하는 기여자
|
||||
reader-outcomes:
|
||||
- 프로젝트가 만드는 결과와 안전 경계를 30초 안에 설명한다.
|
||||
- 의존성을 설치하고 전체 테스트로 개발 환경을 확인한다.
|
||||
- 네 가지 모드 중 자기 작업에 맞는 경로를 선택한다.
|
||||
- 후보를 검증하고 패치를 준비한 뒤 명시적으로 적용한다.
|
||||
project-story:
|
||||
value-proposition: 저장소 코드와 사용자 요구를 근거로 README 후보를 만들고 검증 가능한 패치로 전달한다.
|
||||
problem: README 자동 작성은 실행 명령과 구조 설명이 실제 저장소와 어긋나거나 기존 문서를 훼손하기 쉽다.
|
||||
target-reader: README를 새로 만들거나 안전하게 갱신하려는 개발자
|
||||
notable-traits:
|
||||
- text: 저장소 사실과 사용자 의도를 분리하고 고위험 주장을 근거에 연결한다.
|
||||
fact-ids: [F-PROJECT-001, F-STATE-001]
|
||||
- text: 포함한 그림은 개요 결정부터 실제 소스 또는 자산까지 교차 검증한다.
|
||||
fact-ids: [F-VISUAL-001]
|
||||
- text: 품질 심사 근거는 실제 README 줄 범위와 해시에 묶인다.
|
||||
fact-ids: [F-REVIEW-001]
|
||||
- text: 패치 준비와 대상 README 적용이 분리되고 적용 직전에 상태와 해시를 다시 검사한다.
|
||||
fact-ids: [F-APPLY-001]
|
||||
maturity: Codex 경로의 네 모드 드라이버는 구현됐으나 후보 작성은 LLM 경계에 있고 도구 간 동등성은 아직 검증하지 않았다.
|
||||
limitations:
|
||||
- 후보 작성 자체는 결정론적 코드가 아니라 LLM 파이프라인이 담당한다.
|
||||
- Claude와 Antigravity의 런타임 동등성은 Phase 4 전에는 주장하지 않는다.
|
||||
narrative-variant: library
|
||||
reader-journey:
|
||||
- reader-question: 무엇을 만들고 어떤 문제를 막습니까?
|
||||
section-id: overview
|
||||
- reader-question: 로컬에서 설치와 테스트를 어떻게 확인합니까?
|
||||
section-id: quick-start
|
||||
- reader-question: 내 작업에는 어떤 모드를 선택해야 합니까?
|
||||
section-id: usage
|
||||
- reader-question: 저장소 분석부터 적용까지 어떤 흐름으로 동작합니까?
|
||||
section-id: architecture
|
||||
- reader-question: 어떤 오류와 문서 훼손을 차단합니까?
|
||||
section-id: safeguards
|
||||
- reader-question: 기여 전에 무엇을 검증해야 합니까?
|
||||
section-id: tests
|
||||
- reader-question: 상세 계약은 어디에서 확인합니까?
|
||||
section-id: documentation
|
||||
@@ -0,0 +1,129 @@
|
||||
schema-version: 1
|
||||
sections:
|
||||
- id: overview
|
||||
title-guidance: 무엇을 만드는가
|
||||
level: 2
|
||||
purpose: 프로젝트의 결과, 대상 독자, 사실 근거와 명시적 적용이라는 핵심 경계를 첫 화면에서 설명한다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
target-doc: null
|
||||
content-requirements:
|
||||
- 저장소 사실과 사용자 요구를 바탕으로 README 후보와 패치를 만든다는 한 문장 정의
|
||||
- bootstrap, audit, refresh, section-update 네 작업 결과
|
||||
- 후보 작성은 LLM 경계이고 도구 간 동등성을 아직 주장하지 않는다는 제한
|
||||
visual-slot:
|
||||
decision: exclude
|
||||
reader-question: 프로젝트 정체성을 이해하는 데 그림이 필요한가?
|
||||
rationale: 결과와 안전 경계는 짧은 정의와 목록으로 더 직접적으로 전달된다.
|
||||
- id: installation
|
||||
title-guidance: 설치
|
||||
level: 2
|
||||
purpose: 필요한 Python 버전과 개발 의존성 설치 명령을 제시한다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
target-doc: null
|
||||
content-requirements:
|
||||
- Python 3.12 이상
|
||||
- editable 개발 설치 명령
|
||||
- id: quick-start
|
||||
title-guidance: 빠른 시작
|
||||
level: 2
|
||||
purpose: 설치 후 전체 테스트를 실행하고 첫 bootstrap run을 초기화하는 최소 경로를 제공한다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
target-doc: null
|
||||
content-requirements:
|
||||
- 테스트 명령과 통과 신호
|
||||
- init_run 명령과 생성 위치
|
||||
- 독립형 생성 CLI가 아니라 Codex 스킬 요청으로 작성 산출물을 준비한다는 경계
|
||||
- 준비해야 할 작성 산출물과 run_bootstrap으로 게이트를 재생하는 조건
|
||||
visual-slot:
|
||||
decision: exclude
|
||||
reader-question: 세 개의 순차 명령을 이해하는 데 그림이 필요한가?
|
||||
rationale: 복사 가능한 명령과 각 성공 신호가 그림보다 정확하다.
|
||||
- id: usage
|
||||
title-guidance: 사용 모드
|
||||
level: 2
|
||||
purpose: 독자 작업을 기준으로 네 가지 모드의 선택 조건과 결과를 구분한다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
target-doc: null
|
||||
content-requirements:
|
||||
- 새 문서 작성, 기존 문서 점검, 안전 갱신, 부분 갱신의 선택 기준
|
||||
- audit은 후보나 패치를 만들지 않는다는 차이
|
||||
- id: api
|
||||
title-guidance: 요청 API, 설정과 산출물
|
||||
level: 2
|
||||
purpose: 사용자 의도 파일, 실행 디렉터리, 후보·검증·패치 산출물의 대응을 설명한다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
target-doc: null
|
||||
content-requirements:
|
||||
- readme-request의 역할
|
||||
- runs 경로와 주요 산출물
|
||||
- 어댑터 제공 모델 사용량과 미제공 값 비추정 원칙
|
||||
- patch 준비와 apply 명령의 분리
|
||||
- id: architecture
|
||||
title-guidance: 동작 방식
|
||||
level: 2
|
||||
purpose: 사용자 요구와 저장소 근거가 계획·작성·시각화·게이트·품질 심사·적용으로 흐르는 구조를 한 화면에서 설명한다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
target-doc: null
|
||||
content-requirements:
|
||||
- 의미 판단과 결정론적 검증의 경계
|
||||
- 실패 시 계획 단계로 돌아가는 재작업 흐름
|
||||
- 해시 기반 산출물 저장소
|
||||
visual-slot:
|
||||
decision: include
|
||||
reader-question: 저장소 근거와 사용자 요구가 어떻게 검토 가능한 패치로 변합니까?
|
||||
rationale: 두 입력이 계획에서 합쳐지고 작성과 그림이 검증으로 모인 뒤 품질 심사에서 재작업 또는 적용으로 갈라지는 관계는 산문보다 흐름도가 빠르다.
|
||||
purpose: 저장소 분석부터 독립 품질 심사와 명시적 적용까지의 데이터 흐름과 재작업 경계를 보여준다.
|
||||
- id: safeguards
|
||||
title-guidance: 안전장치
|
||||
level: 2
|
||||
purpose: 사실·명령·경로·비밀 값·시각 자료·품질 근거·보호 영역·적용 경계를 구체적으로 설명한다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
target-doc: null
|
||||
content-requirements:
|
||||
- 근거 없는 고위험 주장 차단
|
||||
- 공개 용어와 그림 완성도 계약
|
||||
- 감사 산출물 검증과 갱신 보호 영역
|
||||
- 패치 준비 후 별도 apply
|
||||
- id: tests
|
||||
title-guidance: 테스트
|
||||
level: 2
|
||||
purpose: 전체 회귀 테스트 명령과 자체 README 품질 계약을 설명한다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
target-doc: null
|
||||
content-requirements:
|
||||
- 전체 pytest 명령
|
||||
- CI가 같은 명령을 실행한다는 사실
|
||||
- 자체 README 독자 과업과 시각 결정 테스트
|
||||
- id: documentation
|
||||
title-guidance: 상세 문서
|
||||
level: 2
|
||||
purpose: 아키텍처, 시각 자료, 상태기계, 설계 명세로 독자를 안내한다.
|
||||
required: true
|
||||
content-strategy: summary-link
|
||||
target-doc: docs/
|
||||
content-requirements:
|
||||
- architecture.md
|
||||
- visuals.md
|
||||
- state-machine.md
|
||||
- usage-metrics.md
|
||||
- quality-benchmark.md
|
||||
- 설계 명세
|
||||
- id: limitations
|
||||
title-guidance: 현재 한계
|
||||
level: 2
|
||||
purpose: 결정론 게이트와 LLM 후보 작성의 경계, 도구 간 동등성 미검증 상태를 명시한다.
|
||||
required: true
|
||||
content-strategy: inline
|
||||
target-doc: null
|
||||
content-requirements:
|
||||
- 후보 작성은 LLM 파이프라인
|
||||
- cross-tool equivalence는 Phase 4 목표
|
||||
- 블라인드 품질 비교는 아직 not-run이며 PASS 전 우월성 주장 금지
|
||||
@@ -0,0 +1,57 @@
|
||||
schema-version: 1
|
||||
target:
|
||||
repository: /home/donghyeon/workspace/ai-tool/readme-harness
|
||||
readme-path: README.md
|
||||
mode: bootstrap
|
||||
profile-override: library
|
||||
project-intent:
|
||||
purpose: 저장소의 실제 코드와 사용자 요구를 바탕으로 검증 가능한 README 후보와 명시적으로 적용할 패치를 만드는 하네스를 설명한다.
|
||||
positioning: 사실 추적과 적용 안전성뿐 아니라 독자 과업, 공개 용어, 실제 시각 자료, 근거가 고정된 품질 심사를 함께 다루는 README 제작 도구다.
|
||||
maturity: Codex 경로의 bootstrap, audit, refresh, section-update는 구현됐고 도구 간 런타임 동등성은 아직 주장하지 않는다.
|
||||
audience:
|
||||
primary:
|
||||
- 저장소 README를 새로 만들거나 안전하게 갱신하려는 개발자
|
||||
secondary:
|
||||
- 하네스의 게이트와 워크플로를 확장하는 기여자
|
||||
reader-actions:
|
||||
- 이 프로젝트가 어떤 결과를 만들고 무엇을 보장하는지 30초 안에 판단한다.
|
||||
- 개발 환경을 준비하고 전체 테스트를 실행해 설치 상태를 확인한다.
|
||||
- 작업에 맞는 bootstrap, audit, refresh, section-update 모드를 고른다.
|
||||
- 생성된 패치를 검토한 뒤 별도의 명시적 적용 단계를 실행한다.
|
||||
content-policy:
|
||||
language: ko-KR
|
||||
tone: 직접적이고 검증 수준을 분명히 밝히는 기술 설명체
|
||||
target-length: medium
|
||||
preserve-existing-copy: false
|
||||
detail-docs-policy: summary-and-link
|
||||
visual-policy:
|
||||
mode: when-useful
|
||||
max-visuals: 1
|
||||
preferred-formats:
|
||||
- mermaid
|
||||
placeholder-format: HTML 주석 기반 제작 사양
|
||||
terminology-policy:
|
||||
exact-identifiers: []
|
||||
explain-on-first-use: {}
|
||||
internal-only:
|
||||
family: 작업 담당 방식
|
||||
fan-out: 여러 담당자가 나눠 검토
|
||||
collapse: 한 담당자가 맡아 처리
|
||||
concrete worker: 실제 변경 담당자
|
||||
verification family: 검증 담당 역할
|
||||
route-to: 재작업 시작 상태
|
||||
must-include:
|
||||
- 한 문장 가치 제안과 대상 독자
|
||||
- 설치 전제조건과 복사 가능한 첫 테스트 경로
|
||||
- 네 가지 모드의 독자 작업 기준 선택법
|
||||
- 저장소 분석부터 패치 적용까지의 한 화면 처리 흐름
|
||||
- 사실, 명령, 경로, 비밀 값, 보호 영역, 품질 근거에 대한 안전장치
|
||||
- 생성되는 주요 산출물과 명시적 적용 경계
|
||||
- Codex 경로 구현 범위와 도구 간 동등성 한계
|
||||
- 아키텍처, 시각화, 상태기계 상세 문서 링크
|
||||
must-exclude:
|
||||
- 저장소 근거 없는 최상 품질, 성능, 생산 준비 완료 주장
|
||||
- 전체 상태 이름과 내부 역할 배치를 첫 화면에서 장황하게 나열하는 설명
|
||||
- 내부 오케스트레이션 영문 용어를 독자용 개념처럼 노출하는 문장
|
||||
- 검증되지 않은 설치·실행 명령
|
||||
protected-sections: []
|
||||
@@ -0,0 +1,363 @@
|
||||
schema-version: 1
|
||||
repository-snapshot-hash: sha256:8ea3e3693ce644a2576f9a8670088a36e5964ac8edaca5b279f7281e44aa428b
|
||||
project-name: readme-harness
|
||||
languages: [Python]
|
||||
frameworks: [jsonschema, PyYAML, pytest]
|
||||
facts:
|
||||
- id: F-PROJECT-001
|
||||
category: purpose
|
||||
key: harness-description
|
||||
value: 저장소 사실과 사용자 요구를 바탕으로 GitHub README를 분석·설계·작성·검증하는 하네스
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
line-start: 2
|
||||
line-end: 13
|
||||
source-kind: harness-configuration
|
||||
- id: F-RUNTIME-001
|
||||
category: prerequisite
|
||||
key: python-version
|
||||
value: Python >=3.12
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: pyproject.toml
|
||||
line-start: 1
|
||||
line-end: 5
|
||||
source-kind: build-configuration
|
||||
- id: F-DEPENDENCY-001
|
||||
category: dependency
|
||||
key: runtime-and-dev-dependencies
|
||||
value: [jsonschema>=4.20, PyYAML>=6.0, pytest>=8.0]
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: pyproject.toml
|
||||
line-start: 5
|
||||
line-end: 8
|
||||
source-kind: build-configuration
|
||||
- id: F-MODE-001
|
||||
category: capability
|
||||
key: implemented-modes
|
||||
value: [bootstrap, audit, refresh, section-update]
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
line-start: 10
|
||||
line-end: 13
|
||||
source-kind: harness-configuration
|
||||
- id: F-TOOL-001
|
||||
category: compatibility
|
||||
key: tool-boundary
|
||||
value:
|
||||
supported-tools: [codex, antigravity, claude]
|
||||
deterministic-codex-drivers: implemented
|
||||
cross-tool-equivalence: phase-4
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
line-start: 8
|
||||
line-end: 13
|
||||
source-kind: harness-configuration
|
||||
- path: harness.yaml
|
||||
line-start: 99
|
||||
line-end: 107
|
||||
source-kind: capability-boundary
|
||||
- id: F-STATE-001
|
||||
category: workflow
|
||||
key: bootstrap-gates
|
||||
value:
|
||||
states: [INPUT_CAPTURED, REPOSITORY_SNAPSHOTTED, FACTS_EXTRACTED, PROJECT_PROFILED, README_PLANNED, README_DRAFTED, VISUALS_PLANNED, STRUCTURALLY_VALIDATED, TECHNICALLY_VERIFIED, QUALITY_REVIEWED]
|
||||
final-preparation: READY_FOR_APPLY
|
||||
final-apply: APPLIED
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: src/readme_harness/state.py
|
||||
line-start: 71
|
||||
line-end: 83
|
||||
source-kind: state-machine-code
|
||||
- id: F-VISUAL-001
|
||||
category: visual-contract
|
||||
key: included-visual-completeness
|
||||
value: 개요 include 섹션, visual plan 섹션, README visual id, 요청 모드에 맞는 생성 소스 또는 자산을 함께 검사
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: src/readme_harness/visuals.py
|
||||
line-start: 77
|
||||
line-end: 183
|
||||
source-kind: validator-code
|
||||
- id: F-DRIVER-001
|
||||
category: workflow
|
||||
key: bootstrap-driver-boundary
|
||||
value:
|
||||
init-run: runs/<repo-id>/<run-id>에 state.json과 run-manifest.json을 생성
|
||||
bootstrap-driver: 준비된 authoring artifacts를 QUALITY_REVIEWED까지 검증하며 후보나 대상 README를 작성하지 않음
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .agents/skills/requirement-driven-readme/scripts/init_run.py
|
||||
line-start: 10
|
||||
line-end: 37
|
||||
source-kind: driver-code
|
||||
- path: .agents/skills/requirement-driven-readme/scripts/run_bootstrap.py
|
||||
line-start: 1
|
||||
line-end: 7
|
||||
source-kind: driver-code
|
||||
- id: F-AUTHORING-001
|
||||
category: usage
|
||||
key: model-authoring-boundary
|
||||
value: 독립형 종단 간 생성 CLI가 아니라 도구가 requirement-driven-readme 스킬을 로드하고 모델 역할이 작성 산출물을 준비한 뒤 결정론 드라이버가 검증하는 구조
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: AGENTS.md
|
||||
line-start: 1
|
||||
line-end: 14
|
||||
source-kind: codex-entrypoint
|
||||
- path: harness.yaml
|
||||
line-start: 100
|
||||
line-end: 109
|
||||
source-kind: capability-boundary
|
||||
- id: F-TERM-001
|
||||
category: prose-contract
|
||||
key: public-terminology
|
||||
value: 인라인 코드 식별자를 repository-facts.yaml과 대조하고 내부 전용 용어 노출과 첫 사용 설명을 검사
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: src/readme_harness/prose.py
|
||||
line-start: 120
|
||||
line-end: 207
|
||||
source-kind: validator-code
|
||||
- path: src/readme_harness/prose.py
|
||||
line-start: 286
|
||||
line-end: 379
|
||||
source-kind: validator-code
|
||||
- id: F-CLASSIFY-001
|
||||
category: classification
|
||||
key: root-first-python-classification
|
||||
value: 루트 선언을 우선하고 테스트·픽스처·예제·샘플·vendor를 주 분류 신호에서 제외하며 pyproject.toml을 CLI·서비스·라이브러리로 구분
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: src/readme_harness/scan.py
|
||||
line-start: 14
|
||||
line-end: 103
|
||||
source-kind: scanner-code
|
||||
- path: src/readme_harness/classify.py
|
||||
line-start: 6
|
||||
line-end: 29
|
||||
source-kind: classifier-code
|
||||
- id: F-REVIEW-001
|
||||
category: quality-contract
|
||||
key: hash-bound-review-evidence
|
||||
value: 품질 근거의 artifact, section-id, line-start, line-end, content-hash를 실제 README와 대조하고 review.md를 YAML에서 렌더링
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: src/readme_harness/review.py
|
||||
line-start: 18
|
||||
line-end: 103
|
||||
source-kind: review-validator-code
|
||||
- id: F-AUDIT-001
|
||||
category: audit-contract
|
||||
key: validated-atomic-audit-completion
|
||||
value: audit findings를 스키마 검증하고 산출물을 원자적으로 기록한 뒤 AUDIT_COMPLETED로 전이
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .agents/skills/requirement-driven-readme/scripts/run_audit.py
|
||||
line-start: 107
|
||||
line-end: 134
|
||||
source-kind: audit-driver-code
|
||||
- id: F-APPLY-001
|
||||
category: safety
|
||||
key: explicit-apply-boundary
|
||||
value:
|
||||
prepared-artifacts: [README.generated.md, README.patch, apply-manifest.yaml]
|
||||
checks: [reviewed-artifact-hashes, repository-freshness, generated-hash, target-before-hash, path-containment]
|
||||
target-write: explicit apply_patch.py only
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
line-start: 134
|
||||
line-end: 141
|
||||
source-kind: apply-policy
|
||||
- path: .agents/skills/requirement-driven-readme/scripts/apply_patch.py
|
||||
line-start: 22
|
||||
line-end: 67
|
||||
source-kind: apply-driver-code
|
||||
- id: F-MERGE-001
|
||||
category: safety
|
||||
key: refresh-preservation
|
||||
value: refresh는 protected와 unmarked 영역을 보존하고 서로 다른 managed 편집을 manual-required 충돌로 기록
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: src/readme_harness/merge.py
|
||||
line-start: 7
|
||||
line-end: 79
|
||||
source-kind: merge-code
|
||||
- id: F-LAYOUT-001
|
||||
category: structure
|
||||
key: primary-paths
|
||||
value: [.agents, src/readme_harness, tests, docs/architecture.md, docs/visuals.md, docs/state-machine.md, runs]
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
line-start: 125
|
||||
line-end: 132
|
||||
source-kind: harness-configuration
|
||||
- path: docs/architecture.md
|
||||
line-start: 1
|
||||
line-end: 1
|
||||
source-kind: documentation
|
||||
- path: docs/visuals.md
|
||||
line-start: 1
|
||||
line-end: 1
|
||||
source-kind: documentation
|
||||
- path: docs/state-machine.md
|
||||
line-start: 1
|
||||
line-end: 1
|
||||
source-kind: documentation
|
||||
- id: F-ARTIFACT-001
|
||||
category: artifact-contract
|
||||
key: primary-authoring-artifacts
|
||||
value: [README.md, readme-request.yaml, repository-facts.yaml, readme-brief.yaml, readme-outline.yaml, README.candidate.md, claim-map.yaml, visual-plan.yaml, prose-report.json, verification.json, review-findings.yaml, review.md, quality-manifest.yaml, audit-findings.yaml, audit-report.md, README.generated.md, README.patch, apply-manifest.yaml, runs/demo/first, runs/<repo-id>/<run-id>, requirement-driven-readme, bootstrap]
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .agents/skills/requirement-driven-readme/scripts/run_bootstrap.py
|
||||
line-start: 46
|
||||
line-end: 56
|
||||
source-kind: bootstrap-driver-code
|
||||
- path: harness.yaml
|
||||
line-start: 134
|
||||
line-end: 141
|
||||
source-kind: apply-policy
|
||||
- id: F-SELF-README-001
|
||||
category: readme-contract
|
||||
key: own-readme-quality-tests
|
||||
value: [library profile quality audit, 30-second reader order, python3 -m pytest -q, Mermaid, harness-flow]
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: tests/unit/test_own_readme_quality.py
|
||||
line-start: 14
|
||||
line-end: 38
|
||||
source-kind: repository-owned-readme-test
|
||||
- id: F-CI-001
|
||||
category: testing
|
||||
key: continuous-integration
|
||||
value: GitHub Actions는 Python 3.12에서 개발 의존성을 설치하고 python -m pytest -q를 실행
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: .github/workflows/ci.yml
|
||||
line-start: 1
|
||||
line-end: 17
|
||||
source-kind: ci-workflow
|
||||
- id: F-USAGE-001
|
||||
category: observability
|
||||
key: adapter-supplied-model-usage
|
||||
value: 어댑터가 제공한 단계별 입력·캐시 입력·출력 토큰과 컨텍스트 파일 기여를 run-manifest.json에 누적하며 미제공 값은 추정하지 않음
|
||||
assertion-type: observed
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: src/readme_harness/usage.py
|
||||
line-start: 11
|
||||
line-end: 66
|
||||
source-kind: usage-recorder-code
|
||||
- path: docs/usage-metrics.md
|
||||
line-start: 1
|
||||
line-end: 29
|
||||
source-kind: usage-documentation
|
||||
- id: F-BENCH-001
|
||||
category: limitation
|
||||
key: quality-superiority-gate
|
||||
value:
|
||||
repository-types: 8
|
||||
arms: [human-maintained, single-prompt, harness]
|
||||
current-status: not-run
|
||||
required-status: PASS
|
||||
superiority-claims: prohibited-until-benchmark-pass
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: benchmarks/quality-benchmark.yaml
|
||||
line-start: 1
|
||||
line-end: 37
|
||||
source-kind: benchmark-contract
|
||||
- path: harness.yaml
|
||||
line-start: 108
|
||||
line-end: 114
|
||||
source-kind: capability-boundary
|
||||
- id: F-LIMIT-001
|
||||
category: limitation
|
||||
key: candidate-generation-boundary
|
||||
value: 후보 작성은 LLM pipeline이며 결정론 코어가 아니고 도구 간 런타임 동등성은 phase-4 목표
|
||||
assertion-type: declared
|
||||
confidence: high
|
||||
evidence:
|
||||
- path: harness.yaml
|
||||
line-start: 99
|
||||
line-end: 107
|
||||
source-kind: capability-boundary
|
||||
commands:
|
||||
- id: CMD-001
|
||||
command: python3 -m pip install -e ".[dev]"
|
||||
cwd: .
|
||||
source:
|
||||
path: pyproject.toml
|
||||
verification:
|
||||
status: discovered
|
||||
method: pyproject dependencies and editable install syntax
|
||||
- id: CMD-002
|
||||
command: python3 -m pytest -q
|
||||
cwd: .
|
||||
source:
|
||||
path: pyproject.toml
|
||||
verification:
|
||||
status: executed
|
||||
method: pytest execution in current workspace
|
||||
level: execution
|
||||
limitations: [운영체제와 새 가상환경에서의 설치까지 증명하지는 않음]
|
||||
- id: CMD-003
|
||||
command: python3 .agents/skills/requirement-driven-readme/scripts/init_run.py --repo-id demo --run-id first --mode bootstrap --target-repository /path/to/repository --tool-adapter codex
|
||||
cwd: .
|
||||
source:
|
||||
path: .agents/skills/requirement-driven-readme/scripts/init_run.py
|
||||
verification:
|
||||
status: static-verified
|
||||
method: python script path exists
|
||||
- id: CMD-004
|
||||
command: python3 .agents/skills/requirement-driven-readme/scripts/run_bootstrap.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
cwd: .
|
||||
source:
|
||||
path: .agents/skills/requirement-driven-readme/scripts/run_bootstrap.py
|
||||
verification:
|
||||
status: static-verified
|
||||
method: python script path exists
|
||||
- id: CMD-005
|
||||
command: python3 .agents/skills/requirement-driven-readme/scripts/generate_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
cwd: .
|
||||
source:
|
||||
path: .agents/skills/requirement-driven-readme/scripts/generate_patch.py
|
||||
verification:
|
||||
status: static-verified
|
||||
method: python script path exists
|
||||
- id: CMD-006
|
||||
command: python3 .agents/skills/requirement-driven-readme/scripts/apply_patch.py --run-dir runs/demo/first --repo /path/to/repository
|
||||
cwd: .
|
||||
source:
|
||||
path: .agents/skills/requirement-driven-readme/scripts/apply_patch.py
|
||||
verification:
|
||||
status: static-verified
|
||||
method: python script path exists
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"git-sha": "636617ccd9f20440f21339f808557c096b55fec2",
|
||||
"dirty": true,
|
||||
"diff-hash": "sha256:8ea3e3693ce644a2576f9a8670088a36e5964ac8edaca5b279f7281e44aa428b",
|
||||
"scanned-at": null,
|
||||
"file-count": 228
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
schema-version: 1
|
||||
verdict: PASS
|
||||
score: 90
|
||||
scores:
|
||||
project-specificity:
|
||||
score: 5
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: overview
|
||||
line-start: 12
|
||||
line-end: 26
|
||||
content-hash: sha256:e6881327a3a749eecb74b02636fbc9c3d254ce9b952896f59c7093d0d89e2799
|
||||
observation: 주 독자를 README 작성·갱신 개발자로 명시하고 네 모드와 근거·적용 경계, 런타임 동등성 한계를 프로젝트 고유 특성으로 설명한다.
|
||||
reader-journey:
|
||||
score: 5
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: overview
|
||||
line-start: 12
|
||||
line-end: 26
|
||||
content-hash: sha256:e6881327a3a749eecb74b02636fbc9c3d254ce9b952896f59c7093d0d89e2799
|
||||
observation: 대상 독자, 제공 결과, 핵심 안전 경계와 구현 한계가 첫 개요에 모여 있어 후속 과업을 빠르게 판단할 수 있다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: usage
|
||||
line-start: 84
|
||||
line-end: 95
|
||||
content-hash: sha256:1cb56273e71777d93e55ce3eee23094d33f4d6d66b8e56d5f57b842107c8857a
|
||||
observation: 네 모드를 새 작성, 감사, 보존 갱신, 부분 갱신이라는 독자 작업과 결과 기준으로 바로 선택할 수 있다.
|
||||
technical-explanation:
|
||||
score: 4
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: architecture
|
||||
line-start: 135
|
||||
line-end: 166
|
||||
content-hash: sha256:f39304dc61c0a017a37676b2077d572aaf9c8bd78b24ae51eb125762d41ef623
|
||||
observation: 사용자 요구와 저장소 근거가 계획, 작성, 시각 자료, 결정론적 검사, 독립 심사와 재작업으로 이어지는 책임과 흐름을 설명한다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: safeguards
|
||||
line-start: 168
|
||||
line-end: 186
|
||||
content-hash: sha256:f4aeba8e1e5aae86600fc4f2c70f10da1b67120222cf8c45912b88e9882fc509
|
||||
observation: 용어·시각 자료·품질 근거·갱신 보호에 해당하는 검증 책임과 차단 조건을 구체적인 계약으로 구분한다.
|
||||
task-usability:
|
||||
score: 4
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: installation
|
||||
line-start: 28
|
||||
line-end: 42
|
||||
content-hash: sha256:0854377cd971afc6408b317ba1308f319f8a2025bef86dfac262ab253e999565
|
||||
observation: 전제조건, 복사 가능한 설치 명령과 새 가상환경에서의 미검증 범위를 함께 밝혀 설치 판단이 가능하다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: quick-start
|
||||
line-start: 44
|
||||
line-end: 82
|
||||
content-hash: sha256:ee017689603496487003245c0cb4e00a7be4ac3a0eec8921a5edb111da68d78b
|
||||
observation: 테스트 성공 기준, 모델 기반 작성 경계, 준비 산출물과 초기화·검증 명령을 순서대로 제시한다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: api
|
||||
line-start: 97
|
||||
line-end: 133
|
||||
content-hash: sha256:86cc70fd60e94877c1de9c3db099c67df7b18adedfebff01dc84217329d11fa0
|
||||
observation: 입력, 주요 산출물, 패치 준비와 명시적 적용 명령을 분리해 검토 후 작업을 안전하게 수행할 수 있다.
|
||||
prose-clarity:
|
||||
score: 4
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: installation
|
||||
line-start: 28
|
||||
line-end: 42
|
||||
content-hash: sha256:0854377cd971afc6408b317ba1308f319f8a2025bef86dfac262ab253e999565
|
||||
observation: 런타임과 패키지 식별자를 인라인 코드로 구별하고 전제조건과 검증 한계를 직접적인 한국어로 설명한다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: quick-start
|
||||
line-start: 44
|
||||
line-end: 82
|
||||
content-hash: sha256:ee017689603496487003245c0cb4e00a7be4ac3a0eec8921a5edb111da68d78b
|
||||
observation: 독립 실행 도구가 아니라는 제한과 독자가 요청할 행동을 먼저 밝히며 기술 식별자는 인라인 코드로 구별한다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: safeguards
|
||||
line-start: 168
|
||||
line-end: 186
|
||||
content-hash: sha256:f4aeba8e1e5aae86600fc4f2c70f10da1b67120222cf8c45912b88e9882fc509
|
||||
observation: 반복 종결 경고는 있으나 항목 구조와 구체적인 현재형 동사가 함께 쓰여 이해를 방해하지 않는다.
|
||||
visual-judgment:
|
||||
score: 5
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: architecture
|
||||
line-start: 135
|
||||
line-end: 166
|
||||
content-hash: sha256:f39304dc61c0a017a37676b2077d572aaf9c8bd78b24ae51eb125762d41ef623
|
||||
observation: 단일 Mermaid 흐름도가 두 입력의 결합, 작성과 그림의 합류, 독립 심사, 재작업과 명시적 적용을 한 화면에 보여 준다.
|
||||
hard-gates:
|
||||
passed: true
|
||||
failures: []
|
||||
reader-simulations:
|
||||
30-seconds:
|
||||
outcome: PASS
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: overview
|
||||
line-start: 12
|
||||
line-end: 26
|
||||
content-hash: sha256:e6881327a3a749eecb74b02636fbc9c3d254ce9b952896f59c7093d0d89e2799
|
||||
observation: 도구의 정체성, 안전 목적과 README를 작성·갱신하는 개발자라는 대상을 모두 확인할 수 있다.
|
||||
5-minutes:
|
||||
outcome: PASS
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: quick-start
|
||||
line-start: 44
|
||||
line-end: 82
|
||||
content-hash: sha256:ee017689603496487003245c0cb4e00a7be4ac3a0eec8921a5edb111da68d78b
|
||||
observation: 테스트 성공 기준, 모델 기반 작성 요청, 준비 산출물, 초기화와 결정론적 게이트 재생 순서를 확인할 수 있다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: architecture
|
||||
line-start: 135
|
||||
line-end: 166
|
||||
content-hash: sha256:f39304dc61c0a017a37676b2077d572aaf9c8bd78b24ae51eb125762d41ef623
|
||||
observation: 요구와 근거가 작성·검사·독립 심사·재작업·적용으로 이어지는 전체 구조를 한 화면에서 식별할 수 있다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: limitations
|
||||
line-start: 214
|
||||
line-end: 224
|
||||
content-hash: sha256:10ae2331d6b1858e08b4affefc718b064393da0947295bf78246e4f6eb6c2038
|
||||
observation: 모델 작성 의존성, 도구 간 동등성 미검증, 정적 명령 검증과 미실행 품질 벤치마크를 현재 한계로 구분한다.
|
||||
contributor:
|
||||
outcome: PASS
|
||||
evidence:
|
||||
- artifact: README.candidate.md
|
||||
section-id: tests
|
||||
line-start: 188
|
||||
line-end: 199
|
||||
content-hash: sha256:7eb8e5a521f7d6a821377078e40f288a27fd197437a9bd25922013f5a11bc927
|
||||
observation: 전체 테스트 명령, CI 환경과 자체 README 계약 범위를 기여 전에 확인할 수 있다.
|
||||
- artifact: README.candidate.md
|
||||
section-id: documentation
|
||||
line-start: 201
|
||||
line-end: 212
|
||||
content-hash: sha256:97129977e42c81be1ff70cdfa2402147fed9366468c0e39dc48ba71b1c0259b2
|
||||
observation: 구현·규칙·테스트 위치를 구분하고 아키텍처·상태기계·계측·벤치마크 상세 문서로 이동할 수 있다.
|
||||
findings: []
|
||||
@@ -0,0 +1,22 @@
|
||||
# README quality review
|
||||
|
||||
Verdict: **PASS** — 90/100
|
||||
|
||||
## Dimension scores
|
||||
|
||||
- project-specificity: 5/5
|
||||
- reader-journey: 5/5
|
||||
- technical-explanation: 4/5
|
||||
- task-usability: 4/5
|
||||
- prose-clarity: 4/5
|
||||
- visual-judgment: 5/5
|
||||
|
||||
## Reader simulations
|
||||
|
||||
- 30-seconds: PASS
|
||||
- 5-minutes: PASS
|
||||
- contributor: PASS
|
||||
|
||||
## Findings
|
||||
|
||||
No findings.
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"run-id": "20260720-review-remediation",
|
||||
"repo-id": "readme-harness",
|
||||
"mode": "bootstrap",
|
||||
"target-repository": "/home/donghyeon/workspace/ai-tool/readme-harness",
|
||||
"harness-version": "0.1.0",
|
||||
"started-at": null,
|
||||
"tool-adapter": "codex",
|
||||
"input-hashes": {},
|
||||
"usage": {}
|
||||
}
|
||||
@@ -0,0 +1,347 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"mode": "bootstrap",
|
||||
"current": "APPLIED",
|
||||
"history": [
|
||||
{
|
||||
"state": "INITIALIZED"
|
||||
},
|
||||
{
|
||||
"state": "INPUT_CAPTURED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "request",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "REPOSITORY_SNAPSHOTTED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "snapshot",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"diff-hash": "sha256:8ea3e3693ce644a2576f9a8670088a36e5964ac8edaca5b279f7281e44aa428b"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "FACTS_EXTRACTED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "facts",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"fact_ids": [
|
||||
"F-PROJECT-001",
|
||||
"F-RUNTIME-001",
|
||||
"F-DEPENDENCY-001",
|
||||
"F-MODE-001",
|
||||
"F-TOOL-001",
|
||||
"F-STATE-001",
|
||||
"F-VISUAL-001",
|
||||
"F-DRIVER-001",
|
||||
"F-AUTHORING-001",
|
||||
"F-TERM-001",
|
||||
"F-CLASSIFY-001",
|
||||
"F-REVIEW-001",
|
||||
"F-AUDIT-001",
|
||||
"F-APPLY-001",
|
||||
"F-MERGE-001",
|
||||
"F-LAYOUT-001",
|
||||
"F-ARTIFACT-001",
|
||||
"F-SELF-README-001",
|
||||
"F-CI-001",
|
||||
"F-USAGE-001",
|
||||
"F-BENCH-001",
|
||||
"F-LIMIT-001"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "PROJECT_PROFILED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "profile",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"profile": "library"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "README_PLANNED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "brief",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
},
|
||||
{
|
||||
"name": "outline",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"section_ids": [
|
||||
"overview",
|
||||
"installation",
|
||||
"quick-start",
|
||||
"usage",
|
||||
"api",
|
||||
"architecture",
|
||||
"safeguards",
|
||||
"tests",
|
||||
"documentation",
|
||||
"limitations"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "README_DRAFTED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "conformance",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"sections": [
|
||||
"overview",
|
||||
"installation",
|
||||
"quick-start",
|
||||
"usage",
|
||||
"api",
|
||||
"architecture",
|
||||
"safeguards",
|
||||
"tests",
|
||||
"documentation",
|
||||
"limitations"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "claim_map",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"claims": [
|
||||
"C-PROJECT-001",
|
||||
"C-MODE-001",
|
||||
"C-SAFETY-SUMMARY-001",
|
||||
"C-LIMIT-001",
|
||||
"C-RUNTIME-001",
|
||||
"C-INSTALL-001",
|
||||
"C-TEST-COMMAND-001",
|
||||
"C-AUTHORING-001",
|
||||
"C-INIT-001",
|
||||
"C-BOOTSTRAP-001",
|
||||
"C-USAGE-001",
|
||||
"C-INPUT-001",
|
||||
"C-USAGE-METRICS-001",
|
||||
"C-PREPARE-001",
|
||||
"C-APPLY-001",
|
||||
"C-FLOW-001",
|
||||
"C-TERM-001",
|
||||
"C-VISUAL-001",
|
||||
"C-REVIEW-001",
|
||||
"C-AUDIT-001",
|
||||
"C-MERGE-001",
|
||||
"C-APPLY-SAFETY-001",
|
||||
"C-CI-001",
|
||||
"C-LAYOUT-001",
|
||||
"C-LIMIT-002",
|
||||
"C-VERIFY-LIMIT-001",
|
||||
"C-BENCH-LIMIT-001"
|
||||
],
|
||||
"derived-statements": {
|
||||
"C-PROJECT-001": "이 하네스는 저장소의 실제 코드와 사용 목적을 바탕으로 문서 후보를 만들고,\n명령·경로·근거를 검사한 뒤 검토 가능한 패치로 제공합니다.",
|
||||
"C-MODE-001": "`bootstrap`, `audit`, `refresh`, `section-update` 네 모드를 구현했습니다.",
|
||||
"C-SAFETY-SUMMARY-001": "저장소 근거와 사용자 요구를 분리해 읽고, 고위험 사실을 근거에 연결합니다. 그림을\n넣기로 했다면 실제 소스나 자산까지 확인하고, 품질 심사는 원문의 줄과 해시에 묶인\n근거를 사용합니다. 패치 준비가 끝나도 대상 `README.md`는 자동으로 바뀌지 않습니다.",
|
||||
"C-LIMIT-001": "결정론적 Codex 경로는 구현됐습니다. 후보 문장 작성은 모델 파이프라인이 담당하며,\n다른 도구와의 런타임 동등성은 Phase 4 검증 전까지 보장하지 않습니다.",
|
||||
"C-RUNTIME-001": "`Python` 3.12 이상이 필요합니다.\n런타임 의존성은 `jsonschema`와 `PyYAML`입니다.\n개발 의존성은 `pytest`입니다.",
|
||||
"C-INSTALL-001": "이 설치 명령은 프로젝트 선언에서 확인했지만, 현재 작업에서는 새 가상환경 설치까지\n실행해 증명하지 않았습니다.",
|
||||
"C-TEST-COMMAND-001": "자체 README 테스트는 이 명령을 최소 실행 경로로 요구합니다. 다른 운영체제와 새\n가상환경의 동일한 결과까지 보장하는 계약은 아닙니다.",
|
||||
"C-AUTHORING-001": "이 프로젝트는 명령 하나로 문서를 완성하는 독립 실행 도구가 아닙니다. Codex 작업 공간에서\n`requirement-driven-readme` 스킬로 대상 저장소의 `bootstrap` 실행을 요청하면 작성\n역할이 사용자 요구, 저장소 근거, 개요, 후보, 주장 지도, 그림 계획과 품질 심사\n산출물을 준비합니다.",
|
||||
"C-INIT-001": "이 명령은 `runs/demo/first`에 상태와 실행 매니페스트를 초기화합니다.",
|
||||
"C-BOOTSTRAP-001": "드라이버는 후보를 새로 쓰지 않고 준비된 산출물을 `QUALITY_REVIEWED`까지\n검증합니다.",
|
||||
"C-USAGE-001": "네 모드는 요청 스키마에 선언되어 있고 각 흐름의 상태·게이트 계약이 구현되어\n있습니다.",
|
||||
"C-INPUT-001": "`readme-request.yaml`은 독자, 언어, 길이, 보존 범위, 공개 용어, 그림 정책을\n정합니다. 기술 사실은 `repository-facts.yaml`에 저장하고, 각 실행은\n`runs/<repo-id>/<run-id>` 아래에서 격리합니다.",
|
||||
"C-USAGE-METRICS-001": "어댑터가 제공하는 단계별 모델 사용량은 실행 매니페스트에 누적합니다. 제공되지\n않은 값은 0으로 추정하지 않습니다.",
|
||||
"C-PREPARE-001": "이 단계는 `README.generated.md`, `README.patch`, `apply-manifest.yaml`을 만들고\n상태를 `READY_FOR_APPLY`로 전진시킵니다.",
|
||||
"C-APPLY-001": "적용 직전에 후보·저장소·대상 README 해시와 경로 경계를 다시 검사합니다.",
|
||||
"C-FLOW-001": "사용자 요구는 독자 흐름과 공개 용어, 그림 결정을 만듭니다. 대상 저장소에서는\n근거와 프로젝트 유형을 수집합니다. 두 입력이 합쳐진 후보와 시각 자료는 결정론적\n게이트와 독립 품질 심사를 통과해야 패치가 됩니다.",
|
||||
"C-TERM-001": "- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.\n- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을\n 차단합니다.",
|
||||
"C-VISUAL-001": "- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.\n- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을\n 차단합니다. <!-- claim-id: C-TERM-001 -->\n- 그림을 포함하기로 한 개요 결정, 계획 항목, README 마커, 생성 소스나 자산이\n 일치해야 시각 자료 게이트를 통과합니다.",
|
||||
"C-REVIEW-001": "- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.\n- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을\n 차단합니다. <!-- claim-id: C-TERM-001 -->\n- 그림을 포함하기로 한 개요 결정, 계획 항목, README 마커, 생성 소스나 자산이\n 일치해야 시각 자료 게이트를 통과합니다. <!-- claim-id: C-VISUAL-001 -->\n- 품질 점수와 독자 과업 근거의 줄 범위와 해시를 실제 후보에 대조하고,\n `review.md`는 검증된 YAML에서 렌더링합니다.",
|
||||
"C-AUDIT-001": "- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.\n- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을\n 차단합니다. <!-- claim-id: C-TERM-001 -->\n- 그림을 포함하기로 한 개요 결정, 계획 항목, README 마커, 생성 소스나 자산이\n 일치해야 시각 자료 게이트를 통과합니다. <!-- claim-id: C-VISUAL-001 -->\n- 품질 점수와 독자 과업 근거의 줄 범위와 해시를 실제 후보에 대조하고,\n `review.md`는 검증된 YAML에서 렌더링합니다. <!-- claim-id: C-REVIEW-001 -->\n- 감사 모드는 결과 스키마를 확인하고 산출물을 원자적으로 기록한 다음 완료 상태로\n 전진합니다.",
|
||||
"C-MERGE-001": "- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.\n- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을\n 차단합니다. <!-- claim-id: C-TERM-001 -->\n- 그림을 포함하기로 한 개요 결정, 계획 항목, README 마커, 생성 소스나 자산이\n 일치해야 시각 자료 게이트를 통과합니다. <!-- claim-id: C-VISUAL-001 -->\n- 품질 점수와 독자 과업 근거의 줄 범위와 해시를 실제 후보에 대조하고,\n `review.md`는 검증된 YAML에서 렌더링합니다. <!-- claim-id: C-REVIEW-001 -->\n- 감사 모드는 결과 스키마를 확인하고 산출물을 원자적으로 기록한 다음 완료 상태로\n 전진합니다. <!-- claim-id: C-AUDIT-001 -->\n- 갱신 모드는 보호 영역과 마커 밖 문장을 보존하며, 사람이 고친 관리 영역과 새\n 후보가 충돌하면 자동 적용을 막습니다.",
|
||||
"C-APPLY-SAFETY-001": "- 명령·버전·전제조건·모듈·경로·보장·한계 주장은 저장소 근거에 연결합니다.\n- 인라인 코드의 영문 표현이 실제 식별자인지 확인하고 내부 전용 용어의 공개 노출을\n 차단합니다. <!-- claim-id: C-TERM-001 -->\n- 그림을 포함하기로 한 개요 결정, 계획 항목, README 마커, 생성 소스나 자산이\n 일치해야 시각 자료 게이트를 통과합니다. <!-- claim-id: C-VISUAL-001 -->\n- 품질 점수와 독자 과업 근거의 줄 범위와 해시를 실제 후보에 대조하고,\n `review.md`는 검증된 YAML에서 렌더링합니다. <!-- claim-id: C-REVIEW-001 -->\n- 감사 모드는 결과 스키마를 확인하고 산출물을 원자적으로 기록한 다음 완료 상태로\n 전진합니다. <!-- claim-id: C-AUDIT-001 -->\n- 갱신 모드는 보호 영역과 마커 밖 문장을 보존하며, 사람이 고친 관리 영역과 새\n 후보가 충돌하면 자동 적용을 막습니다. <!-- claim-id: C-MERGE-001 -->\n- 비밀 값, 저장소 밖 경로, 오래된 스냅숏, 검토 뒤 바뀐 산출물은 패치 준비나\n 적용을 차단합니다.",
|
||||
"C-CI-001": "GitHub Actions는 의존성을 설치한 뒤 전체 테스트를 실행합니다. 실행 환경은\nPython 3.12입니다. 자체 README 테스트는 라이브러리 프로파일, 30초 독자 흐름, 최소 실행\n경로, Mermaid 그림 결정을 확인합니다.",
|
||||
"C-LAYOUT-001": "주요 구현은 `src/readme_harness`, 스키마·규칙·워크플로는 `.agents`, 테스트는\n`tests`에 있습니다.",
|
||||
"C-LIMIT-002": "- 후보 작성은 LLM 파이프라인의 판단에 의존합니다. 결정론적 드라이버는 준비된\n 산출물을 검증하고 상태를 전진시킵니다.\n- 네 모드의 결정론적 경로는 구현됐지만 도구 간 런타임 동등성은 Phase 4 검증\n 목표입니다.",
|
||||
"C-VERIFY-LIMIT-001": "- 후보 작성은 LLM 파이프라인의 판단에 의존합니다. 결정론적 드라이버는 준비된\n 산출물을 검증하고 상태를 전진시킵니다.\n- 네 모드의 결정론적 경로는 구현됐지만 도구 간 런타임 동등성은 Phase 4 검증\n 목표입니다. <!-- claim-id: C-LIMIT-002 -->\n- 명령 검증 보고서의 기본 수준은 정적 검사입니다. 실행을 별도로 기록하지 않은\n 명령은 실제 실행 성공을 뜻하지 않습니다.",
|
||||
"C-BENCH-LIMIT-001": "- 후보 작성은 LLM 파이프라인의 판단에 의존합니다. 결정론적 드라이버는 준비된\n 산출물을 검증하고 상태를 전진시킵니다.\n- 네 모드의 결정론적 경로는 구현됐지만 도구 간 런타임 동등성은 Phase 4 검증\n 목표입니다. <!-- claim-id: C-LIMIT-002 -->\n- 명령 검증 보고서의 기본 수준은 정적 검사입니다. 실행을 별도로 기록하지 않은\n 명령은 실제 실행 성공을 뜻하지 않습니다. <!-- claim-id: C-VERIFY-LIMIT-001 -->\n- 여덟 저장소 유형의 블라인드 비교 계약은 마련했지만 결과 상태는 아직 `not-run`입니다.\n `PASS` 결과 전에는 품질 우월성을 주장하지 않습니다."
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "VISUALS_PLANNED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "visual_plan",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"visuals": [
|
||||
"harness-flow"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "STRUCTURALLY_VALIDATED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "github_markdown",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
},
|
||||
{
|
||||
"name": "reader_prose",
|
||||
"ok": true,
|
||||
"warnings": [
|
||||
"KO-REPEATED-ENDING line 4: 같은 문장 종결이 이어져 설명이 기계적으로 들릴 수 있습니다."
|
||||
],
|
||||
"data": {
|
||||
"schema-version": 1,
|
||||
"policy-id": "korean-reader-prose-v1",
|
||||
"language": "ko-KR",
|
||||
"applicable": true,
|
||||
"scope": "candidate",
|
||||
"state": "PASS_WITH_WARNINGS",
|
||||
"summary": {
|
||||
"errors": 0,
|
||||
"warnings": 1,
|
||||
"sentences": 108,
|
||||
"prose-characters": 2081,
|
||||
"hangul-characters": 1839
|
||||
},
|
||||
"findings": [
|
||||
{
|
||||
"rule-id": "KO-REPEATED-ENDING",
|
||||
"severity": "warning",
|
||||
"line": 4,
|
||||
"section": "README Harness",
|
||||
"region-kind": "candidate",
|
||||
"excerpt": "합니다 (29/43문장)",
|
||||
"message": "같은 문장 종결이 이어져 설명이 기계적으로 들릴 수 있습니다.",
|
||||
"suggestion": "정의, 절차, 제한에 맞춰 현재형 동사와 명사형 표제를 섞어 쓰세요.",
|
||||
"source-ids": [
|
||||
"NIKL-EASY-PUBLIC-LANGUAGE"
|
||||
],
|
||||
"id": "P-001"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "TECHNICALLY_VERIFIED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "verify",
|
||||
"ok": true,
|
||||
"warnings": [
|
||||
"manual verification required: python3 -m pip install -e \".[dev]\" (unsupported-static-verifier)",
|
||||
"manual verification required: python3 -m pytest -q (unsupported-static-verifier)"
|
||||
],
|
||||
"data": {
|
||||
"schema-version": 1,
|
||||
"state": "PASS_WITH_MANUAL",
|
||||
"verification-level": "static",
|
||||
"execution-verified": false,
|
||||
"checks": {
|
||||
"commands": {
|
||||
"total": 6,
|
||||
"verified": 4,
|
||||
"manual-required": 2,
|
||||
"failed": 0
|
||||
},
|
||||
"paths": {
|
||||
"total": 9,
|
||||
"verified": 9,
|
||||
"failed": 0
|
||||
},
|
||||
"anchors": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
},
|
||||
"readme-contracts": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
}
|
||||
},
|
||||
"failures": [],
|
||||
"limitations": [
|
||||
"manual verification required: python3 -m pip install -e \".[dev]\" (unsupported-static-verifier)",
|
||||
"manual verification required: python3 -m pytest -q (unsupported-static-verifier)"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "secret_scan",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "QUALITY_REVIEWED",
|
||||
"gates": [
|
||||
{
|
||||
"name": "review",
|
||||
"ok": true,
|
||||
"warnings": [],
|
||||
"data": {
|
||||
"verdict": "PASS",
|
||||
"score": 90,
|
||||
"findings": [],
|
||||
"report-valid": true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"state": "READY_FOR_APPLY",
|
||||
"gates": []
|
||||
},
|
||||
{
|
||||
"state": "APPLIED",
|
||||
"gates": []
|
||||
}
|
||||
],
|
||||
"rework": {
|
||||
"iterations": 0,
|
||||
"findings": {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"schema-version": 1,
|
||||
"state": "PASS_WITH_MANUAL",
|
||||
"verification-level": "static",
|
||||
"execution-verified": false,
|
||||
"checks": {
|
||||
"commands": {
|
||||
"total": 6,
|
||||
"verified": 4,
|
||||
"manual-required": 2,
|
||||
"failed": 0
|
||||
},
|
||||
"paths": {
|
||||
"total": 9,
|
||||
"verified": 9,
|
||||
"failed": 0
|
||||
},
|
||||
"anchors": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
},
|
||||
"readme-contracts": {
|
||||
"total": 0,
|
||||
"verified": 0,
|
||||
"failed": 0
|
||||
}
|
||||
},
|
||||
"failures": [],
|
||||
"limitations": [
|
||||
"manual verification required: python3 -m pip install -e \".[dev]\" (unsupported-static-verifier)",
|
||||
"manual verification required: python3 -m pytest -q (unsupported-static-verifier)"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
schema-version: 1
|
||||
visuals:
|
||||
- id: harness-flow
|
||||
section: architecture
|
||||
type: request-flow
|
||||
purpose: 저장소 분석과 사용자 요구가 후보 작성, 그림 생성, 결정론적 게이트, 독립 품질 심사를 거쳐 패치와 명시적 적용으로 이어지는 흐름을 보여준다.
|
||||
placeholder-text: 왼쪽의 두 입력이 계획에서 합쳐지고 작성과 그림이 검증으로 모인 뒤 품질 심사에서 재작업 또는 적용으로 갈라지는 Mermaid 흐름도다.
|
||||
must-show:
|
||||
- 사용자 요구와 대상 저장소라는 두 입력
|
||||
- 독자 흐름·용어·그림 결정과 저장소 근거·프로젝트 분류
|
||||
- README 작성과 그림 소스·자산 생성
|
||||
- 근거·명령·경로·문체 검사와 독립 품질 심사
|
||||
- 수정 필요 시 계획으로 돌아가는 재작업
|
||||
- 통과 후 패치 준비와 명시적 적용
|
||||
- 해시 기반 실행 산출물
|
||||
relationships:
|
||||
- 사용자 요구 -> 독자 흐름·용어·그림 결정
|
||||
- 대상 저장소 -> 근거 수집·프로젝트 분류
|
||||
- 근거 수집·프로젝트 분류 -> 독자 흐름·용어·그림 결정
|
||||
- 계획 -> README 작성
|
||||
- 계획 -> 그림 소스·자산 생성
|
||||
- README 작성 + 그림 -> 결정론적 검사
|
||||
- 결정론적 검사 -> 독립 품질 심사
|
||||
- 독립 품질 심사 -> 계획 (수정 필요)
|
||||
- 독립 품질 심사 -> 패치 준비·명시적 적용 (통과)
|
||||
emphasize:
|
||||
- 의미 판단과 결정론적 검증의 경계를 별도 노드로 나눈다.
|
||||
- 재작업 화살표와 정방향 적용 흐름을 다른 라벨로 구분한다.
|
||||
- 해시 기반 산출물이 분석·계획·검증·적용에 연결됨을 보인다.
|
||||
avoid:
|
||||
- 전체 내부 상태 이름을 노드에 나열하지 않는다.
|
||||
- Claude와 Antigravity 런타임 동등성을 구현 완료처럼 표현하지 않는다.
|
||||
- 자동 적용처럼 보이는 우회 경로를 만들지 않는다.
|
||||
placement:
|
||||
after-section-id: architecture
|
||||
accessibility:
|
||||
alt-text: 사용자 요구와 대상 저장소에서 출발해 계획, README와 그림 작성, 결정론적 검사, 독립 품질 심사를 거친다. 수정이 필요하면 계획으로 돌아가고 통과하면 패치를 준비한 뒤 별도로 적용한다.
|
||||
production:
|
||||
format: mermaid
|
||||
status: embedded
|
||||
Reference in New Issue
Block a user