mcpField
S
scientific-figure

scientific-figure

github.com/gaasherデータ・データベース17838 回インストール17 週間前に更新
リポジトリ

scientific-figure について

scientific-figureは、科学データまたは図の概要から図を作成し、独立した批評とルーブリック採点を通じて改善するスキルです。明確な品質基準を満たす科学図表の作成向けで、PNG画像と再描画可能なplot.pyを成果物として出力します。

主な機能

  1. 01plot.pyの生成とPNGの描画
  2. 02固定ルーブリックによる図の採点
  3. 03図の数値と入力データの照合
  4. 04具体的な批評に基づく反復改善
  5. 05任意のジャーナル規定と文献の参照

活用シーン

  1. 01品質基準に沿った科学図表の作成
  2. 02批評に基づく図の明瞭さの改善
  3. 03プロット値と元データの照合

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/gaasher/agent-loop-skills --skill scientific-figure

インストール後、Claude Code で/scientific-figureを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

examples/
run.example.yaml
roles/
critic.md
generator.md
rubrics/
rubric.md
schemas/
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> と同じ契約ですpython3pyproject.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)で締めくくります。

コメント