让 AI 交付最终结果,而不是复述被否掉的方案。 Ship the result, not the conversation.
我让它做一盘番茄炒蛋,它加了东坡肉;我说去掉,它端上来一盘"番茄炒蛋(无东坡肉)"。
AI 助手在多轮修改后,会把被否决的内容、纠正指令本身回放进最终交付物——标题变成 参数表(不做评分),注释里解释"为什么不用某个方案",回复开头写"已删除第4章",结尾还要加一句"全文不含任何相关字眼"(否认即提及,此地无银三百两)。
一句验收标准:没参加过这次会话的读者,不该从产物里反推出会话历史。
三层机制,各取所需:
| 层 | 形态 | 适合 |
|---|---|---|
| ①两行规则 | 手动粘贴进全局指令 | 所有人,零成本,覆盖大部分场景 |
| ②echo-guard skill | 纯文本 skill,装完即用 | 多轮修改后出重要交付物的人 |
| ③hook 自动提醒 | 可选进阶脚本 | 想要"不靠人记"的可靠性的人 |
把下面两行加进你的全局指令(AGENTS.md / CLAUDE.md / 系统提示词):
- 一切交付物以"编者→读者"口吻生成:读者对本次会话一无所知,从产物中反推不出任何会话历史(包括被否决的方案、纠正过程、修订指令本身)。
- 用户的否决是控制数据:它决定产出什么,但不进入产物;修订请求先翻译成最终形态("去掉评分"="两列表格:参数名/参数说明"),标题等高显著度文本从最终形态重新生成,交付回复直接给结果。
完整版(含保留例外、防误杀条款)见 extras/agents-md-rule.md。
git clone https://github.com/Hansweek/echo-guard.git
# 把 skill 文件夹复制到你的平台目录:
cp -r echo-guard/echo-guard ~/.claude/skills/ # Claude Code
cp -r echo-guard/echo-guard ~/.codex/skills/ # Codex / ChatGPT(或 ~/.agents/skills/)
cp -r echo-guard/echo-guard .cursor/skills/ # Cursor(也兼容读 .claude/skills/)或从 Releases 下载 zip 直接解压到技能目录(zip 根就是 echo-guard/ 文件夹)。装完说一句"用 echo-guard 做终检"验证触发。
skill 是纯文本指令:无脚本、无网络访问、无文件读写、无路径依赖,指令体内零 URL——可用任意文本工具复核。
重要交付靠人记着调用 skill,迟早会忘。支持 hooks 的平台(Claude Code 等)可以配一个 UserPromptSubmit 钩子:检测到用户消息里的修订动词(去掉/删除/移除/换成/remove/delete),自动往对话注入一行终检提醒。脚本和接线范例见 extras/hook-reminder/。
设计原则:hook 注入的是提醒而不是拦截——正则拦不住语义级改写("不做X"换成"按最新口径"就漏了),可靠的路线是"提醒 + 常驻规则"组合。
发布前做过小规模 A/B 对照(独立全新会话;场景:删表格列、删整章、连纠两轮):
- 无规则组:回复开头"已删除第4章'风险与应对'(含两个小节)";连纠后输出"已彻底清理干净……全文不含任何相关字眼"
- 带规则组:直接输出交付物,无叙述、无口号、无误删
样本量小(每组 n=1),欢迎自测。复现技巧:transcript 里保留一轮失败史(助手上一版就翻过车),病灶更容易出现——污染史本身就是诱因。
- 粉红大象:说"别想大象",大象就进了激活状态;被禁止的词在上下文里越禁越活跃
- 证明听话:模型倾向于把"我服从了"渲染成可见文本,服从声明本身成为新的泄漏
- 递归天花板:任何写进上下文的指令(包括反回声规则本身)都可能被复读——所以多层组合比单点规则可靠
相关参考:Anthropic 提示词文档"Tell Claude what to do instead of what not to do";ruff 项目 AGENTS.md 的"someone with no access to the session"验收标准;anthropics/claude-code#65961。
MIT License。设计思想(从最终状态重生成、按交付面检查、保留/删除边界判定)参考并致谢 LB623/no-negative-echo(MIT)。本作为独立重写,场景面向中英文商务文档,新增回复正文受控条款与中文表述变体清单。