| name | rebuttal-writer |
| description | 把 reviewer 评语转成 point-by-point 回应草稿,并通过 3 道安全门(无虚构 / 无空头支票 / 全覆盖)。投稿被拒或 minor/major revision 后由用户显式触发,配合 `reenter_pipeline(reentry_stage="rebuttal_writing", reviewer_feedback_path=...)` 进入。 |
| triggers | ["写 rebuttal","写回应","反驳审稿","rebuttal","point-by-point","审稿回复"] |
| inputs | ["artifacts/reviewer_feedback.json","evidence_graph.json","corpus_ledger.json","artifacts/draft_final.tex"] |
| outputs | ["artifacts/rebuttal_critiques.json","artifacts/rebuttal.md","artifacts/rebuttal_safety_report.json","artifacts/assurance/rebuttal_writing_*.json"] |
| contracts | ["引用必须在 evidence_graph / corpus_ledger 内(safety gate 1)","任何 \"we will\" / \"future work\" / \"in our next version\" 类承诺需要绑定到具体实验/章节(safety gate 2)","每条 critique 都必须被 response 引用回应(safety gate 3)"] |
rebuttal-writer
把 reviewer comments 转成 point-by-point 回应。共 7 个阶段,前 4 个是生成,后 3 个是安全门。每个阶段写到磁盘的中间产物可以被 validator / compliance_checker 直接复核——不依赖 LLM 自述。
本技能由用户显式触发。投稿被拒或拿到 reviewer comments 后:
reenter_pipeline(project_dir, "rebuttal_writing", reviewer_feedback_path="path/to/reviewer_feedback.json")
系统会把 feedback 文件路径写进 project_state.reentry_history。然后 advance_pipeline 进入 rebuttal_writing stage。
输入契约
artifacts/reviewer_feedback.json
由上游(reenter_pipeline)保证存在。本技能视作只读结构,不应改动其 schema。本技能只要求顶层是 dict 或 list,且包含可被解析为「评语单元」的字段(例如 reviews: [...] 或 comments: [...] 或 weaknesses: [...])。Parse 阶段负责适配。
7 阶段流程
Stage 1 — Parse(拆原子 critique)
把 reviewer feedback 拆成一个原子 critique 列表:
{
"critiques": [
{
"id": "R1.1",
"reviewer": "R1",
"severity": "major" | "minor" | "comment",
"text": "原始评语原文",
"claim_reference": "论文第 X 节 / Table N / Eq. M",
"topic": "novelty | experiment | writing | math | citation | scope | other"
}
]
}
写入 artifacts/rebuttal_critiques.json 的 critiques 字段。每条 critique 一条——不要合并、不要漏。
Stage 2 — Classify(3 分类)
对每条 critique 标注 category:
| category | 含义 | 后续策略 |
|---|
legitimate | 评语真实指出了论文中的不足或漏洞 | 修改论文 + 在 rebuttal 中承认并指向修改 |
looks-legit-but-wrong | 评语看起来合理但其实 reviewer 误读了或事实错误 | 在 rebuttal 中礼貌澄清并提供反例 / 引用 |
hallucination | reviewer 凭空说论文有某个东西(实际没有),或要求论文做超出 scope 的事 | 在 rebuttal 中明确指出原文位置 + 礼貌反驳 |
写回 artifacts/rebuttal_critiques.json,给每条 critique 加 category 字段。
Stage 3 — Strategy(响应策略)
为每条 critique 写 response_strategy:
legitimate → 必填字段 paper_revision_pointer(指向论文哪一节会修改)+ response_outline
looks-legit-but-wrong → 必填字段 counter_evidence(必须引用 evidence_graph 中已存在的 claim id 或 corpus_ledger 中的 cite_key)+ response_outline
hallucination → 必填字段 original_paper_location(指原文段落位置)+ response_outline
写回 artifacts/rebuttal_critiques.json。
Stage 4 — Draft(生成 rebuttal.md)
按 category 分组渲染 markdown:
# Response to Reviewers
## Summary of Changes
...
## Response to Reviewer 1
### R1.1 [Category: legitimate]
**Comment.** <critique.text>
**Response.** <response_outline>
We have revised <paper_revision_pointer> accordingly.
### R1.2 [Category: looks-legit-but-wrong]
**Comment.** <critique.text>
**Response.** <response_outline>
As shown in <counter_evidence>, ...
每条 response 必须显式引用回原 critique 的 id(例如 ### R1.1)。这是 safety gate 3 的关键。
Stage 5 — Safety gate 1: No fabrication
逐条检查 response_outline / counter_evidence 中提到的引用:
\cite{xxx} 形式:xxx 必须出现在 corpus_ledger.entries[*].cite_key 中,且对应 entry 的 publishable=true。
- evidence claim 引用(如 "claim_id=c123"):必须出现在
evidence_graph.claims[*].id 中。
任何一条不通过 → 把违规明细写进 artifacts/rebuttal_safety_report.json.gate1,本 stage 不允许 advance(compliance checker 会 block)。
Stage 6 — Safety gate 2: No overpromise
在 artifacts/rebuttal.md 上做 regex + 语义检查:
- 硬 regex 禁用(除非紧邻
paper_revision_pointer):
\bwe will\b (除非后面 30 字内出现 Section\b|Table\b|Figure\b|Appendix\b)
\bfuture work\b(除非整段在显式 ## Future Work / ### Limitations 段落里)
\bin our next version\b
\bbeyond the scope\b(仅在 hallucination 类别允许)
- 输出违规列表到
rebuttal_safety_report.json.gate2。
Stage 7 — Safety gate 3: Full coverage
对 artifacts/rebuttal_critiques.json.critiques[*].id 做覆盖检查:
- 在
artifacts/rebuttal.md 中 grep 每个 critique 的 id(如 R1.1)。
- 缺失的 critique id 写进
rebuttal_safety_report.json.gate3.missing_ids。
- 同时做 fuzzy match:把 critique.text 的前 8 个内容词在 rebuttal.md 中检索,确认 response 实际涉及该 critique(不是只挂个 id)。
三道门全部通过后,complete_stage 才能 advance。
输出契约
{
"gate1_no_fabrication": {
"passed": true,
"violations": []
},
"gate2_no_overpromise": {
"passed": true,
"violations": []
},
"gate3_full_coverage": {
"passed": true,
"missing_critique_ids": []
}
}
与 AssuranceContract 的关系
本技能不直接发射 AssuranceContract——complete_stage() 会在 stage 推进时统一调用 compliance_checker.check_compliance("rebuttal_writing", project_dir),把 3 道门的检查结果嵌入 AssuranceContract.child_verdicts,输出到 artifacts/assurance/rebuttal_writing_*.json。
技能只需要写好上面三个 artifact 文件。