交出一份报告,每条结论都能被任何人在自己机器上离线复核——改过任何一个字节,密封哈希就会对不上。
面向 DeepSeek Harness 的可核查研究报告引擎:claim 绑定不可变证据快照,数字与引文按字节核对,结果封存为版本化报告目录,封印就是 manifest.json 的 SHA-256。
安装 · 配置 · FAQ · 简体中文 · English · Español · Português · हिन्दी
dsh plugin --profile <name> add dsh-research-report社区插件,与 DeepSeek 官方无关。唯一仓库:https://github.com/PerryLink/dsh-research-report(Gitee 为镜像)。
给模型一个主题和一组来源,dsh-research-report 把每条结论(claim)绑定到不可变的证据快照、逐字节核对数字与引文,再把结果封存成一份可独立复核的版本化报告。报告目录里有 report.md、manifest.json 和审计日志;封印哈希就是 manifest.json 的 SHA-256,拿到目录的人用 dsh-research-verify 就能离线重算,不需要挂载插件。它刻意不做深研循环:检索与抓取走 ctx.web,长任务走 ctx.jobs,规划与综合留给模型或上游插件。
-
安装(三选一):
# npm 通道(已发布版本) dsh plugin --profile web add dsh-research-report # git 通道(最新 main;等价于 git+https://github.com/PerryLink/dsh-research-report.git) dsh plugin --profile web add github:PerryLink/dsh-research-report # tarball 通道:本仓库 pnpm pack 后 dsh plugin --profile web add ./dsh-research-report-<version>.tgz
两条在线通道都会把 bundle 行(见
cordis.patch.yml)装入 profile 的dsh.profile.bundles层栈,重启生效。 -
最小配置(默认即可用;相对路径相对 harness 工作目录解析):
- insert: - id: dsh-research-report name: dsh-research-report config: ledgerRoot: .research-ledger reportRoot: research-reports
-
验证已生效:
dsh --profile web --dump-config | grep dsh-research-report然后在会话里跑一遍最小闭环,再用 CLI 复核封印:
evidence_add({ origin: "docs/market.md", title: "市场快照" }) # → ev-1a2b3c4d5e6f research_report({ topic: "...", sections: [...], claims: [...], evidenceRefs: ["ev-1a2b…"] }) ledger_query({ claimId: "c1" }) # 绑定关系 + 核查结论dsh-research-verify --report research-reports/<topic>/<YYYYMMDD-HHmmss>
卸载:dsh plugin --profile web remove dsh-research-report(或从 profile patch 删掉该行)。
从 DSH Desktop 市场安装
所有 PerryLink 插件均可在 DSH Desktop 内置市场中浏览:市场 → 来源 → 添加来源 → 粘贴 https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json → 选中。安装仍需通过市场的 npm 身份校验与你的确认。
dsh-research-report 的可信度来自三件事:证据不可变、核查可重算、缺口不隐藏。
- 证据账本——内容寻址快照存储(
<ledgerRoot>/objects/<sha256>+ JSONL 日志)。同一内容只存一份;快照不可变;每次读取都重算哈希——篡改或删除会被发现,而不是被信任。 - claim ↔ 证据绑定——claim 登记时声明其依赖的证据 id;账本保存绑定关系与每一次核查结论(最新为准)。
- 字节级核查——claim 文本中的每个数字与引文子串都必须能在其绑定快照中字面定位。无绑定证据或无核查字面量 →
unverified;证据存在但不足以证实或证伪声称字面量 →insufficient;标签在快照中对应不同数值(且声称值不存在)→disproven;快照被篡改/缺失 →contradicted。不做语义理解、不做向量相似——只做可审计的字节核对。 - 可选数字核查桥——当 claim 引用 workspace 内结构化数据集(CSV/JSON)且
dsh-data-quality已挂载时,经其冻结的verifyCitations契约做容差核对;数据集不一致即证伪该 claim。 - 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 内含报告哈希、全部证据哈希与各审计日志哈希。 - 交付前重审计与封存拦截——封存前对每条绑定证据的 claim 离线重跑一次核查并写入
verification.jsonl;verdict drift、绑定证据被篡改/缺失、或审计日志序列化失败都会拦截封存(响亮失败,无 tunable)。 - 证伪账本——每条被证伪(disproven)或矛盾(contradicted)的 claim 记录进
disconfirmation.jsonl(claim + 证据引用 + 原因),并在报告的「证伪记录」附录列明。 - 负知识——被证伪的 claim 按其内容哈希记入
disproofs.jsonl;同一文本在证据未变时被复报会被强制置回disproven,证据变化后才允许重新核验。 - 只读 verifier 回环——封存后先跑确定性兜底
verifySealedReport(零网络零模型):重算封印与审计哈希、逐 claim 复核,把 machine-check 段落写入verifier-note.md;挂载ctx.jobs时再派生只读 verifier job(模型复核为增强,绝不替代)。 - 会话锚定证据——
evidence_add支持可选sessionRef(sessionId+eventRange,格式校验响亮失败);锚点入账并在附录 B、manifest、verification.jsonl登记。会话锚定证据诚实判unverified(会话锚定证据需人工回查会话日志)。 - 诚实缺口——未核实/证据不足/有矛盾/已证伪的 claim 在正文中保留醒目标记
[未核实]/[证据不足]/[与证据矛盾]/[已证伪],并在附录 A 列明。绝不静默通过。 - 不做深研循环——检索编排刻意复用官方底座:搜索/抓取走
ctx.web,长任务走ctx.jobs。规划与综合交给模型(或上游插件)。
evidence_add({ origin, content?, title? })——登记一条证据。给content则按原文存储;不给时 URL 源经ctx.web抓取、workspace 相对路径从磁盘读取(读取绝不逃逸 workspace)。返回证据 id 与 SHA-256 哈希。research_report({ topic, title?, sections, claims, evidenceRefs, gather?, depth?, background? })——组装并封存报告:校验(claim 引用不全响亮拒绝)→ 逐条核查 → 渲染带醒目标记的report.md→ 写manifest.json→ 返回封印哈希。gather: true先经ctx.web做一轮检索,返回已捕获候选证据与显式缺口清单——绝不自动成稿。background: true经ctx.jobs返回{ kind: 'background', jobId }。research_trail({ limit?, format? })——只读的 claim → 证据 → 结论轨迹:把已注册 claim 与证据、已存结论拼起来,把没有可解析证据的 claim 标为 unbound,列出悬空 evidence id,输出可交给审稿人的 Markdown(以及结构化行)。不新增存储、不改写结论。ledger_query({ claimId? | evidenceId? })——只读查询绑定关系与核查结论;证据读取时重算哈希,篡改/丢失会显式报告。不带 id 时返回账本摘要。ctx.researchReport.assemble(request)——面向兄弟插件的冻结服务表面(见src/service.ts;由scripts/verify-frozen-contract.mjs逐字节门禁)。
以下为插件真实入口;安装后调用一个即可。
详细示例
命令
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"]
})输出
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
Observed from README.md:112-118,150; test/index.spec.ts:166-177; src/tools/research-report.ts:170-175
失败分支
输入
{"topic":"probe","sections":[{"heading":"Growth","paragraphs":[{"text":"Growth was 42%.","claimIds":["c1"]}]}],"claims":[{"id":"c1","text":"Growth was 42%.","evidenceIds":[]}]}
输出
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%. [未核实]
Observed from 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 · research_trail
独立二进制(打包为 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>:期望的 seal 哈希,用于与重算的 manifest 哈希比对;缺省则只报告重算值、不比对。--ledger <dir>:证据账本根目录(objects/<sha256>+index.jsonl),用于逐 claim 字节级复检;缺省则如实跳过 claim 复检。--format:json(默认)或sarif(SARIF 2.1.0)。
它重算 seal 哈希(manifest.json 的 SHA-256)、report.md 哈希与审计日志哈希,逐 claim 重跑字节级 + 完整性检查,任一已执行检查失败则以非零码退出。verifySealedReport / buildVerificationReport / renderSarif / renderVerificationJson 亦从包导出供库调用。
全部可调项都是 Schemastery Config 字段;非法值在加载期响亮失败。相对路径根目录相对 harness 工作目录(workspace)解析。cordis.patch.yml 逐键内联注释。
最常用键:
| 键 | 默认值 | 含义 |
|---|---|---|
enabled |
true |
总开关;false 时什么都不挂载。 |
ledgerRoot |
.research-ledger |
证据账本目录(对象 + JSONL 日志)。 |
reportRoot |
research-reports |
封存报告根目录(按主题 + 时间戳版本化)。 |
workspaceRoot |
(宿主会话工作目录) | 路径证据的工作区根;默认取会话工作目录,其次取 harness cwd。 |
maxEvidenceBytes |
2097152 |
单条证据快照的 UTF-8 字节硬上限。 |
maxEvidencePerReport |
200 |
单份报告可绑定证据条数硬上限。 |
完整配置表(8 个键)
| 键 | 默认值 | 含义 |
|---|---|---|
enabled |
true |
总开关;false 时什么都不挂载。 |
ledgerRoot |
.research-ledger |
证据账本目录(对象 + JSONL 日志)。 |
reportRoot |
research-reports |
封存报告根目录(按主题 + 时间戳版本化)。 |
workspaceRoot |
(宿主会话工作目录) | 路径证据的工作区根;默认取会话工作目录,其次取 harness cwd。 |
maxEvidenceBytes |
2097152 |
单条证据快照的 UTF-8 字节硬上限。 |
maxEvidencePerReport |
200 |
单份报告可绑定证据条数硬上限。 |
fetchTimeoutMs |
20000 |
抓取时单次 ctx.web fetch 的超时(毫秒)。 |
requireJournalMetadata |
false |
为 true 时,DOI 类证据登记必须带期刊名与出版年份(否则响亮失败)。 |
profile patch 覆盖示例:
- insert:
- id: dsh-research-report
name: dsh-research-report
config:
reportRoot: research-reports/acme
maxEvidencePerReport: 100
requireJournalMetadata: true账本和报告到底写在哪?删掉会怎样?
两者都在配置的根目录内:ledgerRoot(默认 .research-ledger)与 reportRoot(默认 research-reports),相对路径相对 harness 工作目录解析。快照按内容寻址且不可变,同一内容只存一份;删除或改写对象后,下一次读取重算哈希就会失败,绑定它的 claim 判 contradicted,ledger_query 报告 integrity: missing/tampered——不会悄悄当没事发生。
没有配置 fetch provider 时会怎样?会静默降级吗?
不会静默。官方 dsh-base 只挂搜索,配置 fetch provider 之前 URL 抓取会响亮失败(WEB_UNAVAILABLE/WEB_PROVIDER_UNAVAILABLE);基于搜索的 gather 会把未捕获的来源列进缺口清单,绝不编造证据、绝不自动成稿。
和 dsh-data-quality 会冲突吗?
不冲突。ctx.dataQuality 是可选的,只在调用时经 ctx.get 判空使用,从不写入 inject;存在时按它冻结的 verifyCitations 契约做数据集引文核对,不存在时该分支如实跳过。本插件本身不注册任何 waterfall 监听器。
性能开销多大?
核查是纯字节操作:零网络、零模型调用,代价随 claim 中的数字/引文字面量与绑定快照大小线性增长。封存前的重审计同样是确定性的重复核对。唯一的外部等待是证据抓取,受 fetchTimeoutMs(默认 20000 ms)约束;长报告可走 background: true 交给 ctx.jobs。
为什么我的转述结论被判 unverified?
这是字节级设计的必然结果:内置核查只定位数字与引文字面量,不能判断改写前后的语义等价。见「已知限制」第一条——可审计优先于聪明。
- 构造级防篡改——每次快照读取都对照索引重算 SHA-256;不匹配时绑定 claim 核查为
contradicted,ledger_query报告integrity: tampered/missing。 - workspace 限制——本地证据读取相对 workspace 根解析并拒绝逃逸(比较前两侧都经
path.resolve)。 - 配置响亮失败——非法边界在挂载期抛错;claim 引用不全、未知证据 id、id/内容冲突在组装期抛错。
- 不碰凭据、无隐藏网络——URL 抓取走
ctx.web(provider 选择、错误分类、SSRF 策略都留在部署方的 web provider)。 - 注册可逆——所有贡献经
ctx.effect()/register(),卸载与热重载干净。
dsh-research-report 只消费公开 seam:ctx.tools、ctx.systemPrompt,以及可选的 ctx.web / ctx.jobs / ctx.dataQuality(调用时经 ctx.get 判空使用,绝不写入 inject)。写入只发生在配置的账本与报告根目录内(默认都是 workspace 本地目录);本地文件读取不越出 workspace;网络访问只经 harness web seam——绝不直接 fetch。证据快照不可变且内容寻址;claim 登记不可变;核查结论只追加。
- manifest 声明的权限:
fs:workspace-write、network:ctx-web-only、session:read、session:write、native-code:none(见package.json的dshWorkshop段)。 - 会话事件:
research-report/evidence、research-report/verify、research-report/seal是自适应镜像;宿主认识该词表时才落盘,否则账本日志单独承担持久真相(见「已知限制」)。
- 字节级而非语义级——内置核查只做数字/引文字面定位;没有可核查字面量的转述性 claim 判
unverified;声称值缺失而标签对应其他数值时判contradicted。这是 v1 的刻意选择(可审计优先于聪明)。 - 会话事件自适应——插件声明了类型化的
research-report/evidence、research-report/verify、research-report/seal会话事件,但 0.1.5-alpha.1 的Session.append仍不提供ignorable选项、也没有插件事件注册面,所以只有宿主 build 认识这些类型时才真正落盘(否则持久化层会在恢复时拒绝该日志)。账本日志始终是权威的持久事实源。 - 默认 profile 不挂载 fetch provider——官方
dsh-base只挂搜索,所以配置 fetch provider 之前 URL 抓取会响亮失败(WEB_UNAVAILABLE/WEB_PROVIDER_UNAVAILABLE);基于搜索的gather会把未捕获的来源列入缺口清单。 - 单 workspace 作用域——账本与报告根目录在挂载时相对 harness 工作目录解析;多 workspace 部署应在各 profile 配置绝对路径。
本插件在结构上不争夺其他插件的资源:
- 唯一服务键
ctx.researchReport——由src/service.ts的 Service Definition 提供,不注册第二个服务键。 - 不注册 waterfall 监听器——本插件没有
ctx.on()监听器,因而不参与任何顺序敏感事件链;若未来新增,放行分支必须调用next()。 - 不注册 HTTP 路由与客户端面——没有
webServer前缀、没有客户端 slot;它是纯 host 插件(仓库无client/)。 - patch 层只 insert 自己——bundle patch 只插入
dsh-research-report一行,不覆写内置行的config。 - 可选协同按需取用——
ctx.web/ctx.jobs/ctx.dataQuality都在调用时经ctx.get判空;未挂载时对应路径响亮失败并说明原因,而不是静默走另一条路。 - 冻结契约有门禁——
ctx.researchReport.assemble(src/service.ts)与CitationCheck*(src/verify.ts)是兄弟插件共用的逐字节冻结块,scripts/verify-frozen-contract.mjs在 CI 里守住漂移。
| 维度 | 状态 |
|---|---|
| Harness | DeepSeek Harness dsh-v0.2.1-alpha.1(2026-09-25 已核验)。npm dev/test 线 0.1.7-rc.2;compat 矩阵同时钉住四条已声明 peer 线。0.1.5-alpha.1(2026-09-09 已适配)的会话信封保留 ignorable 字段但仅用于存量日志读取兼容——Session.append 仍无法盖章,门控行为不变。 |
| Node | ^22.19.0 || >=24.9.0,仅 ESM("type": "module") |
| 平台 | 任何 DSH 可运行处(纯 host;网络只经 ctx.web) |
| 模型 | 文本模型完全支持;核查是字节比对,不需要额外模型能力 |
Peer 依赖:@deepseek-ai/cordis ^4.0.5-alpha.1、@deepseek-ai/schemastery ^3.18.5-alpha.1,以及 @deepseek-ai/dsh-session、@deepseek-ai/dsh-tools、@deepseek-ai/dsh-system-prompt、@deepseek-ai/dsh-web、@deepseek-ai/dsh-jobs(范围见 package.json)。可选兄弟(绝不强制):ctx.web 抓取、ctx.jobs 后台组装、ctx.dataQuality 数据集引文交叉核对。
- Gitee 镜像(同步镜像,以 GitHub 为准)
- dshfind 插件页(安装量与排名)
- OpenSSF Scorecard 报告(由 .github/workflows/scorecard.yml 驱动)
- dsh-plugin-doctor 验证报告
- DSH Market(已上架)
- 1024 商店渠道:先
npm i -g dsh1024,再dsh1024 plugin --profile web add dsh-research-report(计入 deepseek1024.com 安装排行) - 生态实测知识库:插件开发指南 · 选型实测数据 · 维护取舍判据
pnpm install
pnpm run typecheck && pnpm run typecheck:ci
pnpm test
pnpm run build
pnpm run verify:self-contained && pnpm run verify:artifacts
pnpm run verify:frozen-contract
node scripts/check-readme-sync.mjs
pnpm run check:lockfile
pnpm packtypecheck经已安装的 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注册表的脚本化 provider。 - 发布:
node scripts/release.mjs <x.y.z>(bump、盖 CHANGELOG、重跑门禁、提交 + 打 tag;绝不 push)。 - 配图由
scripts/gen-readme-assets.py程序化生成(Python + Pillow):Pillow 画docs/assets/dsh-research-report-hero-{zh,en}-{light,dark}.webp(1440×576),手写 SVG 画docs/assets/dsh-research-report-flow-v5-{light,dark}.svg(1100×660),可重复执行、深浅两版与五语共用。
目录布局:
| 路径 | 内容 |
|---|---|
src/index.ts |
function-plugin 契约(name/inject/Config/apply,无 default export) |
src/service.ts |
ctx.researchReport Service Definition + 逐字节冻结的 assemble 契约块 |
src/ledger.ts |
内容寻址证据账本(对象 + JSONL 日志、读取重算哈希) |
src/verify.ts |
字节级核查器 + 冻结的 CitationCheck* 桥类型 |
src/assemble.ts |
纯组装:请求校验、report.md 渲染、确定性 manifest.json、封印 |
src/gather.ts |
抓取(ctx.web / workspace 文件)与 gather 候选轮 |
src/tools/ |
四个消费者:evidence_add、research_report、ledger_query、research_trail |
test/ |
vitest,使用真实 host 运行时;仅网络后端是脚本化 provider |
fixtures/ |
三条本地文档,覆盖 evidence → seal → tamper → contradicted 全流程 |
Topics:dsh、dsh-plugin、deepseek-harness、cordis、research、evidence-ledger、verifiable-report、audit、citation-verification
本项目是 PerryLink 维护的 DeepSeek Harness 插件家族成员(全部 Apache-2.0)。如果这个插件帮到了你,给个 star——它不解锁任何功能,但会让下一个人更容易找到它。
- @PerryLink —— 原作者与维护者:插件架构、证据账本、字节级核验、密封报告、五语文档、CI 与发布自动化。
展开全部插件
LICENSE(Apache License 2.0)© 2026 dsh-research-report contributors
Apache-2.0 · 社区插件,与 DeepSeek 无关。