Installs into .claude/skills of the current project.
Are you the author of fact-verify?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/parkjui92-fact-verify)
---
name: fact-verify
description: "AI가 수집·작성한 조사 결과, 동향 브리핑, 보고서 초안의 출처를 독립적으로 검증하는 스킬. 출처 신뢰도 4-Tier 분류(정부·학술·언론·비공식), 재인용 체인 감지(같은 보도자료를 여러 언론이 받아쓴 '가짜 교차검증' 차단), URL·DOI·arXiv·NTIS 과제번호 실존 확인, 한국 학술·정책 출처 검증(KCI·RISS·국회도서관·NKIS), 수치·날짜 정합성 점검으로 할루시네이션을 걸러낸다. 다음 상황에서 반드시 이 스킬을 사용한다: ①출처·각주·참고문헌을 단 산출물(브리핑·보고서·조사 정리·기사 초안)을 작성했거나 사용자·발주처에 전달하기 직전 — **명시적 요청이 없어도 배포 전 상시 실행(standing gate)** ②'출처 검증', '출처 확인', '팩트체크', '교차 검증', '인용 검증', '근거 확인', '참고문헌 실재 확인', '이 자료 믿을 만해?', '할루시네이션 점검', '검증해줘' 등의 요청 ③조사·리서치 결과를 브리핑·보고서·기사에 싣기 전 신뢰도를 확인할 때 ④검증을 마친 원고를 고친 뒤 '바뀐 부분만 다시 검증', '수정본 재검증'을 요청할 때. 문서의 문법·표현 교정에는 사용하지 않는다(그건 교정교열 스킬의 몫)."
---
# fact-verify — 출처 검증 게이트
리서치 결과를 **믿기 전에** 돌리는 검증 단계다. AI(또는 사람)가 수집한 주장·수치·인용을 출처 단위로 분해하고, 세 단계 프로토콜로 통과/보류/거부를 판정한다.
**설계 전제(회의론자 자세):** 기본 상태는 의심이다. 증거가 있어야 통과한다. "AI가 작성했을 가능성"을 상수로 가정하고, 그럴듯한 주장일수록 더 엄격히 본다. 불확실하면 포함하지 않는 쪽을 택한다 — 브리핑의 신뢰는 한 번 깨지면 회복이 어렵다.
---
## 입력
두 형태를 받는다:
1. **구조화 입력**: `주장 — 출처(URL/서지)` 쌍의 목록 (다른 에이전트·스킬의 조사 산출물)
2. **자유 텍스트**: 브리핑·보고서 초안·기사 초고 — 이 경우 먼저 텍스트에서 "사실 주장 + 붙어 있는 출처"를 추출해 검증 대상 목록을 만들고, **출처가 아예 없는 사실 주장**은 그 자체로 `NO_SOURCE` 플래그를 단다.
## 검증 깊이 (기본: standard)
| 깊이 | 수행 범위 | 용도 |
|------|-----------|------|
| `quick` | Step 1(Tier 분류) + 식별자 형식 검사만. 네트워크 불필요 | 초안 단계 빠른 점검 |
| `standard` | + Step 3 실존 확인 및 주장 내용 원문 대조(URL·식별자·한국 검증원) | 브리핑 발행 전 (권장 기본) |
| `deep` | + Step 2 교차 독립성(핵심 주장 2개 독립 출처), 수치·날짜 원문 대조 | 대외 보고서·기사·투고 |
---
## 원장으로 검증하기 (v1.3 — standard 이상 기본)
검증자의 "원문 확인함"은 자기보고다. 이 스킬은 판정을 **주장–근거 원장**(`<원고>.fv.json`)에 남기고, 그 판정이 규칙을 지켰는지를 `scripts/fv.py`가 기계로 확인한다. 표준 라이브러리만 쓰므로 설치할 것이 없다. 필드와 규칙 전체는 `references/ledger.md`.
1. **쪼개기** — `python3 scripts/fv.py extract 원고.md` : 문장을 검증 단위로 나누고 수치·날짜·직접인용·「문서명」·조문을 항목으로, 링크·DOI·arXiv·(저자, 연도)·각주를 출처로 등록한다. 출처 없는 수치 문장, 참고문헌에 없는 인용을 표시한다. hwpx·docx도 읽는다.
2. **접속** — `fv.py probe 원고.fv.json` : 링크·DOI·arXiv에 실제로 접속해 `access_status`만 기록하고 본문을 `fv_sources/`에 저장한다. 판정은 하지 않는다. 봇 차단을 우회하지 않는다.
3. **판정** — 검증자가 원문을 읽고 항목마다 `checks`(근거 상태·원문 그대로/계산/환산·발췌·위치)를 채운 뒤 주장별 `verdict`를 정한다. 막힌 출처는 R1대로 대체 원문을 찾아 `alt_for`로 잇는다. 숫자·인용이 없는 사실 주장은 직접 추가하고, 강의 운영 정보 같은 비주장은 `OUT_OF_SCOPE`로 사유와 함께 뺀다.
4. **점검** — `fv.py check 원고.fv.json --final` : 대조하지 않은 항목이 남은 VERIFIED, 본문 없는 출처로 낸 SUPPORTS, **저장된 원문에서 찾을 수 없는 발췌**, 글자 그대로가 아닌 직접인용, 산식 없는 계산 수치, 접속 실패만으로 낸 REJECT 등을 [필수]로 막는다. [필수] 0건이 될 때까지 고친다.
5. **보고** — `fv.py report 원고.fv.json -o 원고_검증보고서.md` : 건수는 코드가 센다. [필수]가 남으면 보고서를 만들지 않는다.
6. **수정본** — `fv.py diff 원고.fv.json 원고_v2.md` : 그대로인 주장은 판정을 이어받고 **바뀐 주장·새 주장만** 다시 검증 대상이 된다.
`quick` 깊이(네트워크 없음)는 1단계와 식별자 형식 검사만 한다. 원장 없이 표만 쓰는 것도 허용하지만, 그때는 보고서에 "원장 미사용 — 발췌 기계 대조 없음"을 적는다.
---
## 3단 검증 프로토콜
### Step 1. 출처 Tier 분류
`references/tier-rules.md`의 기준으로 모든 출처를 분류한다.
- **Tier 1** 정부·기관 공식 (.go.kr, .gov, europa.eu 등) — 단독 근거 가능
- **Tier 2** 학술·국책연구 (peer-reviewed 학술지, KCI 등재지, KISTEP·STEPI 등 국책연, 주요 싱크탱크) — 단독 근거 가능
- **Tier 3** 주요 언론 — 가능하면 **2개 이상 독립 언론** 확인
- **Tier 4** 블로그·SNS·커뮤니티·익명 — **단독 근거 절대 불가.** 원출처를 찾아 확인되면 그 원출처의 Tier로 승격
도메인이 목록에 없으면 성격을 판단해 보수적으로(낮은 쪽으로) 분류하고 "판정 근거"를 기록한다.
### Step 2. 교차 일관성 검증 (deep, 또는 핵심 주장)
**2-A. 출처 독립성 — 재인용 체인 감지 (이 스킬의 핵심 기능)**
```
❌ 가짜 교차 검증:
주장 X가 매경·한경·서울경제 3곳에서 보도됨
→ 세 기사 모두 "과기부 보도자료"를 받아쓴 것이면 실은 출처 1개다.
✅ 진짜 교차 검증:
주장 X가 ① 정부 공식 발표 ② 독립 취재 기사 ③ 학술지 논평에서
일관되게 나타남 → 독립 출처 3개.
```
확인 방법:
- 각 기사 원문에서 "○○가 밝혔다/발표했다/보도자료에 따르면" 같은 **공통 원천 표지**를 찾는다
- 동일 보도자료·공고·논문으로 이어지는 인용 체인을 추적한다
- 독립 출처 수를 세어 기록한다 (재인용은 1개로 합산)
**2-B. 수치·날짜·인명 일관성**
- 여러 출처가 같은 수치를 보고하는가? 불일치(예: "투자 100조" vs "50조") 발견 시 원출처를 확인해 어느 쪽이 정확한지 판정하거나 `NEEDS_REVIEW`로 보류한다.
### Step 3. 실존 확인 (할루시네이션 체크)
- **URL**: 실제로 fetch하고 HTTP 응답과 본문 확보 여부를 별도 기록한다. 403/404, 로그인벽, 빈 본문은 사실 여부의 증거가 아니다. 대체 원문을 찾고 아래 통합 판정표를 적용한다.
- **식별자 형식·실존**:
- DOI: `10.XXXX/...` 형식 → `https://doi.org/<DOI>` 리다이렉트 확인, 메타데이터(제목·저자)와 대조
- arXiv: `YYMM.NNNNN` 형식 → `arxiv.org/abs/`에서 실존·제목 확인
- NTIS 과제번호: 10자리(예: `1711XXXXXX`) 형식 검사
- ISBN: 체크디지트 검사 + 국립중앙도서관 조회
- **날짜·수치 정합성**: 발표일이 원문 날짜와 일치하는가, 인용 수치가 원문 수치와 정확히 일치하는가(단위·기준연도 포함), 미래 시점 서술이 현재와 모순되지 않는가.
### Step 3-D. 한국 학술·정책 출처 검증 (v1.1)
CrossRef·arXiv·Semantic Scholar 같은 국제 DB는 **국문 학술지·국책연 보고서·정부 간행물을 거의 못 잡는다**. 한국 정책·학술 문헌은 DOI가 없는 경우가 많아, 국제 도구로 "확인 불가"가 뜬다고 실재하지 않는 것이 아니다. 아래 한국 검증원으로 별도 확인한다.
| 출처 유형 | 검증원 | 접근 |
|-----------|--------|------|
| 국내 학술지 논문(KCI 등재) | **KCI**(한국연구재단) 학술지·논문·인용 정보 | 공공데이터포털 `15085388`(학술지)·`15084727`(인용) API, 또는 kci.go.kr 공개 검색 |
| 대학 학위논문·학술자원 | **RISS**(KERIS) | 공공데이터포털 `3046254`, 또는 riss.kr 공개 검색 |
| 폭넓은 서지(단행본·논문·의안) | **국회도서관** 국가학술정보 | 공공데이터포털 `15040835`(검색)·`15000282` |
| 국책연 보고서 | **NKIS**(국가정책연구포털, nkis.re.kr), 기관 사이트 | WebFetch 공개 검색 |
| 정부 정책연구 | **PRISM**(정책연구관리시스템, prism.go.kr) | WebFetch 공개 검색 |
| 단행본·보고서 ISBN | 국립중앙도서관 서지정보 | 공공데이터포털 ISBN API |
검증 절차:
1. **저자·제목·연도·게재지**로 위 검증원을 조회한다(정확 일치가 없으면 제목 부분일치로 후보 제시).
2. 조회 결과의 서지정보(게재지명·권호·연도)를 인용과 대조한다 — 특히 **연도·권(호) 오기**와 **학회지명 오기**를 잡는다.
3. 국내외 검색에서 확인되지 않으면 → `NEEDS_REVIEW`(서지 미확인). 검색 부재만으로 문헌이 허위라고 판정하지 않는다.
4. 공개 검색으로는 접근되나 API 키가 없어 구조화 확인이 안 되는 경우 → 확인된 사실은 `VERIFIED`로, 불확실한 건 `NEEDS_REVIEW`로 정직하게 구분한다.
> **접근 등급(graceful degradation).** 이 스킬은 **키 없이도 동작**한다 — 기본은 각 포털의 공개 검색 페이지를 WebFetch하고 CrossRef(무키)를 병행한다. 사용자가 **공공데이터포털 인증키**(무료, 자체발급)를 환경에 설정해 두면 KCI·RISS·국회도서관 API로 **정밀·대량** 검증으로 자동 승급한다. 키는 요구사항이 아니라 성능 옵션이며, 없을 때 있는 척하지 않는다.
---
## 실전 보강 규칙 (R1~R5: v1.2, 해외 정책사례 브리핑 각주 25건 재검증 / R6~R7: v1.3, 실전 검증 보고서 65건 채굴)
### R1. 자동조회 차단 사이트 대응 — "404/403이 곧 허위 출처는 아니다"
정부·기관 사이트 다수가 봇을 차단한다(실측: energy.gov 404, iaea.org 402, science.org 403, ukri.org 404, moore.org 404, nature.com 로그인벽, nsfc.gov.cn SSL 오류, hbr.org 제한). 또한 **HTTP 200이어도 JS 렌더링 페이지는 본문 추출이 실패**할 수 있다(실측: arpa-e.energy.gov — 내비게이션만 반환). 절차:
1. fetch 실패·빈 본문 → 즉시 REJECT 금지. **검색엔진 색인·캐시로 해당 문구를 확인**하고, 확인되면 판정을 `NEEDS_REVIEW(차단-색인확인)`으로 세분 표기한다.
2. 대체 경로를 시도한다: 같은 기관의 다른 URL(보도자료·PDF 직링크·간행물 페이지), 공식 배포 채널(EurekAlert=기관 보도자료 배포, grants.gov=연방 공고 원문, CORDIS=EU 과제 공식), 신뢰 가능한 재게시(동일 원문을 재게시한 여러 대학은 독립 출처 한 계통으로 계산).
3. 원문 직접 대조·색인만 확인·2차 자료 확인을 검증 기록에서 구분한다. 본문에는 필요한 출처와 실질적 불확실성을 남기며, 내부 검증 배지의 표시 여부는 사용자의 배포 형식을 따른다.
### R2. 문장 분해 원칙 — "한 문장 안의 수치 N개 = 검증 항목 N개"
실측된 최다 오류는 허위 출처가 아니라 **맞는 수치에 검증 안 된 파생·부가 수치가 딸려 들어가는 것**이었다(예: 배출 200명〔원문 있음〕+ 정년직 60명〔원문 없음〕 / 총액 5,000억〔원문 있음〕+ "각 2,500억"〔단순 2등분 역산〕 / 조문 내용〔원문 있음〕+ "제25조"〔재구성〕). 규칙:
- 문장을 수치·고유명사 단위로 분해해 **각각** 원문 대조한다. 하나라도 원문에 없으면 그 부분만 잘라내거나 "산출치·추정"임을 명기한다.
- 직접인용(따옴표)은 원문에 그 표현이 **문자 그대로** 있을 때만 유지 — 취지만 같으면 따옴표를 벗겨 의역으로 전환한다(실측: "kill criteria agreed in advance"는 취지는 맞으나 문구 부재 → 의역 전환).
- 조사 지시서에 다음 문구를 넣는다: **"원문에 문자 그대로 있는 것과 계산·추정으로 만든 것을 구분 표기하라."**
### R3. 자기보고 표본 재검증 — 타 에이전트 조사물을 검증할 때
'검증완료' 표기는 조사자의 자기보고다. 미검증분 전수 확인에 더해 **'검증완료' 표기 중 20~30%를 표본 추출해 독립 재검증**한다(실측: 표본 7건 중 3건에서 부가 수치 미검증 적발). 표본에서 문제가 나오면 같은 조사자의 다른 '검증완료'도 등급을 한 단계 낮춰 취급한다. **반대 방향도 센다** — 조사자가 '미대조'·〔2차〕로 남긴 항목이 원문과 일치하면 올린다(실측: 과잉 유보 핵심 3건이 모두 정확, 〔2차〕→원문 승격 4건). 표본 결과는 뒤집힌 건수를 심각도별로 기록한다(`fv.py sample`).
### R4. 추가 점검 3종 (고빈도 오류 유형 보강)
- **⑬ 프로그램 현존 확인**: 인용하는 제도·프로그램(해외 포함)이 지금도 운영 중인가 — 종료·마지막 기수·개편·공모 중단을 확인해 단서를 단다(실측: Moore Inventor Fellows 2025년 10기로 종료, 대만 跨世代 공모 중단 — 각주 미반영 상태로 발견).
- **⑭ '상충'으로 보이는 수치의 범위 확인**: 두 수치가 어긋나 보이면 상충 판정 전에 **집계 범위·모수가 같은지** 먼저 본다(실측: 'SEK 27억 vs 30억'은 사업 단위 vs 패키지 전체 — 상충이 아니라 범위 차이).
- **⑮ 규정 수치는 법규·요강 원문 우선**: 연령·금액·자격요건은 대학·재외공관·블로그의 요약본에서 오기가 빈발한다(실측: 대만 Columbus 연령 '35세' 오기 유통 — 정부 법규 원문으로 38세 확정). 요약본끼리 어긋나면 **법령·모집요강 원문**을 찾아 판정한다.
### R5. 산출물 배포 게이트 (standing rule)
출처·각주가 달린 산출물은 **작성 완료 ≠ 배포 가능**이다. 배포 전 이 스킬을 standard 이상으로 실행하고(신규 문서: 미검증분 전수 + 검증완료 표본 / 기존 문서 재배포: 변경분), 판정 요약(✅/⚠️/❌ 건수)과 정정 내역을 사용자에게 보고한 뒤 배포한다. 검증 보고서는 산출물 옆에 파일로 남긴다(예: `NNa_재검증_보고서.md`).
### R6. 요약 도구를 거친 문장은 원문이 아니다
WebFetch의 요약 모델과 검색엔진 AI 요약은 수치·날짜·인용 낱말을 바꿔 돌려준다(실측: 원문 '5 + 8'을 '4 + 9'로, "than not"을 "or not"으로, 방문일·연도를 지어냄, 인용을 약 125자에서 자름 — 보고서 약 8건, 이렇게 받은 인용에 〔검증〕이 붙은 항목 5건). 인용·수치·날짜는 **원문 HTML·PDF 텍스트**(`fv.py probe`가 저장한 `fv_sources/`)에서만 대조한다. 요약기를 거친 대조는 원장에 `via: "summary"`로 남기며 VERIFIED의 근거가 될 수 없다. 검색 결과 요약에만 있고 원 페이지에서 확인되지 않는 사실은 삭제 후보다.
### R7. 개정·전이 회귀 게이트
오류는 첫 조사보다 **옮기고 고치는 단계**에서 더 많이 생겼다(보고서 약 12건·항목 약 35건 — 조사 파일엔 있던 출처가 집필에서 빠짐(NO_SOURCE 11건 중 6건), 앞 장의 정정이 뒤 장에 안 퍼짐, 같은 쟁점이 개정마다 3차례 되살아남, 지운 환각 문헌이 다른 장에 남음).
- 이전 검증은 **문장이 바뀌지 않았을 때만** 이어받는다(`fv.py diff`). "기존 문장 재작성이라 새 주장 없음"은 재검증 생략 사유가 아니다.
- REJECT의 정정 내용은 **'쓰면 안 되는 것' 목록**으로 다음 단계(집필·개정)에 넘긴다. 반박된 값이 다른 문장에 다시 나타나면 `diff`가 [필수]로 잡는다.
- NEEDS_REVIEW를 '배포 전 육안 확인 권장'으로만 이월하지 않는다(실측: 17차례 개정 동안 그대로, 법령 원문 한 번이면 끝날 조문을 4차까지 미룸). 두 번 넘어오면 확인 경로를 정해 끝내거나 본문 단정을 낮춘다.
- 검증 범위는 변경 내역이 아니라 원고 전체 대조로 정한다(변경 내역에 없던 신설 장이 빠진 사례).
---
## 판정 규칙
접속 상태와 근거 판정은 다음 필드로 분리한다. 이 표가 상태 해석의 단일 기준이다.
- `access_status`: `FULL_TEXT`, `METADATA_ONLY`, `BLOCKED`, `NOT_FOUND`, `EMPTY_BODY`, `UNREACHABLE`(시간 초과·SSL·DNS), `NOT_CHECKED`
- `evidence_status`: `SUPPORTS`, `CONTRADICTS`, `CITATION_MISMATCH`, `INSUFFICIENT`, `NOT_CHECKED`
- 원래 URL·대체 URL 각각의 접속 상태, 대조 위치·짧은 근거, 기준연도·단위·모수, 미확인 사유를 기록한다.
| 판정 | 조건 | 처리 |
|------|------|------|
| `VERIFIED` | 확보한 원문이 해당 주장을 뒷받침하고 대상·시점·단위·모수 및 필요한 출처 요건 충족 | 대조 위치와 근거 기록. 공식 사이트나 HTTP 200만으로 통과 금지 |
| `NEEDS_REVIEW` | 접근 실패·빈 본문·색인/서지만 확인·검색 미발견·모수 불명·근거 부족 | 부족한 증거와 다음 확인 방법 기록. 미확인을 사실 확정으로 전달하지 않음 |
| `REJECT` | 확보한 원문이 주장을 반박하거나 잘못된 대상·서지·인용임을 구체적으로 확인 | 문제가 있는 주장 또는 인용을 특정해 수정/제외 권고. 인용 오류가 주장 자체의 거짓을 뜻하지는 않음 |
| `NO_SOURCE` | 사실 주장에 출처가 없음 | 출처 보강 또는 근거 없는 단정 수정 |
| `OUT_OF_SCOPE` | 검증할 사실 주장이 아님(강의 시간·쪽 번호·자기 서술 등) | 사유를 적고 건수에서 뺀다 |
### 판정 위생 (v1.3 — 실전 검증 보고서 65건 채굴)
가장 큰 결함은 허위 출처를 놓친 것이 아니라 **약한 근거로 ✅를 준 것**이었다(보고서 약 20건 — 한 보고서는 ✅ 86건 중 13건이 〔2차〕, 다른 보고서는 미확인 6건을 "학습 지식과 어긋나지 않음"으로 처리). 괄호 라벨은 약 40종으로 갈라져 같은 〔2차〕가 넷을 뜻했다. 아래 대응표로 고정한다.
| 쓰던 표시 | 원장 기록 | 판정 |
|---|---|---|
| 〔검증〕 원문 직접 대조 | `FULL_TEXT` + `SUPPORTS`(literal) + 발췌·위치 | VERIFIED 가능 |
| 〔계산〕 원문 값으로 계산·환산 | `SUPPORTS`(derived·converted) + 산식 | VERIFIED 가능, 본문에 '산출'·'추정' 표시 |
| 〔색인확인〕 차단 — 색인·캐시로만 확인 | `BLOCKED`·`EMPTY_BODY` + `INSUFFICIENT` | NEEDS_REVIEW |
| 〔2차〕 2차 자료만 읽음 | 2차 출처 + `INSUFFICIENT` | NEEDS_REVIEW |
| 〔요약경유〕 요약 도구의 문장으로 대조 | `via: summary` | NEEDS_REVIEW |
| 학습 지식·추론·"공식 사이트라서" | 근거 아님 | NEEDS_REVIEW |
- 한 칸에 판정 하나. 하위 항목에 ❌가 있으면 상위를 ✅로 집계하지 않는다. NO_SOURCE를 ⚠️나 ❌에 합산하지 않는다.
- ⚠️의 사유는 **접근 실패**인지 **내용 의심**인지 구분해 적는다(⚠️ 25건 중 15건이 사실상 접근 불가였던 보고서가 있다).
- 검증 배지(〔검증〕 등)를 독자용 본문에 붙일지는 배포 형식을 따른다. 붙인다면 원장과 같은 뜻이어야 한다 — 틀린 '원문 확인' 배지가 슬라이드에 붙은 사례가 있다.
Tier 4 단독 근거는 `INSUFFICIENT`/`NEEDS_REVIEW`로 남기고 원출처를 찾는다. 단, **발언 귀속 주장**("○○가 '…'라고 썼다")은 발언자 본인 계정·본인 발표가 1차 원출처다(`speaker_own`). 이때 뒷받침되는 것은 발언의 존재·문구·날짜뿐이고, 발언 속 수치·사실은 따로 원출처가 필요하다. `quick`의 형식 검사나 서지 실존 확인만으로 주장 내용을 `VERIFIED`로 올리지 않는다. 대체 공식 원문을 실제 대조했다면 원래 URL의 404를 보존하면서도 해당 주장은 `VERIFIED`가 될 수 있다.
---
## 고빈도 오류 유형 (실전 채굴 체크리스트)
URL이 살아 있고 문헌이 실재해도 주장은 틀릴 수 있다. 아래는 정부 R&D·정책보고서 검증에서 반복 적발된 유형으로, **출처 실존 확인만으로는 절대 잡히지 않는다.** 각 항목을 별도로 물어라.
**① 지표 혼동 (가장 흔하고 가장 치명적)**
서로 다른 지표를 한 문장에 이어 붙이면 각 수치가 맞아도 문장 전체가 거짓이 된다.
- "정부 R&D 예산"(정부 재원) vs "총연구개발비/GDP"(민간 78% 포함) — 후자를 "국가 R&D 투자 비율"로 부르면 오도.
- 예산 vs 집행, 계약 약정액(최대 상한) vs 실지급액, 누적 총액 vs 연간액.
→ **묻기: 이 수치의 분자·분모·재원 범위가 문장의 주어와 같은가?**
**② 기준연도 표류**
수치는 맞는데 연도가 다른 경우. 2018년 통계를 연도 표기 없이 현재형으로 쓰거나, 비교 대상국만 다른 연도인 경우(한국 2024년 vs 이스라엘 2023년).
→ **묻기: 각 수치의 기준연도가 명시되어 있고 비교 대상과 정렬되는가?**
**③ 제도·계획의 만료**
"제4차 기본계획('21~'25)"처럼 종료된 계획을 현행으로 서술. 법령 개정으로 조항 번호가 바뀐 경우.
→ **묻기: 이 계획·법령은 작성 시점에 여전히 유효한가? 후속 차수가 나왔는가?**
**④ 법령 조항 번호**
근거 조항을 한 조 어긋나게 다는 오류가 흔하다(기본계획 근거는 제5조인데 제6조로 표기 등). 2차 요약이 아니라 **법령 원문**으로 대조한다.
**⑤ 발표 주체 오기**
수치는 실재하나 발표 기관이 다른 경우(전국경제인연합회 ↔ 한국무역협회). 기관명 변경(전경련→한경협 2024)도 함께 본다.
→ **묻기: 이 수치를 실제로 발표한 기관·문서·행사는 무엇인가?**
**⑥ 직접인용 날조 — 최우선 검증 대상**
큰따옴표 안의 문장은 원문에 그 표현이 있어야 한다. 취지가 비슷한 다른 문헌의 내용을 특정 보고서의 직접인용으로 붙이는 사고가 실제로 발생한다.
→ **인용부호가 보이면 무조건 원문 전문 검색.** 없으면 REJECT하고, 취지에 실제로 부합하는 문헌을 찾아 제시한다.
**⑦ 출처가 그 수치를 실제로 뒷받침하는가 (오귀속)**
문헌은 실재하고 주제도 맞는데, 인용된 특정 수치는 그 문헌의 **다른 대상**에 관한 값인 경우. (예: GAO 보고서가 mRNA 후보에 TRL 8A를 부여했는데 비(非)mRNA 후보의 TRL 6~7을 mRNA에 귀속.)
→ **묻기: 그 표·그 페이지에서 이 수치가 붙은 대상과 시점이 본문의 대상·시점과 같은가?**
**⑧ 잔차 역산치**
원문에 없는 수치를 저자가 뺄셈으로 만들어 원문 출처를 단 경우(총액−구매액−이전투입=팬데믹기 R&D). 반올림 오차가 누적돼 원문과 어긋난다.
→ **묻기: 이 수치가 원문에 문자 그대로 있는가, 아니면 계산으로 만든 것인가?**
**⑨ 문헌 논지와 인용 용도 불일치**
서지는 정확한데 그 논문이 실제로 하는 주장이 아닌 경우(선형모형의 역사를 다룬 논문을 성과단계 taxonomy 근거로 인용).
→ **묻기: 이 문헌의 초록·결론이 본문이 시키는 일을 실제로 하는가?**
**⑩ 방법론 임계값의 출처표 특정**
같은 지표라도 계산 방식이 다른 복수의 기준표가 병존한다(Lawshe 1975 원표 vs Wilson-Pan-Schumsky 2012 재계산표 vs Ayre-Scally 2014 정확이항). "N=10에서 0.52"가 틀린 게 아니라 **다른 표를 쓴 것**일 수 있다.
→ **묻기: 어느 표의 몇 번째 행인가? 채택한 표를 본문이 밝히고 있는가?**
**⑪ 법인격·주체 성격**
"정부 주도 기관"이 실제로는 민간 컨소시엄 출자 법인인 경우(NPCI). 국제기구 '보고서'가 실제로는 저자 개인 견해인 워킹페이퍼인 경우.
→ **묻기: 이 조직의 법적 성격과 이 문서의 격(공식 입장 vs 워킹페이퍼)은 무엇인가?**
**⑫ 인과 귀속의 비약**
수치는 맞으나 원문이 다른 원인에 귀속시킨 경우(발사비 95% 절감은 셔틀 대비 공시가 비교이지 재사용의 효과가 아님 — 원문은 재사용 기여를 30~50%로 추정).
→ **묻기: 원문이 이 결과를 무엇의 결과라고 말하는가?**
⑬~⑮는 위 「실전 보강 규칙」 R4에 있다. 아래 ⑯~㉔는 2026년 8~10월 실전 검증 보고서 65건에서 채굴했다(건수는 근사치). **현행 목록에 없던 것 가운데 가장 많았던 것이 ⑯과 ⑱이다.**
**⑯ 양태·한정어·조건 변형 (가장 흔함 — 보고서 약 30건, 100건 이상)**
수치는 맞는데 단언 강도가 바뀐다. 검토→확정, 예상→관측, could→했다, 'up to'(최대)·'일부 평가에서'·'원칙적으로'·'수 있다' 탈락, '60% 이상'→'약 60%', 조건문 "if …"를 이미 일어난 일로. 공식 지침의 "승인 도구 활용"이 "승인 도구로만"이 된 사례.
→ **묻기: 원문의 유보어·한정어·조건이 본문에 그대로 살아 있는가?** (`fv.py check`가 원문 발췌에 유보어가 있는데 본문에 없으면 [권고])
**⑰ 최상급·전칭 부풀림**
'세계 최초'·'최대'·'유일'·'전원'·'신설'은 원문에 **그 표현이 문자 그대로** 있을 때만 쓴다. 보도자료 제목의 자기 표현('세계최초')은 "○○는 세계 최초라고 밝혔다"처럼 귀속해 쓴다. 한 유형에서만 최대인 값을 "전체 중 최대"로 쓰지 않는다. (`check`가 발췌에 없는 최상급을 [필수]로)
**⑱ 날짜 종류·판본·기준일 (보고서 약 30건, 약 70건)**
- 법령: 공포 / 시행 / 발효 / 적용을 구분한다. **부칙에 따른 조문별 분할 시행**(일부 조문만 6개월 뒤 시행), 정오표로 바뀐 적용일, 미시행 개정판의 법률번호를 현행으로 쓰는 것을 확인한다. 법령 사이트 기본 링크가 다른 시행판을 띄우기도 하므로 **시행일을 지정한 링크**로 대조한다.
- 그 밖의 날짜: 사건일/보도일/게시일, arXiv 제출일/발표일, 페이지 갱신일('Content current as of')≠발행일, 「YYYY년 평가」 같은 회차명 연도≠발행연도, 온라인 게재/권호, 의결연도/계획기간, UTC/한국 시각(미국 시각 공지는 한국 날짜로 다음 날일 수 있음).
- 판본: 연례 간행물의 다른 연도판, 같은 URL의 갱신판, 워킹페이퍼·프리프린트/게재본(수치·저자 순서가 바뀜), 웹 문구 개정. 직접인용이 인용한 최신판에는 없고 전년도판에만 있던 사례가 있다.
- **시점에 따라 바뀌는 값에는 조회일을 붙인다**: AI 모델명·버전·사양·가격, 서비스 종료·개명, 저장소 별·포크, DB 건수, 사용자 수. (`extract`가 기준일 없는 값을 표시하고 `check`가 [권고])
→ **묻기: 이 날짜는 무슨 날짜이고, 이 값은 어느 판·어느 시점의 것인가?**
**⑲ 표본·단위·방향**
응답자 vs 전체, 사용 사례 수 vs 응답자 수, 특정 분야 표본을 다른 분야로 외삽, 21쌍 중 1쌍뿐인 극단값을 대표값으로. **% vs %p**("17% lower"를 "17%p"로), 부호·방향(시간 −18%=빨라짐), 조↔억(2.684조 → 실제 2,684억). 분류체계·조사 설계가 바뀐 전후를 단순 비교한 **시계열 단절**.
→ **묻기: 분자·분모·모집단·단위·방향이 원문과 같은가? 그 사이 측정 기준이 바뀌지 않았는가?**
**⑳ 부재 주장 — '없다·공백·처음'**
원문에 있는데 '원문에 없음', '연구 공백', '측정 방법이 없다'고 쓰는 오류(보고서 약 9건). 인용한 문헌의 초록 마지막 문장이 이미 그 공백을 다루고 있던 사례가 있다. 유료벽 뒤를 보지 않고 '공개 안 됨'이라고 쓰지 않는다. **무엇을 어디까지 찾았는지(search_scope)를 적은 뒤에만** 부재를 단정한다.
**㉑ 출처줄 불일치 — 주장은 참, 각주가 불완전**
사실은 맞는데 각주에 단 문서에는 없고 다른 문서에만 있는 경우(보고서 약 13건). '약 3개월'이 표시 출처의 '10주+'와 다른 사례의 '12주'를 섞은 값인데 각주는 앞엣것만 단 사례. 주장 거짓(REJECT)과 구분해 **각주 보강**으로 처리한다.
**㉒ 원문 자체의 오류·내부 불일치**
같은 원문 안에서 표는 13개 기관 727명, 본문은 14개 기관 740명. 원문을 고치지 않는다 — 불일치를 기록하고 본문이 어느 값을 썼는지 밝힌다(`source_inconsistent`).
**㉓ 번역·인용 변형·오귀속**
번역 요약에 따옴표를 붙임, 의역이 개정 중 따옴표로 승격, 말줄임표 없이 구절 삭제, 조문 용어 치환('정당한 이익'→'공익'), 'last author'를 '교신저자'로 오역해 산출값이 바뀐 사례. 국내 기사에 번역된 해외 인사 발언은 **원 발언**과 대조한다. 유명인의 말로 퍼진 SNS 인용문의 원작자가 다른 사용자였던 사례, 비공식 '아카이브' 유사 도메인에만 있는 인용문, 본인 블로그의 AI 생성 요약을 "본인 요약"으로 쓴 사례가 있다. 업계 단체·소송 당사자의 주장은 귀속해 쓴다.
**㉔ 위치·링크**
PDF 쪽과 인쇄 쪽 번호를 섞지 않는다(인쇄 3쪽 ≠ PDF 6쪽). 200을 돌려주지만 첫 화면으로 넘어가는 **소프트 404**, 도메인 이전, 다른 회차로 리다이렉트를 확인한다(`probe`가 소프트 404를 NOT_FOUND로, 막힌 링크엔 웨이백 보관본 주소를 붙임 — 보관본의 시점이 인용 시점과 맞는지는 따로 본다).
> **원칙: 숫자가 맞아도 문장은 틀릴 수 있다.** 검증 단위는 '수치'가 아니라 '수치를 담은 문장 전체'다. 실측된 오류 대부분은 유령 문헌이 아니라 **맞는 출처에 붙은 틀린 꼬리표**(다른 판·다른 날짜·다른 대상·빠진 한정어)였다.
---
## 출력 형식
### 기본: 마크다운 검증 보고서
원장을 쓰면 `fv.py report`가 아래 형식을 만든다. 표의 건수를 손으로 세지 않는다(요약 건수와 표가 어긋나는 사고가 반복됐다).
```markdown
## 출처 검증 보고서
- 검증 대상: N건 | ✅ VERIFIED n | ⚠️ NEEDS_REVIEW n | ❌ REJECT n | 🚫 NO_SOURCE n
- Tier 분포: T1 n / T2 n / T3 n / T4 n(전원 제외 또는 승격)
- 검증 깊이: standard | 검증 일시: YYYY-MM-DD
| # | 주장(요약) | 출처 | Tier | 판정 | 사유·조치 |
|---|-----------|------|------|------|-----------|
| 1 | ... | msit.go.kr/... | 1 | ✅ | 공식 보도자료 원문 확인 |
| 2 | ... | arXiv 2404.99999 | 2 | ⚠️ | NOT_FOUND / INSUFFICIENT — 식별자·대체 원문 재확인 |
| 3 | ... | 매경·한경 2건 | 3 | ⚠️ | 두 기사 모두 동일 보도자료 재인용 — 독립 출처 1개뿐 |
| 4 | ... | 한국정책학회보 32(1) | 2 | ✅ | KCI 조회 확인 (단, 인용 연도 오기 2022→2021) |
```
### 옵션: YAML (에이전트 파이프라인 연동용)
다른 에이전트가 소비할 때는 `verification_report:` YAML(총계, by_tier, rejected_items[사유·조치], review_needed, verified_items)로 반환한다. 각 항목에 `access_status`, `evidence_status`, 대조 위치와 사유를 포함한다. 기존 소비자는 최종 판정명을 그대로 읽을 수 있으나 `NEEDS_REVIEW`를 거짓이나 검증완료로 해석하지 않는다.
---
## 재검증·에스컬레이션
- 조사 주체(사람/에이전트)에게 재조사를 요청할 때는 **어떤 항목이 왜 문제인지 + 무엇을 확인하면 되는지**를 구체적으로 적는다.
- 같은 항목이 재조사 후에도 확인되지 않으면 `NEEDS_REVIEW`를 유지하고 조사 범위와 한계를 기록한다. 반복 실패만으로 `REJECT`로 승격하지 않는다.
## 에이전트 파이프라인의 게이트로 쓰기
조사 → **fact-verify** → 집필 순서로 배치하면 검증 게이트가 된다. 서브에이전트 정의 예시:
```markdown
---
name: fact-verifier
description: 조사 결과를 독립 검증하는 전문 에이전트. 조사 완료 후, 집필 시작 전에 호출.
tools: [WebFetch, WebSearch, Read, Write, Bash]
---
fact-verify 스킬의 3단 프로토콜을 따라 조사 산출물을 검증하고
원장(fv.py)에 판정을 남긴 뒤 `fv.py check --final`이 [필수] 0건일 때만
verification_report를 반환한다. REJECT 항목은 집필에 사용 금지.
```
## 한계 (정직하게 알릴 것)
- URL 실존·DOI·한국 검증원 확인에는 **웹 접근(WebFetch/WebSearch)** 이 필요하다. 오프라인 환경에서는 `quick` 깊이만 가능함을 알린다.
- **한국 학술·정책 검증**은 공개 검색(무키)으로도 되지만, KCI·RISS·국회도서관 **API의 정밀·대량 조회는 공공데이터포털 인증키(무료)가 있을 때만** 가능하다. 키가 없으면 공개 검색 범위 안에서만 확인하고, 못 미친 부분은 `NEEDS_REVIEW`로 정직하게 남긴다.
- 페이월·로그인 뒤 문서, 인쇄물 전용 문헌(DBpia 유료 원문 등)은 실존 확인이 제한된다 → `NEEDS_REVIEW`.
- 이 스킬은 **출처 규율 도구**다. 출처가 실존하고 주장과 일치하는지를 보며, 주장 자체의 학술적 타당성·진위를 최종 보증하지 않는다. 판정은 사람의 판단을 돕는 보조 신호다.
- 검증 과정에서 외부로 전송되는 것은 확인 대상 URL·식별자·검색어(제목·저자)뿐이다. 문서 전체를 외부 서비스에 보내지 않는다.
- `fv.py`의 항목 추출은 놓치지 않는 쪽으로 짜여 있어 비주장도 걸린다(`OUT_OF_SCOPE`로 뺀다). 숫자·인용이 없는 사실 주장은 고르지 못한다. PDF 본문은 추출하지 않으며, 발췌 대조는 글자 일치만 본다 — 발췌가 주장을 뒷받침하는지는 검증자의 판단이다.
## 커스터마이즈
`references/tier-rules.md`에 자기 분야의 기관·학술지·매체를 추가하라. 기본 목록은 과학기술정책(STI) 분야 기준으로 작성되어 있다 — 보건·환경·경제 등 다른 분야는 해당 분야의 정부기관·국책연·전문지를 Tier 1~3에 보강하면 된다.
공공데이터포털 인증키 설정은 `references/korea-sources.md`를 참조한다.