
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
dsh-noletme
Advanced tools
NoLetMe — real-time reasoning-trajectory keyword stats for the DeepSeek Harness web chat. Tracks the We-need/Let's efficient trajectory vs the Let-me hesitant trajectory vs the The-user-wants neutral framing in the model's streaming reasoning blocks.
NoLetMe 是 DeepSeek Harness(dsh)网页端插件,在会话页右侧边缘挂载一块实时推理关键词统计面板。
模型流式输出时,NoLetMe 只统计其**推理块(reasoning blocks)**中出现的特征词,据此反映当前推理风格:
| 分类 | 关键词 | 依据 |
|---|---|---|
| 🟢 高效 · 直接行动 | We need… Let's… We should… We can… We will…;首行 Good./Great./Excellent. | minimal 类高分轨迹 |
| 🟠 犹豫 · 第一人称试探 | Let me… I think… I'm not sure… I wonder… I guess… maybe perhaps | standard 类低分轨迹 |
| ⚪ 中性 · 复述任务 | The user wants… The user asked… this task… the request… | Standard 目录开场框架 |
灰测是另一层、不改 0813 词表。面板只报命中态与数字;完整判定规则见 灰测如何判定。
面板是原生融入的悬浮层:复用 harness 设计系统(--dsw-alias-* 语义令牌、DetailsPanel 头/体结构、CSS Modules、明暗与 reduced-motion),通过官方 shell.overlay 插槽挂载,不改动、不补丁任何既有 UI。
本插件的分类体系并非杜撰,每一条都追溯至公开的 xiaobright/modeltest 仓库,及其对 DeepSeek V4 Pro GA 0813 后训练过拟合事件的调研:在 DeepSeek Harness「Minimal」预设(RL 训练所用的双工具脚手架)上训练出的 checkpoint,换到更宽的 Standard 工具目录后能力崩塌。
测试集:Project2 V4.1b —— 一个真实损坏的 ESP-IDF 嵌入式工程任务,已正式冻结(PROJECT_FROZEN.md,2026-07-23 冻结;评分规则与隐藏测试于 2026-07-19 做 SHA-256 固定)。
实测数据:evaluator/trajectory_evidence/derived/trajectory_stats.json(每次运行做 SHA-256 固定;只统计已完成的助手推理块,排除流式分块):
| 运行(模型 / 配置) | 得分 | we | let me | let's | I | 可见回复 |
|---|---|---|---|---|---|---|
| V4 Pro / Minimal WSL | 99 | 272 | 0 | 101 | 17 | 1 |
| V4 Pro / Minimal WSL | 96 | 231 | 0 | 117 | 18 | 1 |
| V4 Pro / anchored-standard Win | 98 | 179 | 1 | 88 | 17 | 1 |
| V4 Pro / anchored-standard Win | 99 | 165 | 0 | 98 | 18 | 1 |
| V4 Pro / Standard WSL | 91 | 11 | 208 | 2 | 137 | 55 |
| V4 Pro / PTC WSL | 92 | 16 | 194 | 0 | 237 | 33 |
高分运行(96–99)带 we/let's、let me ≈ 0;低分运行(91–92)let me 数以百计。这条干净的界线就是 🟢 高效 / 🟠 犹豫的划分来源。
分类器:仓库自带精确词法规则(evaluator/trigger_probe/src/classifier.mjs),NoLetMe 逐条镜像:首行 We need → minimal 类;有 we 无 let me → +2;出现任何 let me → standard 类;独立首行 Good./Great./Excellent. → +1。⚪ 中性类覆盖其余 ambiguous(模糊)及复述框架 —— Standard 目录开场 The user wants … Let me …(见 DEEPSEEK_V4_TRIGGER_MECHANISM_EXPERIMENTS_20260814.md),外加通用任务描述词汇。
诚实边界:原始矩阵原文警告:"词法轨迹标签是观测性指纹,而非路由或身份标签。" 词频只反映推理风格,不能判定后端、路由或 checkpoint;V4 Flash 会在分数不变时改变风格。灰测探针同样只报告社区观测到的特征组合,不能据此断言路由到了哪家模型。NoLetMe 是推理风格诊断工具,不是模型身份测试。
文献上的「LLM 风格指纹」分类器(例如 Bitton & Bitton, arXiv:2503.01659 的三分类器集成,或 Attestify 一类需训练语料的统计指纹)需要离线权重与校准集,不适合塞进这个浏览器插件。NoLetMe 只保留能本地、无模型地从 reasoning 算出的统计:列表密度、块长 p50、TTR、平均词长,作为灰测旁的完整数据,而不是把会话贴上 Claude/Gemini/GPT 标签。
完整事件报告见 docs/research.md。
一句话:对会话里每个助手轮独立打分,score ≥ 5 命中、≥ 2 疑似、否则未命中;任一轮命中即整段会话显示命中。加分项:出现 I'm doing +4、开场即 I'm doing +2、概要/条目形 CoT(列表行占比 ≥ 35%)+2、脏 token(Nameeee 等)+2、泄漏 fp_… 串 +2、TTFT 超过本会话动态线 +1;减分项:Let me ≥ 2 且无 I'm doing −3、裸 we ≥ 3 且无 I'm doing −1。0813 词表完全不动。
面板「灰测」一行(未命中 / 疑似 / 命中)的规则写在这里。实现:src/client/graytest.ts(信号表 gray-signals.ts),GRAYTEST_VERSION = 3。
灰测是抽卡——一次抽中一轮。探针因此逐轮独立计分:
assistant 节点各得一个 TurnProbe(verdict、score、I'm doing 数、列表密度、TTFT…);partial 单独算一条 live 轮(无 timing);likely → 命中;否则任一轮 possible → 疑似;面板徽章取最高分轮的家族。这样第 3 轮抽中不会被前两轮 0813 的 Let me 稀释;反过来旧会话里偶然一次 I'm doing 也只影响那一轮。展开后「按轮」区列出每轮一行(T<turn> / live · verdict · I'm doing · TTFT · 吐字时长)。
对这一轮的 reasoning 文本(只算 kind === 'reasoning' 的块,可见 text 一律不算):
| 信号 | 分 | 说明 |
|---|---|---|
I'm doing / I am doing / 粘连 I'mdoing ≥ 1 | +4 | 08-19/20 社区主指纹 |
本轮最新块首行即 I'm doing… | +2 | 开场比块中出现更强 |
有 I'm doing 且该轮 let me = 0 | +1 | 灰测常缺 Let me |
概要形:列表/标题行占比 ≥ 35%(或 ≥ 15% 且有 I'm doing) | +2 | 列表行 = 行首 - * • 1. 1) #–### |
脏 token:Nameeee、antml:thinking、<antml、EDMFunc、everydaycalculation | +2 | 从 reasoning 漏出 |
后端串 fp_…(如 fp_v4pro_20260812_prod) | +2 | 部署指纹,当细节不是身份 |
| TTFT 异常慢(超过本会话动态线) | +1 | 见下节;受网络影响,封顶 +1 |
该轮 let me ≥ 2 且无 I'm doing | −3 | 典型 0813 Standard |
裸 we ≥ 3、无 I'm doing、非概要形 | −1 | 典型 0813 Minimal |
阈值:score ≥ 5 → 命中;score ≥ 2 → 疑似;其余未命中。
社区反复强调灰测「首字很慢」「一段一段出」。宿主在 assistant 节点上记录 timing.stepStartTime / firstTokenTime / completedTime,插件据此给出每轮:
这些时间戳包含排队与网络,固定阈值会在慢链路上误报。所以插件用会话自己的历史轮估网络质量,动态调整命中线:
| 画像字段 | 含义 |
|---|---|
ttftBaseline | 已计轮 TTFT 的中位数——这条链路的底噪 |
ttftSpread | p90 ÷ p50——抖动程度 |
streamCharsPerSec | 吐字阶段每秒推理字符(慢链路同样拖低它) |
slowLineMs | 动态命中线 = max(基线 + 3 s, 基线 × 2 × 抖动),下限 2.5 s、上限 60 s |
效果:全程 ~9 s 的慢代理把基线抬到 9.5 s、命中线抬到 ~20 s——自己的每一轮都不会被误报;快链路(~0.7 s 基线)命中线收紧到 ~3.7 s,一次 5 s 的卡顿照样被抓。样本 < 2 轮时退回静态规则(≥ 6 s 或 ≥ 300 ms/字符)。
TTFT 仍只作 +1 弱加分,原始数字与画像始终显示——判断留给用户。流式 partial 没有时间戳,TTFT 列留空。
本地、无模型的描述统计,不是把会话贴上 Claude / Gemini / GPT 标签:
| 字段 | 含义 |
|---|---|
| I'm doing | 全部 reasoning 里出现次数 |
| 列表密度 | 会话级列表行占比 |
| p50 | reasoning 块字符数中位数 |
| TTR | 小写分词 type-token ratio |
| 词长 | 字母 token 平均长度 |
| TTFT↑ | 任一轮触发慢首字时提示 |
| 按轮 | 每轮 verdict / I'm doing / TTFT / 吐字 |
| 脏 token / fp | 仅当扫到时显示原文 |
指纹(脏 token、开场词、fp 正则、列表行正则)集中在 src/client/gray-signals.ts,新增社区报告改表即可。pnpm calibrate 用两组语料做回归:
I'm 的 build 记录)→ 合成会话后不得到达 likely。文献上的家谱鉴定(Bitton & Bitton, arXiv:2503.01659 三分类器集成等)需要训练权重与校准集,不进这个浏览器插件。
灰测命中只表示「某轮 reasoning 像社区灰测簇」,不能据此断言路由到了哪家模型、哪个 checkpoint、哪台机器。词法标签与时间特征都是观测性指纹,不是身份。V4 Flash 也会在分数不变时改风格。
更短的矩阵与 0813 对照见 docs/research.md。
前置条件:已安装 dsh CLI ≥ 0.1.0-rc.7(dsh --version),并已建好目标 profile。NoLetMe 按 dsh 0.1.x 的客户端契约构建:同时兼容 rc.7、rc.8、0.1.1-rc.x、0.1.2-rc.1、0.1.3-alpha.x、0.1.5-rc.x、0.1.6-alpha.1,以及 0.1.7 全线(alpha.1、alpha.2、rc.1、rc.2)。更早的 rc 版本未保证兼容。逐版本的精确兼容声明(DSH STORE dsh.compatibility.dshReleases 矩阵)以本仓库 package.json 为准:0.1.6-alpha.1 与 0.1.7-rc.1 为真实 Profile 实测,0.1.7-alpha.1、0.1.7-alpha.2、0.1.7-rc.2 为静态契约探针实测(平台种子表、shell.overlay、chat.legacy 切片、SessionFace 四项逐版本比对通过)。
方式一 · npm 安装(推荐) —— dsh-noletme 已发布到 npm,预构建安装,无需 allowBuilds 审批
dsh plugin --profile demo add dsh-noletme
安装后即可在网页端右上角看到面板。
方式二 · 从 GitHub 直接安装(prepare 脚本会在安装时自动构建 lib/)
dsh plugin --profile demo add github:Yuer6327/NoLetMe
pnpm ≥ 10 默认拦截 git 依赖的
prepare脚本。先把 pnpm 提示的包名写入该 profile 的pnpm-workspace.yaml,再重新执行add:
方式三 · 本地目录安装
cd /path/to/this/repo/.. # 进入 NoLetMe/ 所在目录的上级
dsh plugin --profile demo add ./NoLetMe
dsh web --profile demo # 或直接:dsh --profile demo
allowBuilds:
dsh-noletme: true
原理:cordis.patch.yml 这层在组合里插入 dsh-noletme 行;package.json 的 dsh.client 块告诉网页壳加载浏览器包。包根另有 dsh-std Community v0.15 静态清单 dsh-plugin.json(facets.host.entry → lib/std/host.js),给 @dsh-std/adapter-dsh 等标准宿主做安装前兼容判定与 inventory;面板本身仍走原生 dsh.client——Community v0.15 / browser.ui.dsh/v1alpha1 目前只有 SettingsSection 与 ToolCallView,没有 shell.overlay 对应 surface,所以标准宿主不会重挂这块面板。
标准宿主侧可先装 adapter 再装本包(adapter 扫描 profile 依赖里的 dsh-plugin.json):
dsh plugin --profile demo add @dsh-std/adapter-dsh
dsh plugin --profile demo add dsh-noletme
Windows 注意:
cordis.patch.yml的行名用的是包名dsh-noletme,因此只有把该包装入 profile 后悬浮层才生效。行名写成原始绝对路径会失败 —— ESM loader 拒绝D:\…入口名(ERR_UNSUPPORTED_ESM_URL_SCHEME);Linux 下可用file://URL 替代。
本地开发:
pnpm install && pnpm build
dsh web --patch 'D:/OneDrive/桌面/play/codes/dsh-plugin/NoLetMe/cordis.patch.yml'
? 链接,数字始终显示)、轨迹模式、占比条、we · let's · let me · I、关键词明细、犹豫压力。方法说明不进面板。prefers-reduced-motion 下降级为瞬时切换;开合状态会被记住。partial),不看 text。若推理块缺失/极少,面板只报健康告警和原始计数,不拿文本凑数。0813 会话分类器保持原样。localStorage(dsh-noletme.stats.<sessionId>),重开会话不重新计数,只折叠新增消息。pnpm install # devDependencies:tsdown、lightningcss、typescript、react types
pnpm typecheck # 可选;tsc --noEmit
pnpm test # 计数引擎 + 灰测探针 + dsh-std Community v0.15 清单契约
pnpm calibrate # 灰测阈值校准(克隆 modeltest 冻结聚合做负样本回归)
pnpm build # tsdown → lib/index.js(node 半边)+ lib/std/host.js(dsh-std facet)+ lib/client.js(浏览器包)
客户端依赖(@deepseek-ai/dsh-client-*)只用于构建与类型检查,精确锁在 0.1.7-rc.2(npm @deepseek-ai/dsh 的 next 标签;latest 现为 0.1.5-rc.3、alpha 为 0.1.7-alpha.2)。它们不进运行时产物——lib/client.js 除宿主种子模块外不带任何 @deepseek-ai/* 依赖,跨版本兼容由结构读取保证,而不是由依赖范围保证。浏览器包只 require rc.7∩rc.8∩0.1.1∩0.1.2∩0.1.3∩0.1.5∩0.1.6∩0.1.7 的平台种子模块(react、cordis、dsh-client-ui-slots、dsh-client-ui-primitives);宿主种子表自 0.1.6 起扩到 9 项(新增 dsh-client-ui-dockkit,0.1.7 未变),那 7 项始终是子集,所以既不 require 0.1.2 新增的 dsh-client-store,也不 require dsh-client-ui-dockkit(旧宿主种子表没有它们)。会话快照按结构子集读取:rc.7–0.1.1 用顶层 nodes/partial(必要时回退 chat.legacy);0.1.2+ 把节点从 SessionFace 拆到 uiConversation.views.get('chat').legacy(0.1.6/0.1.7 下该切片为 {nodes, turnTimings, turnEnds, partial, runningCalls},nodes/partial 语义未变,新增的两个 Map 未被用到),插件惰性合并两路,且 dsh.client.inject 不再列出已删除的 dsh-client-runtime(否则新宿主组图会失败)。旧宿主仍通过 cordis sessions 服务等待,不依赖 graph 边。
0.1.7 新增的插件版本闸门对本插件不生效。 宿主在安装与启动时调用 evaluatePluginCompatibility(),把插件 package.json 里声明为 peerDependencies 的 @deepseek-ai/dsh / @deepseek-ai/dsh-* 范围与运行中的 dsh 版本比对(semver.satisfies,prerelease 参与比较;workspace:^/~/* 视作当前运行时),不满足则拒绝安装/启动,并给出 dsh plugin allow-version <pkg@version> --dsh-version <exact> --accept-risk 这一精确到 插件@版本 × dsh 版本 的例外入口(version-exemptions 可查、revoke-version 可撤)。该检查只在插件存在 peerDependencies 字段时才生效——没有该字段直接返回 undefined,不做任何校验。NoLetMe 不声明任何 dsh peer,因此不会被这个闸门拦住;这也是刻意的:它的兼容性来自上面的结构读取,而不是版本区间。
0.1.7-rc.1 的其余宿主侧变更(Session 日志升 V4 与批量迁移、Agent 生命周期/会话历史/Shell 沙箱接口异步化、设置改由 Profile 插件配置保存、Agent 预设改由插件组合包声明、PTC 运行时与工作流执行器改名、工具返回按统一 token 预算截断、Windows 沙箱越界删除修复等)均不触及本插件:shell.overlay 仍是 {kind:'list', scope:'root'}(0.1.7 另加 shell.leading 槽,纯增量),dsh.client 键、__ModuleLoader__.load 契约与 assistant {kind,seq,blocks} + timing.{stepStartTime,firstTokenTime,completedTime} 结构均未变。
0.1.7-rc.1 实测(0.3.8)。 对已安装的 0.1.7-rc.1 逐项核对:宿主前端种子表仍为 9 项(与 0.1.6 相同,本插件声明的 7 项是子集);shell.overlay 声明与 chat.legacy 切片(nodes/partial/turnTimings/turnEnds/runningCalls)、SessionFace = ISession & ObservableSnapshot<SessionSnapshot> 均未变;evaluatePluginCompatibility() 对 dsh-noletme@0.3.8 返回 undefined(无 peerDependencies → 跳过),并用对照组确认 <0.1.6、^0.2.0 会被判为 BLOCK。实机 dsh --profile web --port 3160 下 boot manifest 条目为 {id: dsh-noletme, inject: ['@deepseek-ai/dsh-client-locale','@deepseek-ai/dsh-client-ui-layout'], immediately: true},包以 plugins/??dsh-noletme/client.js&rev=… 合并形式下发(94540 B,只 require react 与 react/jsx-runtime);headless Edge(CDP)面板渲染成功、卡片 302×117 ↔ 胶囊 97×38(radius 10px)形变通过、零 console 报错。未覆盖:真实会话的计数链路——0.1.7 的 web profile 停在首次运行的 API Key 配置引导上,没有可打开的会话,因此空状态(暂无会话)之外的计数未经实机验证,逻辑正确性仍由 pnpm test 的折叠/灰测单测覆盖。
0.1.7 全线静态契约探针(0.3.9)。 对 npm 发行物逐版本下载比对 0.1.7-alpha.1、0.1.7-alpha.2、0.1.7-rc.1、0.1.7-rc.2 四个版本中本插件依赖的全部契约面:dsh-web-frontend 平台种子表(9 项,本插件 require 的 7 项齐全)、dsh-client-ui-layout 的 shell.overlay 槽声明(仍为 {kind:'list', scope:'root'})、dsh-client-ui-chat 的 chat.legacy 切片(仍为 {nodes, turnTimings, turnEnds, partial, runningCalls})、dsh-api-session-controller 的 SessionFace = ISession & ObservableSnapshot<SessionSnapshot> 与 loadOlder()(仅文档注释与分页粒度说明有差异)。四项探针在四个版本上结果完全一致,与 rc.1 实测基线吻合,故 package.json 的 dshReleases 矩阵将 0.1.7 全线声明为 compatible;alpha.1/alpha.2/rc.2 为静态证据,未经真实 Profile 实机验证。
⚠️ 这些包在 npm 的
latest标签常常滞后(多数 client 包latest仍可能是0.0.1-rc.1,而@deepseek-ai/dsh的latest现为 0.1.5-rc.3、next为 0.1.7-rc.2、alpha为 0.1.7-alpha.2)。升级依赖时请显式写具体版本或alpha/next标签,不要用@latest。
dsh CLI 升级后无需重装 profile:基底包(
dsh-base、dsh-web-app等)按"安装优先"从 CLI 自身解析,profile 里的行会自动跟到新版本。
浏览器包是 window.__ModuleLoader__.load(...) 闭包工厂产物(与 harness 自带的 clientBundle 预设同形):平台模块走冻结模块表解析,其余内联,*.module.css 编译成哈希类名映射并自动注入样式。
src/
├── index.ts # Node(宿主)半边 —— 空操作,满足 Loader
├── std/host.ts # dsh-std Community v0.15 FacetModule(无 @deepseek-ai/*)
└── client/
├── index.ts # 浏览器包入口(apply/inject)
├── apply.ts # 注册 shell.overlay 入口 + 统计 store
├── slots.ts # inject-face + composed-props 契约
├── conversation.ts # 宿主快照结构子集(nodes/partial、chat.legacy、或 0.1.2+ uiConversation)
├── session-source.ts # 当前会话 ConversationView 可观察源
├── session-store.ts # 统计 store:实时折叠、全历史翻页、持久化
├── accumulator.ts # 每会话增量折叠 + 压缩 + 序列化
├── keywords.ts # 有研究依据的 0813 关键词表
├── stats.ts # 计数引擎(最长匹配遍历、按块缓存)
├── graytest.ts # 本轮灰测探针(I'm doing / 概要形 / 脏 token / fp_)
├── NoLetMePanel.tsx / .module.css
└── locales.ts # zh + en 词典
推理流以 reasoning-delta 分块到达,会话层累加进 partial(每动画帧至多发布一次),落定的轮次进 nodes。rc.8 起宿主另有 chat/views,顶层 nodes/partial 仍是 0.1.1 的兼容切片;0.1.2 删除 dsh-client-runtime,节点改由 uiConversation 发布为 views.get('chat').legacy,SessionFace 只留 openState/hasMore/loadOlder。conversationViewOf 合并这两路。0.1.5 把原 conversation Slot 迁到 main 的 conversation key,并新增 sidebar.panellist;0.1.6 在该切片旁加了 turnTimings/turnEnds,0.1.7 未再改该切片;nodes/partial 与 assistant {kind,seq,blocks}、timing.{stepStartTime,firstTokenTime,completedTime} 结构自 0.1.2 起始终未变;shell.overlay 一直是布局的帧级纯增量席位(0.1.7 另加同级的 shell.leading),面板不迁。统计 store 对两路快照都做增量折叠(按块身份缓存计数,新节点由 seq 高水位门控),发布现成的 TrajectoryStats —— 面板从不整段重算会话。面板样式镜像 DetailsPanel。
FAQs
NoLetMe — real-time reasoning-trajectory keyword stats for the DeepSeek Harness web chat. Tracks the We-need/Let's efficient trajectory vs the Let-me hesitant trajectory vs the The-user-wants neutral framing in the model's streaming reasoning blocks.
The npm package dsh-noletme receives a total of 180 weekly downloads. As such, dsh-noletme popularity was classified as not popular.
We found that dsh-noletme demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.