#!/bin/sh
# Claude Code Skill 설치 스크립트
# 생성: 2026-08-13 · Skill 1개 · 파일 1개
#
#   ./install-skills.sh            ~/.claude/skills/ 에 설치 (모든 프로젝트에서 사용)
#   ./install-skills.sh ./myrepo   ./myrepo/.claude/skills/ 에 설치 (그 저장소 전용)
set -e

DEST="${1:+$1/.claude/skills}"
DEST="${DEST:-$HOME/.claude/skills}"
mkdir -p "$DEST"
echo "설치 위치: $DEST"


mkdir -p "$DEST/pipeline-validate"
cat > "$DEST/pipeline-validate/SKILL.md" <<'SKILL_PAYLOAD_EOF'
---
name: pipeline-validate
description: 다단계 데이터 파이프라인의 무결성을 검증한다. 건수·중복·커버리지에 더해 과거에 실제로 터졌던 버그를 회귀 테스트로 박아 두고, 추론으로 합친 건은 전수 재판정한다. TRIGGER - "파이프라인 검증", "무결성 확인", "회귀 테스트", "병합이 제대로 됐나", 수집·병합·정규화를 여러 번 다시 돌리는 파이프라인을 신뢰해야 할 때.
---

# 파이프라인 무결성 검증

## 언제 쓰나

수집 → 병합 → 정규화 → 분석 파이프라인을 **여러 번 다시 돌릴 때.** 규칙을 고칠 때마다 예전에 고쳤던 버그가 되살아나는지 확인해야 한다.

## 정본 코드

```
~/Documents/혜연/BTC_KOL_PoC/
  validate.py        167줄  파이프라인 전체 무결성
  verify_merges.py   316줄  추론 병합 전수 재판정
```

## 핵심 1 — 터졌던 버그를 회귀 테스트로 박아라

> 건수·중복·커버리지에 더해, **지금까지 실제로 터졌던 버그의 회귀 테스트를 포함한다.**

일반 검증(건수가 맞나, 중복이 없나)만으로는 **한 번 고친 버그가 되살아나는 걸 못 잡는다.** 정본에 박혀 있는 두 개:

```python
# 회귀: 4글자 이하 실명을 이니셜로 쪼개던 버그 (Hwang Shin → HWANG S H I N)
check("회귀 · 실명을 이니셜로 오인하지 않음", not split_bug, ...)

# 회귀: 강창무 ← 김성현 오병합
check("회귀 · KANG CHANG MOO ≠ KIM SUNG HYUN", ...)
```

**구체적인 사례를 이름째로 박는다.** "이니셜 처리가 잘 되나" 같은 추상적 검사는 무엇이 깨졌는지 안 알려준다. 실제로 틀렸던 그 사람의 이름을 넣으면 깨지는 순간 원인이 바로 보인다.

버그를 고칠 때마다 그 케이스를 여기 한 줄 추가하는 습관을 들인다.

## 핵심 2 — 추론으로 합친 건은 전수로 본다

`verify_merges.py` 의 판단 기준이 정확하다.

> 병합은 네 규칙으로 일어난다. **① 은 ORCID 라는 식별자를 쓰므로 검증 대상이 아니다.** ②③④ 는 표기·기관·공저자를 근거로 한 **추론**이라 틀릴 수 있고, 틀리면 두 사람의 실적이 한 사람에게 합쳐진다. **KOL 순위를 직접 흔들기 때문에 전수로 본다.**

**식별자 조인과 추론을 나누고, 추론만 검증한다.** ORCID 로 합친 건 검증할 게 없다. 표본이 아니라 전수로 보는 이유는 오류 하나가 순위를 바꾸기 때문이다 — 영향이 큰 판정은 표본으로 넘기지 않는다.

검증은 2단계다: **식별자 판정**(ORCID·PMID 로 확인 가능한 것) → **GPT 판정**(남은 것). 여기서도 싼 근거를 먼저 쓴다.

```bash
python3 verify_merges.py --list    # 검증 대상 목록
python3 verify_merges.py --run     # 식별자 판정 + GPT 판정
python3 verify_merges.py --report  # 결과 요약
```

## 검사 결과는 한 줄씩 PASS/FAIL 로

`check(name, ok, detail)` 형태로 항목마다 이름·통과여부·상세를 낸다. **실패한 항목만이 아니라 통과한 항목도 함께 출력한다** — 무엇을 검사했는지가 보여야 검증의 범위를 신뢰할 수 있다.

## 함정

- 검증은 read-only. 검증 스크립트가 데이터를 고치면 검증의 의미가 없다.
- `--selfcheck` 를 검증 스크립트 자체에도 둔다. 검증기가 틀리면 아무것도 못 믿는다.
- 기대값을 숫자로 박되 그 근거를 주석에 남긴다 — `[[excel-case-validator]]` 참조.

## 연관 skill

`[[excel-case-validator]]`(엑셀 대조 검증), `[[author-disambiguate]]`(검증 대상), `[[paper-merge-provenance]]`, `[[wos-export-check]]`(입력 단계 검수)
SKILL_PAYLOAD_EOF

echo ""
echo "완료 — Skill 1개를 설치했습니다."
echo "Claude Code를 다시 시작하면 인식됩니다."
