---
name: kist-finder
description: "KIST(한국과학기술연구원) 공식 사이트에서 사전 수집·구조화된 markdown 지식베이스(인물 1,347명·부서 117개·키워드 4,093개)를 grep + Read로 직접 검색하여, 사용자의 자연어 질의 — 이름(예: '이제현'), 분야(예: '양자역학', '이차전지', '단백질'), 부서(예: 'AIX전략실', '양자기술연구단') — 에 대해 적합한 담당자/연구책임자를 매칭 사유와 출처와 함께 즉시 제시한다. 모든 검색은 ~/.claude/skills/kist-finder/data/index/*.md 파일만 사용하는 결정적 오프라인 동작이며 네트워크·Python·외부 스크립트 실행 없이 수행된다. 'KIST 전문가', 'KIST 담당자', 'KIST 누가', 'KIST PI', 'KIST 책임연구원', 'KIST에 ~ 전문가', '한국과학기술연구원 연구자', '/kist-finder' 호출 시 반드시 이 스킬을 사용한다."
---

# kist-finder — KIST 전문가/담당자 검색 (Markdown 지식베이스)

KIST 공식 사이트의 인물 디렉터리·조직 구조·연구 키워드를 **markdown 파일들**로 보관한 지식베이스에서 `grep`과 `Read`만으로 검색한다. 네트워크 호출·Python 실행 없이 동작.

## 핵심 원칙

- **md-only**: 모든 검색은 `~/.claude/skills/kist-finder/data/index/` 의 markdown 파일만 사용. 외부 스크립트 실행·네트워크 호출 금지.
- **결정적**: 동일 지식베이스·동일 질의면 항상 같은 결과.
- **추적성**: 모든 인물 정보에 출처 URL(`kist.re.kr`) + 원문 인용이 함께 있다.

## 호출 형태

| 호출 | 동작 |
|------|------|
| `/kist-finder "<질의>"` | grep + Read로 인물 매칭 → markdown 결과 출력 |
| `/kist-finder` (인수 없음) | 지식베이스 상태(인물·부서·키워드 수) 출력 |
| `/kist-finder build` | KIST 사이트 전체 재크롤·재빌드 (~10분, 사용자 동의 필요) |
| `/kist-finder refresh` | 변경분만 갱신 |

## 지식베이스 레이아웃

```
~/.claude/skills/kist-finder/data/index/
├── _TOC.md                                 # 마스터 목차 + grep cheat-sheet
├── all-people.md                           # 1,347명 단일 표 (grep 메인 파일)
├── org-tree.md                             # KIST 조직 트리
├── keywords.md                             # 4,093 키워드 역색인
└── by-dept/
    ├── _index.md                           # 부서별 markdown 파일 색인
    ├── AIX전략실.md
    ├── 양자기술연구단.md
    ├── 휴머노이드연구단.md
    └── ... (117 부서)
```

이외:
- `references/keyword-thesaurus.md` — 한·영 동의어 사전 (사람용·grep 보조)
- `data/raw/`, `data/structured/`, `data/meta/` — 빌드 원본 (검색에는 사용 안 함, 백업·재빌드용)
- `build_index.mjs`, `parse_index.py` — 빌드/재빌드 도구 (find 모드에서는 실행 안 함)

## find 워크플로우 — grep + Read만 사용

### 1단계: 질의 분류 (LLM이 판정)

| 분류 | 트리거 |
|------|--------|
| **person_name** | 한글 2~4자 이름 형태 (예: "이제현", "홍길동") |
| **department** | 부서 접미사로 끝남 — `연구실`·`연구단`·`연구소`·`센터`·`본부`·`전략실`·`지원실`·`팀`·`그룹` (예: "AIX전략실") |
| **topic** | 분야 명사 또는 영문 키워드 (예: "양자역학", "이차전지", "단백질", "AI", "robotics") |
| **mixed** | 두 분류가 겹치면 둘 다 시도 |

### 2단계: grep으로 1차 후보 모집

분류별 검색 명령:

**person_name** (이름 검색):
```bash
grep -i "^| <이름> " ~/.claude/skills/kist-finder/data/index/all-people.md
```
- 표의 첫 컬럼이 이름이므로 `| <이름> ` 패턴으로 정확 매치
- 동명이인은 부서 컬럼으로 구분 가능

**department** (부서 검색):
```bash
# 부서 파일 직접 read (정확)
cat ~/.claude/skills/kist-finder/data/index/by-dept/<부서명>.md
# 또는
grep -i "| <부서명> |" ~/.claude/skills/kist-finder/data/index/all-people.md
```

**topic** (분야·키워드 검색):
```bash
# all-people.md의 키워드 컬럼에서 grep
grep -iE "양자|quantum|qubit" ~/.claude/skills/kist-finder/data/index/all-people.md

# 또는 keywords.md에서 정규형·동의어 확인 후 부서 추적
grep -iE "양자역학|quantum-mechanics" ~/.claude/skills/kist-finder/data/index/keywords.md
```

검색 키 확장 시 `references/keyword-thesaurus.md` 의 한·영 동의어를 참조한다. 예: "양자역학" 검색 시 thesaurus의 `quantum-mechanics` canonical entry → `quantum optics`, `quantum information`, `양자정보`, `양자광학` 등을 OR로 grep.

### 3단계: 책임자 우선 정렬 (LLM이 결과 해석)

grep 결과를 직책 가중치 순으로 LLM이 정렬한다:

| 직책 | 가중치 |
|------|--------|
| 단장·실장·그룹장·센터장·본부장 | **최우선** (협력 의사결정 라인) |
| 소장·팀장 | 우선 |
| 책임연구원 | 일반 시니어 |
| 책임전문원 | 행정/지원 시니어 |
| 선임연구원 | 주니어 PI |
| 선임전문원 | 행정/지원 |

분야 검색일 때는 책임자급 1명 이상이 top-3 안에 포함되도록 보장. 같은 부서에 단장이 있으면 우선 후보로 노출.

### 4단계: 상세 정보 보강 (필요 시)

top-1·2가 결정되면 해당 부서 파일을 Read하여 동료·인접 인물·부서 단위 컨텍스트 확보:

```
Read ~/.claude/skills/kist-finder/data/index/by-dept/<부서slug>.md
```

부서 파일에는 책임자 우선 정렬된 명단·각 인물의 키워드·출처가 모두 들어있어 단일 Read로 충분.

### 5단계: 결과 출력 — 매칭 사유 4요소

```markdown
# KIST 전문가 매칭 결과

**질의**: "<원문>"  ·  **분류**: <person_name|department|topic|mixed>
**지식베이스 기준**: <data/index 변경일> · 인물 1,347명 · 부서 117개

## 추천 1순위 — (이름) (직책) 🟢 책임자 · 부서: <부서>
- **소속**: KIST > 본부 > 부서
- **매칭 사유**:
  1. 키워드 근거: ...
  2. 직책 근거: ...
  3. 소속 근거: ...
  4. 출처 인용: "<evidence>" (<공식 URL>)

## 추천 2순위 ...
## 추천 3순위 ...

## 인접 분야 후보 (참고)
- ...

## 면책
- 인덱스 기준일: <data/index/_TOC.md 또는 raw 메타에서 확인>
- KIST 공식 사이트(kist.re.kr) 공개 페이지만 사용. 네트워크 라이브 검색 0건.
- 동명이인 주의: 외부 기관에 같은 이름이 존재할 수 있습니다.
```

### 빈 결과 처리

grep 결과 0건이면 다음 순으로 폴백:
1. thesaurus 동의어로 grep 재시도
2. `keywords.md` 에서 부분일치 키 찾기
3. 그래도 0건이면 "공개 지식베이스에서 일치하는 인물 없음" + 인접 분야 제안 출력

자동으로 사이트 fetch·빌드 호출하지 않는다 — 사용자가 명시적으로 `refresh` 요청해야 한다.

## 상태 조회 (인수 없음)

```bash
head -5 ~/.claude/skills/kist-finder/data/index/_TOC.md
wc -l ~/.claude/skills/kist-finder/data/index/all-people.md
ls ~/.claude/skills/kist-finder/data/index/by-dept/ | wc -l
```

출력 예:
```
KIST 지식베이스 상태
- 인물 디렉터리: 1,347명 (all-people.md)
- 부서 markdown: 117개 (by-dept/)
- 키워드 색인: 4,093 키 (keywords.md)
- 사용법: /kist-finder "<찾고싶은 이름/분야/부서>"
```

## build / refresh — 인덱스 재생성

검색 자체는 markdown만 사용하지만, **새로 크롤하거나 갱신할 때**는 어쩔 수 없이 도구가 필요하다:

1. **크롤** (`build_index.mjs`, Node): cheliped-browser로 KIST 사이트 199 페이지 수집 → `data/raw/`
2. **파싱** (`parse_index.py`, Python): raw HTML → `data/structured/*.json` → **자동으로 `data/index/*.md`까지 동기 생성**
3. find 모드는 위 결과인 markdown만 사용 (Python·Node 실행 없음)

소요: 약 10분. 사용자 명시 트리거(`/kist-finder build` 또는 `refresh`) 시에만 실행.

## 윤리 / 개인정보 가이드라인

수집 허용:
- `kist.re.kr` 공식 사이트 공개 페이지의 조직명·부서명·연구단명·연구실명·연구분야·직책·담당업무

수집 금지 / 자동 마스킹 (parse 단계):
- 휴대전화 (`01[016789]-?\d{3,4}-?\d{4}`, `+82-?10-?…`)
- 개인 이메일 (`@(gmail|naver|hanmail|daum|kakao|yahoo)\.(com|net)`)
- 증명사진·생년월일·주소·비공개 인사정보

모든 인물 markdown 줄에는 `출처 ste`(KIST 공식 페이지 ID)가 포함된다. 출처 미상 정보는 인덱싱하지 않는다.

사용자가 특정 인물 제거를 요청하면 `all-people.md` 의 해당 줄 + `by-dept/<부서>.md` 의 해당 섹션 즉시 제거 + `data/meta/denylist.txt` 에 이름 추가하여 향후 build/refresh 시 영구 제외.

## 동작 예시

### A. 이름 검색

사용자: `/kist-finder "이제현"`

LLM 동작:
1. 분류 = `person_name`
2. `grep -i "^| 이제현 " ~/.claude/skills/kist-finder/data/index/all-people.md`
3. → 1줄 매칭, 부서 `AIX전략실` 확인
4. `Read ~/.claude/skills/kist-finder/data/index/by-dept/AIX전략실.md`로 직책·출처·동료 확보
5. 매칭 사유와 함께 결과 출력

### B. 분야 검색

사용자: `/kist-finder "양자역학"`

LLM 동작:
1. 분류 = `topic`
2. thesaurus 참조 → 확장 키 `[양자역학, 양자, quantum, qubit, 양자정보, 양자광학, 양자컴퓨팅]`
3. `grep -iE "양자|quantum|qubit" ~/.claude/skills/kist-finder/data/index/all-people.md` → 다수 매칭
4. 가장 빈도 높은 부서가 **양자기술연구단**임을 발견
5. `Read by-dept/양자기술연구단.md` → 단장·책임연구원 명단·키워드 확보
6. 단장 1명·책임연구원 2명을 top-3로 출력 + 인접 분야 후보 (반도체기술연구단 양자수송 등)

### C. 부서 검색

사용자: `/kist-finder "AIX전략실"`

LLM 동작:
1. 분류 = `department` (접미사 "전략실")
2. `Read by-dept/AIX전략실.md` 직접 — 부서장(이제현 실장) + 동료 3명이 책임자 우선 정렬되어 있음
3. 그대로 출력

### D. 빈 결과

사용자: `/kist-finder "탱고 댄스"`

LLM 동작:
1. 분류 = `topic`
2. thesaurus에 매칭 없음. `grep -iE "탱고|tango|댄스|dance"` → 0건
3. "공개 지식베이스에 일치 없음" 명시 + KIST 핵심 도메인 안내

## 휴리스틱 변경·thesaurus 보강 절차

본 스킬의 검색 품질을 개선하려면:
1. `references/keyword-thesaurus.md` 에 누락된 한·영 동의어 추가
2. 동작 검증 — 동의어를 새 grep 키로 사용해 의도한 부서가 hit하는지 수동 확인
3. 필요 시 분류 휴리스틱 또는 직책 가중치 표를 본 skill.md에서 직접 수정 (Python 코드 수정 불필요)

회귀 테스트: 다음 13개 시드 쿼리에 대한 기대 동작을 항상 보존:
- `이제현` → AIX전략실 이제현 (실장)
- `양자컴퓨팅` → 양자기술연구단 다수
- `양자역학` → 양자기술연구단 단장·책임연구원
- `이차전지` → 에너지저장연구센터 (정훈기 센터장)
- `단백질 구조` → 의약소재연구센터 등
- `AIX전략실` → 부서 멤버 4명
- `AI` / `인공지능` → 이제현(AIX전략실) 또는 인공지능연구단
- `로봇` → 휴머노이드연구단 단장
- `탄소중립` → 기후·환경연구소
- `뇌과학` → 뇌과학연구소
- `수소` → 수소·연료전지연구단
- `탱고 댄스` → 0건 (정답)

## 참고

- 마스터 목차: `data/index/_TOC.md`
- 동의어 사전: `references/keyword-thesaurus.md`
- 외부 의존: `cheliped-browser` (build/refresh 시에만)
