scientific-figure について
scientific-figureは、科学データまたは図の概要から図を作成し、独立した批評とルーブリック採点を通じて改善するスキルです。明確な品質基準を満たす科学図表の作成向けで、PNG画像と再描画可能なplot.pyを成果物として出力します。
主な機能
- 01plot.pyの生成とPNGの描画
- 02固定ルーブリックによる図の採点
- 03図の数値と入力データの照合
- 04具体的な批評に基づく反復改善
- 05任意のジャーナル規定と文献の参照
活用シーン
- 01品質基準に沿った科学図表の作成
- 02批評に基づく図の明瞭さの改善
- 03プロット値と元データの照合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gaasher/ agent-loop-skills --skill scientific-figureインストール後、Claude Code で/scientific-figureを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples/run.example.yamlroles/critic.mdgenerator.mdrubrics/rubric.mdschemas/critique.schema.json詳細
科学図のループ
成果物は科学図(レンダリングされた画像と、それを生成する plot.py)です。各
イテレーションでは生成 → 批評+採点を行います。生成担当が描画スクリプトを作成して図をレンダリングし、固定された <goals> メッセージの達成を目指します。敵対的な批評担当が、固定の
rubrics/rubric.md に照らして 0〜100 点で採点し、pass を判定します。その後、生成担当が批評担当の具体的な
findings に基づいて修正します。ループは、採点が <pass_threshold> を超えるか、予算に達するまで続きます。作業はすべてサンドボックス内のコピーで行われます。ユーザーのデータは読み取り専用でコピーされ、編集されることはありません。
担当者(すべてこのフォルダー内):
roles/generator.md—plot.pyを作成・修正し、<render_cmd>を実行してfigure.pngをレンダリングし、 必要に応じて<lit>を使ってドメインの内容を根拠付けます。generation_notes.mdを作成します。roles/critic.md— 敵対的な採点担当です。各ルーブリックの評価軸を独立して再導出し、図の数値をデータと照合して抜き取り確認し、必要に応じて文献に基づいてドメインの網羅性を確認し、schemas/critique.schema.jsonを出力します(採点結果、pass、実行可能な所見)。rubrics/rubric.md— 固定の採点ルーブリックです(批評担当が編集することはありません)。schemas/critique.schema.json— 検証対象となる唯一の出力です。
サブエージェントを起動し、起動できない場合は役割を代替します。 Claude Code では、generator、次にcriticを実際の Agent サブエージェントとして順番に起動します(批評担当には生成担当の図が必要です)。それ以外の環境では、各役割をその場で担います。あなたはオーケストレーターです。
批評担当が自ら採点する理由(誠実さの問題)
批評担当は批評と採点の両方を行うため、ループ終了へのプレッシャーによって採点が甘くなり、生成担当がルーブリックの攻略を試みるおそれがあります。これを防ぐため、roles/critic.md と rubrics/rubric.md では、批評担当が(1)編集することのない固定ルーブリックを適用し、(2)生成担当の説明をそのまま繰り返すのではなく、レンダリングされた図、データ、固定された <goals> から各評価軸を再導出し、(3)「修正済み」という主張を鵜呑みにせず、図の数値の一部を自ら再計算し、(4)固定され、基準に沿った評価基準を維持して、努力や経過したイテレーションに対する加点は行わず、(5)ハードゲートを適用します(データと矛盾する図の値、誤解を招く軸、または実データとして提示された捏造データがあれば、平均点にかかわらず図は不合格になります)。生成担当は具体的な findings に対して最適化します。一方、批評担当は固定された目標に照らして総合的に採点するため、「すべての所見に対応する」だけで機械的に合格を得られるわけではありません。2つの役割を別々のエージェントが担うため、批評担当が生成担当の意図にただ追認することはありません。
使用する場面
科学データ(またはそれを説明するプロンプト)があり、敵対的な批評と採点ルーブリックを用いて、品質基準を超える仕上がりの図をユーザーが求めている場合に使用します。デフォルトでは、以下の生成→批評ループを最後まで実行します。例外として、ユーザーが反復なしで図と批評を1つずつ求めている場合は、生成と批評を1回ずつ行って終了します。論文の執筆や分析の実施、すでに最終版となっている画像のレタッチには使用しません。
セットアップ
バインディングを対話形式で解決します。 作業ディレクトリに loop.run.yaml がある場合は読み込み、値を1行で確認して、ループに進みます。それ以外の場合、Claude Code(AskUserQuestion ツールが使用可能な環境)では、各バインディングの妥当と思われる値を推定し、推奨オプションとして提示します。それ以外の環境では、それぞれを引用符付きのプレーンテキストの質問として尋ねます。次に loop.run.yaml(形式は examples/run.example.yaml)を書き込み、他のファイルを作成する前に、要約した <goals>、ジャーナル仕様が適用されるかどうか、文献の利用可否を含め、すべての値を確認します。
| バインディング | 意味 | デフォルト | 推定方法 |
|---|---|---|---|
<brief> | 作成する図を説明するプロンプトと、図が伝えるべきメッセージ/主張(データがある場合は、データが何を表すかも含む) | — | ユーザーの依頼。文章として貼り付けられている場合は、<sandbox_root>/brief.md に保存します |
<data_paths> | 図で可視化するデータファイル(CSV/TSV/parquet/JSON など)。空の場合 → 例示的/模式的な図(その場合、整合性の軸ではデータへの忠実性ではなく、内部整合性を確認します) | — | 依頼の近くにある作業ディレクトリを調べます。null の場合もあります |
<goals> | 図の伝達目標を示す箇条書き 1~3 項目 — 固定。批評役はこれらに照らして評価し、生成役が目標を放棄することはできません | — | セットアップ時に <brief> から要点を抽出し、ユーザーに一行で確認します |
<render_cmd> | 生成役が作成したプロットスクリプト(iter<N>/plot.py を追記します)を、ユーザーの環境で実行するコマンド/インタープリター — このスキルにはプロット用の依存関係は含まれず、scientific-writer の <plot_command> と同じ契約です | python3 | pyproject.toml/.venv/README を確認します。例:uv run python または仮想環境の python |
<style> | 任意の美的/スタイルガイド、または指定された投稿先ジャーナル/会議 — ジャーナルが指定された場合、セットアップ時に図の仕様を取得し(下記参照)、両方の役割がそれに準拠し、照らして評価します | — | ユーザーに尋ねます。投稿先については <brief> を確認します |
<pass_threshold> | 停止するために批評役が到達すべき overall_score(0~100)。ハードゲートがないことも条件です | 85 | 完璧を要求せず、洗練された出版可能な図を目指します |
<budget> | 反復の最大回数 | 6 | — |
<patience> | 改善が連続して見られない場合に停止するまでの反復回数 | 2 | — |
<sandbox_root> | プロットスクリプト、図、批評、台帳を保存する場所 | ./sandbox | — |
ドメイン軸はバインディングではありません — 批評役が、図に外部ドメインに関する主張(特定のパスウェイ、遺伝子セット、標準ベンチマーク、分類体系、メカニズム、または文献で確立された数値)が含まれているかを自動検出し、ドメイン軸を独自に有効化します。ユーザーが切り替える必要はありません。
文献ツールチェーン(任意、S2 と arXiv のみ)。 ドメインの根拠確認には、兄弟関係にある literature-search スキルを使用します — <lit_skill_dir>(兄弟スキルとしてインストールされます。例:~/.claude/skills/literature-search/)、<lit_py> = python3、<lit> = <lit_skill_dir>/tools/lit_search.py を解決します。キャッシュを再利用するには、サブコマンドの後に --cache-dir <sandbox_root>/literature/.cache を追加します。キー不要の S2 + arXiv コア(<lit> search のデフォルト --source s2、snippet、cite、fulltext)のみを使用してください。--source openalex|both、ask、bgpt は使用しないでください。セットアップ時に <lit> --help が動作することを確認します。スキルがない場合は、すべての情報取得を WebSearch/WebFetch に切り替えます。loop.run.yaml にはティア(存在の有無のみ)を記録します。
すでに取得した情報を再利用し、反復ごとに再検索しないでください。 取得結果はすべて --cache-dir <sandbox_root>/literature/.cache にキャッシュされ、各役割は確認した事実(主張 → 数値/要素 → 出典)を <sandbox_root>/literature/sources.md に追記します。両方の役割はまずその記録とキャッシュを参照し、手元にない論文/スニペットのみを取得します。前の反復ですでに確認された値は、最初から検索し直すのではなく、記録された出典を読み直して再確認します。文献確認の目的は正確性であり、呼び出し回数ではありません — 論文を取得したら、その内容に基づいて作業してください。
ジャーナルのスタイルシート(Web 検索による別経路)。 <style> にジャーナル/会議が指定されている場合、セットアップ時に WebSearch/WebFetch で図のガイドラインを一度だけ取得し、<sandbox_root>/style/journal_spec.md に保存します(列幅の mm 表記、最小フォントサイズ、フォント、線幅、カラーモード、パネルラベルの規則、ファイル要件)。両方の役割はこの単一のキャッシュ済み仕様を読みます — 生成役は仕様に準拠し、批評役は美観/明瞭性の評価軸を仕様に基づいて設定します — そのため、両者が異なる仕様を基準に評価することはありません。これは <lit> とは別のものです。Web 検索はジャーナルのスタイル仕様を探し、<lit>(S2/arXiv)はドメインの内容を確認します。
環境。 ジェネレーターは、ユーザー自身の環境で <render_cmd> を実行して図をレンダリングします。このコードにはサードパーティーの依存関係(matplotlib、pandas など)が必要なため、スキルには一切含まれておらず、インストールも行いません。<render_cmd> をシェルから実行し、レンダリングされた figure.png を読み込みます。SVG ではなく PNG をレンダリングするのは、クリティックが画像を確認できるようにするためです(SVG は XML として読み込まれます)。納品物は figure.png とその plot.py です。plot.py は、ユーザーが再レンダリングして任意のベクター形式に変換するための再現可能なソースです。スキルが作成する補助コードは、すべて標準ライブラリのみを使用します。
バインディングの確認後、サンドボックスを一度だけ初期化します(データは読み取り専用でコピーし、元データは絶対に編集しません):
<sandbox_root>/
├── loop.run.yaml ← resolved bindings + <goals> + literature_tiers
├── brief.md ← <brief> (if pasted as prose)
├── ledger.tsv ← header only (see Ledger)
├── data/ ← read-only COPY of <data_paths> (omit if no data)
├── style/journal_spec.md ← fetched journal figure spec (omit if no journal named)
├── literature/.cache/ ← lit_search on-disk cache
└── iter1/ ← created by the generator
├── plot.py
├── figure.png
├── generation_notes.md
└── critique.json
ループ
<N> は 1 から始まります。既存のベースラインを評価するループとは異なり、毎回ジェネレーターが先に実行されます(批評する入力図はありません)。1 回目の反復ではゼロから作成し、2 回目以降は修正します。毎回、必ず新たに評価します。スコアは、現在の図に対する 新たな 批評のみから算出し、前回のスコアを引き継ぐことはありません。表面的な変更だけではスコアは上がりません。
このチェックリストをコピーして、項目にチェックを付けてください。
- 生成 —
<brief>、<data_paths>、<goals>、<style>(およびstyle/journal_spec.md)、<render_cmd>、<lit>、さらに反復 2 回目以降はiter<N-1>/critique.jsonを指定して、generator(roles/generator.md)を起動します。ジェネレーターはiter<N>/plot.pyを作成・編集し、サンドボックス内で<render_cmd> iter<N>/plot.pyを実行してiter<N>/figure.pngをレンダリングし、ドメインに関する内容の根拠を<lit>に求め、iter<N>/generation_notes.mdを書き込みます。 - 批評と採点 —
iter<N>/figure.png、データ、<goals>を対象に、critic(roles/critic.md)を毎回新規に 1 つ起動し、rubrics/rubric.mdを適用します。各評価軸を個別に 1〜5 で再評価し、図の数値をデータと照合して抜き取り確認を行い、必要に応じてドメインの網羅性を文献で確認し、overall_score = 100 × Σscore / (5 × n_axes)を計算し、ハードゲートを適用してpassを決定し、iter<N>/critique.jsonを書き込みます(schemas/critique.schema.jsonに対して検証します)。 - 記録 —
ledger.tsvに 1 行追加します(「Ledger」を参照)。 - 停止判定 —
critique.pass == true、またはN == <budget>、またはoverall_scoreが<patience>回の反復にわたって横ばいなら停止します(「Stops」を参照)。 -
N = N + 1として繰り返します(Generate に戻り、今度は批評を踏まえて修正します)。
critique は次のような形式です(抜粋。完全な形式は schemas/critique.schema.json を参照):
{"iteration": 2, "summary": "Needs revision: honest now, but the MAPK panel omits ERK and the y-axis lacks units.",
"axes": {"message": {"score": 4, "justification": "Up-regulation reads clearly."},
"aesthetic": {"score": 3, "justification": "Palette not colorblind-safe (red/green)."},
"clarity": {"score": 4, "justification": "Y-axis missing units."},
"integrity": {"score": 4, "justification": "Bar heights match data/levels.csv."},
"domain": {"score": 3, "justification": "MAPK cascade missing ERK node."}},
"overall_score": 72.0, "pass": false, "gate_failures": [],
"spotchecks": [{"target": "group-B bar = 2.4", "method": "recomputed from data/levels.csv", "result": "confirmed"}],
"findings": [{"urgency": "must_fix", "action_type": "add", "area": "domain:incomplete",
"finding": "MAPK cascade panel omits ERK1/2 downstream of MEK.", "proposed_action": "Add ERK node + MEK→ERK edge.",
"target_artifact": "iter2/plot.py", "evidence": "lit snippet: canonical MAPK = RAF→MEK→ERK"}]}
台帳
<sandbox_root>/ledger.tsv はタブ区切りです。自由記述にカンマは使いません:
iter overall_score pass message aesthetic clarity integrity domain top_fix generation_summary
1 52.0 no 3 2 2 4 - label axes + fix palette baseline draft
2 74.0 no 4 3 4 4 3 add missing MAPK nodes (lit) relabeled; colorblind palette; +ERK/MEK
3 88.0 yes 5 4 5 5 4 - rebalanced panels; legend off-data
ドメイン軸が無効な場合(n_axes=4)は、domain 列に - を使用します。反復ごとの critique.json と generation_notes.md は iter<N>/ に保存されます。予算到達またはスコア停滞によって停止する場合は、必ずしも最後ではなく、最高スコアの反復を報告してください。サンドボックスは Git の追跡対象にしないでください。
制約
<sandbox_root>の外にあるものは、絶対に編集も実行もしません。 セットアップ時にデータを読み取り専用でコピーし、ジェネレーターのplot.pyと<render_cmd>はサンドボックス内で実行します。../による外部への脱出は禁止です。- データ、数値、ドメイン要素を捏造してはいけません。実データとして提示する図は、
<data_paths>からレンダリングできなければなりません。データがない場合、図は明らかに説明用・模式的なものとして読み取れる必要があり、偽のデータプロットに見えてはいけません。<lit>から追加するドメイン内容(遺伝子、ノード、ベースライン、報告値)は、その反復で実際に検索して得た情報に基づくものとし、決して創作してはいけません。 - 採点基準は固定され、再現可能です。 ループを終わらせるために、クリティックがルーブリックの基準を緩めることはありません。確認済みのハードゲートがあれば、平均点にかかわらず図は不合格です。
<goals>を守ります。 ジェネレーターは、同じメッセージをより美しく、わかりやすく表現します。高得点を狙うために、意図されたメッセージを省いたり歪めたりしてはいけません。- 各反復では、まとまりのある修正を 1 回だけ行います。 まず阻害要因やゲートを修正し、スコアの変化を特定の修正に結び付けられるようにします。
- インストールは禁止です。 スキルにはプロット用の依存関係が含まれていません。
<render_cmd>はユーザーの環境で実行し、補助コードは標準ライブラリのみを使用します。文献は、キー不要の S2 と arXiv のコアのみを対象とします。API キーを表示したりコミットしたりしてはいけません(keys.envは引き続き Git の追跡対象外にします)。
停止条件
ループは次のいずれかに最初に該当した時点で停止します。
- 合格 —
critique.pass == true。成果物(iter<N>/figure.pngとplot.py)、スコア、軌跡を報告します。 - 予算 —
N == <budget>。スコアが最も高い反復を成果物として報告します。 - 停滞 —
<patience>回の反復にわたってoverall_scoreが横ばいになります。最良の反復と、残っているgate_failures/must_fixの阻害要因を報告します。
最後は必ず、成果物(iter<N>/ のパス)、その overall_score と合否、軸ごとのスコア、ledger.tsv に記録されたスコアの推移、そして合格していない場合は図と基準の間に残っている阻害要因(gate_failures と未解決の must_fix)で締めくくります。