Bundle
dsh-consumer-audit
Audit a DSH profile for capabilities nothing consumes, and record completion claims with the evidence that supports them.
- Source
- qimen039-code
- License
- MIT
- Updated
- Updated 11 hours ago
Readme
# dsh-consumer-audit
[English](README.en.md) | 中文
你装的插件或 skill 注册了某项能力,但注册成功不代表模型真的调用过它们,也不代表它们设计的内容真的实际生效了,而这件事模型根本不会主动报告。这个插件负责把它报出来。
## 它解决什么
DSH 的插件可以向宿主注册工具、skill、服务和路由。注册成功不等于模型会调用它们。
一个插件可能在启动时安静地注册了三个工具,其中两个在过去几十次会话里一次都没被调用过。代码在,测试过,加载正常,只是没有任何任务走到那里。还有一类更隐蔽:插件只包裹了宿主已有的方法,什么都不注册,从清单上看它像什么都没做,实际上它确实在生效。
`consumer_audit` 把这件事变成一份可核对的清单。它读取活动 profile 的组成行,解析每一行装的是哪个包,静态扫描该包的注册站点,再去 `DSH_HOME` 下的会话日志里数每个已注册工具和 skill 出现过几次,最后报告计数为 0 的那些。
## 一份报告长什么样
在装了 8 个插件的 profile 上跑一次,得到这样的结构(插件名换成中性写法):
```
generated_from
rows 8 已声明的组成行
sessions_scanned 16 实际扫描的会话日志份数
findings
tool_never_invoked some-plugin/tool-x 16 份日志里 0 次调用
tool_never_invoked this-plugin/consumer_audit 同上,包括它自己
notes(不算问题,只是说明)
intercepts_host_behaviour some-plugin 只包裹宿主已有方法,没有新能力可数
first_party_shipped @deepseek-ai/... 随 harness 发行,不在 profile 里
```
每条 finding 都带证据定位、缺口归类和证伪条件。它长这样:
```json
{
"kind": "tool_never_invoked",
"object": "some-plugin/tool-x",
"consumer_count": 0,
"evidence": {
"locator": "<该插件安装目录>",
"method": "tool name searched across 16 scanned session logs"
},
"falsifier": "find one invocation in a session log this run did not scan",
"classification": "consumer_verification_gap"
}
```
注意最后一栏。一条 finding 说的只是"这次扫描没看到消费者",并附带可以推翻它的观测。它没说插件写得不好。
## 什么时候用得上
装完一个新插件,想知道它有没有在干活。怀疑某个功能写了但没接上。清理 profile 之前,想知道删掉谁不会有影响。自己写插件,想知道哪部分没人调用。
上面这些判断由模型做,它自己去跑这个插件;人只要问一句就行。
## 安装
```sh
dsh plugin --profile <profile> add github:qimen039-code/dsh-consumer-audit
```
装完需要重启 DSH,工具才会出现在模型工具表里。
如果你手工把包装进 profile,注意解析位置:DSH 的 loader 只从**活动 profile 自己的** `node_modules` 解析插件包,放在 `profiles/node_modules` 下无效,会以 `PackageOverlayNotFoundError` 启动失败。用上面的命令安装不会遇到这个问题,它写进的是 profile 的依赖图。
需要 Node 22.15 或更新版本,因为会话日志是多帧 zstd。
## 怎么读报告
报告里有六类 finding 字段。
| 字段 | 含义 |
| --- | --- |
| `tool_never_invoked` | 工具已注册,被扫描的日志里没有对它的调用 |
| `skill_never_loaded` | 盘上有 `SKILL.md`,被扫描的会话没有加载过 |
| `prompt_only_capability` | 这个包只注册提示词 |
| `row_without_capability` | 行已挂载、包也解析到了,但它什么都没注册 |
| `duplicate_prompt_section` | 两个包注册了同名的提示词段 |
| `package_unresolved` | 这一行的包既不在 profile 里,也不属于随 harness 发行的那批 |
| `tool_never_delivered` | 被调用过,但每次返回都带 isError |
| `skill_never_delivered` | 同上,针对 skill |
另有两类结果记为 notes,不做判定。包名以 `@deepseek-ai/` 开头的行随 harness 发行,搜索为空说明不了任何事。包裹既有服务方法的包不注册新能力,调用计数判断不了它。
报告还有一节 `consumed`,逐条给出 `attempts` / `failed` / `succeeded`。三层是分开的:注册了(声明)、被调用过(有调用记录)、送达了(配对的返回不带 isError)。报告只走到送达这一层。字段 `generated_from.capability_names` 标出每个包的能力名是它自己声明的还是扫描推断的,前者权威,后者可能读错。
**内容有没有按设计生效,是模型该判断的事,不是这个插件该判断的事。** 插件在这里只做一件事:把记录交出来。
会话日志是多帧 zstd,模型没法用普通读取打开。所以工具多了一个入口:
```json
{"action": "evidence", "name": "some_tool", "limit": 5}
```
它返回该能力最近若干次调用的参数和返回正文,以及每次的 `isError`。模型拿它去对照这个能力本该做什么,再下判断。插件不替它下这个判断,也不假装自己能下。
## 边界
源码里的注册站点只说明能力被声明了,不说明它能用。
调用计数描述的是被扫描的那些日志。未扫描的 profile、日志窗口之前的调用都会读成未使用;会话变长,计数也会漂移。
第一方包随 harness 发行,不参与搜索。报告把它们记为 shipped,不报缺失。
扫描匹配一组固定的调用模式,报告里列出了这组模式。用其他调用点注册的包会被误报。
字段 `generated_from.preset_roots_searched` 逐条列出本次运行看过的 skill 根。某个根没被解析到,意味着它的 skill 不在报告里,不意味着它们没被使用。
报告不含语义判断。
## 消融
```js
import { collect } from "dsh-consumer-audit/collect";
import { ablation } from "dsh-consumer-audit/audit";
const input = collect({ dshHome, profileDir });
console.log(ablation(input));
```
关掉消费者计数时,需要计数的工具与 skill 记作未评估。把输入置空的那种消融看起来差异很大,实际什么也证明不了。
## 验证
仓库根目录一条命令重跑全部检查:
```powershell
.\tools\run-evidence.ps1
```
它依次检查:市场 entry 的机械要求、市场自己的目录解析器与安装解析器、两份 README 与 `SKILL.md` 的写作特征、插件契约在三种上下文下的行为、`npm pack` 后隔离安装的副本、对首个 finding 的独立重数,以及受跟踪文件里有没有本机信息。任何一节失败,脚本以非零码退出。
当前数字与逐条描述见 [EVIDENCE.md](EVIDENCE.md)。README 不抄这些数字,它们每次运行都会变。
**尚未验证**:市场精选列表上架。entry 文件已就绪,仓库公开,但 PR 未提。
## 仓库结构
```
lib/audit.js 对一份普通清单做判定,无 I/O
lib/collect.js 读 DSH_HOME,产出那份清单
lib/index.js 注册工具与 skill
skills/ skill 正文
tools/ 各项检查与发布脚本
market/ 提交进精选列表的条目文件
```
## 许可
MIT
Install
dsh plugin --profile web add github:qimen039-code/dsh-consumer-audit
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-consumer-audit from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.