| name | research-wiki |
| description | 누적되는 progress_*.md 위에 Karpathy-style LLM 위키를 유지한다. 세 가지 연산 — ingest(progress 파일을 엔트리/개념 페이지로 접어넣기), query(자연어 연구 질문에 위키 엔트리를 읽어 답변 + 출처 인용), lint(stale/contradiction/orphan/dangling 감지) — 을 지원. "wiki ingest", "wiki query", "wiki lint", "위키에 반영해줘", "~~한 것들 정리해줘" 같은 요청에서 사용. |
research-wiki
progress report 누적본 위에 유지되는, 점진적으로 쌓이는 지식 베이스. Karpathy의 LLM-wiki 패턴을 기반으로 한다: raw source는 불변, 위키는 LLM이 유지, cross-reference로 연결, ingest/query/lint 3연산으로 일관성 유지.
경로
.env 에서 로드 (레포 루트에서 source .env):
REPO # 위키 git 저장소 루트
PROGRESS_ROOT # progress_YYYYMMDD_HHMM.md 가 쌓이는 디렉토리
WIKI # 위키 본체 (git-tracked)
LIVE # 실험 작업 폴더 (read-only)
WIKI_LANG # ko | en (기본 ko)
WIKI_CATEGORIES # 쉼표 구분 카테고리 (기본: attacks,defenses,concepts,findings)
PRIMARY_METRICS # progress 파일에서 뽑아 Latest Numbers 테이블에 우선 노출할 지표 (쉼표 구분, 순서대로). 미지정 시 progress 파일 컬럼 순서 준수
위키 레이아웃
$WIKI/
├── index.md # 카탈로그: 카테고리별 엔트리 목록 + 한 줄 요약
├── log.md # ingest/query/lint 연산 append-only 로그
├── <category>/<name>.md
└── findings/q_<slug>.md # query 가 재사용할 가치 있는 답을 낸 경우에만 작성
기본 카테고리는 attacks/, defenses/, concepts/, findings/. WIKI_CATEGORIES로 변경 가능.
엔트리 페이지 템플릿
templates/entity.md 참조. 핵심 구조:
---
name: <entity-name>
type: <category> # attacks | defenses | concepts 중 하나
status: active | deprecated | superseded
last_updated: YYYY-MM-DD
---
# <Entity display name>
## Summary
<한 단락, 무엇이고 왜 중요한지>
## Latest Numbers
<attack/defense 타입에만 해당 — markdown 테이블>
## Timeline
- YYYY-MM-DD HH:MM · <짧은 노트> · source: `progress_YYYYMMDD_HHMM.md`
- ...
## Cross-references
- [related entity](../<category>/<name>.md)
## Design / Mechanism
<타입에 따라 — 공격이면 payload 구조, 방어면 알고리즘 요약과 알려진 구멍>
연산
1. Ingest
입력: progress_YYYYMMDD_HHMM.md 경로. 생략 시 $PROGRESS_ROOT/progress_*.md 중 최신 파일 기본값.
단계:
- Progress 파일 읽기.
- "Current Status (live)" (또는 상응하는) 테이블 파싱 — 각 행은
(subject, variant, context, progress, primary_metrics...) 형태. Progress 파일의 타임스탬프를 행 datestamp로 사용.
- 각
(subject, variant) 튜플에 대해:
$WIKI/<category>/<subject>.md 를 upsert:
- 없으면 엔트리 템플릿으로 생성.
- Timeline bullet 추가 (datestamp + 한 줄 결과 + 출처 인용).
Latest Numbers 테이블에서 해당 (subject, variant) 행을 최신값으로 교체.
- Frontmatter
last_updated 갱신.
variant 쪽 엔트리 페이지도 같은 방식으로 upsert.
- "Done" 항목 파싱. 신규 엔트리(e.g. "신규 공격 X 구현 완료")가 등장하면 엔트리 페이지를 생성하고 Summary를 문맥에서 pre-fill.
- "Known incidents" 항목 파싱. 개념적 발견(e.g. "X 공격의 masked bypass 실패")이면
$WIKI/concepts/ 에 해당 개념 페이지를 생성하거나 갱신.
$WIKI/index.md 갱신:
- 모든 엔트리 페이지가 해당 섹션 밑에 리스팅되는지 확인.
- 각 엔트리:
- [<name>](<category>/<name>.md) — <Summary 한 줄 hook>.
- 섹션 내 알파벳순 정렬 유지.
$WIKI/log.md 에 append:
- YYYY-MM-DD HH:MM · ingest progress_YYYYMMDD_HHMM.md — touched N attacks, M defenses, K concepts
- 커밋:
cd $REPO && git add wiki/ && git commit -m "wiki: ingest progress_YYYYMMDD_HHMM". push 하지 않음.
Progress 파일 자체를 수정하지 않는다. 불변 source.
2. Query
입력: 자연어 질문 (언어는 WIKI_LANG 또는 사용자 입력 언어를 따름).
단계:
$WIKI/index.md 를 읽고 후보 엔트리 페이지 식별.
- 해당 페이지들 읽기. 페이지가 특정 progress 파일을 참조하고 그것이 문맥에 필요하면 progress 파일도 읽음.
- 답변 합성. 인용 형식:
[entity:<name>], [progress:YYYYMMDD_HHMM], [concept:<name>]. 모든 수치 주장에 인용을 붙인다.
- 답이 substantive(≈100 단어 이상 합성, 재사용 가능성 있음)이면
$WIKI/findings/q_<slug>.md 로 저장:
---
question: <원문 질문>
asked_at: YYYY-MM-DD HH:MM
---
# <질문 재진술>
<인용 포함 본문>
## Sources
- [entity:<name>](../<category>/<name>.md)
- [progress:YYYYMMDD_HHMM](../../progress/progress_YYYYMMDD_HHMM.md)
slug는 짧고 소문자 하이픈(e.g. q_which-attacks-bypass-melon.md).
$WIKI/log.md 에 append:
- YYYY-MM-DD HH:MM · query "<원문 질문, 80자 축약>" → findings/q_<slug>.md (또는 no-finding)
- Finding을 썼으면 커밋:
git add wiki/ && git commit -m "wiki: query <slug>".
3. Lint
입력 없음. 체크 수행 후 리포트 출력.
체크 항목:
- Missing ingests —
$PROGRESS_ROOT/progress_*.md 중 $WIKI/log.md 에 ingest 라인으로 기록되지 않은 것.
- Contradictions — 같은
(subject, variant) 조합의 Latest Numbers 행이 여러 곳에 등장하거나, Timeline bullet이 같은 수치에 대해 별도 설명 없이 다른 값을 주장.
- Stale pages — 엔트리 페이지
last_updated 가 7일 이상 지남 AND 더 최근 progress 파일에서 해당 엔트리를 언급 (→ ingest 때 갱신됐어야 할 페이지).
- Orphans — 엔트리 페이지가
$WIKI/index.md 에서 링크되지 않음.
- Dangling citations — 페이지가 존재하지 않는 progress 파일 또는 존재하지 않는 형제 엔트리를 인용.
출력: 리포트 출력. 자동 수정하지 않음 — 사용자가 결정. 로그에 append:
- YYYY-MM-DD HH:MM · lint — P missing-ingests, Q contradictions, R stale, S orphans, T dangling
호출 규약
research-wiki ingest [path] — 한 파일 ingest. 생략 시 최신 progress 파일.
research-wiki ingest --all — 아직 log에 없는 모든 progress 파일을 시간순으로 ingest.
research-wiki query <question> — 위키에서 답변 생성.
research-wiki lint — 건강성 체크.
제약
- Immutable sources.
progress_*.md 를 절대 수정하지 않음.
- Cite everything. 엔트리 페이지의 모든 수치는
· source: progress_YYYYMMDD_HHMM.md 인용을 붙임.
- No hype. 해석 없이 숫자만 기록. Progress 파일 자체가 해석한 경우에만 인용부 인용.
- Primary metric 우선.
PRIMARY_METRICS 가 설정되면 Latest Numbers 테이블에서 그 순서대로 컬럼 노출. 지정된 메트릭을 숨기거나 재정렬하지 않음.
- 언어 일관성.
WIKI_LANG=ko면 한국어 산문 + 영어 기술 용어. en이면 영어.
- Never push. 사용자가 직접 push. 동일 턴에 사용자가 명시적으로 push 요청한 경우만 예외.
- Never auto-trigger. 명시적 호출 또는 meeting-progress 로부터의 handoff 키워드가 있을 때만.
- Contradictions survive. 두 progress 파일이 같은 수치에 대해 다른 값을 주장하면 둘 다 Timeline에 날짜와 함께 보존. Latest Numbers는 더 최근 값을 보여주되 이전 불일치를 노트로 표시.
- Entity naming. 프로젝트의 canonical 이름을 사용 (예: 공격/방어 이름은 실제 코드의
--attack, --defense 플래그 문자열과 일치).
Handoff from meeting-progress
meeting-progress skill이 새 progress_YYYYMMDD_HHMM.md 를 작성하면 이 skill로 chain 될 수 있다. 두 경로:
- Auto-chain (same-turn handoff). 사용자의 meeting-progress 원 요청에 chaining 키워드(
wiki, ingest, 체이닝, ingest까지, 위키)가 포함돼 있으면 meeting-progress 가 방금 쓴 파일을 인수로 research-wiki ingest 를 바로 호출. 두 번째 프롬프트 불필요.
- Soft suggestion. 그렇지 않으면 meeting-progress 가 한 줄 제안을 출력하고 멈춤. 사용자 승인 후 이 skill 실행.
어느 경로든 ingest 대상은 방금 쓴 파일. 과거 파일의 백필은 명시적으로 research-wiki ingest --all 을 요청해야 함.