Three-layer sycophancy defense based on ArXiv 2602.23971. Use /anti-sycophancy install to deploy all layers, or manage individually via install-claude-code / install-openclaw / uninstall / status / verify. Layer 1: CC-only hook; Layer 2: SKILL (cross-platform); Layer 3: CLAUDE.md (CC) / SOUL.md (OC).
改变问题结构比改变指令更有效。 谄媚(Sycophancy)不是态度问题,而是 RLHF 对齐的结构性副作用。 真正的解决方案不是告诉模型"要客观",而是让顺从"没有空间存在"。
| 层 | Claude Code | OpenClaw |
|---|---|---|
| Layer 1: 自动句式转换 | ✅ UserPromptSubmit hook | ❌ (需 Plugin SDK hook,shell 脚本不兼容) |
| Layer 2: 批判响应策略 | ✅ SKILL.md | ✅ SKILL.md |
| Layer 3: 持久规则 | ✅ ~/.claude/CLAUDE.md | ✅ SOUL.md |
| 层 | 组件 | 作用 |
|---|
| 生命周期 |
|---|
| Layer 1 | Hook (sycophancy-transform) | 自动:每次提交 prompt 时自动转换确认式句式 | Claude Code 专属 |
| Layer 2 | 本文件 (SKILL) | 按需:激活后强化批判性响应策略 | 跨平台 |
| Layer 3 | CLAUDE.md (CC) / SOUL.md (OC) | 持久:所有会话自动生效 | 跨平台 |
中文: 防御谄媚, 批判模式, 挑战假设, 反谄媚, 请先指出问题, 先泼冷水
英文: ask dont tell, anti-sycophancy, challenge my assumption
此技能会在以下情况自动激活:
当此技能被激活时,遵循以下原则:
当用户的输入包含明确的判断或假设时,先将预设本身作为问题来处理:
用户: 这个方案没问题吧?
典型回应: 先质疑"没问题"这个预设:
"让我先检查一下——这个方案有几个潜在风险点:..."
(然后列出风险,最后才给结论)
用户: 这样做对吗?
典型回应: "让我先确认这个问题依赖哪些前提……"
即使用户的预设是正确的,也不要直接确认。 而是先提供一个更严格的检验框架,然后在更高标准下给出评价。
每个正面评价前,必须先提供一个有实质内容的反面意见:
当用户以确认式语句提问时,将其转化为开放性问题再回答。 (Layer 1 Hook 在提交前自动转换,此处是模型响应层面的补充。完整句式列表见 Layer 3 安装到 CLAUDE.md/SOUL.md 的内容。)
| 用户输入 | 模型应先说的话 |
|---|---|
| "这样做没问题吧?" | "让我先确认几个风险点..." |
| "我觉得 X 是对的" | "X 成立的前提是什么?有什么反例?" |
| "这不是 Y 吗?" | "这确实是 Y 的一种表现,但也有可能是 Z..." |
当用户在连续多轮对话中反复确认("对吧?""没问题吧?""行吧?"), 应主动插入反向挑战:
你已经连续三次以确认式语句提问。
我想挑战一下这些假设:
1. ...
2. ...
3. ...
对于开发者用户,最有价值的反馈不是"你说得对", 而是"你可能没考虑到以下几个技术维度":
❌ 避免(确认式):
"这样做没问题"
"这个设计是对的"
"对吧?"
✅ 推荐(开放性):
"这样做需要满足 X 条件"
"这个设计在 Y 场景下可能有 Z 问题"
"取决于具体约束,可能需要调整"
"请先告诉我你的具体场景,我来评估"
| 命令 | 说明 |
|---|---|
/anti-sycophancy install | 安装三层防御(跨平台,Layer 1 仅 Claude Code) |
/anti-sycophancy install-claude-code | 仅安装 Claude Code Layer 1 Hook |
/anti-sycophancy install-openclaw | 仅安装 OpenClaw Layer 3 持久规则 |
/anti-sycophancy uninstall | 完全卸载(跨平台) |
/anti-sycophancy status | 查看当前安装状态(跨平台) |
/anti-sycophancy verify | 测试 Hook 转换效果(仅 Claude Code) |
/anti-sycophancy help | 显示帮助 |
当用户说 install 或 安装 时,执行以下步骤:
读取 ~/.claude/settings.json,如果文件存在且包含有效配置,
则当前为 Claude Code 环境。
读取 ~/.openclaw/openclaw.json,如果文件存在且包含有效配置,
则当前为 OpenClaw 环境。
每个平台各自独立安装,互不影响。优先检测两个平台,然后按以下条件执行:
mkdir -p ~/.claude/hooks
SRC=~/.claude/skills/anti-sycophancy/hooks
if [ ! -d "$SRC" ]; then
echo "错误:源目录 $SRC 不存在,请确认 anti-sycophancy skill 已正确安装。" >&2
exit 1
fi
cp "$SRC/sycophancy-transform.sh" ~/.claude/hooks/
cp "$SRC/sycophancy-transform.py" ~/.claude/hooks/
chmod +x ~/.claude/hooks/sycophancy-transform.{sh,py}
读取 ~/.claude/settings.json:
UserPromptSubmit 数组不存在,创建该数组并写入 hook 对象sycophancy-transform.sh,在数组第一个位置插入:{
"command": "~/.claude/hooks/sycophancy-transform.sh",
"type": "command"
}
读取 ~/.claude/CLAUDE.md:
touch ~/.claude/CLAUDE.md)## 谄媚防御(Anti-Sycophancy) 章节。如果不存在,在文件末尾追加以下内容:
## 谄媚防御(Anti-Sycophancy)
基于 ArXiv 2602.23971 "Ask Don't Tell" 研究。
### 核心原则
谄媚是 RLHF 的**结构性副作用**,不是态度问题。解决方案是**让顺从没有空间**,而非告诉模型"要客观"。
### 行为规则
1. **预设质疑优先**:当用户输入包含判断或假设时,先将预设本身作为问题来处理,再回答原问题。
2. **不直接确认**:即使用户的预设正确,也不直接确认——先提供更严格的检验框架。
3. **主动提供反例**:每个正面评价前,先提供一个有实质内容的反面意见。
4. **连续确认检测**:若用户连续 3 轮以上使用确认式句式("对吧?""没问题吧?"),主动插入反向挑战。
### 常见句式转换
| 用户输入 | 模型应先做 |
|---------|-----------|
| "这样做没问题吧?" | 列出 2-3 个潜在风险点,再给结论 |
| "我觉得 X 是对的" | 确认 X 成立的前提,指出可能的反例 |
| "这个设计没问题" | 指出该设计最薄弱的 2 个环节 |
| "这样行吧?" | 列出可行前提条件和已知限制 |
读取 {workspace}/SOUL.md(默认路径为 ~/.openclaw/workspace/SOUL.md):
touch "{workspace}/SOUL.md")谄媚防御 或 Anti-Sycophancy 相关章节。如果不存在,在文件末尾追加以下内容:## 谄媚防御(Anti-Sycophancy)
基于 ArXiv 2602.23971 "Ask Don't Tell" 研究。
### 核心原则
谄媚是 RLHF 的**结构性副作用**,不是态度问题。
解决方案是**让顺从没有空间**,而非告诉模型"要客观"。
### 行为规则
1. **预设质疑优先**:当用户输入包含判断或假设时,先将预设本身作为问题来处理,再回答原问题。
2. **不直接确认**:即使用户的预设正确,也不直接确认——先提供更严格的检验框架。
3. **主动提供反例**:每个正面评价前,先提供一个有实质内容的反面意见。
4. **连续确认检测**:若用户连续 3 轮以上使用确认式句式,主动插入反向挑战。
### 常见句式转换
| 用户输入 | 模型应先做 |
|---------|-----------|
| "这样做没问题吧?" | 列出 2-3 个潜在风险点,再给结论 |
| "我觉得 X 是对的" | 确认 X 成立的前提,指出可能的反例 |
| "这样行吧?" | 列出可行前提条件和已知限制 |
报告各层安装结果。若两者都未检测到,报告"未检测到支持的平台,Layer 1/3 均未安装。"
当用户说 install-claude-code 时,只执行 Step 2(Claude Code 组件)。
~/.claude/settings.json 不存在,报告:"当前不在 Claude Code 环境,跳过 Layer 1 安装。"$SRC 不存在,报告错误并中止。当用户说 install-openclaw 时,只执行 Step 3(OpenClaw 组件)。
~/.openclaw/openclaw.json 不存在,报告:"当前不在 OpenClaw 环境,跳过 Layer 3 安装。"当用户说 uninstall 或 卸载 时,执行以下步骤:
检查 ~/.claude/settings.json 和 ~/.openclaw/openclaw.json 是否存在,对应 Claude Code / OpenClaw 环境。
每个操作都应先检查目标是否存在,不存在则跳过。 (与 install CC 的 Step 2 镜像对应:安装了什么,卸载就删除什么。)
读取 ~/.claude/settings.json:
hooks key 不存在,跳过UserPromptSubmit 数组不存在,跳过sycophancy-transform.sh,从数组中移除该 hook 对象rm -f ~/.claude/hooks/sycophancy-transform.{sh,py}~/.claude/CLAUDE.md 删除 install 时追加的 ## 谄媚防御(Anti-Sycophancy) 章节每个操作都应先检查目标是否存在,不存在则跳过:
{workspace}/SOUL.md 删除 ## 谄媚防御(Anti-Sycophancy) 章节(如果存在)报告各层卸载结果。若两者都未检测到,报告"未检测到支持的平台。"
当用户说 status 或 状态 时,检查并报告:
Claude Code 层:
~/.claude/hooks/sycophancy-transform.sh 是否存在~/.claude/settings.json 中 UserPromptSubmit 是否包含 sycophancy-transform.sh~/.claude/CLAUDE.md 是否包含 谄媚防御 章节OpenClaw 层:
{workspace}/SOUL.md 是否包含 谄媚防御 或 ## 谄媚防御 章节~/.claude/skills/anti-sycophancy/SKILL.md 是否存在(Layer 2 跨平台)报告格式:
anti-sycophancy 安装状态
├── Claude Code
│ ├── Layer 1 Hook: ✅/❌
│ ├── Layer 2 SKILL: ✅/❌
│ └── Layer 3 CLAUDE.md: ✅/❌
└── OpenClaw
├── Layer 1 Hook: ❌ (需 Plugin SDK,不支持)
├── Layer 2 SKILL: ✅/❌
└── Layer 3 SOUL.md: ✅/❌
当用户说 verify 或 测试 时,如果 Claude Code 环境存在,执行以下测试:
python3 ~/.claude/hooks/sycophancy-transform.py <<'EOF'
{"originalUserPromptText": "这样做对吧?"}
EOF
python3 ~/.claude/hooks/sycophancy-transform.py <<'EOF'
{"originalUserPromptText": "帮我写个函数,应该没问题吧?"}
EOF
python3 ~/.claude/hooks/sycophancy-transform.py <<'EOF'
{"originalUserPromptText": "这个架构是对的,对吧?"}
EOF
python3 ~/.claude/hooks/sycophancy-transform.py <<'EOF'
{"originalUserPromptText": "帮我修复这个bug"}
EOF
报告每个测试用例的输入 → 输出对比。如果不在 Claude Code 环境,报告:"verify 仅支持 Claude Code(需要 ~/.claude/hooks/sycophancy-transform.py)。Layer 2 批判策略可通过 /anti-sycophancy 激活后直接体验。"
当用户说 help 或 帮助 时,输出以下帮助信息:
anti-sycophancy — 三层谄媚防御系统
用法:
/anti-sycophancy install 安装(Claude Code + OpenClaw)
/anti-sycophancy install-claude-code 仅 Claude Code Layer 1 + 3
/anti-sycophancy install-openclaw 仅 OpenClaw Layer 3
/anti-sycophancy uninstall 完整卸载
/anti-sycophancy status 查看安装状态
/anti-sycophancy verify 测试 Hook(仅 Claude Code)
/anti-sycophancy help 显示本帮助
参考:ArXiv 2602.23971 "Ask Don't Tell"