scientific-writer について
scientific-writer は、既存の科学論文を複数回の批評、独立した採点、改訂によって改善するスキルです。専門レビュアーと執筆役を連携させ、サンドボックス内のコピーで作業しながら、論文の中心的な発見を維持します。
主な機能
- 01専門レビュアーによる並列評価
- 02基準を固定した独立した査読
- 03文章、図、コードの改訂
- 04ユーザー指定コマンドによる図の再生成
- 05批評と査読結果の形式検証
- 06サンドボックスでの反復とスコア記録
活用シーン
- 01定められた品質基準に沿った論文草稿の改善
- 02主張、データ、図の不整合の発見
- 03中心的な発見を変えずに論文を改訂
- 04書き直しを行わない批評ラウンドの実施
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gaasher/ agent-loop-skills --skill scientific-writerインストール後、Claude Code で/scientific-writerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples/run.example.yamlroles/code_reviewer.mdfigures_judge.mdformatting_judge.mdpeer_reviewer.mdscientific_judge.mdscientific_writer.mdstyle_judge.mdschemas/finding.schema.jsonpeer_review.schema.json詳細
Scientific Writer Loop
成果物は科学論文の原稿(草稿とそのデータセット、図、任意のコード)です。
各イテレーションでは、批評 → 採点 → 改訂を行います。5 人の専門家判定役が具体的な指摘を提示し、独立したpeer_reviewerが同じ評価軸に沿って論文を 0〜100 点で採点し、scientific_writerが文章、図、コードを修正して、ユーザーの <plot_command> を実行し、図を再生成します。スコアが <pass_threshold> を超えるか、予算に達するまでループを繰り返します。すべての作業はサンドボックス内のコピーに対して行われ、ユーザーのオリジナルには一切触れません。
役割(すべてこのフォルダー内にあります):
roles/figures_judge.md、roles/scientific_judge.md、roles/style_judge.md、roles/formatting_judge.md、roles/code_reviewer.md— 5 人の批評役。それぞれが共通のschemas/finding.schema.jsonに準拠した指摘を出力します。roles/peer_reviewer.md— 総合評価を行う採点役(独自の誠実性ルールがあります)。schemas/peer_review.schema.jsonを出力し、passを判定します。roles/scientific_writer.md— 改訂役。コードを修正し → 図を再生成し → 文章を更新します。schemas/finding.schema.json、schemas/peer_review.schema.json— 検証済みの 2 つの出力です。
起動できる場合は起動し、できない場合は代替します。 Claude Code では、実行対象の判定役を実際の Agent サブエージェントとして並列に起動し、次に新しい peer_reviewer を起動してから、scientific_writer を起動します。それ以外の場合は、各役割をその場で引き受けます。あなたがオーケストレーターです。
採点役をこのように設計した理由(誠実性の問題)
peer_reviewer は判定役が批評するのと同じ評価軸で採点します。そのため、判定役の評価への追従、ループを終了させる圧力による採点の水増し、評価基準を攻略しようとする執筆者の出現が懸念されます。roles/peer_reviewer.md はこれらに対処するため、次の要件を設けています。(1)批評を読む前に、論文とデータセットに基づいて各評価軸を再評価し、独立して採点する。(2)「修正済み」という主張を鵜呑みにせず、数値や引用を自ら一部検証する。(3)判定役が見落とした問題を明らかにする。(4)努力や経過したイテレーション数は加点せず、固定され、基準が明確で、再現可能な評価基準を維持する。(5)厳格なゲートを適用し、問題が確認された場合は平均点にかかわらず論文を不合格にする。(6)表面的な要件遵守ではなく、実質を確認する。writer は判定役の具体的な指摘への対応を最適化し、grader は論文を総合的に評価します。そのため、「すべての指摘に対応する」だけで機械的に合格できるわけではありません。
使用する場面
科学論文の草稿がすでにあり、複数の判定役による批評と独立した査読評価を通じて、品質基準を超えるまで改善したい場合に使用します。デフォルトでは、以下の批評 → 採点 → 改訂ループ全体を実行します。例外として、ユーザーが批評のみ(書き直しなし)を希望する場合は、判定役と peer_reviewer による 1 回のラウンドを実行して終了します。白紙の状態から論文を書く場合や、単独の文献調査には使用しません。
セットアップ
バインディングを対話形式で解決します。 作業ディレクトリに loop.run.yaml が存在する場合は読み込み、値を1行で確認して、ループに進みます。それ以外の場合は、Claude Code(AskUserQuestion ツールが利用可能)の場合、各バインディングのもっともらしい値を推定し、推奨オプションとして提示します。他のホストでは、引用符で囲んだプレーンテキストのプロンプトを使って、それぞれを確認します。その後、loop.run.yaml(形式:examples/run.example.yaml)を書き込み、他のファイルを作成する前に、各値(有効な軸の数が4か5か、および文献のライブ/縮退ティアを含む)をすべて確認します。
| binding | 意味 | デフォルト | 推定方法 |
|---|---|---|---|
<draft_path> | 改善対象のドラフト(markdown/text/tex) | — | 作業ディレクトリを調べ、ドラフトらしいファイルを探します |
<dataset_paths> | 主張や図表の根拠となるデータファイル。数値の検証に使います | — | ドラフトの近くにあるデータファイルを探します |
<figures_dir> | ドラフトが参照する図の画像があるディレクトリ | — | ドラフトの近くを調べます。null の場合もあります |
<code_paths> | プロット/結果を生成するソースファイル。空の場合はコード軸を除外します(n_axes=4、code_reviewer なし) | — | プロット/分析スクリプトを探します |
<plot_command> | コードから図/結果を再生成するコマンド。null の場合は図/コードを編集のみとし(「needs regeneration」としてフラグ付けします) | — | pyproject.toml/.venv/README を確認します。例:python3 code/make_figures.py |
<citation_style> | formatting_judge が適用する単一のスタイル(APA|MLA) | APA | ユーザーに確認します |
<target_venue> | 任意。スタイル/長さの基準を適用する投稿先 | — | ユーザーに確認します |
<length_limits> | 任意の要旨/論文の語数目標 | — | ユーザーに確認します |
<intent> | 論文の中心的な発見/貢献を1~2文で記述したもの。固定され、ライターが変更することはできません | — | ドラフトを読み取り、抽出した内容をユーザーに確認します |
<pass_threshold> | peer_reviewer が到達すべき全体スコア(0~100)。ハードゲートがない場合、ループを停止します | 85 | 完璧さを求めない、十分に優れた論文の基準です |
<budget> | 最大反復回数 | 6 | — |
<patience> | 改善のない反復がこの回数連続したら停止します | 2 | — |
<sandbox_root> | 作業コピー、批評、レビュー、台帳を格納する場所 | ./sandbox | — |
文献ツールチェーン。 引用の根拠付け(writer)と検証(scientific_judge、peer_reviewer)は、同階層の 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 を追加すると、キャッシュを再利用できます。セットアップ時に <lit> --help が動作することを確認します。スキルがない場合はユーザーに伝え、リポジトリの loops/literature-search フォルダーを ~/.claude/skills/ にコピーしてインストールするか、すべての検索を WebSearch/WebFetch に切り替えます。キー不要の S2 + arXiv コアは、セットアップなしで動作します。無料の S2_API_KEY があれば、snippet/cite の信頼性が高まります。<lit> keys --init を実行し、表示された keys.env はユーザー自身に記入してもらいます。チャットに秘密情報を絶対に貼り付けないでください。 ティアは(有無のみ)loop.run.yaml に記録します。
環境。 writer は、ユーザー自身の環境でユーザーの <plot_command> を実行して図を再生成します。このコードにはサードパーティーの依存関係(matplotlib、pandas など)が必要な場合があります。そのため、スキルにはそれらが含まれず、インストールもしません。ユーザーのコマンドを外部実行し、再生成された出力を読み取ります。スキルが作成するヘルパーコードは、標準ライブラリーのみを使用します。同階層のスキルにある tools/lit_search.py も、標準ライブラリーのみを使用します。
バインディングの確認後、サンドボックスを一度だけ初期化します(オリジナルをコピーし、元のファイルは絶対に編集しないでください):
<sandbox_root>/
├── loop.run.yaml ← resolved bindings + <intent> + literature_tiers
├── ledger.tsv ← header only (see Ledger)
├── literature/.cache/ ← lit_search on-disk cache
└── iter1/
├── draft.md ← COPY of <draft_path>
├── figures/ ← COPY of <figures_dir>
└── code/ ← COPY of <code_paths> (omit if no code)
ループ
<N> は 1 から始まります。反復 1 では、未変更の草稿(ベースライン)を批評して採点します。その前に改訂してはいけません。反復ごとに新たに採点します。スコアは、改訂後の論文に対する新しいピアレビューのみから得られ、前のスコアを引き継ぐことはありません。表面的な変更ではスコアは変わりません。
このチェックリストをコピーして、項目にチェックを付けてください。
- 批評 — 有効な審査者を並列で起動します(起動できない場合は段階的に縮退)。それぞれが
iter<N>/の作業コピーとデータセットを対象にし、iter<N>/critiques/<reviewer>.jsonを作成します(schemas/finding.schema.jsonに照らして検証)。コードがない場合はcode_reviewerをスキップします。 - 採点 — 新規の
peer_reviewerを 1 つ起動します(roles/peer_reviewer.md)。独立して採点し(まず自分で読み、その後批評と照合)、数値や引用を抜き取り検証して、見落とされた問題を明らかにします。iter<N>/peer_review.jsonを作成します(schemas/peer_review.schema.jsonに照らして検証):有効な軸ごとに 1~5 点、overall_score = 100 × Σscore / (5 × n_axes)、ハードゲート →pass。 - 記録 —
ledger.tsvに 1 行追加します(「台帳」を参照)。 - 停止判定 —
peer_review.pass == true、またはN == <budget>、またはoverall_scoreが<patience>回の反復にわたって横ばいの場合は停止します(「停止条件」を参照)。 - 改訂 —
scientific_writerを起動します(roles/scientific_writer.md)。批評、ピアレビュー、<lit>、<plot_command>、<citation_style>、<intent>を渡します。まずブロック項目/ゲート項目を修正し、コードを修正してから(コピーした<plot_command>をサンドボックス内で実行して図を再生成し)、文章を更新します。新しい引用は<lit>で根拠を確認し、iter<N+1>/{draft.md,figures/,code/}とiter<N+1>/revision_notes.mdを作成します。 -
N = N + 1として繰り返します。
審査者の finding と peer_review の形式は次のとおりです(抜粋。完全な形式は schemas/ を参照):
{"reviewer": "code_reviewer", "iteration": 1, "overall": "block",
"summary": "Block: make_figures.py sorts the two columns independently, fabricating r=0.98 (true r≈0.62).",
"findings": [{"urgency": "must_fix", "action_type": "replace", "area": "make_figures:broken-pairing",
"finding": "xs=sorted(study); ys=sorted(score) destroys per-row pairing; r inflated to 0.98 (real ≈0.62).",
"proposed_action": "Correlate the paired arrays; re-render Fig 1; update r everywhere.",
"target_artifact": "iter1/code/make_figures.py", "evidence": "code/make_figures.py:~70; paired r=0.62"}]}
{"iteration": 1,
"axes": {"figures": {"score": 1, "justification": "Fig 1 plots bug-sorted data; numbers != data.", "blocking_issues": ["fig r=0.98 != paired r=0.62"]},
"scientific": {"score": 1, "justification": "Causal claim from one correlation; r unreproducible."},
"style": {"score": 2, "justification": "Promotional, AI-flavored prose."},
"formatting": {"score": 2, "justification": "Mixed APA/MLA; Results before Methods."},
"code": {"score": 1, "justification": "Independent column sort fabricates r=0.98."}},
"overall_score": 28.0, "pass": false,
"gate_failures": ["make_figures.py sort bug makes r=0.98 an artifact (true 0.62)"],
"issues_judges_missed": ["Methods omits the test used and n."],
"spotchecks": [{"target": "paired Pearson r", "method": "recomputed from data", "result": "refuted"}],
"substance_check": "Baseline iteration — nothing revised yet."}
台帳
<sandbox_root>/ledger.tsv はタブ区切りです。自由記述にコンマを使ってはいけません:
iter overall_score pass figures scientific style formatting code top_fix revision_summary
1 28.0 no 1 1 2 2 1 fix make_figures sort bug baseline (no revision)
2 61.0 no 3 3 3 3 4 report honest r, de-causalize fixed bug+claims; relabeled fig1
3 88.0 yes 4 5 4 4 5 - unified APA; trimmed abstract; balanced sleep claim
コード軸がない場合は、code 列に - を使います。反復ごとの critiques/*.json、peer_review.json、revision_notes.md は iter<N>/ に保存します。予算到達/停滞で停止する場合は、必ず最後の反復とは限らない、最も高いスコアの反復を報告してください。サンドボックスは未追跡のままにします。
制約
<sandbox_root>の外にあるものは、編集も実行もしないでください — セットアップ時に元ファイルを一度だけ読み込み、コピーしてからはコピーのみを使って作業します。<plot_command>もサンドボックスにコピーし、そこから実行します。- データ、数値、図、引用を捏造しないでください — 新しい引用は、実在する
<lit>/WebFetch の取得結果から逐語的に引用します。{"error","fallback"}の場合は、WebSearch/WebFetch に切り替えます。 - 採点基準は固定され、再現可能です — ループを終わらせるために、peer_reviewer が基準を緩めることはありません。確認されたハードゲートは、平均点にかかわらず論文を不合格にします。
<intent>を守ってください — writer は同じ発見を強化します。中核となる結果を変更したり、批評を回避するために実際の発見を削除したりしてはいけません。スコアを上げるために結果を削除するのは不正行為です。- 反復ごとに一貫性のある改訂を 1 回行い、まずブロック項目/ゲート項目に対処して、スコアの変化を改訂に帰属できるようにします。
- インストールは禁止です — このスキルには依存関係が含まれていません。
<plot_command>はユーザーの環境で実行し、ヘルパーコードは標準ライブラリのみを使います。API キーを表示またはコミットしてはいけません(keys.envは gitignore の対象のままにします)。
停止条件
ループは、次のいずれかに最初に該当した時点で停止します。
- 合格 —
peer_review.pass == true。納品物(iter<N>/の成果物)、スコア、推移を報告します。 - 予算 —
N == <budget>。最も高いスコアの反復を納品物として報告します。 - 停滞 —
overall_scoreが<patience>回の反復にわたって横ばいになります。最も高いスコアの反復と、残っているgate_failures/must_fixの阻害要因を報告します。
最後に必ず、納品物の iter<N>/ パス、その overall_score と合否、軸ごとのスコア、ledger.tsv に記録されたスコアの推移を示してください。不合格の場合は、論文が基準に達するまでに残っている阻害要因(gate_failures と未解決の must_fix)も示してください。