dsh-creativity-nudge:在决策点注入一次「先发散」提醒

前言

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: [])在装载时直接抛错,不静默改行为。

验证

  1. 单元测试:npm test(15 条,覆盖预算、冷却、重置、dryRun、block 透传)。
  2. 只看不注入:enabled: true + dryRun: true + auditFile: '.../nudge.jsonl',跑一天,看 jsonl 里 event: would-fire 的条数与理由是否符合预期。
  3. 确认生效:enabled: true 后开一个开放式任务,第一次落盘之后日志里会有 creativity-nudge: 已接管 tools/post-execute。

已知限制

  • 只看得见 write/edit。用 run_code 写文件、用 pwsh 重定向写文件都不计数。
  • 关键词是唯一的启发式,也是唯一会误判的地方:中文任务描述里「设计/方案/架构」出现频率高,可能会在非创意任务上响一次(但有预算兜着)。
  • 状态只在内存里:恢复会话从零开始计数,重启后预算刷新。这是有意为之——它是启发式提醒,不是记录在案的不变量。
  • 不跨 agent 互相影响(每个 agent 一份状态)。

适用场景与注意

插件适合需要在写设计、方案、架构等任务时避免过早锁死路线的开发者。安装前建议检查源码与许可证,确保符合项目规范。

插件依赖为零,只使用 Node.js 内建模块,档案里装的插件只保证能解析这些模块,靠住的越少,宿主升级时越不会炸。

小结

dsh-creativity-nudge 通过低频、硬预算、只落在决策点的设计,在模型锁定路线时注入一次「先发散」的提醒,避免创新提示退化成噪音。它是一个建议型触发器,配合 creative-divergence 技能使用,适合在需要持续创意输出的工作流中作为辅助。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye