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

可验证报告引擎 PerryLink/dsh-research-report

DeepSeek Harnessv0.3.30
PerryLink2 天前有提交已提供中文文档扫描:含敏感能力

为 DeepSeek Harness 打造的可验证研究报告引擎:内容寻址的证据账本(声明与快照绑定、防篡改),加上带版本的密封报告,逐条声明给出验证结论,并附清单密封目录。

62.6/100
综合分
213
GitHub 星标
1,395
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-research-report
npm 源 · dsh-research-report 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · security
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 2 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包dsh-research-report @ 0.3.30
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 02:37:36

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 75 处,展示前 66 条)
  • 发起网络请求
    lib/index.js:444
    result = await deps.web.fetch({ url }, linked);
  • 读取本地文件
    lib/index.js:465
    content = await readFile(absolute, "utf8");
  • 写入本地文件
    lib/index.js:729
    await appendFile(notePath, review, "utf8");
  • 写入本地文件
    lib/index.js:1157
    await writeFile(path.join(reportDir, "report.md"), reportText, "utf8");
  • 写入本地文件
    lib/index.js:1158
    await writeFile(path.join(reportDir, "manifest.json"), manifestText, "utf8");
  • 写入本地文件
    lib/index.js:1159
    await writeFile(path.join(reportDir, "verification.jsonl"), verificationText, "utf8");
  • 写入本地文件
    lib/index.js:1160
    await writeFile(path.join(reportDir, "disconfirmation.jsonl"), disconfirmationText, "utf8");
  • 写入本地文件
    lib/index.js:1184
    await writeFile(notePath, verifierNote, "utf8");
  • 读取本地文件
    lib/index.js:1229
    readFile: (file) => readFile(file, "utf8"),
  • 读取本地文件
    lib/cli.js:64
    content = await readFile(path.join(ledgerRoot, "objects", record.sha256), "utf8");
  • 读取本地文件
    lib/cli.js:80
    const manifestText = await readFile(path.join(args.reportDir, "manifest.json"), "utf8");
  • 读取本地文件
    lib/cli.js:86
    readFile: (file) => readFile(file, "utf8"),
  • 读取本地文件
    lib/verify-sealed-Dylli1KR.js:45
    text = await readFile(file, "utf8");
  • 写入本地文件
    lib/verify-sealed-Dylli1KR.js:101
    await mkdir(this.objectsDir, { recursive: true });
  • 读取本地文件
    lib/verify-sealed-Dylli1KR.js:107
    await readFile(target);
  • 写入本地文件
    lib/verify-sealed-Dylli1KR.js:113
    await writeFile(temporary, content, "utf8");
  • 写入本地文件
    lib/verify-sealed-Dylli1KR.js:115
    await rename(temporary, target);
  • 读取本地文件
    lib/verify-sealed-Dylli1KR.js:118
    await readFile(target);
  • 写入本地文件
    lib/verify-sealed-Dylli1KR.js:156
    await appendFile(this.indexFile, `${JSON.stringify(record)}\n`, "utf8");
  • 写入本地文件
    lib/verify-sealed-Dylli1KR.js:186
    await appendFile(this.claimsFile, `${JSON.stringify(line)}\n`, "utf8");
  • 写入本地文件
    lib/verify-sealed-Dylli1KR.js:205
    await appendFile(this.verdictsFile, `${JSON.stringify(line)}\n`, "utf8");
  • 读取本地文件
    lib/verify-sealed-Dylli1KR.js:285
    content = await readFile(path.join(this.objectsDir, record.hash), "utf8");
  • 读取本地文件
    lib/types/ledger.js:44
    text = await readFile(file, 'utf8');
  • 写入本地文件
    lib/types/ledger.js:105
    await mkdir(this.objectsDir, { recursive: true });
  • 读取本地文件
    lib/types/ledger.js:111
    await readFile(target);
  • 写入本地文件
    lib/types/ledger.js:120
    await writeFile(temporary, content, 'utf8');
  • 写入本地文件
    lib/types/ledger.js:122
    await rename(temporary, target);
  • 读取本地文件
    lib/types/ledger.js:128
    await readFile(target);
  • 写入本地文件
    lib/types/ledger.js:167
    await appendFile(this.indexFile, `${JSON.stringify(record)}\n`, 'utf8');
  • 写入本地文件
    lib/types/ledger.js:196
    await appendFile(this.claimsFile, `${JSON.stringify(line)}\n`, 'utf8');
  • 写入本地文件
    lib/types/ledger.js:212
    await appendFile(this.verdictsFile, `${JSON.stringify(line)}\n`, 'utf8');
  • 读取本地文件
    lib/types/ledger.js:294
    content = await readFile(path.join(this.objectsDir, record.hash), 'utf8');
  • 发起网络请求
    lib/types/gather.js:59
    result = await deps.web.fetch({ url }, linked);
  • 读取本地文件
    lib/types/gather.js:83
    content = await readFile(absolute, 'utf8');
  • 写入本地文件
    lib/types/provider-local.js:174
    await appendFile(notePath, review, 'utf8');
  • 写入本地文件
    lib/types/provider-local.js:631
    await writeFile(path.join(reportDir, 'report.md'), reportText, 'utf8');
  • 写入本地文件
    lib/types/provider-local.js:632
    await writeFile(path.join(reportDir, 'manifest.json'), manifestText, 'utf8');
  • 写入本地文件
    lib/types/provider-local.js:633
    await writeFile(path.join(reportDir, 'verification.jsonl'), verificationText, 'utf8');
  • 写入本地文件
    lib/types/provider-local.js:634
    await writeFile(path.join(reportDir, 'disconfirmation.jsonl'), disconfirmationText, 'utf8');
  • 写入本地文件
    lib/types/provider-local.js:663
    await writeFile(notePath, verifierNote, 'utf8');
  • 读取本地文件
    lib/types/provider-local.js:706
    readFile: (file) => readFile(file, 'utf8'),
  • 读取本地文件
    lib/types/cli.js:62
    content = await readFile(path.join(ledgerRoot, 'objects', record.sha256), 'utf8');
  • 读取本地文件
    lib/types/cli.js:74
    const manifestText = await readFile(path.join(args.reportDir, 'manifest.json'), 'utf8');
  • 读取本地文件
    lib/types/cli.js:82
    readFile: (file) => readFile(file, 'utf8'),
  • 读取本地文件
    src/cli.ts:79
    content = await readFile(path.join(ledgerRoot, 'objects', record.sha256), 'utf8')
  • 读取本地文件
    src/cli.ts:91
    const manifestText = await readFile(path.join(args.reportDir, 'manifest.json'), 'utf8')
  • 读取本地文件
    src/cli.ts:102
    readFile: (file: string) => readFile(file, 'utf8'),
  • 发起网络请求
    src/gather.ts:96
    result = await deps.web.fetch({ url }, linked)
  • 读取本地文件
    src/gather.ts:120
    content = await readFile(absolute, 'utf8')
  • 读取本地文件
    src/ledger.ts:107
    text = await readFile(file, 'utf8')
  • 写入本地文件
    src/ledger.ts:177
    await mkdir(this.objectsDir, { recursive: true })
  • 读取本地文件
    src/ledger.ts:184
    await readFile(target)
  • 写入本地文件
    src/ledger.ts:192
    await writeFile(temporary, content, 'utf8')
  • 写入本地文件
    src/ledger.ts:194
    await rename(temporary, target)
  • 读取本地文件
    src/ledger.ts:199
    await readFile(target)
  • 写入本地文件
    src/ledger.ts:250
    await appendFile(this.indexFile, `${JSON.stringify(record)}\n`, 'utf8')
  • 写入本地文件
    src/ledger.ts:286
    await appendFile(this.claimsFile, `${JSON.stringify(line)}\n`, 'utf8')
  • 写入本地文件
    src/ledger.ts:303
    await appendFile(this.verdictsFile, `${JSON.stringify(line)}\n`, 'utf8')
  • 读取本地文件
    src/ledger.ts:390
    content = await readFile(path.join(this.objectsDir, record.hash), 'utf8')
  • 写入本地文件
    src/provider-local.ts:226
    await appendFile(notePath, review, 'utf8')
  • 写入本地文件
    src/provider-local.ts:752
    await writeFile(path.join(reportDir, 'report.md'), reportText, 'utf8')
  • 写入本地文件
    src/provider-local.ts:753
    await writeFile(path.join(reportDir, 'manifest.json'), manifestText, 'utf8')
  • 写入本地文件
    src/provider-local.ts:754
    await writeFile(path.join(reportDir, 'verification.jsonl'), verificationText, 'utf8')
  • 写入本地文件
    src/provider-local.ts:755
    await writeFile(path.join(reportDir, 'disconfirmation.jsonl'), disconfirmationText, 'utf8')
  • 写入本地文件
    src/provider-local.ts:784
    await writeFile(notePath, verifierNote, 'utf8')
  • 读取本地文件
    src/provider-local.ts:830
    readFile: (file: string) => readFile(file, 'utf8'),
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-util-values@deepseek-ai/dsh-attachment@deepseek-ai/cordis@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-agent@deepseek-ai/dsh-brand@deepseek-ai/dsh-invariants@deepseek-ai/dsh-scope@deepseek-ai/dsh-user-approval@deepseek-ai/dsh-jobs@deepseek-ai/dsh-jobs-local
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

2 张 · 点击查看大图

功能亮点

  • 内容寻址证据账本
  • 声明与快照绑定
  • 密封报告逐条验证
v0.3.302026-10-22
· [0.3.30] - 2026-10-22 · 修复 · 工作区路径证据现在按会话的工作目录解析(issue #23)。服务商在挂载时捕获 process.cwd(),之后每个 evidence_add 路径来源都用它。在 DSH Desktop 上,主进程的 cwd 指向配置档目录,于是真实的工作区文件被读成 ~/.dsh/profiles//...(ORIGIN_UNREADABLE),绝对路径也被判为工作区之外而拒绝(ORIGIN_OUTSIDE_WORKSPACE)。服务商现在每次调用都重新解析根目录:显式配置的 workspaceRoot 优先,否则用宿主按会话隔离的 workingDirectory 服务,最后才用启动时的 cwd。宿主服务缺失或抛错时走回退,而不是让工具失败。五份 README 都写明了 workspaceRoot;测试覆盖会话目录、显式覆盖和回退三种情况。
v0.3.292026-10-19
· [0.3.29] - 2026-10-19 · 修复 · 更新 rc.2 回归锁定:宿主事件词表是 62 个(不是 59 个),后台任务 id 是十六进制/UUID 形式,不是数字。
v0.3.272026-10-19
封存后校验器失败会记录到 verifier-note.md,不再让 research_report 失败。113 项测试通过。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
📑 dsh-research-report - 1024 store channel:先执行一次 npm i -g dsh1024,再执行 dsh1024 plugin --profile web add dsh-research-report(会计入 deepseek1024.com 的安装排名)。 dshfind 面向 DeepSeek Harness 的可验证研究报告引擎。 每条论断都绑定到不可变的证据快照,逐字节校验,再封存进带版本号的报告;报告清单的哈希任何人都能重算。 dsh-doctor DSH Market English · 简体中文 · Español · Português · हिन्दी dsh plugin --profile <name> add dsh-research-report 📖 生态知识库 —— 实测数据,不是营销话术:插件开发指南 · 插件选型数据 · 维护标准。
展开完整文档(README 剩余 1 节)
📑 dsh-research-report

- 1024 store channel:先执行一次 npm i -g dsh1024,再执行 dsh1024 plugin --profile web add dsh-research-report(会计入 deepseek1024.com 的安装排名)。

dshfind

面向 DeepSeek Harness 的可验证研究报告引擎。

每条论断都绑定到不可变的证据快照,逐字节校验,再封存进带版本号的报告;报告清单的哈希任何人都能重算。

dsh-doctor
DSH Market

English · 简体中文 · Español · Português · हिन्दी

dsh plugin --profile <name> add dsh-research-report

📖 生态知识库 —— 实测数据,不是营销话术:插件开发指南 · 插件选型数据 · 维护标准。

安装与卸载

dsh plugin --profile demo add dsh-research-report # install
dsh plugin --profile demo remove dsh-research-report # uninstall

确认这一行已挂载:dsh --profile demo --dump-config | grep dsh-research-report。

⭐ 如果它帮到了你

这个插件是 DSH 插件家族的一员(95 个,全部 Apache-2.0)。如果你在用,给个 star —— 它不会解锁任何功能,但会让下一个人在搜索里更容易找到它。
中文: 属于 DeepSeek Harness 的 95 个插件家族的一员。如果它对你有用,点个 star 能帮下一个人找到它——没有任何功能藏在 star 后面。

dsh-research-report 是什么?

一个可验证的研究报告引擎,面向 DeepSeek Harness。

每条论断都绑定到不可变的证据快照,逐字节校验,再封存进带版本号的报告;报告清单的哈希任何人都能重新算出来。

dsh-research-report 的工作流示意图:问题 → 封存来源 → 报告。

工作流概览:问题 → 封存来源 → 报告。下面的示例用的都是真实的命令接口。

兼容性

- DeepSeek Harness dsh-v0.2.1-alpha.1(2026-09-25 验证)。npm dev/test 线 0.1.7-rc.2;peer 为 >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0。兼容矩阵锁定了全部四条声明的 peer 线。在这条线上,Session.append 的第三个参数只对 surface-eligible 类型才是 SurfaceIntent,所以 research-report/ 事件仍然进不了会话日志:账本日志才是持久的事实来源,审计镜像要等宿主认识这套词汇之后才会启用(test/events-gate.spec.ts 里的回归锁钉住了这一点)。
0.1.5-alpha.1(2026-09-09 适配):会话信封保留可忽略字段,只为兼容已存日志的读取——Session.append 仍然无法写入它,所以审计门行为不变。2026-09-11 对照已发布的 0.1.5-rc.2 类型验证通过(完整本地门链);兼容工作流锁定了两条声明的 peer 线。
- Node ^22.19.0 || >=24.0.0,仅支持 ESM("type": "module")。
- Peer 依赖:@deepseek-ai/cordis ^4.0.2、@deepseek-ai/schemastery ^3.18.2,以及 @deepseek-ai/dsh-session、@deepseek-ai/dsh-tools、@deepseek-ai/dsh-system-prompt、@deepseek-ai/dsh-web、@deepseek-ai/dsh-jobs,版本为 >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0。
- 可选同级插件(从不强制):ctx.web 服务商,用于 URL 抓取/采集;ctx.jobs,用于后台组装;ctx.dataQuality(dsh-data-quality),用于数据集引用交叉核对。

你能得到什么

- 证据账本——内容寻址的快照存储(<ledgerRoot>/objects/<sha256> + JSONL 日志)。相同内容只存一份;快照不可变;每次读取都重算哈希,所以篡改或删除会被发现,而不是被信任。
- 论断 ↔ 证据绑定——论断登记时带上它所依赖的证据 id;账本保存绑定关系和每次校验结论(最新一次为准)。
- 字节级校验——论断里的每个数字和每段引文,都必须能在绑定的快照里逐字找到。没有绑定证据,或者没有可核对的字面量,论断标为 unverified;绑定了证据却无法证实或证伪论断中的字面量,标为 insufficient;标签对应的快照值不同(论断值不存在),标为 disproven;快照被篡改或缺失,标为 contradicted。不做语义分析,不用嵌入——只做可审计的字节检查。
- 可选的数值桥接 — 当某条主张引用结构化工作区数据集(CSV/JSON),且已挂载 dsh-data-quality 时,会通过其冻结的 verifyCitations 契约、按容差交叉核对引用;数据集不匹配即证伪该主张。
- DOI 证据(零网络) — DOI 来源按确定性规则校验(10.xxxx/xxxx 结构、前缀白名单、DOI 字符集);非法 DOI 直接报错。可选接受期刊/年份元数据,requireJournalMetadata 仅在启用时约束学术 DOI 证据。
- 带版本的密封报告 — <reportRoot>/<slug(topic)>/<YYYYMMDD-HHmmss>/report.md + manifest.json + verification.jsonl + disconfirmation.jsonl;密封哈希是 manifest 的 SHA-256,manifest 本身携带报告哈希、每条证据哈希,以及每份审计日志的哈希。
- 交付前重审与密封拦截 — 密封之前,每条绑定主张都离线重新核验并记入 verification.jsonl;判定漂移、绑定证据被篡改或缺失、日志序列化失败,都会阻止密封(直接报错,无可调参数)。
- 证伪台账 — 每条被反驳或证伪的主张都记入 disconfirmation.jsonl(主张 + 证据引用 + 原因),并列入报告的 falsification log 附录。
- 负知识 — 被证伪的主张按内容哈希记住(disproofs.jsonl);同一文本在证据未变时再次上报,会被强制回到 disproven,只有证据变化后才重新核验。
- 只读校验循环 — 密封之后,确定性的 verifySealedReport 兜底(零网络、零模型)重算密封哈希与审计哈希,并重新检查每条主张,把机器检查写入 verifier-note.md;挂载 ctx.jobs 时还会派生一个只读校验任务(模型复核是增强,绝不替代)。
- 独立校验命令行 — dsh-research-verify --report <dir> [--seal <sha256>] [--ledger <dir>] [--format json|sarif] 仅凭密封目录重算密封哈希 + 逐条主张复核,输出 JSON 信封或 SARIF 2.1.0 文档(见 Verifier CLI)。
- 会话锚定证据 — evidence_add 接受可选的 sessionRef(sessionId + eventRange,校验失败即报错);锚点会被存储、在附录 B 中呈现,并登记到 manifest 与 verification.jsonl。会话锚定证据会如实核验为 unverified(session-anchored evidence requires a manual check against the session log)。
- 如实呈现缺口 — 未核实、证据不足、与证据矛盾、已证伪的主张,在报告正文中保留可见的 [未核实] / [证据不足] / [与证据矛盾] / [已证伪] 标记,并列入附录 A。绝不静默放过。
- 不做深度研究循环 —— 检索编排刻意复用现有能力:搜索和抓取用 ctx.web,长任务用 ctx.jobs。规划与综合仍交给模型(或上游插件)。

快速开始

dsh plugin --profile web add github:PerryLink/dsh-research-report

git 渠道

From a scratch profile (pins the commit; runs the self-contained prepare build)
dsh plugin --profile demo add "github:YOUR_ORG/dsh-research-report#<sha>"
The profile's pnpm-workspace.yaml gains an allowBuilds entry for dsh-research-report on first add.

npm 渠道

dsh plugin --profile demo add dsh-research-report

两个渠道都会把 bundle 行(见 cordis.patch.yml)装进配置档的 dsh.profile.bundles 栈,重启后生效。

然后在会话里:

evidence_add({ origin: "docs/market.md", title: "Market snapshot" }) # → ev-1a2b3c4d5e6f
research_report({ topic: "示例行业概览", sections: [...], claims: [...], evidenceRefs: ["ev-1a2b…"] })
ledger_query({ claimId: "c1" }) # bindings + verdict

示例

下面都是插件的真实入口。装一次,然后调用其中一个。

详细示例

命令

~~~sh
research_report({
topic: "示例行业概览",
sections: [{ heading: "市场规模", paragraphs: [{ text: "2025 年全球示例行业市场规模为 1,280 亿元。", claimIds: ["c1"] }] }],
claims: [{ id: "c1", text: "市场规模为 1,280 亿元", evidenceIds: ["ev-5dc0a84d0e48"] }],
evidenceRefs: ["ev-5dc0a84d0e48", "ev-c6cf024e0916", "ev-61f8f4533cb7"]
})

输出

~~~text
report sealed: /tmp/rr-test-4U2mlF/reports/示例行业概览/20261019-124904
seal (sha256 of manifest.json): 5c85c97597096ced281ca191d7abaaf7434f18b397d35ac81c31aa364a3b12f9
claims: 1 verified / 0 unverified / 0 contradicted / 0 insufficient / 0 disproven (of 1); evidence bound: 3

来源:README.md:112-118,150; test/index.spec.ts:166-177; src/tools/research-report.ts:170-175*

失败分支

输入

~~~text
{"topic":"probe","sections":[{"heading":"Growth","paragraphs":[{"text":"Growth was 42%.","claimIds":["c1"]}]}],"claims":[{"id":"c1","text":"Growth was 42%.","evidenceIds":[]}]}

输出

~~~text
edge-case (no throw): isError=false; kind=sealed; verdicts[0]={"claimId":"c1","status":"unverified","note":"claim binds no evidence snapshot"}; counts={"verified":0,"unverified":1,"contradicted":0,"insufficient":0,"disproven":0}; evidenceCount=0; report.md marker=Growth was 42%. [未核实]

来源:plugins/dsh-research-report/src/verify.ts:173-175 (unverified verdict); plugins/dsh-research-report/src/assemble.ts:209-220 (visible mark); plugins/dsh-research-report/README.md:87 (honest gaps); exercised through plugins/dsh-research-report/test/harness.ts

简要示例

- research_report
- ledger_query

配置

所有可调项都是 Schemastery 的 Config 字段;值不合法时,配置档加载会直接报错。相对根目录按 harness 工作目录(即工作区)解析。

| 键 | 默认值 | 说明 |
| enabled | true | 总开关;设为 false 时不挂载任何内容。 |
| ledgerRoot | .research-ledger | 证据账本目录(对象 + JSONL 日志)。 |
| reportRoot | research-reports | 封存报告根目录(按主题和时间戳分版本)。 |
| workspaceRoot | (host session working directory) | 工作区路径证据的根目录;默认取会话工作目录,再退回 harness cwd。 |
| maxEvidenceBytes | 2097152 | 单条证据快照 UTF-8 字节数的硬上限。 |
| maxEvidencePerReport | 200 | 单份报告可绑定证据条目的硬上限。 |
| fetchTimeoutMs | 20000 | 采集期间单次 ctx.web 抓取的超时(毫秒)。 |
| requireJournalMetadata | false | 设为 true 时,DOI 类型证据在注册时必须带期刊名和出版年份(否则直接报错)。 |

工具与接口

- evidence_add({ origin, content?, title? }) —— 注册一条证据快照。带 content 时原文照存;不带 content 时,URL 来源经 ctx.web 抓取,工作区相对路径从磁盘读取(读取不会逃出工作区)。返回证据 id 和 SHA-256 哈希。
- research_report({ topic, title?, sections, claims, evidenceRefs, gather?, depth?, background? }) —— 组装并封存报告:先校验(引用未注册的 claim 会直接报错),再逐条核验 claim,渲染带可见标记的 report.md,写入 manifest.json,返回封存哈希。gather: true 会通过 ctx.web 跑一轮搜索,返回采集到的候选证据和明确的缺口清单——它绝不自动组装。background: true 经 ctx.jobs 返回 { kind: 'background', jobId }。
- ledger_query({ claimId? | evidenceId? }) —— 只读的绑定/判定查询;读取时会重新计算证据哈希,快照被篡改或缺失都会明确报出。不带 id 时返回账本摘要。
- ctx.researchReport.assemble(request) —— 供同级插件使用的冻结服务接口(见 src/service.ts;由 scripts/verify-frozen-contract.mjs 逐字节校验)。

权限与数据

dsh-research-report 只使用公开接缝:ctx.tools、ctx.systemPrompt,以及可选的 ctx.web / ctx.jobs / ctx.dataQuality(调用时查找,从不注入)。它只写入配置的账本根目录和报告根目录(两者默认都是工作区内的目录),只读取工作区内的文件,访问网络一律走 harness 的 web 接缝——绝不直接 fetch。证据快照不可变,按内容寻址;claim 注册不可变;判定只追加。

安全边界

- 构造即防篡改 — 每次读取快照都会重新计算 SHA-256,并与索引比对;不一致时,绑定的断言验证为 contradicted,ledger_query 报告 integrity: tampered/missing。
- 工作区限制 — 本地证据读取以工作区根目录为基准解析,拒绝越界(比较前两侧都经过 path.resolve)。
- 配置出错就报错 — 无效边界在挂载时抛错;未注册的断言引用、未知证据 id、id/内容冲突在组装时抛错。
- 不处理凭据,无隐藏网络 — URL 抓取走 ctx.web(服务商选择、错误分类、SSRF 策略都留给部署方的 web 服务商)。
- 注册可撤销 — 每项贡献都经过 ctx.effect() / register(),卸载和热重载都干净。

已知限制

- 字节级,非语义 — 内置检查逐字定位数字/引号字面量;没有可检查字面量的转述断言验证为 unverified,而真实断言若数字缺失、标签以不同值出现,会读作 contradicted。这是 v1 的有意选择(可审计胜过取巧)。
- 会话事件是自适应的 — 插件声明了带类型的 research-report/evidence、research-report/verify、research-report/seal 会话事件,但 0.1.5-alpha.1 的 Session.append 仍未暴露 ignorable 选项,也没有插件事件注册接口,所以只有宿主构建认识这些类型时追加才会生效(否则持久化层会在恢复时拒绝该日志)。账本日志始终是持久的真相来源。
- 默认配置档不挂载抓取服务商 — 随附的 dsh-base 只挂载搜索,所以 URL 抓取会直接报错(WEB_UNAVAILABLE/WEB_PROVIDER_UNAVAILABLE),直到配置抓取服务商;基于搜索的 gather 会把未抓取的来源列进缺口列表。
- 单工作区范围 — 账本和报告根目录在挂载时以 harness 工作目录为基准解析;多工作区部署应按配置档配置绝对根目录。

验证器命令行

独立的 dsh-research-verify 二进制(打包为 lib/cli.js,零 @deepseek-ai 导入)无需挂载插件即可审计任意已封存报告目录:

dsh-research-verify --report <dir> [--seal <sha256>] [--ledger <dir>] [--format json|sarif]

- --report <dir> — 已封存报告目录(manifest.json + report.md + 审计日志)。
- --seal <sha256> — 期望的封存哈希,用来与重新计算的 manifest 哈希比对。省略 = 只报告重新计算的哈希,不做比对。
- --ledger <dir> — 证据账本根目录(objects/<sha256> + index.jsonl),启用逐断言字节级复查。省略 = 如实跳过断言复查。
- --format — json(默认)或 sarif(SARIF 2.1.0)。
它重新计算封条哈希(manifest.json 的 SHA-256)、report.md 哈希和审计日志哈希,对每条声明重跑字节级校验与完整性检查;任何一项已执行的检查失败,就以非零状态退出。包内同样导出 verifySealedReport / buildVerificationReport / renderSarif / renderVerificationJson 这几个函数,供库方式调用。

开发

pnpm install
pnpm run typecheck && pnpm run typecheck:ci
pnpm test
pnpm run build
pnpm run verify:self-contained && pnpm run verify:artifacts
node scripts/check-readme-sync.mjs
node scripts/verify-frozen-contract.mjs
pnpm pack

- typecheck 通过已安装的 0.1.7-rc.2 peer 解析 @deepseek-ai/*;typecheck:ci 清掉 skipLibCheck,并针对已发布的类型启用 verbatimModuleSyntax。两者都必须保持通过。
- 测试使用 0.1.7-rc.2 peer 中真实的 Context/Session/ToolRuntime/LocalJobRegistry/WebRuntime;只有网络后端是脚本化的服务商,通过真实的 ctx.web 注册表注册。
- 发布:node scripts/release.mjs <x.y.z>(升版本、写入 CHANGELOG、重跑门禁、提交并打标签;从不推送)。

主题

dsh、dsh-plugin、deepseek-harness、cordis、research、evidence-ledger、verifiable-report、audit、citation-verification

贡献者

- PerryLink — 原作者与维护者:插件架构、证据账本、字节级校验、封条报告、五语言文档、CI 与发布自动化。

PerryLink DSH 插件家族

本项目属于 PerryLink 的 DeepSeek Harness 插件家族。下方名册默认折叠,让每个 README 的首屏都保持简短;展开即可看到每一行及其状态。

展开全部插件

| 插件 | 状态 |
| dsh-aqua-input-check | |
| dsh-archive-check | |
| dsh-auto-review | |
| dsh-autotier | |
| dsh-bid-ca-precheck | |
| dsh-bid-qual-check | |
| dsh-cert-mcp | |
| dsh-checkpoint-rewind | |
| dsh-click | |
| dsh-composer-history | |
| dsh-contract-stance | |
| dsh-customs-doc-check | |
| dsh-data-quality | |
| dsh-demurrage-ledger | |
| dsh-doublecheck | |
| dsh-drill-script-check | |
| dsh-eia-guide-check | |
| dsh-emergency-plan | |
| dsh-essay-rubric-check | |
| dsh-evidence-check | |
| dsh-export-ctl-check | |
| dsh-fast | |
| dsh-fmea-table-check | |
| dsh-forecast-penalty | |
| dsh-fund-research | |
| dsh-github | |
| dsh-gongwen-flow-check | |
| dsh-gongwen-word-check | |
| dsh-guard-plan-qc | |
| dsh-hazchem-check | |
| dsh-hazplan-check | |
| dsh-hidden-risk-map | |
| dsh-hs-classify | |
| dsh-icd-rule-check | |
| dsh-industry-research | |
| dsh-lawcite-adapter | |
| dsh-laya | |
| dsh-lc-doc-check | |
| dsh-learning-gap-check | |
| dsh-library | |
| dsh-local-ai | |
| dsh-lsp-actions | |
| dsh-mask | |
| dsh-mcp-panel | |
| dsh-medrec-qc | |
| dsh-memento | |
| dsh-nsfc-form-check | |
| dsh-nurse-record-check | |
| dsh-observe | |
| dsh-origin-rvc-check | |
| dsh-ota-review-check | |
| dsh-output-styles | |
| dsh-paper-doc-adapter | |
| dsh-permission-rules | |
| dsh-permit-report-check | |
| dsh-pipeline-check | |
| dsh-pleading-draft | |
| dsh-plugin-doctor | |
| dsh-plugin-guide | |
| dsh-plugin-kit | |
| dsh-plugin-upgrade | |
| dsh-policy-brief-draft | |
| dsh-power-loss-split | |
| dsh-power-ticket-check | |
| dsh-ppap-check | |
| dsh-protest-deadline | |
| dsh-railway-window | |
| dsh-repair-order-qc | |
| dsh-research-report | |
| dsh-review-reply-check | |
| dsh-rulefile-check | |
| dsh-safety-brief-check | |
| dsh-score | |
| dsh-session-sync | |
| dsh-site-log-check | |
| dsh-skill-pack-security | |
| dsh-soe-decision-check | |
| dsh-soilwater-check | |
| dsh-sop-sync-check | |
| dsh-spc-gbt-adapter | |
| dsh-talk | |
| dsh-tender-extract | |
| dsh-tender-matrix | |
| dsh-test-drive | |
| dsh-ticktick | |
| dsh-translate | |
| dsh-warranty-calc | |
| dsh-budget | 🧊 已冻结 — 见仓库 README |
| dsh-claude-move | 🧊 已冻结 — 见仓库 README |
| dsh-defend | 🧊 已冻结 — 见仓库 README |
| dsh-draw | 🧊 已冻结 — 见仓库 README |
| dsh-reach | 🧊 已冻结 — 见仓库 README |
| dsh-background-agents | 🚫 已退役 — 见仓库 README |
| dsh-session-pin | 🚫 已退役 — 见仓库 README |
| dsh-team-rooms | 🚫 已退役 — 见仓库 README |

许可证

Apache-2.0 — 见 LICENSE。
预览分享卡片长什么样 ↓PerryLink/dsh-research-report
分享 · DeepSeek Harness Hub
PerryLink/dsh-research-report

为 DeepSeek Harness 打造的可验证研究报告引擎:内容寻址的证据账本(声明与快照绑定、防篡改),加上带版本的密封报告,逐条声明给出验证结论,并附清单密封目录。

回到顶部