jimliu/adversarial-polish
>- 多轮对抗式稿件打磨技能。通过"批评→改写→综合→盲评"循环,像学术同行评审一样反复打磨稿件直到收敛。所有中间产物(批评、改写、综合、评分)保存为独立文件,完整记录进化过程。当用户说"对抗打磨""反复打磨""深度打磨""多轮润色""盲评打磨""打磨到收敛""帮我把这篇稿子磨一磨""pressure polish""adversarial polish"时触发。也适用于用户说"这篇稿子很重要,帮我好好打磨"或"我需要更高质量的润色"等暗示需要超越单轮润色的场景。注意:如果用户只是要求普通润色,优先使用已有 polish 技能。本技能适合对质量要求极高、愿意花更多时间打磨的稿件。
npx skills add https://github.com/JimLiu/Illustrated-Agent-Skills --skill adversarial-polish
用独立角色的对抗与盲评替代主观判断,让稿件在"批评→改写→综合→盲评"的循环中自然收敛到最优状态。
单次润色的问题:模型要么过度迎合(你说改我就改),要么过度批判(为了批而批),要么过度折中(两边都不得罪)。结果是稿件被 prompt 的措辞而非内容质量所左右。
对抗式打磨的解法:把每个角色拆成独立视角,各自只看到必要信息,然后让盲评来决定谁赢。赢家成为新基准,循环直到没人能改得更好。
对抗式打磨的一切价值都建立在上下文隔离之上。 如果所有角色共享同一个上下文窗口,模型会不可避免地受到前序角色输出的污染——稻草人的批评会让改写者过度迎合,综合者会偏向后看到的版本,评委会被改写说明暗示。这不是"注意力不集中"的问题,是架构层面的根本缺陷。
每个角色必须作为独立的 sub-agent 生成(spawn)。 这是硬性要求,不是建议。
具体做法:
关键原则:
稻草人 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 # 打磨报告
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 综合版胜出,已替换为新基准)
> 稻草人正在审视新基准…
Take jimliu/adversarial-polish from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.