content-refinement-agent について
content-refinement-agentは、論文草稿を反復的に評価・修正するPaperOrchestraのスキルです。評価基準に沿ったレビュー、根拠の確認、修正履歴の記録を組み合わせ、決定的なルールで採用・差し戻し・停止を判断します。
主な機能
- 01評価基準に沿った査読のシミュレーション
- 02主張と実験記録の照合
- 03構成レビュー用の逆アウトライン作成
- 04修正とレビュー指摘の追跡
- 05草稿の採点と判定区分の算出
- 06反復の採用・差し戻し・停止
活用シーン
- 01複数回のレビューで論文草稿を改善
- 02根拠のない数値主張を特定
- 03採用された草稿スナップショットを選択
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ar9av/ paperorchestra --skill content-refinement-agentインストール後、Claude Code で/content-refinement-agentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/ai-failure-modes.mdclaim-evidence-map.mdda-reviewer.mdhalt-rules.mdprompt.mdreverse-outline.mdreviewer-rubric.mdsafe-revision-rules.mdwriting-quality-check.mdscripts/apply_worklog.pyconcession_guard.pydecision_band.pyreverse_outline.pyscore_delta.pyscore_trajectory.pysnapshot.pytest_reverse_outline.pyupdate_critique_memory.py詳細
コンテンツ改良エージェント(ステップ 5)
PaperOrchestra のコンテンツ改良エージェントを忠実に実装したものです (Song et al., 2026, arXiv:2604.05018, §4 Step 5, App. F.1 pp. 49–51)。
コスト:約5~7回の LLM 呼び出し(App. B)。通常、約3回の改良イテレーションを行い、それぞれレビュー担当の呼び出し1回と改訂担当の呼び出し1回で構成されます。
論文では、このステップが全体的な品質向上に大きく寄与する要素の一つとして取り上げられています。改良だけで、採択率が絶対値で +19%(CVPR)、+22%(ICLR)向上します(Fig. 4)。このステップを適切に実施してください。
入力
workspace/drafts/paper.tex— ステップ4の出力workspace/inputs/conference_guidelines.mdworkspace/inputs/experimental_log.md— ハルシネーションのチェックで正解データとして使用workspace/citation_pool.json/workspace/refs.bib— 使用を許可された参考文献
出力
workspace/refinement/iter1/、iter2/、iter3/— 各イテレーションのスナップショット。paper.tex、paper.pdf、review.json、score.jsonを含みますworkspace/refinement/worklog.json— 判断の追記専用履歴workspace/final/paper.texとworkspace/final/paper.pdf— 最良の採用済みスナップショットのコピー
改良ループ
prev_score = score(paper.tex) # baseline from initial draft
snapshot iter0/
for iter in 1..ITER_CAP (default 3):
1. simulate_review(paper.tex) → review.json
(uses `references/reviewer-rubric.md` rubric)
2. apply_revision(paper.tex, review.json) → new_paper.tex
(uses verbatim Refinement Agent prompt at `references/prompt.md`)
3. snapshot iter<N>/ with new_paper.tex, review.json
latexmk -pdf new_paper.tex → iter<N>/paper.pdf
4. score(new_paper.tex) → curr_score
5. decide via score_delta.py:
- if curr.overall > prev.overall: ACCEPT
- elif curr.overall == prev.overall and net_subaxis ≥0: ACCEPT
- else: REVERT
6. apply_worklog.py to append the decision
7. if REVERT or no actionable weaknesses or iter == ITER_CAP: HALT
paper.tex ← new_paper.tex (only on ACCEPT)
prev_score ← curr_score
cp <best iter>/paper.tex → workspace/final/paper.tex
HALT 時の「最良」スナップショットは、採用された総合スコアが最も高いものです。REVERT による HALT の場合、最良のスナップショットは、差し戻しの直前のイテレーションです。
手順
0. 洗練前の整合性ゲート
初稿のスナップショット作成や採点の前に、以下の2つのゲートを順番に実行します。
ゲート A — AI の失敗モード(references/ai-failure-modes.md を読み込み、1回実行):
references/ai-failure-modes.md(skills/shared/ai_failure_modes.md を参照)を読み込みます。
初稿と入力に対して7つすべてのチェックを実行します。このゲートを実行するのは、イテレーション1の開始時の1回のみです。
- 失敗が確認された場合 →
worklog.jsonに HALT エントリーを記録し、ユーザーに報告して停止します。 - 失敗の可能性がある場合 →
paper.texに WARNING コメントを追加し、worklog.jsonに記録して続行します。 - 失敗がない場合 → 続行します。
ゲート B — 主張と根拠の出所(1回実行、警告ゲート):
python skills/paper-orchestra/scripts/claim_evidence_gate.py \
--paper workspace/drafts/paper.tex \
--log workspace/inputs/experimental_log.md \
--out workspace/claim_evidence_report.json \
--out-md workspace/claim_evidence_map.md
このゲートでは、初稿内のすべての数値を supported(値が experimental_log.md に記載されている)、attributed(文に引用または先行研究への言及がある)、needs evidence(どちらにも該当しない)に分類します。確認事項となるのは最後のカテゴリーのみです。references/claim-evidence-map.md を参照してください。
終了コード 0 → PASS。通常どおり続行します。
終了コード 1 → WARN:根拠のない数値主張が見つかりました。worklog.json に次のように記録します:
{gate: "claim_evidence", status: "WARN", unsupported_count: N, report: "workspace/claim_evidence_report.json"}
workspace/claim_evidence_map.md の needs evidence に該当する行を、ステップ3で改訂エージェントに追加指示として渡します:「以下の値は論文に記載されていますが、experimental_log.md で裏付けられず、引用もありません。ログに記録された値を使って述べ直すか、出典を明記するか、主張を削除してください。数値を正当化するために、文を曖昧な表現に弱めてはいけません。」2回のイテレーション後も残っている行は、再度言い換えるのではなく削除します。
ゲート B の警告を理由に停止してはいけません。改訂エージェントが対処します。
ゲート C — リバースアウトライン(1回実行、参考情報):
python skills/content-refinement-agent/scripts/reverse_outline.py \
--paper workspace/drafts/paper.tex \
--out workspace/reverse_outline.md \
--json workspace/reverse_outline.json
初稿を段落ごとに1行、つまり各段落のトピックセンテンスだけに要約し、トピックセンテンスがない段落、メッセージが2つある段落、引用を羅列している段落にフラグを立てます。最初の査読者への依頼の前に workspace/reverse_outline.md を読み、Logical Flow の評価軸への入力として査読者への依頼に渡します。構成上の問題は、改訂計画に 並べ替え/統合/分割/削除 の指示として加えます。文単位の書き換えでは順序の問題を解決できません。また、順序が不適切なセクションの推敲に費やしたイテレーションも予算に含まれます。references/reverse-outline.md を参照してください。
ゲート D — 研究ブリーフを読む(実行のたびに、終了コードなし):
workspace/research_brief.md が存在する場合は、査読者への依頼を行う前に必ず読みます。§4 の「根拠が薄かったセクション」のリストを、追加のコンテキストとして悪魔の代弁者役の査読者に渡します。これにより、最もリスクの高いセクションが重大な精査の対象になります。
0b. 初稿のスナップショットを作成する
python skills/content-refinement-agent/scripts/snapshot.py \
--src workspace/drafts/paper.tex \
--dst workspace/refinement/iter0/
これにより iter0/paper.tex が作成されます。次に、コンパイルして iter0/paper.pdf を生成します。
cd workspace/refinement/iter0/ && latexmk -pdf -interaction=nonstopmode paper.tex
採点して(以下のステップ1を参照)→ iter0/score.json に出力します。
1. 査読をシミュレートする
1 から始まる各反復 N について、次の手順を実行します。
文章品質の事前チェック(各反復の開始時):
references/writing-quality-check.md を読み込み、現在のドラフトに対して 5 カテゴリー(カテゴリー A〜E)のチェックリストを実行します。違反を記録し、改訂アジェンダに追加します。
査読者への呼び出し前に批評メモリを更新する(iter N ≥ 2 の場合のみ。iter 1 はスキップします):
python skills/content-refinement-agent/scripts/update_critique_memory.py \
--worklog workspace/refinement/worklog.json \
--review workspace/refinement/iter<N-1>/review.json \
--iter <N> \
--out workspace/refinement/critique_memory.json
これにより、focus_on(継続中の未解決の問題)と do_not_reflag(すでに解決済みの問題)を含む critique_memory.json が生成されます。次の 2 つのリストを、そのまま査読者のシステムプロンプトに埋め込みます。
CRITIQUE MEMORY — you must honour this before reviewing:
FOCUS ON (flagged in prior iterations, not yet resolved — prioritise these):
<critique_memory.focus_on items, one per line>
DO NOT RE-FLAG (already addressed in prior iterations):
<critique_memory.do_not_reflag items, one per line>
これにより、すでに修正済みの問題が査読者によって再び指摘されるのを防ぎ、本当に行き詰まっている問題の見落としを防ぎます。
現在のドラフトの逆アウトラインを再生成し(reverse_outline.py、Gate C)、workspace/reverse_outline.md を査読者へのユーザーメッセージに含めます。査読者は文章の印象ではなく、トピックセンテンスの順序に基づいて論理的な流れを評価します。これにより、この評価軸は文体上の理由ではなく、構造上の理由で変化します。
references/reviewer-rubric.md を、シミュレートする査読者への呼び出しのシステムプロンプトとして読み込みます。査読者は iter<N-1>/paper.pdf(ホスト側の LLM が PDF 入力に対応していない場合は paper.tex)を読み、長所、短所、質問、および評価軸ごとのスコアを含む JSON を出力します。
この評価基準は、論文で選定された評価者である AgentReview(Jin et al., 2024)を模倣するように構成されています。references ディレクトリには忠実な評価基準を用意しており、実際の査読はホストエージェントの LLM が行います。
悪魔の代弁者の査読者: シミュレートする査読者のうち 1 人を、references/da-reviewer.md に従って DA に指定する必要があります。DA は表面的な仕上がりではなく、第一原理に立ち返って中核的な主張(因果関係の過剰な主張、アブレーションの網羅性、ベースラインの公平性、一般化に関する主張、新規性の誇張)に異議を唱えます。DA が CRITICAL と判断した問題が、すべての査読者の意見を踏まえた後も未解決の場合、その問題は評価基準のスコアにかかわらず「改訂を承認」の判断を阻止します。DA の CRITICAL な指摘は、worklog.json に {da_critical: true, finding: "..."} の形式で記録します。
各ラウンドの DA による指摘と譲歩の判断を workspace/refinement/da_concessions.json に記録し(スキーマは references/da-reviewer.md を参照)、譲歩のしきい値プロトコルを決定論的に適用します。これにより、シミュレートされた DA が迎合的に譲歩するのを防ぎます。
python skills/content-refinement-agent/scripts/concession_guard.py \
--log workspace/refinement/da_concessions.json \
--out workspace/refinement/iter<N>/da_guard.json
# exit 0 = clear; exit 1 = standing CRITICAL → force REVERT this iteration;
# exit 2 = a concession was rejected (caving/consecutive) → DA must restate;
# exit 3 = schema error.
このガードは、rebuttal_score < 4 での譲歩、または直前のラウンドでも譲歩している場合の譲歩を拒否し、該当する指摘を「standing」に戻します。standing の CRITICAL(終了コード 1)がある場合、ACCEPT は REVERT に上書きされます。
workspace/refinement/iter<N>/review.json に保存します。
2. ドラフトを評価する
査読者への呼び出しでは、定性的なフィードバックと評価軸ごとのスコアの両方が出力されます。
{
"axis_scores": {
"scientific_depth": {"score": 65, "justification": "..."},
"technical_execution": {"score": 70, "justification": "..."},
"logical_flow": {"score": 60, "justification": "..."},
"writing_clarity": {"score": 55, "justification": "..."},
"evidence_presentation":{"score": 72, "justification": "..."},
"academic_style": {"score": 68, "justification": "..."}
},
"overall_score": 64.5,
"decision_band": "Major Revision",
"strengths": [...],
"weaknesses": [...],
"questions": [...]
}
iter<N>/score.json に保存します。(ホストが 1 つの文書を出力する場合は review.json と統合します。スキーマは重複しています。)
decision_band は overall_score から決定論的に導出されます。Accept(≥80)/Minor Revision(65–79)/Major Revision(50–64)/Reject(<50)です。スコアとの不一致を防ぐため、手入力ではなく python skills/content-refinement-agent/scripts/decision_band.py --score-json iter<N>/score.json を実行して設定します。この評価区分は、ステップ 5 の目標達成による停止判定に使用されます。
3. リビジョンを適用する
references/prompt.md の逐語的な Content Refinement Agent プロンプトを読み込みます。
Anti-Leakage Prompt を先頭に追加します。入力:
paper.tex— 現在のドラフトpaper.pdf— コンパイル済み PDF(利用可能な場合はマルチモーダルコンテキスト)conference_guidelines.mdexperimental_log.md— 数値に関する主張のグラウンドトゥルースworklog.json— これまでの変更履歴citation_pool.json— 使用可能な参考文献reviewer_feedback— Step 1 の JSON
このプロンプトは、モデルに弱点への対処、質問への回答の反映、および次の2つの出力ブロックの生成を指示します。
- worklog JSON
{addressed_weaknesses[], integrated_answers[], actions_taken[]} - 改訂後の LaTeX コード全文
改訂後の LaTeX を iter<N>/paper.tex として保存します。apply_worklog.py を使って worklog JSON を workspace/refinement/worklog.json に追記します。
4. コンパイルして再採点する
cd workspace/refinement/iter<N>/ && latexmk -pdf -interaction=nonstopmode paper.tex
次に、新しいドラフトでシミュレーションによるレビューを再実行し、新しいイテレーションの score.json を更新します。(これは「改訂後の再採点」呼び出しです。)
5. 採用/差し戻しを決定する
呼び出し側のループでは CONSECUTIVE_SMALL(初期値は 0)を管理し、各呼び出しで渡す必要があります。これにより score_delta.py が停滞を検出できます。
python skills/content-refinement-agent/scripts/score_delta.py \
--prev workspace/refinement/iter<N-1>/score.json \
--curr workspace/refinement/iter<N>/score.json \
--plateau-threshold 1.0 \
--plateau-streak 3 \
--accept-threshold 80 \
--consecutive-small $CONSECUTIVE_SMALL \
> workspace/refinement/iter<N>/delta.json
EXIT=$?
# Update streak for next iteration:
CONSECUTIVE_SMALL=$(python3 -c "
import json
d = json.load(open('workspace/refinement/iter<N>/delta.json'))
print(d['consecutive_small'])
")
終了コード:
0— ACCEPT(全体スコアが改善または同点で、サブ軸の純変化が非負、Accept 帯未満で、停滞していない)1— REVERT(全体スコアが低下)2— REVERT(全体スコアは同点だが、サブ軸の純変化が負)4— HALT_PLATEAU(採用されたが、閾値未満のイテレーションが N 回連続したため早期終了)5— HALT_TARGET_MET(採用され、Accept 帯に到達。全体スコア ≥ 80 のため終了)
動作:
- ACCEPT(終了コード 0):
iter<N>/paper.texを新しい最良版として保持します。イテレーション N+1 に進みます。 - REVERT(終了コード 1 または 2):
iter<N-1>/paper.texを正本としてコピーし、終了します。 - HALT_PLATEAU(終了コード 4):現在の版を保持します(採用済みです)が、終了します。それ以降のイテレーションで有意な改善が得られる可能性は低いためです。実際には、リファインによる改善の約 85% はイテレーション 1 で得られます。以降のイテレーションで 3 回連続して改善が 1 ポイント未満の場合、停滞として判定されます。
- HALT_TARGET_MET(終了コード 5):現在の版を保持します(採用済みです)が、終了します。論文は Accept 帯(全体スコア ≥ 80)に到達しているため、反復を続けて後退のリスクを負う理由はありません。実行レポートでは、
delta.jsonにdecision_band_prev/decision_band_currが記録されます。
例外 — DA CRITICAL。 このイテレーションで concession_guard.py(Step 1)が終了コード 1 を返した場合、score_delta.py が ACCEPT と判定していても、結果を REVERT として扱います。iter<N-1>/paper.tex にロールバックし、次の改訂で未解決の CRITICAL 指摘に対処する必要があります。
必ず apply_worklog.py --decision ... を使って判定を記録してください。
6. 停止ルール
次のいずれかに該当した場合、ループを停止します。
- イテレーション数が
ITER_CAP(デフォルトは 3)に達した。 score_delta.pyが終了コード 1 または 2(REVERT)を返した、またはconcession_guard.pyが終了コード 1 を返した(未解決の DA CRITICAL → 強制 REVERT)。- シミュレーションによるレビューの
weaknessesリストが空である(適用可能なフィードバックがない)。 score_delta.pyが終了コード 4(HALT_PLATEAU — 停滞による早期終了)を返した。score_delta.pyが終了コード 5(HALT_TARGET_MET — Accept 帯に到達、全体スコア ≥ 80。現在のドラフトを昇格)を返した。
7. 最良のスナップショットを昇格する
採用されたイテレーションのうち、overall_score が最も高いものを特定します(最新の採用済みイテレーション、または後のイテレーションが差し戻された場合はそれ以前のイテレーション)。次をコピーします。
cp workspace/refinement/iter<best>/paper.tex workspace/final/paper.tex
cp workspace/refinement/iter<best>/paper.pdf workspace/final/paper.pdf
その後、最終レポートでユーザーに次の情報を伝えます。
- 実行したイテレーション数
- 最終的な全体スコアとその判定帯(Accept / Minor / Major / Reject)
- スコアの推移と判定帯(例:「iter0 58.0 Major → iter1 67.3 Minor (accept) → iter2 81.0 Accept (halt: target met)」)
- 昇格したイテレーションと停止理由(revert / plateau / target met / iter cap / DA critical)
重大な安全上の制約(付録 F.1、50~51 ページ)
論文では、Refinement Agent の初期バージョンが「不足しているベースラインを制約として表面的に列挙し、評価スコアを人為的に引き上げることで、自動レビュアーの採点関数を悪用した」と明示されています。逐語的なプロンプトではこれを禁止しています。必ず遵守してください:
- [IRON RULE] スコアが低下したら停止します。
score_delta.pyが終了コード 1 または 2(REVERT)を返した場合、直ちに前のスナップショットに戻し、停止してください。スコア低下後の修正は一切認められません。 - [IRON RULE] 修正時に新たな実験を行わないでください。 新たな実験、アブレーション、ベースラインを求めるレビュアーの要求は無視してください。Refinement Agent の役割は見せ方を整えることであり、新たな科学的知見を生み出すことではありません。レビュアーが不足データを求めても、その指摘は単に見送り、実験を捏造したり、それを約束する「今後の課題」の項目を追加したりしてはいけません。
- [IRON RULE] 数値に関する主張はすべて experimental_log.md と一致させてください。 エージェントが新たな数値を加えることはできず、既存の数値を提示し直すことしかできません。改訂版の論文に記載された数値が experimental_log.md にない場合、それは幻覚です。
- 制約を明示的に述べてはいけません。 「私たちはこれを制約として認識しています」という表現は禁止です。モデルは説明を明確にすることで弱点に対処できますが、制約を防御的に列挙して評価者を欺いてはいけません。
これらのルールにより、報酬ハッキングを防ぎ、改訂ループの誠実性を保ちます。
リソース
references/prompt.md— 付録 F.1 の Content Refinement Agent プロンプト(逐語)references/reviewer-rubric.md— AgentReview 形式の採点基準(6 軸)references/halt-rules.md— 形式的な疑似コードによる承認/差し戻し/停止のロジックreferences/safe-revision-rules.md— 報酬ハッキング防止の制約references/writing-quality-check.md— AI らしい文章を避けるための 5 項目チェックリスト(共有ファイルへのポインター)references/ai-failure-modes.md— 最初のイテレーション前に実行する 7 モードの整合性チェック(共有ファイルへのポインター)references/da-reviewer.md— Devil's Advocate レビュアーのプロトコルと譲歩ルールreferences/claim-evidence-map.md— NEW 3 つの主張ステータスと、改訂アジェンダでの活用方法references/reverse-outline.md— NEW 段落のフラグが示す内容と、リバースアウトラインの読み方scripts/score_delta.py— 2 つのスコア JSON から承認/差し戻し/停止を判定。判定区分と目標達成時の停止(終了コード 5)を出力scripts/decision_band.py— 全体スコアを標準の判定区分(Accept/Minor/Major/Reject)に対応付けscripts/concession_guard.py— DA の譲歩しきい値プロトコルを適用し、未解決の CRITICAL がある場合は承認をブロックscripts/score_trajectory.py— 寸法ごとのスコア履歴、低下、停滞を検出scripts/reverse_outline.py— NEW トピックセンテンスのアウトラインと段落構造のフラグscripts/apply_worklog.py— イテレーションの項目を worklog.json に追記scripts/snapshot.py— ロールバック用に paper.tex/paper.pdf を iter/ にコピーscripts/update_critique_memory.py— NEW worklog とレビューから critique_memory.json を作成/更新(AutoSci に着想を得たレビュアーメモリ)skills/shared/writing_quality_check.md— AI らしい文章を避けるための完全版チェックリスト(5 項目)skills/shared/ai_failure_modes.md— AI 研究における失敗モードの完全版チェック(7 モード)skills/shared/handoff_schemas.md— パイプラインの全ステップ間の正式なデータ契約skills/shared/research_brief_template.md— NEW リサーチブリーフのスキーマ(最初のレビュアー呼び出し前に §1~§4 を読むこと)skills/shared/section_rhetoric.md— NEW セクションごとの構成テンプレート。セクション別チェックリストは、レビュアーの Logical Flow 軸の評価に反映されます