# 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 の日本語スタイル(常体、コードスイッチング回避)に従う。