Skip to content
Back to skills

fact-verify

ASecurity

AI가 수집·작성한 조사 결과, 동향 브리핑, 보고서 초안의 출처를 독립적으로 검증하는 스킬. 출처 신뢰도 4-Tier 분류(정부·학술·언론·비공식), 재인용 체인 감지(같은 보도자료를 여러 언론이 받아쓴 '가짜 교차검증' 차단), URL·DOI·arXiv·NTIS 과제번호 실존 확인, 한국 학술·정책 출처 검증(KCI·RISS·국회도서관·NKIS), 수치·날짜 정합성 점검으로 할루시네이션을 걸러낸다. 다음 상황에서 반드시 이 스킬을 사용한다: ①출처·각주·참고문헌을 단 산출물(브리핑·보고서·조사 정리·기사 초안)을 작성했거나 사용자·발주처에 전달하기 직전 — **명시적 요청이 없어도 배포 전 상시 실행(standing gate)** ②'출처 검증', '출처 확인', '팩트체크', '교차 검증', '인용 검증', '근거 확인', '참고문헌 실재 확인', '이 자료 믿을 만해?', '할루시네이션 점검', '검증해줘' 등의 요청 ③조사·리서치 결과를 브리핑·보고서·기사에 싣기 전 ...

  • 2 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 10, 2026
researchpythongobashawsapi

Works with

  • api

Security analysis

A100/100

Pro scans all 11 files and shows the line behind each finding

Scanned October 10, 2026

npx -y skills add parkjui92/fact-verify --agent claude-code

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.

Security grade badge for fact-verify
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/parkjui92-fact-verify/badge)](https://www.skillsdirectory.com/skills/parkjui92-fact-verify)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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`를 참조한다.

Files in this skill

  • CHANGELOG.md8.7 KB
  • README.en.md8.2 KB
  • SKILL.md34.6 KB
  • docs/why.md36.5 KB
  • examples/verification-report-example.md3.2 KB
  • fact-verify.skill93.5 KB
  • references/korea-sources.md3.6 KB
  • references/ledger.md7.1 KB
  • references/tier-rules.md5.3 KB
  • scripts/fv.py73 KB
  • tests/test_fv.py10 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.