把每轮工具计数与粗粒度验证信号写入本地 JSONL,不保存提示词、工具参数或结果正文。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-verification-receipt
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:030611/dsh-verification-receipt
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README

回答一个范围更小、可以检查的问题:这一轮中,DSH 记录了哪些形似验证操作的执行信号?
dsh plugin --profile web add dsh-verification-receipt
Receipt 汇总已记录的工具计数与词法层面的形似验证信号;它不能证明测试确实运行,也不能证明代码正确。
由社区维护,并非 DeepSeek 官方项目。相关 trust-layer 插件:Telemetry Redactor、Evidence Audit 与 Context Provenance。
DSH Verification Receipt 是一个面向 DeepSeek Harness 的小型、被动式 Profile Bundle。每次耐久的 turn/end 到达后,它会向本地 JSONL 文件追加一条隐私最小化、启发式执行摘要。
它记录执行痕迹,不证明语义正确。凭证只能说明 DSH 记录了工具调用,并且词法启发式发现了可能的验证信号;它永远不能证明“测试已运行”,也不能说明正确命令得到执行、断言充分、输出真实或助手结论正确。
它有意不做 evidence-audit 账本:各行保持独立,不引入哈希链、产物捕获、claim-evidence 关联或协议证明。
兼容性证据
版本 0.1.1 精确支持 DSH 0.1.2-alpha.3、0.1.2-alpha.4 和 0.1.2-alpha.5,Node.js 范围为 ^22.19.0 || >=24.0.0。每个 DSH 版本均通过本地包门和一次性 Windows Web Profile 的安装、合成配置、冷启动及卸载验收。精确边界见兼容性证据。Cordis 和 Session 由 DSH 宿主提供,因此标为 optional peer;Schemastery 既以精确版本作为运行时依赖,也声明为兼容性 peer。
安装
上面的兼容性证据对应源码版本 0.1.1。GitHub 修改版本号不会自动发布到 npm;
使用包名安装前,可运行 npm view dsh-verification-receipt version 核对 registry
版本是否已包含这些改动。发布前需要使用此源码版本时,请构建并打包 checkout,
再将生成的 .tgz 传给 dsh plugin --profile web add。
把已发布的包加入需要生成凭证的每个 profile:
dsh plugin --profile web add dsh-verification-receipt
dsh --profile web --dump-config
如果其他 profile(例如 headless)也需要凭证,请换用对应 profile 名重复第一条命令。本地开发时,克隆本仓库并运行 pnpm install --frozen-lockfile && pnpm run check,再把 checkout 路径而不是包名传给 dsh plugin ... add。
tarball 已包含编译后的 JavaScript 和 TypeScript 声明,使用者不需要 TypeScript、
esbuild 或插件构建步骤。单独安装包时,可用
pnpm add --ignore-scripts dsh-verification-receipt@<version> 禁用依赖生命周期
脚本;请将占位符换成已发布版本。这是包管理器命令,不是 DSH CLI 参数。
本源码树通过 prepack 在打包/发布前构建,没有 prepare、preinstall、
install 或 postinstall 钩子。checkout 安装依赖后,需要显式运行
pnpm run build 或 pnpm run check。直接安装 Git 源码仍可能由包管理器触发
prepack,不能称为无脚本安装;优先使用预编译的 registry 包或已审阅的 tarball。
具体边界见 SECURITY.md。
package.json 声明 dsh.bundle.patch;cordis.patch.yml 插入一个普通观察插件。任何提供核心 Session 服务的 DSH 输出面都可以使用它。
输出
下图来自发布版插件处理合成、非用户 DSH 事件后生成的真实 receipt;右侧只展示部分落盘字段。它不是用户会话,也不证明测试运行或通过。

默认文件为:
$DSH_HOME/verification-receipts/v1/receipts.jsonl
DSH_HOME 未设置时,路径解析到 ~/.dsh 下。可以在 profile 的 cordis.patch.yml 中用绝对路径覆盖:
- id: verification-receipt
config:
outputPath: /absolute/private/path/receipts.jsonl
每行格式如下:
{
"schemaVersion": 1,
"kind": "dsh-verification-receipt",
"sessionIdHash": "sha256:…",
"turn": 3,
"turnEndSeq": 42,
"endedAt": 1786630000000,
"outcome": "completed",
"tools": {
"calls": 4,
"succeeded": 3,
"failed": 1,
"unresolved": 0,
"topLevel": 2,
"nested": 2
},
"verificationSignals": [
{
"source": "command",
"category": "test",
"status": "failed"
}
],
"claim": "execution-trace-only",
"receiptHash": "sha256:…"
}
完整性警告
两个 hash 都没有密钥,均可重算。receiptHash 是对其前面全部凭证字段按输出顺序计算的 SHA-256;能编辑一行的人也能重新计算它。独立行无法暴露删除、插入、重排、截断、回滚或替换。它不是签名、可信时间戳、哈希链、承诺或防篡改日志。
隐私与 Agent 行为

落盘凭证不包含:
- 工具参数或 call id;
- 工具结果正文或错误消息;
- 助手或用户消息正文;
- 原始 session id、工作目录、provider 名称或模型名称。
插件会暂时读取已有耐久事件里的工具名称、原始参数和结果状态来计算汇总,但不会持久化这些输入。它不追加 Session 事件、不注册工具、不添加 prompt 段、不注入上下文、不发起模型调用,也不改变模型历史。
sessionIdHash 是确定性、无密钥且带域分隔的 SHA-256,用于在不保存原始 id 的前提下将同一 Session 的凭证分组。它可跨文件关联。如果 Session id 可预测或熵低,观察者可以离线猜测候选值并重算 hash;这是化名化,不是匿名化。
验证信号启发式
以下情况会产生启发式信号:
- 工具名称类似 test、typecheck、lint、build、check、verify 或 validate 工作;或者
- 类 shell 工具在内存中的
command或cmd参数类似上述工作。
落盘信号只保留 source、粗粒度 category 和观察到的 status。DSH 原生工具错误以及可识别的非零 shell 退出标记计为失败。后台命令保持 unresolved,因为后续 job 结果可能发生在本轮之外。即使是 status: succeeded,也只表示观察到的调用没有已识别失败标记;它不表示测试通过,甚至不表示测试确实运行。
分类只做词法匹配,不解析 shell 语义、不展开别名,也不执行命令:
| 输入形态 | 支持情况 | 边界 |
|---|---|---|
JSON 字符串或对象参数中的字符串 command/cmd |
支持 | 只检查已识别的类 shell 工具名。 |
大小写、引号,或可见的 bash -lc/pwsh -Command wrapper |
词法支持 | 分类关键词必须仍在字符串中可见。 |
数组命令、argv、嵌套命令对象、自定义 shell 工具名 |
不支持 | 不产生信号。 |
| 不含可见分类关键词的别名或 wrapper | 不支持 | 预期存在漏判。 |
echo "do not run tests" 一类引用文本 |
会被词法匹配 | 因为不解析意图与执行,预期存在误判。 |
每个匹配都只能称为“启发式信号”,绝不能称为“测试已运行”,也不能作为证明或质量门禁。
模型体验
| 方面 | 影响 |
|---|---|
| Token 成本 | 无。 |
| 工具调用 | 无;模型不会获得新工具。 |
| Session 日志 | 不变;插件只读已有事件,不添加事件。 |
| Prompt 与上下文 | 不变。 |
| Turn 延迟 | 监听器同步扫描已结束的 turn,并排队本地文件 I/O;turn 路径不等待磁盘。 |
已知限制
- 凭证只覆盖插件运行期间观察到的事件;不会回填构造 seed 历史或插件卸载期间结束的 turn。
- 进程崩溃可能丢失尚在队列中的凭证,因为
turn/end不会同步等待这个可选本地 sink;正常卸载插件或应用时会排空已接收写入。 - 卸载时先关闭 enqueue 闸门,再移除 listener,最后排空已接收写入;进程被突然终止时无法运行该生命周期。
- 各行彼此独立,无法检测删除、重排、截断或回滚。
- 凭证状态复述 DSH 记录的工具结果和可识别的 shell 标记,不会独立执行或验证任何内容。
- 投影成本随单轮事件的数量和大小增长;异常大的工具参数在内存分类时可能增加 turn 结束阶段的 CPU 时间。
- 进程内写入队列有序但无界;缓慢或卡死的文件系统会持续增加内存占用,直至写入恢复或进程结束。
- 没有跨进程锁。两个 DSH 进程同写一个文件时,行顺序和行边界完整性均无保证;应每进程使用独立文件。崩溃可能留下不完整尾行,读取方必须拒绝或隔离它。
- 创建模式只在支持的 POSIX 文件系统上请求
0700/0600;不会收紧已有权限,Windows 可能忽略 POSIX mode,并且会跟随预先存在的符号链接。请配置可信、私有且非符号链接的路径。 - 文件没有内建轮转、保留策略、加密、签名或恢复机制。
信任与漏洞披露模型见 SECURITY.md。
开发
pnpm run typecheck
pnpm run test
pnpm run build
pnpm run check
pnpm run release:smoke
pnpm run performance:smoke
测试覆盖隐私排除、确定性 hash、顶层与 Code Mode 最终状态、分类支持/不支持矩阵、监听器释放、磁盘排空,以及真实 DSH Context + SessionStore 组合。release:smoke 会删除生成的 lib/ 后重新打包,保留生命周期元数据以检查安装钩子,并锁定 tarball 精确文件清单。随后在两个独立临时项目中分别禁用、启用安装脚本,按包名导入真实 .tgz 并核对一条合成凭证。
许可证
MIT
链接
同类插件
kenryu42/cc-safety-net★ 1900
执行前守卫,在工具调用运行前拦截破坏性 Git 与文件系统命令,以及对 SSH 密钥、.env 等机密文件的访问。
ADWMC/helm-d#helmd★ 984
DeepSeek Harness 的安全分析插件:33 个工具覆盖六大安全域、证据/报告与工具集,并提供案件生命周期、路由和工具账本;按会话绑定的案件工作区支持证据链、E 编号校验与可复现结论(repro_cmd);内置 362 篇按需参考、三档可热切换人设,以及带案件状态恢复的破甲 / Case / 拦截 / 关于四页工作台。
toby-bridges/api-relay-audit★ 904
从 DeepSeek Harness 对 AI API 中转站和 LLM 代理运行本地安全审计,生成 Markdown 报告,覆盖提示词注入、模型替换信号、工具调用改写、错误泄漏、流完整性和按 profile 启用的 Web3 风险。
SeaOf0/dsh-redteam-model★ 807
面向授权安全研究的 DSH 合集:九个工作模式(redteam 总控、渗透测试、代码审计、二进制分析、攻防评估、免杀对抗、应急溯源、云安全攻防、CTF 解题)与十五个运行时插件,设置页管理台支持一键部署、安装、更新与卸载。
howmp/dsh-pentest★ 616
面向 DeepSeek Harness 的授权渗透模式:以探索链路记录目标、线索、资产与漏洞,并在 Web 中可视化展示。
PerryLink/dsh-auto-review★ 244
审批链上的第二模型自动审查:只读审查子代理返回带理由的 allow/deny 结构化裁决,默认 fail-closed。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。