# paper-curation スキル設計書
- 日付: 2026-07-08
- 状態: 承認済み(ブレインストーミング完了)
- 目的: ユーザーが毎週手作業で行っている新着論文チェック(Semantic Scholar 推薦メール + 国際会議プログラム巡回)を自動化し、選好に合致した論文の週次ダイジェストノートを生成する。
## 要件(確定事項)
| 項目 | 決定 |
| --- | --- |
| 成果物 | 週次ダイジェストノート(`research/curation/2026-Wxx.md`)。判断の主導権は人間に残す。 |
| 収集元 | ① Semantic Scholar 推薦メール(Gmail MCP)② 国際会議プログラム巡回(gist の会議リスト) |
| 選好判定 | 埋め込み類似度による一次絞り込み + LLM 再判定のハイブリッド |
| 実行形態 | `/paper-curation` スキルとして手動/半自動起動。運用が安定したら自動化を検討 |
| 査読フィルタ | 査読なし論文は原則除外。ただし (a) 会議採択済みの arXiv 先行公開は可、(b) 専門性が非常に近い arXiv 論文は例外的に許可 |
## 全体フロー
```
① 収集(2系統並列) → ② 正規化・重複排除 → ③ 埋め込み一次絞り込み → ④ LLM 再判定 → ⑤ ダイジェスト生成
```
## 構成要素
### ① 収集(並列サブエージェント)
**SS メール収集器**
- Gmail MCP で `from:
[email protected]` の直近 7 日(引数で可変)のメールを検索。
- 本文から論文タイトル・リンクを抽出する。抽出は LLM が行う(メール HTML の構造に依存しない)。
**会議プログラム収集器**
- gist(`sre-related-conferences-list.md`)の会議リストを読む。
- 「いま候補収集すべき会議」= 開催日 ±2 か月で accepted papers が公開済みの会議、を LLM が Web 検索で判定。
- 該当会議の accepted papers ページを WebFetch/defuddle で取得し、LLM がタイトルリストを抽出する(会議ごとのパーサ実装は行わない)。
- チェック済み会議・回は状態ファイルに記録し、同じ会議回を毎週再解析しない。
### ② 正規化・重複排除
- 各候補タイトルを `bin/s2.sh`(既存の Semantic Scholar Graph API クライアント)で照会し、正規メタデータ(title / abstract / venue / year / arXiv ID / DOI / publicationTypes)を取得する。
- 査読フィルタをここで適用する。venue が会議リスト上の会議、または S2 メタデータ上で採択記録があるものを通す。arXiv のみのものは④で例外判定に回す。
- 状態ファイル `research/curation/.state.json` に提示済み論文(S2 paperId + 正規化タイトルハッシュ)とチェック済み会議回を記録し、再提示を防ぐ。
- `wiki/sources/` に既に存在する論文(タイトルマッチ)も除外する。
### ③ 埋め込み一次絞り込み
- `scripts/curation/pref-index.py`(新規)が `wiki/sources/` 各ページのタイトル+要約冒頭を nomic-embed-text(ollama、localhost のみ)で埋め込み、`research/curation/.embed-cache.json` にキャッシュする。差分更新(新規 ingest 分のみ埋め込み)。
- 候補の title+abstract を埋め込み、**上位 k 近傍(k=5)の最大類似度**を一次スコアとする。上位 ~40 件を LLM 再判定に渡す。
- ollama 不在時のフォールバック: 既存 BM25 索引(`.vault-meta/bm25/`)による近傍検索。実装は既存 `scripts/rerank.py` の戦略選択パターンを踏襲する。
### ④ LLM 再判定
- 基準文書: `research/curation/profile.md`(研究関心プロファイル)。`wiki/concepts/`・`wiki/sources/` から蒸留して初回生成し、以後**ユーザーが直接編集できる**。月 1 回程度、wiki の成長に合わせて再蒸留する(スキルの `--refresh-profile` 相当の操作)。
- 各候補に対し LLM が以下を付与する:
- スコア(0–100)
- 推薦理由(2–3 文、日本語)
- 関連 wiki ページへの `[[wikilink]]`
- 査読状態の判定(会議採択済み / arXiv 先行公開 / arXiv のみ)
- arXiv のみの論文は「専門性が非常に近い」場合のみスコア 60 以上を許可する。
- 候補数が多い場合はサブエージェントに分割して並列判定する。
### ⑤ ダイジェスト生成
出力: `research/curation/2026-Wxx.md`(ISO 週番号)。
- セクション構成: **必読**(80+)/ **注目**(60–79)/ **境界例**(見送り理由つき、少数)
- 各項目: タイトル・会場/年・スコア・推薦理由・リンク(arXiv/DOI/S2)・関連 wiki ページ
- 末尾に ingest 用コマンド一覧(`/wiki-ingest-paper <URL>` をコピペ実行できる形)
### フィードバックループ
ダイジェストから ingest した論文は `wiki/sources/` に入るため、次週の埋め込み索引に自動反映され選好が強化される。明示的な却下フィードバック機構は初期版では作らない(YAGNI)。
## エラー時の振る舞い
対話セッション内で実行するため、Gmail 検索失敗・会議ページ取得失敗は都度報告してスキップし、取得できた分でダイジェストを生成する。全収集器が失敗した場合のみ中断する。
## ファイル配置
```
.claude/skills/paper-curation/SKILL.md # スキル本体(ワークフロー定義)
scripts/curation/pref-index.py # 埋め込み索引の構築・照会 CLI
research/curation/profile.md # 研究関心プロファイル(人間編集可)
research/curation/.state.json # 提示済み論文・チェック済み会議の状態
research/curation/.embed-cache.json # wiki/sources 埋め込みキャッシュ(git 管理外)
research/curation/2026-Wxx.md # 週次ダイジェスト
```
## 却下した代替案
- **専用 Python パイプライン中心(方式 B)**: 会議ページの HTML が多様で、結局 LLM 解析に頼る部分が残るため、テスト可能性の利点が薄い。埋め込み索引のみスクリプト化する。
- **S2 Recommendations API 中心(方式 C)**: ユーザーが現在チェックしている推薦メールと内容がずれるリスクがある。将来、収集器の 1 つとして追加する拡張点として保留。
- **完全自動 ingest**: wiki の品質管理リスクがあるため、判断は人間に残す。
## 制約・鉄則との整合
- 既存ノート層(`papers/` `notes/` など)には書き込まない。書き込み先は `research/curation/` と `.claude/skills/` のみ。
- `wiki/` 層への書き込みはこのスキルからは行わない(ingest は既存の wiki-ingest-paper に委ねる)。
- 文章は vault の日本語スタイル(常体、コードスイッチング回避)に従う。