Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
name: checks

# 결정적 컴포넌트의 회귀를 막는다 — 수치 일관성 검사기(consistency_check.py),
# 감사 가능한 산출물 계약, 공용 지식층 라우팅, 완료 엔진(hooks/boulder.sh), 이중 매니페스트 정체성.
# 감사 가능한 산출물 계약, 공용 지식층 라우팅, 저장소 중복·정본 ID,
# 완료 엔진(hooks/boulder.sh), 이중 매니페스트 정체성.
# 픽스처는 실제 KOICA 종료평가 PDF 334건 스윕에서 관측된 사고·오탐 유형이다.

on:
Expand All @@ -18,7 +19,10 @@ jobs:
steps:
- uses: actions/checkout@v4

- name: Python 회귀 테스트 (수치 검사기 + 감사 산출물 계약 + 지식층)
- name: 저장소 중복 사본·정본 ID 충돌 검사
run: python3 scripts/repository_hygiene_check.py

- name: Python 회귀 테스트 (수치 검사기 + 감사 산출물 계약 + 지식층 + 저장소 위생)
run: python3 -m unittest discover -s tests -v

- name: 완료 엔진(Stop hook) 동작 테스트
Expand Down
3 changes: 3 additions & 0 deletions .repository-hygiene-allow
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# 정확히 의도된 사본형 경로만 한 줄에 하나씩 적는다.
# 예: docs/phase 2.md
# 비워 두는 것이 기본이며, 예외 추가는 코드리뷰에서 정본과의 공존 이유를 설명한다.
12 changes: 7 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
5. **등급 확정·공식 의견·환류 결정은 사람.** 너는 **평가 초안**만.
6. **AI 평가의 한계 명시.** 정성적 영향력·수원국 맥락·정무 판단은 "사람의 판단 필요"로 라벨.
7. **평가윤리.** 조사대상자 익명(이니셜), 평가 독립성.
8. **감사추적(audit trail) 보존.** 반대근거, 같은 사실의 상충 값·상태, 평가 불가, 검증 정정은 점수가 바뀌지 않아도 최종 산출물에 남긴다.
8. **감사추적(audit trail) 보존.** 평정 전에 점수를 좌우하는 원문 표기를 전역 사실 ID `F1`, `F2`…로 구조화한다. 반대근거, 같은 사실의 상충 값·상태, 평가 불가, 검증 정정은 점수가 바뀌지 않아도 최종 산출물에 남긴다.

## KOICA 평가기준 체계 (2024 — DAC 6대 + 범분야)

Expand Down Expand Up @@ -57,26 +57,28 @@

사용자가 평가 대상을 주며 평가를 요청하면:

1. **자료 확인 + 사업유형 판별** — 대상을 읽고 범위를 파악한다. 문서명·버전·작성일을 기록하고, 핵심 지표·횟수·사업기간·예산·완료/하자 상태의 반복 표기를 원문 전체에서 검색해 지표명·단위·분모·기간·집계규칙·상태기준일로 비교한다.
1. **자료 확인 + 원문 사실대장 작성 + 사업유형 판별** — 대상을 읽고 범위를 파악한다. 문서명·버전·작성일을 기록하고, 핵심 지표·횟수·사업기간·예산·수량·완료/하자 상태의 반복 표기를 원문 전체에서 검색한다. `templates/auditable-evaluation-brief-template.md`의 원문 사실대장에 한 표기당 한 행을 쓰고, 같은 판단대상·지표·목표/실적 역할에는 같은 `F1`, `F2`…를 반복한다. 값·상태·단위·분모·대상·기준기간·집계규칙·상태기준일·문서버전·원문 위치를 채우며, 비교축이 다르면 근거 있는 `설명됨: …` 또는 `[상충: Xn]`으로 분류한다. 파일 작업본이면 평정 전에 `python3 scripts/auditable_output_check.py --ledger-only <브리프>`를 통과시킨다.
2. **기준별 순차·독립 평정** — 적절성 → 일관성 → 효과성 → 효율성 → 지속가능성을 **하나씩** 평가한다.
- 각 기준: 그 기준의 핵심질문에 보고서 근거를 대조해 **1~4점(또는 "평가 불가")** + 지지근거 원문 위치 + 반대·제약근거 + 근거 상태 + 인접 점수가 아닌 이유.
- 각 기준: 그 기준의 핵심질문에 보고서 근거를 대조해 **1~4점(또는 "평가 불가")** + `[사실: Fn]` + 지지근거 원문 위치 + 반대·제약근거 + 근거 상태 + 인접 점수가 아닌 이유.
- 같은 사실의 값·단위·횟수·기간·완료 상태가 다르면 임시 상충 ID를 붙여 양쪽 위치를 남기고 유리한 값을 택하지 않는다.
- 각 핵심 근거에 대해 질문 정합성, 측정 적합성, 비교·시점, 대표성, 대안설명, 원출처 추적을 점검한다. 방법론 점검은 별도 점수가 아니라 공식 루브릭 적용 전의 **근거 게이트**다.
- **다른 기준의 점수에 끌려가지 마라.** 한 기준씩 그 근거만으로. (예: 효과성이 좋아도 지속가능성은 지속가능성 근거로만.)
- 근거 없으면 그 기준은 **"평가 불가"**(지어내기 금지).
- **영향력(Impact)이 관련되면** 위 5기준과 별도로 **사후평가 관점의 영향력 초안**(장기·전환적 효과, 근거 기반, 인과 단정 금지)을 산출하되 **20점 종합에는 합산하지 않는다**(별도 보고). 인과효과 방법론 심사가 필요하면 아래 영향평가 검토로.
3. **자기 검증** — 각 점수가 인용 근거와 정합하는지 재확인하고, 점수를 좌우하는 핵심 사실의 반복 표기를 독립 재검색한다. 상충 후보를 중복 제거해 전역 `X1`, `X2`…로 바꾸고 값 A/B·위치·해결 상태·점수 영향을 기록한다. 점수-근거 괴리를 교정하고 검증 전/후 점수를 남긴다.
3. **자기 검증** — 각 점수가 인용 근거와 정합하는지 재확인하고, 점수를 좌우하는 핵심 사실의 반복 표기를 독립 재검색한다. 사실대장에서 같은 사실의 F-ID·행 단위·필수 비교축·위치와 대조 판정을 점검하고, 누락 표기는 기존 F-ID에 추가하되 기존 ID를 재번호화하지 않는다. 상충 후보를 중복 제거해 전역 `X1`, `X2`…로 바꾸고 사실 ID·값 A/B·위치·해결 상태·점수 영향을 기록한다. 점수-근거 괴리를 교정하고 검증 전/후 점수를 남긴다.
4. **종합점수 산정** —
- **검증 후 점수만** 합산한다. 미해결 중대 상충이 점수를 바꿀 수 있으면 가능한 범위·등급 민감도를 제시하거나 산정을 보류한다.
- 표준 5기준: 합산 20점 → 위 A~F 표.
- **⚠️ 평가 불가 기준이 있으면 종합점수를 단정하지 마라.** "N개 평가 가능 / M개 근거 부족" 명시, 종합은 단서부 잠정 또는 보류.
- 서술-등급 괴리 점검.
5. **사람 인계** — `templates/auditable-evaluation-brief-template.md` 구조로 **감사 가능한 평가 브리프**를 작성한다. 평가 범위·방법, 검증 전후 점수, 기준별 상세 근거·반대근거, 상충·불일치 등록부, 평가 불가·미확인, 검증 정정·재산정, 결론 연계 제언, 한계·사람 판단을 모두 포함한다. 종합점수와 한 단락 근거만 있는 요약은 완료가 아니다. 파일로 작성했으면 `python3 scripts/auditable_output_check.py <브리프>`와 `python3 scripts/consistency_check.py <브리프> --mode project`를 통과시킨다. 끝에 "최종 등급은 평가담당관이 확정"이라고 명시.
5. **사람 인계** — `templates/auditable-evaluation-brief-template.md` 구조로 **감사 가능한 평가 브리프**를 작성한다. 평가 범위·방법, 원문 사실대장, 검증 전후 점수, `[사실: Fn]` 기준별 상세 근거·반대근거, F/X-ID가 연결된 상충·불일치 등록부, 평가 불가·미확인, 검증 정정·재산정, 결론 연계 제언, 한계·사람 판단을 모두 포함한다. 종합점수와 한 단락 근거만 있는 요약은 완료가 아니다. 파일로 작성했으면 `python3 scripts/auditable_output_check.py <브리프>`와 `python3 scripts/consistency_check.py <브리프> --mode project`를 통과시킨다. 끝에 "최종 등급은 평가담당관이 확정"이라고 명시.

## 기본 산출물 계약 — 중대 상충을 숨기지 않는다

**중대 상충**은 어느 값을 채택하느냐에 따라 사실판단, 달성 여부, 품질·안전·하자 상태, 기간·비용, 기준 점수, 종합등급 또는 제언이 달라질 수 있는 불일치다. 단위·기준일 차이로 설명될 가능성이 있어도 실제 대조 전에는 상충 후보로 둔다. 최종 상세 평정의 영향받는 문장에는 `[상충: X1]`을 달고 **상충·불일치 등록부**의 같은 ID로 연결한다. 상충이 점수를 바꾸지 않아도 영향 없음의 이유와 함께 남긴다.

원문 사실대장은 상충 등록부와 다르다. 사실대장은 상충 여부와 무관하게 점수를 좌우하는 원문 표기를 행 단위로 보존하고, 상충 등록부는 그중 설명되지 않은 차이의 판단과 영향을 기록한다. 최종 상세 평정의 사실 주장에는 `[사실: F1]`을 달아 대장과 연결한다.

사용자가 명시적으로 요약만 요구해도 모든 중대 상충, 평가 불가, 검증 정정, 사람 확정 게이트는 생략하지 않는다.

## 외부 증거 보강 (선택 — MCP)
Expand Down
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@ each slice below is recorded as a 0.x milestone.

## [Unreleased]

### Added
- **Source-fact ledger before scoring** — `deveval:evaluate` now records one
row per score-critical source occurrence under stable `F` IDs and runs an
early `--ledger-only` gate. Differences in value/status, unit, denominator,
period, aggregation rule, or as-of date require a supported explanation or a
linked conflict ID; final briefs cross-check `F` IDs across the ledger,
detailed ratings, and conflict register.
- **Repository hygiene CI** — checks now reject copy-suffixed files and
directories when a canonical sibling exists, portable case/NFC path
collisions, and duplicate or path-mismatched agent/skill identities. An
exact-path allowlist documents the rare intentional suffix-shaped name.

## [0.12.0] — 2026-08-05 — Auditable briefs & normative criteria cleanup

### Changed
Expand Down
12 changes: 11 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@ evaluation. Contributions of all sizes are welcome.
anonymization principles intact (see [`docs/do-no-harm.md`](docs/do-no-harm.md)).
4. **Keep it model-agnostic.** Avoid hard dependencies on any single proprietary
LLM or harness. If a change assumes one, note how it degrades/adapts on others.
5. **Keep canonical plugin identities unique.** An agent's frontmatter `name`
must exactly match its `agents/<name>.md` filename; a skill's `name` must
exactly match its `skills/<name>/` directory. Do not commit operating-system
or sync-tool copies such as `file 2.md`, `file copy.md`, or `file (1).md`
alongside their canonical sibling. If a suffix-shaped path is genuinely
intentional, add its exact repository-relative path to
`.repository-hygiene-allow` and explain the exception in review.

## Process / 절차

Expand All @@ -43,7 +50,10 @@ evaluation. Contributions of all sizes are welcome.
same PR — the `mirror-sync` check enforces this, and a deliberately
one-sided PR needs the `mirror-sync-exempt` label. Run it yourself with
`bash scripts/check-mirror-sync.sh` (or `--audit` for the whole repo).
4. Open a pull request with a clear description and, for methodology changes, the
4. Run the deterministic regression and repository-hygiene checks:
`python3 -m unittest discover -s tests -v` and
`python3 scripts/repository_hygiene_check.py`.
5. Open a pull request with a clear description and, for methodology changes, the
supporting citation.

## Licensing of contributions / 기여물 라이선스
Expand Down
5 changes: 3 additions & 2 deletions agents/narrative-verifier.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ model: inherit
- 상관·사전사후 변화·자기보고를 인과효과로 과장하지 않았는가.
- 발견사항에서 결론, 결론에서 제언이 실제로 이어지는가.
- 표본·편향·결측·대안설명·평가 불가 항목이 요약에서 사라지지 않았는가.
- 평가 브리프의 **모든 원문 사실대장 행과 F-ID**가 첨부에 보존되고, 점수를 좌우하는 요약·본문 주장이 같은 `[사실: Fn]`을 인용하는가. 보고서 작성 과정에서 행을 합치거나 F-ID를 재번호화하지 않았는가.
- 평가 브리프의 **모든 중대 상충 ID, 값 A/B, 해결 상태, 점수 영향과 검증 정정 전후**가 보고서 요약·해당 기준 본문·첨부에 보존됐는가. 미해결 상충이 해소된 사실처럼 합쳐지지 않았는가.

## 절대 규칙
Expand All @@ -60,8 +61,8 @@ model: inherit
|-------------------|-----------|-----------|----------------|

### (D) 감사추적 보존
| 상충·정정 ID | 평가 브리프의 내용 | 보고서 위치·표현 | 보존 여부·누락 영향 |
|--------------|--------------------|------------------|---------------------|
| 사실·상충·정정 ID | 평가 브리프의 내용 | 보고서 위치·표현 | 보존 여부·누락 영향 |
|-------------------|--------------------|------------------|---------------------|

### 반려/정정 요청
- (출처 없는 서술, 불일치 항목별 구체적 정정)
Expand Down
Loading
Loading