🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

防篡改审计证据 huangjua/dsh-evidence

DeepSeek Harness
huangjua32 天前有提交已提供中文文档扫描:含敏感能力

为智能体执行生成哈希链回执与可验证证据包

29.4/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add huangjua/dsh-evidence
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · security
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/25·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 32 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包@dsh-external/dsh-evidence(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/22 15:35:03

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 101 处,展示前 56 条)
  • 读取本地文件
    src/browse.ts:43
    const text = await readFile(join(dir, 'evidence.json'), { encoding: 'utf8', signal })
  • 读取本地文件
    src/browse.ts:57
    try { entries = await readdir(root, { withFileTypes: true }) }
  • 读取本地文件
    src/browse.ts:75
    const st = await lstat(dir)
  • 读取本地文件
    src/browse.ts:118
    const receiptText = await readFile(join(dir, 'receipt.jsonl'), { encoding: 'utf8', signal: options.signal })
  • 读取本地文件
    src/bundle-paths.ts:23
    try { lstatSync(file); return true }
  • 读取本地文件
    src/bundle-paths.ts:36
    const rootStat = lstatSync(root)
  • 读取本地文件
    src/bundle-paths.ts:46
    const st = lstatSync(current)
  • 写入本地文件
    src/bundle-paths.ts:59
    if (!pathEntryExists(parent)) mkdirSync(parent, { mode: 0o700 })
  • 读取本地文件
    src/bundle-paths.ts:60
    if (!lstatSync(assertBundlePath(dir, parentKey)).isDirectory()) throw new EvidenceError('COPY_PATH_INVALID', '副本父级不是目录')
  • 读取本地文件
    src/bundle-paths.ts:84
    if (!lstatSync(files).isDirectory()) throw new EvidenceError('COPY_PATH_INVALID', 'files 必须是普通目录')
  • 读取本地文件
    src/bundle-paths.ts:85
    for (const name of readdirSync(files)) reserved.add(`files/${name}`.toLowerCase())
  • 读取本地文件
    src/core.ts:304
    if (!existsSync(file)) throw new EvidenceError('BUNDLE_NOT_FOUND', `证据包不存在或尚未提交: ${name} (${file})`)
  • 读取本地文件
    src/core.ts:305
    return parseManifestText(readFileSync(file, 'utf8'), name)
  • 写入本地文件
    src/core.ts:381
    mkdirSync(dir, { recursive: true, mode: 0o700 })
  • 读取本地文件
    src/core.ts:389
    if (existsSync(tmp)) throw new EvidenceError('WRITE_FAILED', '清单临时路径已存在,拒绝覆盖')
  • 写入本地文件
    src/core.ts:391
    try { chmodSync(tmp, 0o600) } catch { }
  • 写入本地文件
    src/core.ts:392
    renameSync(tmp, file)
  • 读取本地文件
    src/core.ts:533
    const text = readFileSync(path, 'utf8')
  • 写入本地文件
    src/core.ts:578
    mkdirSync(root, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/core.ts:580
    try { mkdirSync(dir, { mode: 0o700 }); reserved = true }
  • 读取本地文件
    src/core.ts:593
    if (!reserved && (recovered?.state !== 'NOT_COMMITTED' || existsSync(manifestPath(root, name)))) throw new EvidenceError('BUNDLE_EXISTS', `证据包已存在: ${n
  • 读取本地文件
    src/core.ts:594
    if (readdirSync(dir).some((item) => item !== '.lock')) throw new EvidenceError('BUNDLE_EXISTS', `目录包含非本次创建的内容: ${name}`)
  • 读取本地文件
    src/file-io.ts:26
    const st = await stat(file, { bigint: true })
  • 读取本地文件
    src/migration.ts:29
    const digestFile = (key: string) => createHash('sha256').update(readFileSync(assertBundlePath(dir, key, true))).digest('hex').toUpperCase()
  • 读取本地文件
    src/migration.ts:58
    const before = statSync(current)
  • 读取本地文件
    src/migration.ts:62
    const after = statSync(current)
  • 写入本地文件
    src/migration.ts:115
    mkdirSync(destinationRoot, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/migration.ts:117
    try { mkdirSync(destination, { mode: 0o700 }) }
  • 写入本地文件
    src/migration.ts:135
    copyFileSync(file.current, staged)
  • 读取本地文件
    src/migration.ts:139
    if (actual !== file.entry.sha256 || statSync(staged).size !== file.entry.size) throw new EvidenceError('FILE_CHANGED', '迁移复制时来源内容发生变化,未提交新包', 'NOT_COM
  • 读取本地文件
    src/migration.ts:140
    nextFiles[file.key] = { ...file.entry, storage: 'copy', mtimeMs: statSync(staged).mtimeMs }
  • 读取本地文件
    src/migration.ts:143
    if (await sha256File(file.current, options.signal) !== file.entry.sha256 || statSync(file.current).size !== file.entry.size) throw new EvidenceError('
  • 读取本地文件
    src/scan.ts:55
    const handle = await opendir(directory)
  • 读取本地文件
    src/scan.ts:74
    const info = await lstat(next, { bigint: true })
  • 读取本地文件
    src/scan.ts:104
    currentBundle = await realpath(options.excludeBundle)
  • 读取本地文件
    src/scan.ts:119
    const info = await lstat(path, { bigint: true })
  • 读取本地文件
    src/scan.ts:121
    const physical = await realpath(path)
  • 读取本地文件
    src/scan.ts:125
    const target = await stat(path, { bigint: true })
  • 读取本地文件
    src/transaction.ts:52
    try { lstatSync(file); return true }
  • 读取本地文件
    src/transaction.ts:97
    if (lstatSync(tmp).isSymbolicLink() || !lstatSync(tmp).isFile()) throw new EvidenceError('TRANSACTION_CORRUPT', `事务临时路径异常: ${tmp}`)
  • 删除本地文件
    src/transaction.ts:98
    rmSync(tmp)
  • 读取本地文件
    src/transaction.ts:106
    if (lstatSync(tmp).isSymbolicLink() || !lstatSync(tmp).isFile()) throw new EvidenceError('TRANSACTION_CORRUPT', '复制暂存发布路径异常')
  • 删除本地文件
    src/transaction.ts:107
    rmSync(tmp)
  • 写入本地文件
    src/transaction.ts:109
    copyFileSync(source, tmp)
  • 写入本地文件
    src/transaction.ts:120
    mkdirSync(tx, { mode: 0o700 })
  • 写入本地文件
    src/transaction.ts:125
    mkdirSync(join(tx, 'copies'), { mode: 0o700 })
  • 删除本地文件
    src/transaction.ts:131
    if (existsSync(join(tx, 'owner.json'))) rmSync(join(tx, 'owner.json'))
  • 删除本地文件
    src/transaction.ts:132
    if (existsSync(join(tx, 'copies'))) rmdirSync(join(tx, 'copies'))
  • 删除本地文件
    src/transaction.ts:133
    rmdirSync(tx)
  • 读取本地文件
    src/transaction.ts:142
    if (!lstatSync(tx).isDirectory() || lstatSync(tx).isSymbolicLink()) throw new Error('transaction is not a plain directory')
  • 读取本地文件
    src/transaction.ts:143
    if (!lstatSync(join(tx, 'owner.json')).isFile() || lstatSync(join(tx, 'owner.json')).isSymbolicLink()) throw new Error('owner is not a regular owned f
  • 读取本地文件
    src/transaction.ts:144
    const owner = JSON.parse(readFileSync(join(tx, 'owner.json'), 'utf8'))
  • 写入本地文件
    src/transaction.ts:176
    renameSync(tx, done)
  • 删除本地文件递归
    src/transaction.ts:179
    rmSync(done, { recursive: true })
  • 写入本地文件
    src/transaction.ts:239
    mkdirSync(filesDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/transaction.ts:394
    mkdirSync(filesDir, { recursive: true, mode: 0o700 })
扫描于 2026/11/4(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-llm@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 生成哈希链回执
  • 可验证证据包

🛡️ 为 DSH 智能体提供可验证、防篡改的审计证据包和哈希链收据

README

由 DeepSeek 最新模型翻译生成
🛡️ dsh-evidence 为 DSH 提供本地审计证据包,哈希可验证 SHA256 清单 • 逻辑哈希链回执 • 时效性(validUntil) 功能 • 快速开始 • DSH Power Suite • 工具 • 简体中文 💡 为什么需要 dsh-evidence? 「测试通过」这类任务声明,需要可复核的输出文件。有了记录下来的快照,复核者就能把当前文件与记录的哈希做对比,并查看相关声明和本地回执链。至于生成这些文件的命令,插件既不观察,也不认证。 dsh-evidence 记录快照,并检查本地一致性: - ⛓️ 哈希链回执:每次 create/add 都会延长一条逻辑哈希链。验证时会检查记录内容、链结构,以及链与清单的绑定关系。 - 📦 复制快照(copy=true):v3 按相对于证据包的 files/... 路径存储。整体移动证据包,本地副本验证依然成立;source 记录来源,但绝不能替代缺失的副本。 - ⏱️ 时效性(validUntil):有效期过期与完整性分开报告。stale 表示内容一致但修改时间不同,并不表示有效期已过。 - 🤝 如实声明边界:明确说明密码学哈希能证明什么、不能证明什么。
展开完整文档(README 剩余 1 节)
🛡️ dsh-evidence

为 DSH 提供本地审计证据包,哈希可验证 SHA256 清单 • 逻辑哈希链回执 • 时效性(validUntil)

功能 • 快速开始 • DSH Power Suite • 工具 • 简体中文

💡 为什么需要 dsh-evidence?

「测试通过」这类任务声明,需要可复核的输出文件。有了记录下来的快照,复核者就能把当前文件与记录的哈希做对比,并查看相关声明和本地回执链。至于生成这些文件的命令,插件既不观察,也不认证。

dsh-evidence 记录快照,并检查本地一致性:
- ⛓️ 哈希链回执:每次 create/add 都会延长一条逻辑哈希链。验证时会检查记录内容、链结构,以及链与清单的绑定关系。
- 📦 复制快照(copy=true):v3 按相对于证据包的 files/... 路径存储。整体移动证据包,本地副本验证依然成立;source 记录来源,但绝不能替代缺失的副本。
- ⏱️ 时效性(validUntil):有效期过期与完整性分开报告。stale 表示内容一致但修改时间不同,并不表示有效期已过。
- 🤝 如实声明边界:明确说明密码学哈希能证明什么、不能证明什么。

🚀 快速开始

安装

In your DSH plugin environment
dev_inject_plugin @dsh-external/dsh-evidence

典型使用流程

1. 创建证据包:evidence_create name="bench-2026" description="Performance audit"
2. 添加快照与断言:evidence_add name="bench-2026" paths="E:\\project\\bench.json|E:\\project\\verify.py" claim="Recorded benchmark output for review" validUntil="2026-12-31"
3. 审计并验证:evidence_verify name="bench-2026"

输入路径与稳定的证据根目录

相对 paths 按调用会话的项目目录解析,该目录由经过验证的宿主接口提供(ToolRunContext.agent.session.header.cwd)。cwd 缺失、无效或不是绝对路径时,返回 RELATIVE_PATH_REQUIRES_CWD;这种情况下请提供完整的绝对输入路径。不会回退到插件的启动目录,也不会调用 process.chdir()。在 Windows 上,盘符相对路径 C:file.txt 和根相对路径 \file.txt 会被视为有歧义而拒绝;请改用 C:\project\file.txt 或完整的 UNC 路径。
证据根目录遵循另一套规则。插件在 apply 时解析一次配置好的 evidenceRoot。配置的相对根目录和每次调用传入的相对 root 覆盖,始终使用同一个捕获的进程目录,因此不同的调用项目无法移动证据存储。绝对 root 覆盖会选中那个确切的存储。没有显式配置时,根目录为 DSH_HOME/evidence;未设置 DSH_HOME 时为 %USERPROFILE%/.dsh/evidence。若要把存储独立放在别处,优先使用绝对路径的配置根目录。

完整性、事务与兼容性

v2 和 v3 要求 receipt.jsonl 非空且有效,并与当前清单绑定。回执缺失或为空时返回 FAIL,错误码为 RECEIPT_MISSING / RECEIPT_EMPTY。普通 add 在暂存文件之前,会先拒绝损坏或不匹配的旧链。真正的 v1 包没有回执,仍可读取,此时 receiptChain=UNVERIFIED_LEGACY,会给出明确警告,且不支持普通追加;离线迁移会保留原始包。

工具失败时使用宿主的 HarnessError 契约,错误结果因此保留稳定错误码。写入错误的消息中,在可用时会包含 commitState、transactionId 以及锁清理失败的详情。提交决定之后发生取消,会完成发布,或留下可查询的恢复状态。取消之后观察到已完成的写入,会报告 COMMITTED_AFTER_CANCEL,状态为 COMMITTED,并带上事务 ID;之后注册表层面的取消仍可能是 ABORTED,文本会说明已提交的结果。重试被取消的写入之前,先查询 evidence_verify / evidence_show。取消本身并不表示没有写入被提交。

status 表达完整性;freshness=CURRENT|EXPIRED 单独表达可读清单中记录的有效日期,包括缺失或损坏文件上的日期。内容一致的过期文件可以通过完整性校验。

写入会把完整清单、回执生成以及所有副本暂存到 .transaction/ 内。.transaction/COMMITTED 的原子发布就是提交决定。在此之前,失败或取消会保留旧的已发布产物;在此之后,恢复流程会完成新一代产物。报告的错误包含稳定错误码,并在相关时包含 commitState 和 transactionId。用 evidence_verify 恢复或查询待处理事务。两处实时元数据替换是各自独立的可恢复发布步骤。该协议已针对进程崩溃和注入的写入失败做过测试,未覆盖断电场景。
校验期间会一直持有 bundle 锁,直到整个文件检查完成,所以检查耗时一长,追加操作就会被拖住。等待和哈希计算都支持取消。活跃的持有者不会因为锁太旧而被顶掉。锁的回收与释放都在同一道短闸门内串行执行,释放时必须提供精确的 PID/token。只有 ESRCH 的 PID 才能被回收。PID 被复用、持有者属于旧版或未知、.lock.gate 成为孤儿,这几种情况一律按失败关闭处理。校验超时返回 status=BUSY、receiptChain=NOT_CHECKED、freshness=UNKNOWN;这不构成任何完整性结论。

普通持有者进程死亡后,下一次操作可以回收它的锁并恢复事务。如果崩溃发生在短闸门内,就需要离线介入:停掉所有写入方,保留锁和事务产物以备检查,确认没有持有者残留后,再手动删除已证实为孤儿的闸门。不做任何基于时长的删除。不要新旧锁协议混跑。真实桌面端的端到端验证仍属于单独的部署检查;模拟工具调用不能替代它。

目录扫描、限制与取消

evidence_add 异步扫描,不跟随文件或目录链接。跳过的链接、重复的物理文件、当前 bundle 及其别名都会作为排除项上报。断开的链接/junction、无法读取的目录、属性获取失败、不支持的输入类型都返回 SCAN_INCOMPLETE;不会悄悄把它们转成一次成功的部分快照。当前 bundle 整体排除。在其他可识别的 bundle 文件夹里,内部的 .lock、.lock.gate、.transaction 以及具名事务清理目录会被排除。可识别 bundle 文件夹之外的同名普通输入文件仍然有效。

默认值为 maxFiles=10000 和 maxTotalBytes=10737418240(10 GiB)。覆盖值必须是正的安全整数。超出任一限制返回 SCAN_LIMIT_EXCEEDED,不截断、也不提交本次扫描。paths 为空或只含分隔符返回 INPUT_EMPTY;空目录或扫描结果全部被排除返回 SCAN_EMPTY。添加成功返回 scan.status=COMPLETE、文件/字节总数、最多 100 条排除路径、excludedTotal 和 exclusionsTruncated。COMPLETE 描述的是明确声明的扫描范围,包含其中的排除项。
add/verify、遍历、复制和哈希都串行执行,并发上限为 1;文件 IO 使用 256 KiB 分块。宿主取消信号能触达锁等待、扫描、复制、哈希和校验。相关句柄在操作 promise 落定前关闭。事务提交决策前取消,会保留旧的已发布代际;决策之后取消,事务协议会走完,或报告恢复要求。读取前后各检查一次文件标识与属性,add 提交前再检查一次。观察到变化就返回 FILE_CHANGED;这些检查不会为外部进程正在改动的文件建立强一致快照。仅元数据创建和离线迁移命令保留各自独立的同步事务发布路径;离线命令还保留同步复制。

有界校验与浏览

evidence_verify detailLimit=20 对缺失、损坏、过期、失效和出错的情况返回完整 counts,路径数组有界,issues 包含路径、代码和原因。issueTotal 和 issuesRemaining 披露截断情况;一个文件可能贡献多条 issue。文本视图显示同样的完整计数和剩余 issue 数。detailLimit 接受 1 到 100 的整数。status=PASS 检查当前完整性,freshness=EXPIRED 表示记录的有效期已过。freshness=UNKNOWN 表示没有得出可靠的有效性结论,例如 bundle 处于 BUSY,或读不到它的 manifest。stale 表示哈希匹配但修改时间有差异。

evidence_list 接受 offset=0 和 limit=20(最大 100),返回 total、returned、remaining 和 nextOffset。条目按名称排序。无效、缺少 manifest 和忙碌的 bundle 目录仍会显示,并附带状态和诊断信息。READABLE 描述 manifest 是否可读;文件和回执的完整性请用 verify 检查。查询在显示截断前搜索完整名称/描述。每次调用分页都描述当时的根,并发新增可能改变后续页。
evidence_show 沿用同一套文件分页,并独立使用 receiptOffset=0、receiptLimit=10(上限 100)。它返回 page 和 receiptPage,记录来自有效的本地回执链,数量有上限。回执无效或不可用时,会给出明确原因。返回的描述、声明、来源和回执备注会转义控制字符,并限制为 500 个显示字符;回执载荷的路径数组最多显示 20 条路径,同时给出原始总数。这个受限视图会省略元数据和无法识别的扩展字段。presentation 标明这些省略项和显示投影:原始清单/记录哈希保留下来供参考,但无法从分页或净化后的投影重新计算。要重新计算这些哈希,请读取原始文件。浏览不会改动原始文件,也不确立内容真实性或命令执行。

stale 提示允许最多 1 微秒的舍入误差,用于毫秒级元数据与文件系统时间戳 API 转换浮点单位的情况。主动扫描/复制/哈希的变更检测则改为比较精确的纳秒属性和文件标识。

可移植 v3 路径与旧格式

v3 条目显式使用 storage: "external" 加绝对键,或 storage: "copy" 加规范 files/... 键。复制会拒绝路径穿越、盘符/UNC 键、设备名、备用数据流,以及包内的链接/联接。重复的基名会获得确定性的 -2、-3 后缀;匹配不区分大小写。这些边界检查覆盖观察到的文件系统状态,不覆盖在协作锁协议之外持续替换路径的恶意进程。

v1/v2 外部引用仍可读取。旧副本只从可识别的 <bundle>/files/<basename> 键映射到当前包中的该文件。映射有歧义时返回 MIGRATION_REQUIRED;本地副本缺失即失败,即使记录的旧路径或原始来源仍然存在。旧副本绝不通过那些旧位置校验。v2 外部追加保持 v2;复制追加需要迁移到新的 v3 包。

离线迁移

在已安装的候选目录中运行,试用时使用隔离副本:

node scripts/migrate-bundle.mjs --root 'E:\evidence' --name 'old-bundle' --preflight
node scripts/migrate-bundle.mjs --root 'E:\evidence' --name 'old-bundle'
Optional: --destination-root 'E:\new-evidence' --destination-name 'reviewed-v3'
默认会新建一个同级目录 old-bundle-migrated-v3,绝不覆盖已存在的目标。原始 manifest、receipt 和正文保持原样。预检会拒绝损坏的链、绑定错误、缺失副本、有歧义的映射,以及待处理的源事务。迁移期间持有源锁,把复制出的字节与原始记录的哈希逐一比对,并把源元数据摘要和校验限制写进 metadata.migration。新的 receipt 链从这次迁移开始,不继承旧的 receipt 历史。即使新包通过当前一致性检查,v1 源仍会保留可见的 UNVERIFIED_LEGACY 来源标记。预提交失败可能留下空的目标预留;重试时换个新名字,或者离线检查这个孤立的预留。永远不要把这条命令当作损坏证据的修复手段。

🧩 DSH Power Suite

本插件属于 DSH Agent Power Suite —— 4 个模块化、零硬依赖的插件,组成完整的开发者工作流闭环:

flowchart LR
M["🧠 dsh-local-memory(1. Remember rules & prefs)"] --> E["⚡ dsh-context-economy(2. Save 80%+ tokens reading code)"]
E --> A["🛡️ dsh-evidence(3. Local audit receipts)"]
A --> S["🔍 dsh-session-index(4. CJK search & bookmarks)"]
S --> M

style M fill:#e8f4fd,stroke:#2b7de9,stroke-width:2px
style E fill:#eef9f2,stroke:#1e8e3e,stroke-width:2px
style A fill:#fef7e0,stroke:#f29900,stroke-width:2px
style S fill:#f3e8fd,stroke:#8430ce,stroke-width:2px

| 插件 | 在套件中的角色 | 与 Evidence 的协同 |
| 🛡️ dsh-evidence | 审计与回执(当前) | 记录文件哈希、本地回执和待审声明。 |
| 🧠 dsh-local-memory | 记忆层 | 可以把记住的决策与已审阅的证据包关联起来。 |
| ⚡ dsh-context-economy | 上下文经济 | 可以把基准测试输出文件登记为证据快照。 |
| 🔍 dsh-session-index | 会话搜索 | 搜索历史会话归档,定位历史证据回执并跳回。 |

📖 深入解析与参考

🛠️ 可用工具(5 个)

| 工具 | 用途 |
| evidence_create | 初始化证据目录、evidence.json(v3)和 receipt.jsonl 链。 |
| evidence_add | 添加文件/目录(SHA256、大小、mtime),可选 claim、validUntil 和 copy=true。 |
| evidence_verify | 检查文件哈希、回执一致性和有效期;返回有界的问题路径和完整计数。 |
| evidence_list | 分页浏览本地证据包目录,保留无效或占用中的条目并附带诊断信息。 |
| evidence_show | 查看一页 manifest 条目,以及单独一页本地回执记录。 |

📁 包结构与清单格式

~/.dsh/evidence/<name>/
evidence.json # Manifest with top-level manifestHash self-integrity
receipt.jsonl # Logical hash-chain receipts; recoverable generation writes
files/ # v3 copies keyed by relative files/... paths
.transaction/ # Pending generation, removed after publication

⚖️ 如实说明能力边界

- 能校验:当前文件哈希与记录哈希是否一致、清单自哈希、收据链结构以及清单绑定关系。claim、description 和收据时间戳都是本地记录的声明。
- 无法独立证明:命令是否真的执行过、内容是否真实、作者身份、被删除的完整历史后缀,以及能否抵抗对整个包的重写。只要能替换全部本地文件,就能重新算出一个自洽的包。本地哈希不是数字签名,也不是可信的外部时间戳服务。

🧪 构建与测试

node scripts/build.mjs # Compile src ➡️ lib
npm run typecheck
npm test # Run test suite
npm run pack:check # Packaging check

属于 DSH Agent Power Suite 的一部分。基于 BSD-3-Clause 许可发布。
预览分享卡片长什么样 ↓huangjua/dsh-evidence
分享 · DeepSeek Harness Hub
huangjua/dsh-evidence

为智能体执行生成哈希链回执与可验证证据包

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部