前言¶
DeepSeek Harness(DSH)的开发中,模型很容易在写到某处时就「锁死」一条路线,再往后都是微调而非重新构思。这种倾向在写设计、方案、架构等任务时尤其明显。频繁出现「要有创意」的提示会变成噪音,模型和人都容易免疫。这里介绍的 dsh-creativity-nudge 就是为了在模型锁定路线的那一刻,注入一次「先发散」的提醒。
插件定位与维护¶
dsh-creativity-nudge 是一个 DSH 工作流插件,由 Elysia-laoda 维护。它是一个建议型触发器,只负责「什么时候想起来」,不否决调用、不改写结果、不评价输出好坏。配套技能 creative-divergence(位于 ~/.dsh/skills/creative-divergence/SKILL.md)负责「怎么做」的工序。
核心功能¶
插件通过观测确定性的结构事实来决定是否注入提醒,而不是通过内容判断。它定义了三个触发时机(T1、T2、T3),并设置硬预算来控制频率。
触发时机¶
| 时机 | 观测条件 | 行为 |
|---|---|---|
| T1 承诺点 | 本会话第一次 write/edit,且用户最近一条消息命中 keywords |
给出两个「机制不同」的候选,各写一句牺牲 |
| T2 卡住点 | 同一个文件被改到第 stuckEdits 次(默认 5) |
换机制,别再微调同一处 |
| T3 连续失败 | 连续 stuckFailures 次 isError(默认 0 = 关闭) |
回退到能工作的状态再换方向 |
不做 T4「交付前提醒」:答案已经写完,这时候提醒只能逼模型推倒重写,成本翻倍、收益不可证。
T2 默认 5 而不是 3:正常开发里改同一个文件 3 次是常态,5 次才开始像打转。T3 默认关闭:一次失败的测试再改一次是很正常的迭代,误报率高于信息量;要开就设 stuckFailures: 2。
频率控制¶
插件通过硬预算限制注入次数,而不是简单节流。
maxPerSession: 2—— 每会话最多两次,用完就没有。cooldownCalls: 8—— 两次提醒之间至少隔 8 次工具调用。- 用户发新消息时清空 T2 的文件计数与失败计数(T1 的「第一次落盘」不重置;同一条用户消息在每一 step 重复出现,按 message id 去重)。
- 措辞轮换:同一句话出现第三次会被当样板忽略,所以两条文案按 seed 轮换。
- 单调递减:预算本身就是递减的——第 3 次机会不存在。
安装与启用¶
插件默认 enabled: false,装上不生效,需要改配置才注册监听。
安装命令如下(使用 PowerShell):
node scripts/install.mjs --dry-run # 预演
node scripts/install.mjs # 装进档案(会备份 package.json)
node scripts/install.mjs --uninstall # 彻底摘干净
安装完成后,必须完全退出并重开 DSH。
在 <profile>/cordis.patch.yml 末尾追加以下内容即可启用:
- id: creativity-nudge
name: 'dsh-creativity-nudge'
config:
enabled: true
部分字段就够——插件内部的 normalizeConfig 会拿 DEFAULTS 合并,没写的键走默认值。
如果想先观测不打扰,可以设置:
- id: creativity-nudge
name: 'dsh-creativity-nudge'
config:
enabled: false
dryRun: true
auditFile: '%USERPROFILE%/.dsh/logs/creativity-nudge.jsonl'
注意 dryRun 单独也能激活监听(不需要 enabled),但只写日志、不注入。
配置项¶
在 cordis.patch.yml 的 config 段可调整以下字段:
enabled: false # 总开关(装上不生效就靠它)
maxPerSession: 2 # 每会话最多注入几次
cooldownCalls: 8 # 两次提醒之间的最小工具调用间隔
stuckEdits: 5 # 同一文件改到第几次算打转
stuckFailures: 0 # 连续失败阈值,0 = 关闭
mutatingTools: ['write', 'edit']
keywords: ['设计', '方案', '架构', '命名', ...]
dryRun: false # 只记日志不注入
auditFile: '' # jsonl 审计路径,空 = 不写
非法配置(如 stuckEdits: 1、keywords: [])在装载时直接抛错,不静默改行为。
验证¶
- 单元测试:
npm test(15 条,覆盖预算、冷却、重置、dryRun、block 透传)。 - 只看不注入:
enabled: true+dryRun: true+auditFile: '.../nudge.jsonl',跑一天,看 jsonl 里event: would-fire的条数与理由是否符合预期。 - 确认生效:
enabled: true后开一个开放式任务,第一次落盘之后日志里会有creativity-nudge: 已接管 tools/post-execute。
已知限制¶
- 只看得见
write/edit。用run_code写文件、用pwsh重定向写文件都不计数。 - 关键词是唯一的启发式,也是唯一会误判的地方:中文任务描述里「设计/方案/架构」出现频率高,可能会在非创意任务上响一次(但有预算兜着)。
- 状态只在内存里:恢复会话从零开始计数,重启后预算刷新。这是有意为之——它是启发式提醒,不是记录在案的不变量。
- 不跨 agent 互相影响(每个 agent 一份状态)。
适用场景与注意¶
插件适合需要在写设计、方案、架构等任务时避免过早锁死路线的开发者。安装前建议检查源码与许可证,确保符合项目规范。
插件依赖为零,只使用 Node.js 内建模块,档案里装的插件只保证能解析这些模块,靠住的越少,宿主升级时越不会炸。
小结¶
dsh-creativity-nudge 通过低频、硬预算、只落在决策点的设计,在模型锁定路线时注入一次「先发散」的提醒,避免创新提示退化成噪音。它是一个建议型触发器,配合 creative-divergence 技能使用,适合在需要持续创意输出的工作流中作为辅助。