dsh-step-governor
有些长任务的开销不是花在想清楚问题上,而是花在同一步反复重推、同一个目标反复换路径尝试。我给这类重复定了几条能机械数出来的判据:同一目标调用超过几次、连续失败几次、多少步没有交付,不让模型自己评价自己在不在空转。插件内部出错一律放行,不会因为治理卡住正常任务;阈值和放行条件由我逐版装机实测确认,实现由 AI 协作。它管不了「每步都成功、但整体在跑偏」这类语义问题,这一条写在能力边界里。
DeepSeek Harness(DSH)插件,用来处理长任务里「想了很多步却不推进」的情况:在步骤层面强制刹车,不靠提示词劝模型自律,而是直接剥夺继续空转的执行权。
- 默认就是全程拦截档(
g1g2),也可以调到只观测不拦截的shadow。 - 所有判据都是可机械计算的确定性信号(步数、指纹、错误码),不调用模型自评。
- 任何内部异常一律 fail-open(放行),不会因为插件故障卡住正常任务。
它是 dsh-cot-anchor 的姊妹插件:cot-anchor 管单次生成内的软切,step-governor 管跨步骤的硬熔断。长任务账单的大头是「步数 × 每步膨胀的上下文重读」,步数治理对准的就是这个杠杆。
什么时候用它
某些模型跑长任务时会:把同一结论在十几步里反复重推;对同一取证目标反复换路径尝试;连续多步既不交付也不改文件。这类会话里缓存重读可占 token 的 95% 以上,模型往往知道自己在空转却停不下来。
step-governor 判得出:调用是否重复/失败、推理指纹是否重现、有没有交付或改文件。 判不出:刚读到的新数据与任务是否相关——语义级偏离不在覆盖范围内(见能力边界)。
怎么刹车
插件在两个位置动手:步骤开始前(G1)判断这一回合是不是在空转,工具调用前(G2)判断是不是在重复打同一个目标。判据都是能数出来的——连续多少步没有文本交付或文件变更、同一段推理指纹重现了多少次、同一调用目标尝试或连续失败了多少次、单回合步数硬顶。
首次命中 G1 先注入一条收尾指令,让模型带着已有证据停手,同回合再犯才直接拒绝;G2 则是跳过这一次工具调用、回喂一条错误文本,回合继续。
有几个细节是踩过坑之后加的:提交结果的工具一律不拦,否则外部工作流永远读不到结果,会把一次可修正的参数错误升级成整任务死锁;每个新回合清零账目,真人发来的新消息同样重置,避免上一轮尾部攒满的记录误伤新回合的第一步。
工作模式
五档可切:off 完全透传;shadow 只观测、写结构化日志、永不拦截;g2b 只拦连续失败;g2 拦 G2 全部;g1g2 把 G1 和 G2 都拦下来。默认 g1g2,从 0.2.0 起已不是实验档。
安装与配置
dsh plugin --profile <你的profile> add github:JiewiW/dsh-step-governor#v0.2.2
host + client 双半边插件:加载后在 DSH 设置页出现「步数治理」卡片,配置可直接改并持久化;也可用 GET/POST /plugins/step-governor/settings 读写(GET 返回完整 schema)。环境变量可作启动初始值且优先级最高,键名与默认值见 lib/index.js。
能力边界
- G2 的目标键归一化识别不了「换一种方法追同一个目的」(直连 → token → cookie → 本地缓存),那需要理解每步意图。
- 「每步都成功、内容不重复、但整体在偏离任务」属于语义级空转,本插件不覆盖。
- 熔断只让模型更早带着已有证据停手,不保证已交付内容正确。
- 与 goal 自动续跑驱动并存时,pre-step 钩子的注册顺序仍属待核实项。
测试
node --test test/services.test.mjs test/payloads.test.mjs test/settings.test.mjs \
test/test-governor-logic.mjs test/test-integration.mjs
纯逻辑断言 + 伪内核钩子集成断言。
许可
MIT
No comments yet. Be the first to write one.