dsh-plugin-rollout-scout
Curated pickMaintenance: Activespookysandwich/dsh-plugin-rollout-scout
Detects which conversation model an account is being served: launches concurrent throwaway probe conversations, scores each streaming chain-of-thought by how its paragraphs open, and cancels probes that read as the older model within seconds. Includes an offline self-check that replays 13 hand-labelled chains-of-thought through the same classifier.
$ dsh plugin add dsh-plugin-rollout-scoutInstall
dsh has no central install command — add this plugin’s entry (documented in its README below) to your profile or patch config, then restart.
How installs work6
stars
0
forks
JavaScript
Language
MIT
License
2026-08-20
Created
2026-09-07
Last push
README
dsh-plugin-rollout-scout
English | 简体中文
服务商有时会灰度发布新的对话模型,你分到哪一个全看运气。灰度侦察会用你自己的账号开启一批临时会话,在思维链流式输出的同时读取它,并按「推理是怎么写的」打分——读起来像你手上这个旧模型的立刻中止,不像的留下来。
它是基于措辞的启发式小工具,不是权威判据。它做的每件事你都可以手动完成:开一个新会话、扫一眼思维链、关掉。

判定方式
信号在于 每个段落是怎么开头的,而不是某个短语在全文出现了多少次。若按全文累计,「Let me」会单纯因为篇幅变长而越积越多,一段本来很好的长思维链最终也会被判为差。只看开头,度量才稳定。
每段只读前 48 个字符。而关键短语往往并不在第 0 个字符:
The directory is empty. Let me create a 3D cyberpunk scene. To avoid conflicts, I'll keep I18n.cs edits under one change.
有两个决定性信号,且刻意 不对称:
| 信号 | 效果 |
|---|---|
任意段落以 Let me 开头 |
旧模型——立即中止该轮 |
整条思维链 以 I'll 开头 |
灰度模型——放行跑完并保留 |
I'll 只有出现在最开头才算证据:旧模型也会在 中间某段 写「I'll create a single HTML file…」,然后隔几段又说「Let me build…」。把每个 I'll 都当证据会造成误判。
两者都没触发时,其余开头进入评分:
加成 = (规整段落 ? 1 : 0) + (有停顿 ? 1 : 0)
置信度 = (正向开头数 + 加成 + 1) / (已分类开头数 + 加成 + 2)
加成把总结链的形态本身也算作证据,因此段落规整、又有停顿的思维链在还没有任何 开头被分类时就会高于 50%。它只影响这个数字:真正保留仍需要凑满「最少开头数」。
段落开头写满 48 个字符就会打分,即使模型从不换行。后出现的 Let me 会推翻 先前的保留。
灰度链路常常用一个 小模型总结思维链。总结模型经常以 We need to… 开头(所以段首 we 只记负分,不直接判死),写出 规整、一段一段的长段落,并且 输出一阵、卡住、再输出一阵。这三条都是新链路的正面证据。旧模型不规律——整段糊成一块,或夹着很短的 Let me 行。
正向开头是第一人称单数的计划语气——I'm、I am、I've、I have、I need、I think、I also、I will,以及位于开头的 For。负向开头是 Let me / Let's,以及开头里出现的任何第一人称复数(we、we need、we will、we'll …)。灰度模型用 “I”,不用 “we”。加一的先验让证据稀少时分数停在 50% 附近,不会因为一个词就给出自信判断:
| 证据 | 置信度 | 判定 |
|---|---|---|
| 暂无 | 50% | 继续观察 |
| 1 正 / 10 负 | 15% | 丢弃 |
| 5 正 / 0 负 | 86% | 保留 |
低于 低于此分即丢弃(0.35)丢弃,高于 高于此分即保留(0.7)保留,但都要先累计到 最少开头数(4)。若连续开了十段一个正向开头都没有,则放弃;思维链 以中文为主(字母中 80% 以上为汉字)则直接丢弃——英文推理里引用一句中文提示词不算。
针对灰度链路的速度与时延特征,还支持两项前置早停开关:
- 生成速度 (TPS) 上限:灰度模型流式吐字速度常在 40~50 字/秒左右(旧模型通常显著更快)。开启后一旦流式 TPS 超过指定上限(默认 60 字/秒),立刻中止该轮,在开头几秒内挽救 Token。
- 首字延迟 (TTFT) 下限:旧模型常在极短时间内(< 1~2 秒)开始输出。可设置首字延迟下限(默认 2 秒),低于此阈值立即在首个字符到达时判定为旧模型并丢弃。
分类器有基于人工标注样本的测试,此外还覆盖了接口防护、发起失败时的行为,以及删除会话的规则:
npm test
控制台
灰度侦察 位于侧边栏底部、「设置」旁边,点开就是下述整屏控制台。它注册在 sidebar.footer.action 座位上,因此与外壳自带的条目样式一致;侧边栏收起为窄栏时,它也会收成一个图标。
左栏 —— 探测提示词、模型(默认 V4-Pro / High)、并发数、存放目录,以及四项评分阈值。阈值下方是自检,再往下是各项开关:TPS 速度上限、首字延迟区间、命中强匹配时自动暂停、思维链以中文为主时丢弃、从磁盘删除旧模型会话。评分规则的长说明收在 评分是怎么算的 里,不再夹在控件中间。
操作按钮固定在左栏底部,设置滚动时不会跟着走,并按分量排列:开始 / 暂停 单独一行,强制停止 与 清空已结束 并排,删除全部会话 则是一行纯文字——它不该长得像顺手就会点到的东西。
评分阈值下方有一条自检:自检 13/13 · 已知灰度样本保留 5/5。它用当前表单里的设置,把十三条人工标注的思维链跑一遍——走的是真实探测同一套分类器,不消耗 Token、不发起探测。把「高于此分即保留」调到标注样本都够不着,它会变成橙色并列出被排除的样本。这是分辨「没找到」和「根本找不到」的办法,否则这两种情况在控制台里长得一模一样。
右栏 —— 已发起 / 进行中 / 已保留 / 已丢弃 / 最高分,下方是随探测新增与离开正常流动的最新优先队列。每行带分数条、命中短语与思维链预览。鼠标放到某一行时,只把这一行钉在当前屏幕位置,显示 固定中 并露出 保留;其他行仍可正常移动。若它正在淡出,淡出也会立刻停止,鼠标还在时不能消失。点击整张卡片打开会话;从悬停直接点进会话时,这次临时救援会带进会话界面,直到鼠标再次移动。未固定、未保留的行默认不显示保留按钮;要真正留住一个探测,请在悬停时点 保留。
固定必须收到宿主对当前这一次鼠标手势的明确确认;若请求被拒、超时或确认不匹配,界面会撤销固定,而不会显示一个实际没有保活能力的假状态。
开始 前会先提醒你确认通知设置——一次运行会开启大量会话,而 DSH Desktop 可能逐个弹通知。探测提示词以插件消息发送,本身不会触发通知;弹窗会显示桌面通知当前是否开启,并可一键关闭。勾选 不再提示 即可跳过。
开始 会变为 暂停:停止发起新探测,中止已判定为旧模型的探测,尚未判定的各自跑完。再变为 继续。强制停止 会中止所有进行中的会话。
判旧的探测先淡出约 3 秒(卡片底边一条细线收掉),期间会话还在跑;淡完才取消。这个截止时间只在首次判旧时建立,后续流式文本不会把它重置。悬停会暂停并记住剩余时间,移开后只继续这一段,不会重新赠送完整 3 秒——只有 保留 才会真正留下。
悬停时出现的 保留 是对会话文件的承诺:不淡出、不清理、不删除,且该标记在插件重载后依然有效。它不会让正在消耗 Token 的回合变成不可停止——强制停止 仍会结束该回合,但会话和保留标记都留下。判定为灰度并跑完的探测会自动保留。已保留的行会持续显示 已保留,再次点击可交回常规清理规则。
探测会话在侧边栏里会自动命名:运行时叫 灰度探测 12,命中后改为 ★ 灰度命中 12 · 87%,在一堆探测里一眼就能认出。已保留的卡片上有 重命名,可以自己起名字;起了名字就等于保留。
清空已结束 会从列表移除已完成的探测,并删除这些会话文件。删除全部会话 会清空该目录下所有探测(包括已经从列表清掉的),并把编号从 1 重新计。
如果 Rollout Scout 的持久所有权记录里存在当前控制台没有对应卡片的探测会话——插件重载、升级或应用重启都会留下这类残留——顶部会出现提示条,可一键 清理。只有插件自己生成并记录的会话 ID 才算;DSH 的空白工作区占位会话,以及用户在同一目录里手动创建的普通会话,都不会被推断成探测。
v3 所有权记录把 owned、protected、deleting 分成三个独立状态。只有会话先持久进入 deleting,才允许物理删除;因此重载后可以继续未完成的清理,而不会把每一个未保留 ID 都误当成删到一半。保留操作在当前进程内按安全侧失败:写盘失败时卡片仍受保护,并显示 重试保留(或 重试取消保留),不会反向执行用户不想要的删除。请在重启前完成重试,因为文件系统从未接受的意图,任何应用都无法在重启后凭空还原。
两者都不会动仍在流式输出或正在释放资源的探测,已保留的也不例外。暂停只是停止发起,进行中的探测仍在跑,所以此时 删除全部会话 会要求你先 强制停止,并等宿主完成释放后才允许删除,以免删掉仍在写入的会话文件。存放目录不能是主目录、磁盘根目录,也不能位于 ~/.dsh 之内——删除以该目录为范围,这些位置会把无关会话卷进去。
若连续三个探测连启动都失败(服务不可达、目录不可写等),运行会自行停止并报出错误,而不是一直重复同一个失败。点 继续 可以重试。
运行状态在宿主端,因此关掉控制台后仍会继续——侧边栏那一行的图标上带一个状态小点(侦察中呼吸闪烁、暂停为灰、命中转绿),宽栏里还会显示进行中的数量、命中后带绿色角标,悬停可看已试数量与目前最高置信度。收成窄栏后只剩这个小点可看,所以它长在图标上而不是文字里。
安装
dsh plugin --profile web add dsh-plugin-rollout-scout
安装后请重启 DSH:宿主端随服务器加载。界面跟随 DSH 显示语言(中文 / English)。
也可以直接从仓库安装,跟的是 master 而不是最近一次发布:
dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout
web 是 profile 名称,请换成你实际使用的那个。独立版启动的是 web,DSH Desktop 用的是 desktop。~/.dsh/profiles/ 下就是你现有的 profile,安装结果落在对应 profile 的 package.json 里。
lib/client.js 是构建产物,但已提交进仓库,所以从仓库安装时也无需任何构建步骤。若你修改了 plugin.client.js,请运行 npm run build 重新生成(npm test 也会顺带生成),并把结果一并提交。
工作原理
- 宿主端提供
/rollout-scout接口,用ctx.agents.create(不带 seed)把每个探测创建为全新会话,并通过installModelSelection设置模型与思考强度。 - 探测提示词以插件消息发送,这样一次运行才不会逐个探测地弹出系统通知。
- 订阅该 agent 作用域内的
session/event,从assistant/chunk读取reasoning-delta(流式思维链),每收到一块就重新分类。 - 判为旧模型时调用
agent.cancel中止该轮;判为灰度则放行至turn/end。流式过程中最后一段会被暂时忽略(开头可能只写了一半),turn 结束后再用完整文本重新分类。 - 探测会话创建在你指定的目录下(作为一个工作区),判为旧模型的会话可选择从磁盘删除。
/rollout-scout监听在本地端口上,因此按本地接口的方式做了防护:写操作必须带application/json内容类型(这会强制浏览器发起 CORS 预检,而预检永远不会被放行),跨源的Origin一律拒绝。你恰好打开的某个网页无法借此发起探测或删除数据。
兼容性
版本 1.5.0:适配 DSH 0.1.5 的 agent/assistant-stream 瞬态流式事件,保留旧事件支持并防止重复计数,兼容持久化列表的新快照结构。
声明兼容范围为 >=0.1.5-rc.2 <0.1.6-0;已验证官方 0.1.5-rc.2,不声明兼容 0.1.6 alpha。旧版 DSH 请保留上一插件版本。验证记录。
可从 GitHub Release 下载发布包,然后执行 dsh plugin --profile desktop add ./dsh-plugin-rollout-scout-1.5.0.tgz。
本次兼容目标为 DSH 0.1.5-rc.2。运行 npm ci、npm test 和 npm run check:package 可验证构建及发布包。更新后请重启 DSH。
入口占用 sidebar.footer.action 座位(list 类型,会与其它底部操作并排,而不是把谁挤掉),控制台本体渲染在全局 shell.overlay 层。两者都不属于会话作用域,因此不与任何会话内插件冲突。需要侧边栏声明了该座位的 DSH 版本;否则控制台将没有入口。与 dsh-plugin-smooth-stream、dsh-plugin-no-workspace、dsh-plugin-message-edit 同族。
关于额度
每个探测都是一次真实的对话轮次,消耗你自己的额度。被丢弃的通常一两秒内就中止,但只要不停止,运行中的任务会一直发起新探测。并发数与各项阈值都可自行调整。
许可
MIT © SpookySandwich
More in Integrations & Sharing
dsh-notification
by omdsh-dev
Desktop notifications for DeepSeek Harness turn completions, with per-outcome controls and include/exclude keyword rules.
dsh-open-in-vscode
by omdsh-dev
Open DeepSeek Harness workspace directories in VS Code directly from the web GUI.
fn-os-apps
by tnnevol
Tencent CodeBuddy model provider for DeepSeek Harness that signs in with browser OAuth instead of an API key, lists the CodeBuddy model catalog with the context, output, tool-calling, reasoning and image capabilities of each model, keeps multiple accounts with automatic failover to the next usable one, shows remaining quota in the composer with a token and credit usage panel, and completes automatable CodeBuddy growth tasks per account with an execution log. Install from npm with `dsh plugin --profile web add @tnnevol/dsh-codebuddy`.
dsh-lark-bot
by plutokeating
Feishu/Lark bridge for DeepSeek Harness: scan-to-connect PersonalAgent binding, streaming cards, git-worktree project workspaces, parallel per-scope tasks, multi-role agents, cross-session notify, in-chat model/key management, and a safety-net guardian that still answers in Feishu after dsh crashes.
