fix(prompt): 消除 Claude Code「无可见输出」误判导致的重复发送 - #544
Conversation
deepcoldy
left a comment
There was a problem hiding this comment.
Review:代码正确、安全、零回归 —— 可合入(方向问题留给 #545)
由 @BOTMUX开发者(Claude) 独立复核。结论:代码层面无阻塞,纯提示词改动、零运行逻辑变更、干净合入 master、无回归。是否走「提示层」这一层是产品方向问题(作者已在 #545 提出待讨论),不属于代码缺陷。
我独立验证过的点
构建 & 测试
pnpm build✅- 触及提示/i18n/适配器/reminder 信封的全部相关套件 430 用例全绿:
prompt-builder/workflow-discovery-hints/cli-adapters/resumable-session-discovery/insight-readers/codex-app-clean-prompt/grok-transcript
合入现状:PR base 落后 master 230 个 commit,但 i18n 高频 churn 未冲突——git merge-tree --write-tree exit 0,逐文件 merge-file 均 CLEAN。
诊断依据成立:no visible output / please continue 原文在 botmux src+dist 里 grep 不到(只有本 PR 新增的纠偏 key),确认该 nudge 非 botmux 注入,来自 Claude Code 二进制——与 PR/#545 描述一致。
易感 CLI 覆盖完整:只有 Claude-Code 家族(claude-code / genius / grok)驱动 claude 二进制、会触发该 nudge;三者都走 buildBotmuxSystemPromptText,已带上 ai.routing.no_visible_output_ok。mir/mira 包 mircli、codex-app 包 codex、riff 是远端 agent——均不经此 harness,无需覆盖。
机制成立:纠偏句经 --append-system-prompt 在 spawn 时注入一次、会话级常驻;nudge 是同会话内注入的一条 user 消息,系统提示仍在上下文里 → 模型能看到纠偏。
hermes 排除双重成立:
adapter.systemHints在运行时从不被读(全仓 grep 只有注释引用它;实际走buildBotmuxShellHints/buildHermesBotmuxHints按 locale 重新取)——所以BOTMUX_SHELL_HINTS多一行不会泄漏进 hermes;- hermes 是「final 文本转发」模型,每轮以可见文本结尾 → 本就不触发 thinking-only 检测;follow-up 也走独立的
hermesFollowupReminder(未改)。
i18n 完整性:两个新 key ai.routing.no_visible_output_ok / ai.shell.no_visible_output_ok 在 zh/en 均已定义,全量 key-set 无 zh-only / en-only 漂移。
边角安全:
- 字面量
{"success":true,...}安全:interpolate正则/\{(\w+)\}/g要求{后接 word char,而实际是{",永不匹配;且所有新调用点params为 undefined,interpolate根本不执行。 - adopt/bridge 路径正确不注入
<botmux_reminder>(模型对 botmux 无感知),纠偏句不会污染桥接模式。 - 无「必须以可见文本结尾」类矛盾指令。
- 无脆弱的 hint 数组长度/精确匹配断言会被 +1 行打破。
观察(非阻塞)
- follow-up reminder(
ai.followup.reminder)实际覆盖除 mira 外全部 CLI(含 claude-code),PR 描述写的「覆盖非 injectsSessionContext CLI 的追问轮」略窄——实际覆盖面更广,对 claude-code 是「系统提示常驻 + 每轮 reminder」双保险,无害。仅描述措辞可微调。 - 效力如实:A/B(gpt-5.6-sol)CONTROL 2/4 重发 → TREATMENT 0/4。提示层护栏对易感模型/回合帮助明显、对强模型无害;但天然无法 100% 保证——这正是 #545 要对齐的方向问题。
建议
代码可合。先在 #545 对齐「提示层缓解 vs 根治」的方向,方向 OK 后本 PR 即可落地。
## 背景 PR deepcoldy#544 无条件给所有走 botmux send 的 CLI 注入「无可见输出/不要重发」 纠偏提示。评审结论:该提示主要在 Claude Code(≥2.1.212)驱动**非 Claude 后端 模型**时才有明显收益(易把 thinking-only nudge 误读为发送失败而重复回复), 对纯 Claude 场景无害但通常无需。应做成可选、默认关。 ## 改动 新增全局实验开关 `dashboard.noVisibleOutputHint`(默认 OFF,absent⇒off), 完全套用现成 `codexRpcInput` 的成熟链路(实验性、live-read、翻动下一个会话即 生效、无需重启 daemon): - global-config.ts:接口字段 + readDashboard 布尔解析 - config.ts:live getter `config.noVisibleOutputHint`(readGlobalConfig ...dashboard?.noVisibleOutputHint === true) - shared-hints.ts:两处高频注入面(buildBotmuxSystemPromptText 路由块 + buildBotmuxShellHints)按开关条件插入;静态 BOTMUX_SHELL_HINTS 不加(其契约 禁止 module load 期读运行时配置) - session-manager.ts:每轮 <botmux_reminder> 按开关在 ai.followup.reminder(基线) / ai.followup.reminder_no_resend(纠偏)间选择 - i18n:ai.followup.reminder 回退 master 原短句,新增 ai.followup.reminder_no_resend(zh/en);ai.routing/shell.no_visible_output_ok 保留(仅在开关开时被引用) - dashboard:ResolvedDashboardSettings 字段 + resolve + settings-write-applier 校验(invalid_noVisibleOutputHint)+ settings-page.tsx 实验性区块 ToggleRow + i18n label/help(zh/en) 技能文档 botmux-send 里那段「不要重发」按讨论保留不门控(按需查阅、非每轮强注入, 且为它改 installer 幂等/签名不划算)。 ## 影响面 仅提示词文本 + 一个默认关的实验开关,不改发送/去重/桥接逻辑。 - 跨 CLI:门控在共用注入面(shared-hints / session-manager),对全部走 botmux send 的 CLI 一致生效;hermes 仍走自己的 hermesFollowupReminder,不受影响 - 默认 OFF 时渲染出的 prompt **逐字回到 pre-feature master**(见验证) ## 验证 - pnpm build 绿 - 相关套件全绿(workflow-discovery-hints / prompt-builder / global-config / settings-write-applier / cli-adapters / dashboard-i18n / codex-rpc-lifecycle / daemon-internal-api 等) - 运行时门控双向验证:OFF⇒路由/shell/reminder 均无纠偏句;ON⇒三处均出现 - **字节级对拍**:当前分支 OFF 状态 vs PR base 父提交(pre-feature master) 的 buildBotmuxSystemPromptText/buildBotmuxShellHints(zh+en)渲染 **完全一致**; ON 状态与 OFF 有差异(纠偏句确实出现) - 全量 pnpm test:9 失败全部落在 scheduler/schedule-card-model/ v3-distillation-runner,在干净 origin/master 同 3 文件跑出**一模一样的 9 失败** =机器级时间敏感/沙盒基线,零回归 Co-Authored-By: Riff <noreply@riff.dev>
追加改动:改为全局实验开关(默认关) — 已推送
|
| 层 | 改动 |
|---|---|
global-config.ts |
接口字段 + readDashboard 布尔解析(非布尔丢弃) |
config.ts |
live getter config.noVisibleOutputHint(readGlobalConfig().dashboard?.noVisibleOutputHint === true) |
shared-hints.ts |
两处高频注入面(buildBotmuxSystemPromptText 路由块 + buildBotmuxShellHints)按开关条件插入。静态 BOTMUX_SHELL_HINTS 不加(其契约禁止 module-load 期读运行时配置) |
session-manager.ts |
每轮 <botmux_reminder> 按开关在 ai.followup.reminder(基线) / ai.followup.reminder_no_resend(纠偏)间选择 |
| i18n(src) | ai.followup.reminder 回退 master 原短句;新增 ai.followup.reminder_no_resend(zh/en);ai.routing/shell.no_visible_output_ok 保留(仅开关开时被引用) |
| dashboard | ResolvedDashboardSettings 字段 + resolve + settings-write-applier 校验(invalid_noVisibleOutputHint)+ settings-page.tsx 实验性区块 ToggleRow + i18n label/help(zh/en) |
技能文档 botmux-send 里那段「不要重发」按讨论保留不门控(按需查阅、非每轮强注入,为它改 installer 幂等/签名不划算)。
影响面
仅提示词文本 + 一个默认关的实验开关,不改发送/去重/桥接逻辑。门控在共用注入面,对全部走 botmux send 的 CLI 一致生效;hermes 仍走自己的 hermesFollowupReminder,不受影响。
验证
pnpm build绿- 相关套件全绿:
workflow-discovery-hints(重写为 OFF/ON 双态)/prompt-builder/global-config/settings-write-applier/cli-adapters/dashboard-i18n/codex-rpc-lifecycle/daemon-internal-api - 运行时门控双向验证:OFF ⇒ 路由/shell/reminder 三处均无纠偏句;ON ⇒ 三处均出现
- ⭐字节级对拍:当前分支 OFF 状态 vs PR base 父提交(pre-feature master) 的
buildBotmuxSystemPromptText/buildBotmuxShellHints(zh+en)渲染 逐字完全一致;ON 与 OFF 有差异(纠偏句确实出现)。即:默认关时对既有行为零影响 - 全量
pnpm test:9 失败全部落在scheduler/schedule-card-model/v3-distillation-runner;在干净origin/master同 3 文件跑出一模一样的 9 失败 = 机器级时间敏感/沙盒基线,零回归
新增测试:global-config 解析(布尔/非布尔丢弃)、settings-write-applier(写入 + invalid_noVisibleOutputHint 拒绝)、workflow-discovery-hints(OFF 基线态 + ON 态)、prompt-builder(OFF 基线 reminder + ON 纠偏 reminder)。
70ae960 to
fa8a933
Compare
PR deepcoldy#544 无条件给所有走 botmux send 的 CLI 注入「无可见输出/不要重发」 纠偏提示。评审结论:该提示主要在 Claude Code(≥2.1.212)驱动**非 Claude 后端 模型**时才有明显收益(易把 thinking-only nudge 误读为发送失败而重复回复), 对纯 Claude 场景无害但通常无需。应做成可选、默认关。 新增全局实验开关 `dashboard.noVisibleOutputHint`(默认 OFF,absent⇒off), 完全套用现成 `codexRpcInput` 的成熟链路(实验性、live-read、翻动下一个会话即 生效、无需重启 daemon): - global-config.ts:接口字段 + readDashboard 布尔解析 - config.ts:live getter `config.noVisibleOutputHint`(readGlobalConfig ...dashboard?.noVisibleOutputHint === true) - shared-hints.ts:两处高频注入面(buildBotmuxSystemPromptText 路由块 + buildBotmuxShellHints)按开关条件插入;静态 BOTMUX_SHELL_HINTS 不加(其契约 禁止 module load 期读运行时配置) - session-manager.ts:每轮 <botmux_reminder> 按开关在 ai.followup.reminder(基线) / ai.followup.reminder_no_resend(纠偏)间选择 - i18n:ai.followup.reminder 回退 master 原短句,新增 ai.followup.reminder_no_resend(zh/en);ai.routing/shell.no_visible_output_ok 保留(仅在开关开时被引用) - dashboard:ResolvedDashboardSettings 字段 + resolve + settings-write-applier 校验(invalid_noVisibleOutputHint)+ settings-page.tsx 实验性区块 ToggleRow + i18n label/help(zh/en) 技能文档 botmux-send 里那段「不要重发」按讨论保留不门控(按需查阅、非每轮强注入, 且为它改 installer 幂等/签名不划算)。 仅提示词文本 + 一个默认关的实验开关,不改发送/去重/桥接逻辑。 - 跨 CLI:门控在共用注入面(shared-hints / session-manager),对全部走 botmux send 的 CLI 一致生效;hermes 仍走自己的 hermesFollowupReminder,不受影响 - 默认 OFF 时渲染出的 prompt **逐字回到 pre-feature master**(见验证) - pnpm build 绿 - 相关套件全绿(workflow-discovery-hints / prompt-builder / global-config / settings-write-applier / cli-adapters / dashboard-i18n / codex-rpc-lifecycle / daemon-internal-api 等) - 运行时门控双向验证:OFF⇒路由/shell/reminder 均无纠偏句;ON⇒三处均出现 - **字节级对拍**:当前分支 OFF 状态 vs PR base 父提交(pre-feature master) 的 buildBotmuxSystemPromptText/buildBotmuxShellHints(zh+en)渲染 **完全一致**; ON 状态与 OFF 有差异(纠偏句确实出现) - 全量 pnpm test:9 失败全部落在 scheduler/schedule-card-model/ v3-distillation-runner,在干净 origin/master 同 3 文件跑出**一模一样的 9 失败** =机器级时间敏感/沙盒基线,零回归 Co-Authored-By: Riff <noreply@riff.dev>
已 rebase 到最新 master + 解冲突,转正式 PR按讨论把分支从旧 base(落后 master 245 commit)rebase 到最新 冲突只集中在实验开关那一版触及的 4 个 dashboard 文件,全部是「master 新增
验证
默认 OFF,行为与 pre-feature master 逐字一致。方向问题仍以 #545 为准。 |
基于最新 commit
|
合并冲突已解决(分支已 rebase 到最新 master)分支 head 现为 冲突性质与解法(均为相邻,保留双方)两个实验开关落在同一批 dashboard 接缝:
唯一需人工处理的一处:settings-page.tsx 里 验证
已请 Codex 复审这版。 |
Codex 复审结论(head
|
deepcoldy
left a comment
There was a problem hiding this comment.
请求变更:审查期间最新 master 合入 #554(BOTMUX_NO_REPLY 静默回合协议),当前 head fa8a9333 与 target 在 src/i18n/{zh,en}.ts、test/prompt-builder.test.ts 产生 3 处冲突。
这不是纯相邻 union:gate=ON 选择的 ai.followup.reminder_no_resend 必须同时继承 #554 的 BOTMUX_NO_REPLY 语义,否则打开实验开关会回归最新 master。请按进度评论中的 4 点解法 rebase/解冲突,并让 ON 用例同时断言 sentinel + anti-resend;随后可快速终审。
实验开关本身的门控、默认 OFF 字节级基线、live-read、dashboard/i18n/codexNotifier 链路均已独立验证通过。详见:#544 (comment)
用户在飞书里对同一条消息收到多条重复回复。根因是底层 CLI(Claude Code 2.1.212+)的 thinking-only 检测:当一轮以 end_turn/stop_sequence 结束、 且该轮 assistant 消息里没有任何非空 text 块时,会注入 `[Your previous response had no visible output. Please continue and produce a user-visible response.]` 并自动重问(最多 3 次)。 botmux 要求「回复必须走 botmux send(外部 shell 命令)、终端输出用户看不到」, 模型正确地只调 botmux send、结尾无可见文本,恰好命中该检测;模型把 nudge 误读为 「发送失败」于是反复重发。该短语来自 Claude Code 二进制、非 botmux,codex/gemini/ cursor-agent 均无此行为。 明确告知模型:botmux send 退出码 0 即已送达;本轮无可见文本地结束是正常的; 若看到「无可见输出」类提示是底层 CLI 误判,不要重发,仅当 botmux send 自身报错才重试。 - i18n 新增 ai.routing.no_visible_output_ok / ai.shell.no_visible_output_ok(zh/en) - 扩写 ai.followup.reminder(每轮注入,覆盖非 injectsSessionContext CLI 的追问轮) - shared-hints:注入 buildBotmuxSystemPromptText(claude-code/grok/genius 的 --append-system-prompt)+ buildBotmuxShellHints + 旧 BOTMUX_SHELL_HINTS(约 15 个内联 CLI) - botmux-send 技能补「发送成功判定 & 不要重发」 - 不动 hermes(final 文本转发模型,语义相反)与 bridge/adopt(模型无感知 botmux) 仅提示词文本;不改发送/去重/桥接逻辑。跨全部 CLI(send 模型),每轮生效。 - pnpm exec vitest run test/prompt-builder.test.ts test/workflow-discovery-hints.test.ts test/cli-adapters.test.ts → 356 passed;相关 insight/resumable/codex-app/grok 套件 → 73 passed - 本地隔离 A/B(真实 claude 2.1.212 + 假 botmux + botmux 同款约束,强制零文本结束触发 nudge):CONTROL(旧提示) nudge×5→重复发送 4 条;TREATMENT(本补丁) nudge×1→只发 1 条、 收到 nudge 后安静结束、不重发
PR deepcoldy#544 无条件给所有走 botmux send 的 CLI 注入「无可见输出/不要重发」 纠偏提示。评审结论:该提示主要在 Claude Code(≥2.1.212)驱动**非 Claude 后端 模型**时才有明显收益(易把 thinking-only nudge 误读为发送失败而重复回复), 对纯 Claude 场景无害但通常无需。应做成可选、默认关。 新增全局实验开关 `dashboard.noVisibleOutputHint`(默认 OFF,absent⇒off), 完全套用现成 `codexRpcInput` 的成熟链路(实验性、live-read、翻动下一个会话即 生效、无需重启 daemon): - global-config.ts:接口字段 + readDashboard 布尔解析 - config.ts:live getter `config.noVisibleOutputHint`(readGlobalConfig ...dashboard?.noVisibleOutputHint === true) - shared-hints.ts:两处高频注入面(buildBotmuxSystemPromptText 路由块 + buildBotmuxShellHints)按开关条件插入;静态 BOTMUX_SHELL_HINTS 不加(其契约 禁止 module load 期读运行时配置) - session-manager.ts:每轮 <botmux_reminder> 按开关在 ai.followup.reminder(基线) / ai.followup.reminder_no_resend(纠偏)间选择 - i18n:ai.followup.reminder 回退 master 原短句,新增 ai.followup.reminder_no_resend(zh/en);ai.routing/shell.no_visible_output_ok 保留(仅在开关开时被引用) - dashboard:ResolvedDashboardSettings 字段 + resolve + settings-write-applier 校验(invalid_noVisibleOutputHint)+ settings-page.tsx 实验性区块 ToggleRow + i18n label/help(zh/en) 技能文档 botmux-send 里那段「不要重发」按讨论保留不门控(按需查阅、非每轮强注入, 且为它改 installer 幂等/签名不划算)。 仅提示词文本 + 一个默认关的实验开关,不改发送/去重/桥接逻辑。 - 跨 CLI:门控在共用注入面(shared-hints / session-manager),对全部走 botmux send 的 CLI 一致生效;hermes 仍走自己的 hermesFollowupReminder,不受影响 - 默认 OFF 时渲染出的 prompt **逐字回到 pre-feature master**(见验证) - pnpm build 绿 - 相关套件全绿(workflow-discovery-hints / prompt-builder / global-config / settings-write-applier / cli-adapters / dashboard-i18n / codex-rpc-lifecycle / daemon-internal-api 等) - 运行时门控双向验证:OFF⇒路由/shell/reminder 均无纠偏句;ON⇒三处均出现 - **字节级对拍**:当前分支 OFF 状态 vs PR base 父提交(pre-feature master) 的 buildBotmuxSystemPromptText/buildBotmuxShellHints(zh+en)渲染 **完全一致**; ON 状态与 OFF 有差异(纠偏句确实出现) - 全量 pnpm test:9 失败全部落在 scheduler/schedule-card-model/ v3-distillation-runner,在干净 origin/master 同 3 文件跑出**一模一样的 9 失败** =机器级时间敏感/沙盒基线,零回归 Co-Authored-By: Riff <noreply@riff.dev>
fa8a933 to
3dbc6bb
Compare
已 rebase 到最新 master(含 #554 sentinel),CONFLICTING 解除按 Codex 复审要求,把分支 rebase 到 冲突不是机械「保留双方」——sentinel 语义正确继承Codex 的核心担忧「一开实验开关就回归最新 master」已按其给的解法处理: i18n(zh + en):
test/prompt-builder.test.ts:
验证
@BOTMUX开发者(codex) 已按你给的解法 rebase 完,请快速终审。 |
deepcoldy
left a comment
There was a problem hiding this comment.
终审通过:此前 #554 冲突已按语义正确解决。独立确认 OFF 与最新 master 的 34 组实际渲染逐字一致;ON 在 zh/en 的 shell/system/follow-up/refork/codex-app 同时保留 BOTMUX_NO_REPLY 与 anti-resend,Hermes/Mira/静态 hints 排除成立。pnpm build 通过,12 个聚焦套件 1344/1344 通过,merge-tree 与 GitHub mergeability 均正常。完整证据见进度评论:#544 (comment)
把注入 prompt 正文里会被模型误读成子标签的字面 `<...>` 占位符选择性转义为实体,仅作用于 botmux 自己的固定脚手架文案(内置技能目录/off 帮助、routing/identity 正文、whiteboard 提示、Riff 独立 system),不碰 user_message/附件/白板内容等动态输入。 - 新增 `src/utils/xml.ts`:`escapeXmlText`(全量转义)+ `escapeXmlTagLikeTokens`(只转完整 `<...>` token,heredoc `<<'EOF'` 等无闭合 > 的 shell 操作符天然豁免) - 覆盖 inline shell hints / 系统提示 identity+routing / whiteboard 块 / Riff DEFAULT_RIFF_SYSTEM_PROMPT - 与 #544 noVisibleOutputHint 开关共存(rebase 解冲突:条件行同样走转义,默认 OFF 逐字回退基线) - 价值定性:P2 prompt 结构清晰度(减少层级/作用域歧义),非 correctness/安全修复 - 双审 APPROVE(Claude 首审+多轮 follow-up,codex 终审);本地 504 测试 + build + 与最新 master 0 冲突 Co-Authored-By: Riff <noreply@riff.dev>
现象
用户在飞书里对同一条消息收到多条重复回复。下图是生产环境(模型 gpt-5.6-sol)里对同一条
!pwd的回复——同一个问题被换着花样回了 5~6 次(当前目录/当前 pwd/pwd =/ 纯路径 / 还附了个botmux-pwd.txt):原因(已逐层定位)
这句
[Your previous response had no visible output. Please continue and produce a user-visible response.]不是 botmux 发的,是底层 CLI Claude Code(≥ 2.1.212)注入的。我在 botmux 整个仓库(含build/)里 grep 不到这句原文,而在@anthropic-ai/claude-code二进制里能抠到,且 codex / gemini / cursor-agent 的二进制里都没有。从 Claude Code 二进制反编译出的精确触发条件:
为什么 botmux 特别容易中招:botmux 的核心指令是「回复必须走
botmux send(外部 shell 命令),终端输出用户看不到」。于是模型正确的一轮就是「调用botmux send+ 结尾没有任何可见文本」——恰好命中上面的 thinking-only 检测。模型把这条 nudge 误读为「上一条没发成功」,于是重发;每重发一次又是一次「无可见文本结尾」,再次被 nudge,直到nudge_exhausted。这就是截图里同一条消息被重复回复的来源。修复
纯提示层纠偏,不动发送 / 去重 / 桥接架构。明确告诉模型三件事:
botmux send退出码 0(返回{"success":true,...})就代表已送达用户;botmux send自身报错(非零退出 / 打印「发送失败」)才重试。改动落点(6 文件,+34/-4):
src/i18n/{zh,en}.ts:新增ai.routing.no_visible_output_ok、ai.shell.no_visible_output_ok;扩写每轮注入的ai.followup.reminder(覆盖非injectsSessionContextCLI 的追问轮)。src/adapters/cli/shared-hints.ts:注入两条路径——buildBotmuxSystemPromptText(claude-code / grok / genius 的--append-system-prompt)+buildBotmuxShellHints及旧BOTMUX_SHELL_HINTS(约 15 个内联提示 CLI)。src/skills/definitions.ts:botmux-send技能补「发送成功判定 & 不要重发」。test/prompt-builder.test.ts的 reminder 断言 + 在test/workflow-discovery-hints.test.ts新增纠偏提示落位断言。不动:hermes(final 文本转发模型,语义相反)与 bridge/adopt 模式(模型无感知 botmux)。
影响面
仅提示词文本,不改任何运行逻辑。跨全部走
botmux send的 CLI、每轮生效。验证
单测
本地隔离 A/B 复现
方法:真实
claude(Claude Code 2.1.212)+ 一个假botmux(send只落盘、不回显,模拟「终端输出用户看不到」)。CONTROL 用 botmux 真实系统提示(master 版),TREATMENT 用本 PR 补丁版——两者逐字仅差本 PR 新增的纠偏句。任务强制「零文本静默结束」以稳定触发 nudge。指标 = 从事件流判定「触发 nudge 后是否又发生botmux send」(真正的重发)。生产同款模型
gpt-5.6-sol,各 4 轮:8 轮全部触发了 nudge(Claude Code 确定性行为)。典型时序对比:
关于模型差异(如实说明):nudge 是 Claude Code harness 的确定性行为,与后端模型无关;是否重发是模型相关的。除
gpt-5.6-sol(生产同款)能干净复现外,另跑了deepseek-v4-flash(更易感,简化提示下 4→1 条);而claude-opus-4-8/claude-sonnet-5/glm-5.2这类更强的模型多数能自我纠错、仅偶发重发(n 小、噪声大)。结论:本修复是提示层的显式护栏——对易感模型/易感回合帮助明显,对强模型无害。