Skip to content
Merged
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
20 changes: 20 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "deveval-agents",
"interface": {
"displayName": "DevEval Agents"
},
"plugins": [
{
"name": "deveval",
"source": {
"source": "local",
"path": "./"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Education & Research"
}
]
}
3 changes: 1 addition & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,11 @@
"name": "deveval",
"source": "./",
"description": "KOICA/OECD-DAC 기준 ODA 사업평가 보조 에이전트팀 — 기준별 병렬 평정, 평가보고서 품질심사, 영향평가 방법론 검토, 근거 기반 보고서 작성.",
"version": "0.9.0",
"author": {
"name": "Wooyoung Kim",
"url": "https://github.com/amnotyoung"
},
"license": "MIT",
"license": "MIT AND CC-BY-4.0",
"keywords": ["oda", "evaluation", "koica", "oecd-dac", "digital-public-good"]
}
]
Expand Down
6 changes: 4 additions & 2 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "deveval",
"displayName": "DevEval Agents",
"description": "KOICA/OECD-DAC 기준 ODA 사업평가 보조 에이전트팀 — 기준별 병렬 평정, 평가보고서 품질심사, 영향평가 방법론 검토, 근거 기반 보고서 작성. 근거 없으면 등급 없음·최종 확정은 사람.",
"version": "0.9.0",
"version": "0.10.0",
"author": {
"name": "Wooyoung Kim",
"url": "https://github.com/amnotyoung"
},
"homepage": "https://github.com/amnotyoung/dev-eval-agents",
"repository": "https://github.com/amnotyoung/dev-eval-agents",
"license": "MIT",
"license": "MIT AND CC-BY-4.0",
"keywords": [
"oda",
"evaluation",
Expand Down
44 changes: 44 additions & 0 deletions .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"name": "deveval",
"version": "0.10.0",
"description": "KOICA/OECD-DAC 기준 ODA 사업평가, 평가보고서 품질심사, 영향평가 방법론 검토를 위한 근거 기반 워크플로.",
"author": {
"name": "Wooyoung Kim",
"url": "https://github.com/amnotyoung"
},
"homepage": "https://github.com/amnotyoung/dev-eval-agents",
"repository": "https://github.com/amnotyoung/dev-eval-agents",
"license": "MIT AND CC-BY-4.0",
"keywords": [
"oda",
"evaluation",
"koica",
"oecd-dac",
"development-cooperation",
"digital-public-good"
],
"skills": "./skills/",
"interface": {
"displayName": "DevEval Agents",
"shortDescription": "근거 기반 ODA 사업평가",
"longDescription": "Evaluate ODA projects against KOICA and OECD-DAC criteria, review evaluation-report quality, inspect impact-evaluation methodology, and draft evidence-linked reports with a mandatory human decision gate.",
"developerName": "Wooyoung Kim",
"category": "Education & Research",
"capabilities": [
"Interactive",
"Read",
"Write"
],
"websiteURL": "https://github.com/amnotyoung/dev-eval-agents",
"privacyPolicyURL": "https://github.com/amnotyoung/dev-eval-agents/blob/main/PRIVACY.md",
"defaultPrompt": [
"이 ODA 사업을 OECD DAC 기준으로 평가해줘.",
"이 평가보고서의 품질을 KOICA 기준으로 검토해줘.",
"이 영향평가 보고서의 인과추론 방법론을 검토해줘."
],
"brandColor": "#1B3A57",
"composerIcon": "./assets/logo.svg",
"logo": "./assets/logo.png",
"screenshots": []
}
}
28 changes: 28 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: checks

# 결정적 컴포넌트의 회귀를 막는다 — 수치 일관성 검사기(consistency_check.py),
# 완료 엔진(hooks/boulder.sh), 이중 매니페스트 정체성(check-manifest-sync.sh).
# 픽스처는 실제 KOICA 종료평가 PDF 334건 스윕에서 관측된 사고·오탐 유형이다.

on:
push:
branches: [main]
pull_request:

permissions:
contents: read

jobs:
tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: 수치 일관성 검사기 회귀 테스트
run: python3 -m unittest discover -s tests -v

- name: 완료 엔진(Stop hook) 동작 테스트
run: bash tests/test_boulder.sh

- name: 매니페스트 정체성 검사
run: bash scripts/check-manifest-sync.sh
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@
*.pdf
*.PDF
*.hwp

# Python 부산물
__pycache__/
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# DevEval Agents — Codex 지침 (AGENTS.md)

> Codex가 이 파일을 자동 로드한다(= Claude Code의 `CLAUDE.md`에 대응하는 Codex판).
> **공용 지식은 `reference/`에 있고 모든 하네스가 공유한다**(Claude Code·Codex·오픈웨이트 러너 `scripts/open_runner.py`). Claude Code판 워크플로는 `CLAUDE.md` + `.claude/agents/` 참조.
> **공용 지식은 `reference/`에 있고 모든 하네스가 공유한다**(Claude Code·Codex·오픈웨이트 러너 `scripts/open_runner.py`). 설치형 Claude/Codex 플러그인의 워크플로는 `skills/` + `agents/`에 있고, 이 파일은 복제한 저장소를 Codex에서 직접 실행할 때 쓰는 폴백이다.
> 평가 기준·척도·규정은 실제 KOICA 자료 기반: `reference/`.

---
Expand All @@ -10,7 +10,7 @@

너는 **KOICA 사업평가 보조 시스템의 "평가총괄"**이다. ODA 사업을 OECD DAC 기준으로 평가하는 일을 보조한다.

⚠️ **Codex 하네스 특성**: Codex는 Claude Code식 서브에이전트 병렬 위임이 네이티브가 아니다. 따라서 **너 자신이 각 기준을 하나씩 순차로, 서로 독립적으로 평정**한다 — 한 기준을 평가할 때 다른 기준의 결론·점수에 동조하지 말고, **그 기준의 근거만으로** 판단하라. (Claude Code판에서 5명의 평가관이 병렬·블라인드로 하던 "독립성"을, 너는 순차적 자기규율로 재현한다.)
⚠️ **직접 실행 폴백**: 설치형 Codex 플러그인은 `skills/`에서 서브에이전트를 위임하지만, 이 `AGENTS.md` 경로는 의존성이 적은 순차 폴백으로 유지한다. **너 자신이 각 기준을 하나씩 순차로, 서로 독립적으로 평정**한다 — 한 기준을 평가할 때 다른 기준의 결론·점수에 동조하지 말고, **그 기준의 근거만으로** 판단하라.

## 절대 원칙 (NON-NEGOTIABLE)

Expand Down
62 changes: 57 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,79 @@ may still change).
The project was developed iteratively as a series of "slices" in June 2026;
each slice below is recorded as a 0.x milestone.

## [Unreleased] — Digital Public Goods readiness (2026-07)
## [Unreleased]

### Added
- **Packaged as a Claude Code plugin** — the repository *is* the plugin, so an
- **e2e-8 validation entry** (`docs/validation-log.md`) — the full evaluate-track
pipeline (6 parallel evaluators + quality-verifier + report-composer + numeric
checker + narrative-verifier, with optional gateway evidence) ran live on the
complete text of the real Cambodia CTS end-of-project report: ~60 sampled
evidence citations, zero hallucinations, 4 real evaluator errors caught and
corrected by the verification layer, band agreement with the human team
reproduced, and 3 defects of the published report itself re-confirmed.
- **Regression test suite + CI** (`tests/`, `.github/workflows/checks.yml`) —
the deterministic components finally have automated tests: 18 unittest cases
for `scripts/consistency_check.py` (fixtures reproduce failure/false-positive
patterns observed in real KOICA reports), 15 behavior tests for
`hooks/boulder.sh`, and `scripts/check-manifest-sync.sh` guarding name/version
parity across the 4 plugin manifests (Claude + Codex + both marketplaces).
- **Ko↔En composite-score extraction** in the numeric checker — Korean reversed
form (`총 24점 만점 중 11.7`) and English form (`12.7 points out of 24`).
Validated against a full sweep of **334 real KOICA end-of-project evaluation
PDFs**: the checker now catches **two genuine published Ko↔En summary
mismatches** (11.7 vs 12.7 — the very Cambodia CTS case this project's
design story is built on — and a sibling report's 9.3 vs 10.3).

### Changed
- **Numeric checker false-positive suppression**, calibrated on the same
334-report sweep (violation flags 71 → 22, all remaining flags are
multi-project bundles or true candidates): scale legends/threshold sentences,
quality-panel stamps (`평가품질 등급`, A–D scheme) and service-bundle grades
(`용역종합 등급`) vs project A–F, satisfaction-survey composites, count/date
ratios (`8/20개소`, `3/20-24`, `20/100,000명`, `(35/24)`), PDM achievement
rates masquerading as `NN/100` quality totals, and line-wrapped severed
labels (`부/분 성공적`). Criterion-mean sum check now requires a plausible
4–6 criteria and supports `(a)`–`(f)`.
- **Checker exit codes**: "nothing to check" is now exit **3** (distinct from
pass 0 / violation 2) so scripted callers cannot mistake it for a pass;
crash/read failure stays fail-open 0. Skills updated accordingly.
- **Completion engine pause semantics** (`hooks/boulder.sh`) — when a guard
trips (3 stalls or 20 attempts) the hook now records the plan's fingerprint
and stops nagging while the plan is untouched; editing the plan (renewed
intent) re-arms the engine. Previously the counters reset after firing, so an
abandoned plan re-blocked every subsequent turn.

## [0.10.0] — 2026-08-02 — Digital Public Goods readiness

### Added
- **Packaged as installable Claude Code and Codex plugins** — the repository
*is* the plugin, so an
evaluator installs it once and works **in their own folder** instead of inside
this repo (evaluation reports are the evaluator's local work product; the repo
is the tool).
- `.claude-plugin/plugin.json` (name `deveval`) + `.claude-plugin/marketplace.json`
for self-distribution: `/plugin marketplace add amnotyoung/dev-eval-agents`
→ `/plugin install deveval@deveval-agents`.
- **Workflows became skills** (`skills/`): `/deveval:evaluate`,
`/deveval:quality-review`, `/deveval:impact-review`, `/deveval:write-report`.
- `.codex-plugin/plugin.json` + `.agents/plugins/marketplace.json` for native
Codex discovery: `codex plugin marketplace add amnotyoung/dev-eval-agents
--ref main` → `codex plugin add deveval@deveval-agents`. Both plugin
manifests use version `0.10.0` and the same stable plugin identity.
- **Workflows became skills** (`skills/`): `deveval:evaluate`,
`deveval:quality-review`, `deveval:impact-review`, and
`deveval:write-report` (Codex invokes them with `$`; Claude Code with `/`).
A plugin does not load `CLAUDE.md` as context (`claude plugin validate` warns
about exactly this), so the evaluation procedure now lives in skills — loaded
on demand rather than always-on.
- `.claude/agents/` → `agents/` (12 agents, unchanged content),
`.claude/settings.json` hooks → `hooks/hooks.json` using `${CLAUDE_PLUGIN_ROOT}`.
- `bin/` (on `PATH` while enabled): `deveval-root` resolves the plugin's absolute
- `bin/` (on Claude Code's `PATH` while enabled): `deveval-root` resolves the plugin's absolute
path so skills can pass **absolute** reference paths to sub-agents — agents only
have `Read/Grep/Glob` and cannot resolve `reference/…` from the user's folder;
`deveval-consistency-check` wraps the numeric consistency checker.
- The same four skills now resolve their installed root without assuming
plugin `bin/` is on `PATH`, load Claude-format role files into generic Codex
subagents, and retain a sequential independence fallback when subagents are
unavailable.
- `CLAUDE.md` rewritten as **repository/development** context only, with the
evaluation workflow removed to prevent duplication drift with `skills/`.
- **Open-source licensing**: MIT for software (`LICENSE`) and CC BY 4.0 for
Expand Down
35 changes: 24 additions & 11 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,51 @@

이 파일은 **이 저장소에서 작업할 때**(플러그인을 개발·유지보수할 때) Claude Code가 읽는 지침이다.

> ⚠️ **평가 워크플로는 여기에 없다.** 이 저장소는 그 자체가 **Claude Code 플러그인**이고, 평가 절차는 `skills/`에 있다. 플러그인 사용자에게 CLAUDE.md는 로드되지 않는다(`claude plugin validate`가 이를 경고한다) — 그래서 워크플로를 스킬로 옮겼다. **평가 절차를 고치려면 `skills/`를 고쳐라. 이 파일에 워크플로를 다시 쓰지 마라**(중복은 곧 드리프트다).
> ⚠️ **평가 워크플로는 여기에 없다.** 이 저장소는 그 자체가 **Claude Code·Codex 공용 플러그인**이고, 평가 절차는 `skills/`에 있다. 설치형 플러그인 사용자에게 CLAUDE.md는 로드되지 않는다 — 그래서 워크플로를 스킬로 옮겼다. **평가 절차를 고치려면 `skills/`를 고쳐라. 이 파일에 워크플로를 다시 쓰지 마라**(중복은 곧 드리프트다).

## 이 저장소 = 플러그인

```
.claude-plugin/plugin.json 매니페스트 (name: deveval)
.claude-plugin/marketplace.json 자체 배포용 마켓플레이스
.codex-plugin/plugin.json Codex 매니페스트 (같은 name/version)
.agents/plugins/marketplace.json Codex 저장소 마켓플레이스
skills/ 평가 워크플로 4종 ← 사용자의 실제 진입점
agents/ 전담 평가관·검증자 12명
hooks/hooks.json + boulder.sh 완료 엔진 (Stop hook)
bin/ 플러그인 활성화 시 PATH에 오르는 실행파일
bin/ Claude가 PATH에 올리는 실행파일(Codex는 절대경로 폴백)
reference/ KOICA 기준 다이제스트 5종 (공용 지식)
templates/ · samples/ · scripts/ 템플릿·샘플·러너
```

| 스킬 | 하는 일 |
|------|---------|
| `/deveval:evaluate` | 사업평가 — 5~6기준 병렬 평정 → 종합점수·등급(안) |
| `/deveval:quality-review` | 평가보고서 품질심사 — 24문항/100점/A~D |
| `/deveval:impact-review` | 영향평가 방법론 검토 — 5축/10질문 |
| `/deveval:write-report` | 보고서 작성 — 작성→수치검사→서술검증→사람 |
| `deveval:evaluate` | 사업평가 — 5~6기준 병렬 평정 → 종합점수·등급(안) |
| `deveval:quality-review` | 평가보고서 품질심사 — 24문항/100점/A~D |
| `deveval:impact-review` | 영향평가 방법론 검토 — 5축/10질문 |
| `deveval:write-report` | 보고서 작성 — 작성→수치검사→서술검증→사람 |

Claude Code는 `/deveval:<skill>`, Codex는 `$deveval:<skill>` 문법으로 호출한다.

## 개발 방법

이 저장소는 플러그인이므로, 개발 중 동작을 보려면 **플러그인으로 로드**해야 한다:
Claude 쪽 개발 동작은 **플러그인으로 로드**해 확인한다:

```bash
claude --plugin-dir . # 이 저장소를 플러그인으로 올려서 테스트
claude plugin validate . # 매니페스트·구조 검증
/reload-plugins # 세션 중 변경사항 반영
```

`.claude/agents/`나 `.claude/settings.json`으로 되돌리지 마라 — 플러그인 레이아웃(`agents/`, `hooks/hooks.json`)이 정본이다.
결정적 컴포넌트(수치 검사기·완료 엔진·매니페스트 정합)는 CI(`checks`)가 지키는 테스트가 있다 — 로컬에서도 돌려라:

```bash
python3 -m unittest discover -s tests # 수치 검사기 회귀 (픽스처 = 실제 사고 유형)
bash tests/test_boulder.sh # 완료 엔진(Stop hook) 동작
bash scripts/check-manifest-sync.sh # 4개 매니페스트 이름·버전 일치
```

`.claude/agents/`나 `.claude/settings.json`으로 되돌리지 마라 — 공용 플러그인 레이아웃(`skills/`, `agents/`, `hooks/hooks.json`)이 정본이다. Codex 매니페스트는 plugin-creator 검증기로 별도 검사한다.

**한국어 정본을 고치면 `docs/en/` 미러도 같은 PR에서 고쳐라.** `CLAUDE.md`·`AGENTS.md`·`agents/`·`reference/`가 대상이고, CI(`mirror-sync`)가 한쪽만 바뀐 PR을 막는다. 한쪽만 바꾸는 것이 의도된 PR에는 `mirror-sync-exempt` 라벨을 붙인다.

Expand All @@ -47,8 +59,9 @@ bash scripts/check-mirror-sync.sh --audit # 감사 모드 — 저장소 전

플러그인 사용자는 **자기 작업 폴더**에서 이걸 쓴다. 저장소 안이 아니다. 따라서:

- **에이전트·스킬은 `reference/…` 상대경로로 파일을 못 찾는다.** 스킬이 `deveval-root`(bin)로 플러그인 절대경로를 얻어 **위임 프롬프트에 절대경로를 실어** 보낸다. 에이전트는 `Read/Grep/Glob`만 가져 스스로 경로를 알아낼 수 없다.
- **hooks**에서는 `${CLAUDE_PLUGIN_ROOT}`를 쓴다(플러그인 업데이트 시 경로가 바뀌므로 여기에 상태를 저장하지 마라).
- **에이전트·스킬은 `reference/…` 상대경로로 파일을 못 찾는다.** 스킬은 `deveval-root`가 있으면 사용하고, 없으면 로드된 `SKILL.md` 위치에서 루트를 계산한 뒤 **위임 프롬프트에 절대경로를 실어** 보낸다. Codex에서는 역할별 `agents/*.md`도 절대경로로 읽혀야 한다.
- **수치 검사기**는 bare command가 없으면 `<root>/scripts/consistency_check.py`를 절대경로로 실행한다.
- **hooks**에서는 Codex도 호환 제공하는 `${CLAUDE_PLUGIN_ROOT}`를 쓴다(플러그인 업데이트 시 경로가 바뀌므로 여기에 상태를 저장하지 마라).
- **평가자의 산출물**(`.omo/eval-plan.md`, `.omo/draft-report*.md`)은 **사용자 작업 폴더**에 만든다. 플러그인 디렉토리에 쓰지 마라.

## 원칙 (스킬·에이전트 전체에 공통)
Expand All @@ -74,4 +87,4 @@ bash scripts/check-mirror-sync.sh --audit # 감사 모드 — 저장소 전

스킬 3종(evaluate·write-report·quality-review)과 Codex `AGENTS.md`에는 **선택적** 외부 증거 보강이 있다 — 같은 관리자의 `oda-intelligence` 플러그인(공개 read-only MCP 게이트웨이)이 설치된 세션에서만 동작하고, 없으면 건너뛴다(하드 의존 아님 — CONTRIBUTING의 model-agnostic 원칙과 DPG 지표 4를 지키는 조건). 연동 규칙·도구 매핑의 정본은 `docs/oda-intelligence-integration.md`. 연동 부분을 고치면 스킬·`AGENTS.md`·통합 문서를 함께 동기화한다. 에이전트 파일은 건드리지 않는 설계다 — 증거는 위임 프롬프트에 실리는 자기서술형 블록으로 전달된다.

> 학습·실험용 프로젝트다. 다른 하네스(Codex `AGENTS.md`, 오픈웨이트 `scripts/open_runner.py`)도 같은 `reference/` 지식을 공유한다 — 워크플로를 고칠 땐 그쪽 동기화도 함께 검토한다.
> 학습·실험용 프로젝트다. Codex 설치형 플러그인, Codex `AGENTS.md` 직접 실행 폴백, 오픈웨이트 `scripts/open_runner.py` 같은 `reference/` 지식을 공유한다 — 워크플로를 고칠 땐 모두의 동기화를 검토한다.
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ evaluation. Contributions of all sizes are welcome.
## What we welcome / 환영하는 기여

- **Agent improvements** — sharper rubrics, clearer instructions, better output
formats for the agents in `.claude/agents/`.
formats for the agents in `agents/`.
- **Reference corrections** — fixes/updates to the `reference/` digests **with a
citation** to the published KOICA/KIEP source (name + article/page).
- **Harness adapters** — new ways to run the same agents (e.g. additional
Expand Down
4 changes: 2 additions & 2 deletions LICENSE-CONTENT
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ SCOPE OF THIS LICENSE

CC BY 4.0 applies to the CONTENT components of this project, namely:

- All Markdown agent instructions (`CLAUDE.md`, `AGENTS.md`,
`.claude/agents/*.md`, and their English counterparts under `docs/en/`)
- All Markdown agent instructions (`CLAUDE.md`, `AGENTS.md`, `agents/*.md`,
and their English counterparts under `docs/en/`)
- The KOICA methodology digests under `reference/`
- Templates under `templates/` and samples under `samples/`
- Project documentation under `docs/` and the README files
Expand Down
Loading
Loading