
This runs your draft through multiple adversarial rounds where a critic finds problems, a rewriter fixes them, a synthesizer merges the best of both, and three blind judges vote on which version wins. It keeps going until the original wins twice in a row or hits four rounds. Every intermediate artifact gets saved to disk so you can see the evolution. The whole thing depends on spawning isolated sub-agents so each role only sees what they should, no shared context pollution. If you're in Claude Code this works as designed. On claude.ai it degrades to theater since everything shares one context window. Good for high-stakes writing where you'd normally do multiple editing passes yourself, overkill for casual stuff.
$ npx -y skills add jimliu/illustrated-agent-skills --skill adversarial-polish --agent claude-codeInstalls into .claude/skills of the current project.
用独立角色的对抗与盲评替代主观判断,让稿件在"批评→改写→综合→盲评"的循环中自然收敛到最优状态。
单次润色的问题:模型要么过度迎合(你说改我就改),要么过度批判(为了批而批),要么过度折中(两边都不得罪)。结果是稿件被 prompt 的措辞而非内容质量所左右。
对抗式打磨的解法:把每个角色拆成独立视角,各自只看到必要信息,然后让盲评来决定谁赢。赢家成为新基准,循环直到没人能改得更好。
对抗式打磨的一切价值都建立在上下文隔离之上。 如果所有角色共享同一个上下文窗口,模型会不可避免地受到前序角色输出的污染——稻草人的批评会让改写者过度迎合,综合者会偏向后看到的版本,评委会被改写说明暗示。这不是"注意力不集中"的问题,是架构层面的根本缺陷。
每个角色必须作为独立的 sub-agent 生成(spawn)。 这是硬性要求,不是建议。
具体做法:
稻草人 → spawn 一个 sub-agent,prompt 中只包含:任务描述 + 当前版本 A 的文本 + 稻草人角色指令(见下文 prompt 模板)。不包含任何历史轮次的批评、改写、投票信息。
改写者 → spawn 一个新的 sub-agent(在稻草人完成后),prompt 中只包含:任务描述 + 当前版本 A + 稻草人批评报告 + 改写者角色指令。不包含综合者或评委的任何信息。
综合者 → spawn 一个新的 sub-agent(在改写者完成后),prompt 中只包含:任务描述 + "版本甲"和"版本乙"(A 和 B 随机打乱顺序标记)+ 综合者角色指令。不包含稻草人批评报告(综合者不应知道哪个版本是"被批评后改的")。
三位评委 → 同时 spawn 3 个独立 sub-agent(并行执行)。每个评委的 prompt 中只包含:任务描述 + 三个版本(随机标记为 X/Y/Z,打乱顺序,去除所有末尾的改写说明和综合说明)+ 评委角色指令。三位评委之间完全独立,互不可见。
关键原则:
稻草人 prompt:
你是一位挑剔的资深中文科技内容编辑。你的任务是审阅一篇文章,只找问题,不给修复方案。
## 任务描述
{task_prompt}
## 待审阅文章
{current_A_text}
## 你的职责
[...稻草人角色指令全文,见下方"角色 1"章节...]
请直接输出批评报告,不要输出任何前言。
改写者 prompt:
你是一位有能力的中文科技内容作者。你需要根据一份批评报告改写一篇文章。
## 任务描述
{task_prompt}
## 原文
{current_A_text}
## 批评报告
{strawman_critique}
## 你的职责
[...改写者角色指令全文,见下方"角色 2"章节...]
请输出完整的改写版本,不要输出任何前言。
综合者 prompt:
你是一位客观的中文科技内容编辑。你面前有同一任务的两个版本,需要取长补短合成最优版本。
## 任务描述
{task_prompt}
## 版本甲
{randomly_assigned_version_1}
## 版本乙
{randomly_assigned_version_2}
## 你的职责
[...综合者角色指令全文,见下方"角色 3"章节...]
请输出完整的综合版本,不要输出任何前言。
评委 prompt(每位评委相同模板,独立 spawn):
你是一位盲审评委。你需要从三个版本中选出最好的一个。你不知道这些版本的作者或来历。
## 任务描述
{task_prompt}
## 版本 X
{randomly_labeled_version_X}
## 版本 Y
{randomly_labeled_version_Y}
## 版本 Z
{randomly_labeled_version_Z}
## 你的职责
[...评委角色指令全文,见下方"角色 4"章节...]
请直接输出你的排名和理由,不要输出任何前言。
Claude.ai 没有 sub-agent,所有角色在同一个上下文中执行。这意味着真正的上下文隔离无法实现。为了尽可能模拟隔离效果:
获取稿件
创建工作目录
<文章目录>/adversarial-polish/
├── round-0/
│ └── A-original.md # 原始稿件
├── round-1/
│ ├── strawman-critique.md # 稻草人批评
│ ├── B-rewrite.md # 改写版本
│ ├── AB-synthesis.md # 综合版本
│ ├── judge-ballots.md # 三位评委投票
│ └── round-summary.md # 本轮总结
├── round-2/
│ └── ...
├── evolution-log.md # 全程进化日志
└── final/
├── final-article.md # 最终定稿
└── polish-report.md # 打磨报告
确认任务 prompt
保存原始稿件到 round-0/A-original.md
每轮循环包含四个角色 + 一个收敛判断。
⚡ 执行方式:spawn 为独立 sub-agent(使用上方稻草人 prompt 模板)
身份: 一个挑剔的资深读者/编辑。
可见信息: 任务描述 + 当前版本 A(仅此而已,不看历史批评和修改)。
职责:
输出格式:
# 稻草人批评报告 - 第 N 轮
## 总体印象(2-3 句话)
## 问题清单
### 🔴 致命问题
1. [具体位置] [问题描述]
2. ...
### 🟡 显著问题
1. [具体位置] [问题描述]
2. ...
### 🟢 轻微问题
1. [具体位置] [问题描述]
2. ...
## 稻草人总结
- 致命问题 X 个,显著问题 Y 个,轻微问题 Z 个
- 最关键的一个问题是:[...]
保存到: round-N/strawman-critique.md
⚡ 执行方式:在稻草人完成后,spawn 为新的独立 sub-agent(使用上方改写者 prompt 模板)
身份: 一个有能力的作者,接到了修改任务。
可见信息: 任务描述 + 当前版本 A + 稻草人批评报告。
职责:
输出: 完整的改写版本(不是 diff,是完整文章)。
在文章末尾附上改写说明:
---
## 改写说明
- 采纳批评 N 条,忽略 M 条
- 主要改动:[列出 3-5 个关键修改]
- 忽略理由:[解释为什么某些批评不采纳]
保存到: round-N/B-rewrite.md
⚡ 执行方式:在改写者完成后,spawn 为新的独立 sub-agent(使用上方综合者 prompt 模板)
身份: 一个客观的编辑,面前有两个版本,需要取长补短。
可见信息: 任务描述 + 版本 A + 版本 B(随机标记为"版本甲""版本乙",打乱顺序避免位置偏差)。
职责:
输出: 完整的综合版本。
在文章末尾附上综合说明:
---
## 综合说明
- 版本甲贡献:[哪些段落/表达来自甲]
- 版本乙贡献:[哪些段落/表达来自乙]
- 原创融合:[哪些地方做了创造性合并]
保存到: round-N/AB-synthesis.md
⚡ 执行方式:同时 spawn 3 个独立 sub-agent 并行执行(使用上方评委 prompt 模板)。三位评委之间完全隔离,互不可见。
身份: 三位独立评委,只关心"哪个版本最好地完成了任务"。
可见信息: 任务描述 + 三个版本(随机标记为 X/Y/Z,打乱顺序,隐去所有作者信息和改写说明)。
重要: 提交给评委的版本必须去掉末尾的"改写说明"和"综合说明",只保留文章正文。
评判标准:
每位评委独立排名并给出理由,然后用 Borda 计分汇总:
# 盲评投票 - 第 N 轮
## 评委 1
排名:[X > Y > Z] 或其他顺序
理由:[2-3 句话]
## 评委 2
排名:[...]
理由:[...]
## 评委 3
排名:[...]
理由:[...]
## Borda 计分
(第一名 2 分,第二名 1 分,第三名 0 分)
| 版本 | 评委 1 | 评委 2 | 评委 3 | 总分 |
|------|-------|-------|-------|------|
| X | ? | ? | ? | ? |
| Y | ? | ? | ? | ? |
| Z | ? | ? | ? | ? |
## 结果
- 胜出版本:[X/Y/Z](揭晓为 [A/B/AB])
- 得分差距:[大/小/微弱]
保存到: round-N/judge-ballots.md
每轮结束后,检查收敛条件:
安全阀: 最多循环 4 轮。如果 4 轮后仍未收敛,取历史最高分版本作为最终结果。
每轮结束生成轮次总结:
# 第 N 轮总结
- 稻草人发现:🔴 X 个 / 🟡 Y 个 / 🟢 Z 个
- 改写者采纳:M 条批评
- 盲评结果:[版本] 胜出(Borda 分 X 分)
- 收敛状态:streak = N / 未收敛,继续
- 当前最佳版本:[来源说明]
保存到: round-N/round-summary.md
汇总所有轮次的演变过程,保存到 evolution-log.md:
# 稿件进化日志
## 任务描述
[task prompt]
## 进化轨迹
### 第 1 轮
- 稻草人核心批评:[...]
- 改写关键改动:[...]
- 盲评结果:[版本] 胜出
- streak: 0 → N
### 第 2 轮
...
## 收敛分析
- 总轮次:N
- 收敛方式:[A 连续两轮胜出 / 达到最大轮次]
- 最终版本来源:[第 X 轮的 A/B/AB]
- 关键进化点:[稿件在哪些方面有了质的提升]
final/final-article.md):干净的文章正文,不含任何说明final/polish-report.md):
outputs/将以下文件复制到输出目录:
final-article.md — 最终定稿polish-report.md — 打磨报告evolution-log.md — 进化日志使用 present_files 展示最终定稿和打磨报告。
有 sub-agent 时:每个角色必须 spawn 为独立 sub-agent。 这是对抗式打磨的根基,详见上方"执行模型"章节。
每个 sub-agent 只接收其"可见信息"范围内的内容:
所有角色都必须尊重原文的核心观点、态度和风格。打磨是优化表达,不是重写内容。改写者和综合者首先忠于原作者的意图。
评委必须真实评判,不能"为了显示价值而选新版本"。如果原版确实更好,就选原版。真正好的内容能经受住对抗式检验。
每个角色的每次输出都保存为独立文件。这不仅是为了可追溯,也让用户可以在任何阶段介入:
如果用户明确说"快速打磨"或稿件较短(< 1000 字),可以缩减:
默认使用完整模式。
循环中的每一轮结束后,简要向用户报告本轮结果。默认自动继续下一轮,除非:
每轮开始时告诉用户当前状态:
第 2 轮开始(streak=0,上轮 AB 综合版胜出,已替换为新基准) 稻草人正在审视新基准…
Sponsors