PerryLink/dsh-research-report
Verifiable research-report engine for DeepSeek Harness: content-addressed evidence ledger (claim-snapshot binding, tamper-evident) plus versioned sealed reports with per-claim verification verdicts and a manifest-sealed directory.
项目介绍Project Overview
dsh-research-report 是面向 DeepSeek Harness 的可验证研究报告插件。它将论断绑定到不可变证据快照,逐字节核验数字与引文,并生成带清单哈希的版本化密封报告。适用于需要审计、可复核研究结论或留存证伪记录的场景。注意:默认配置不挂载网页抓取提供器,URL 捕获会失败,需另行配置。
dsh-research-report is a verifiable research-report plugin for DeepSeek Harness. It binds claims to immutable evidence snapshots, verifies numbers and quoted spans byte-for-byte, and seals versioned reports with a recomputable manifest hash. Use it when research outputs need auditable citations, offline re-verification, or falsification records. Caveat: default profiles mount no fetch provider, so URL capture fails until one is configured.
请帮我了解并安装插件:【dsh-research-report】【https://github.com/PerryLink/dsh-research-report】
把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.
或使用命令行安装(适合开发者)Or use CLI install (for developers)
命令行安装CLI Install
dsh plugin --profile demo add dsh-research-report
把 PerryLink/dsh-research-report 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
📑 dsh-research-report
A verifiable research-report engine for DeepSeek Harness.
Every claim is bound to immutable evidence snapshots, verified byte-for-byte, and sealed into a versioned report whose manifest hash anyone can recompute.
Compatibility
- DeepSeek Harness
0.1.1-rc.2(peers pinned to0.1.1-rc.2). - Node
^22.19.0 || >=24.0.0, ESM only ("type": "module"). - Peer dependencies:
@deepseek-ai/cordis ^4.0.1,@deepseek-ai/schemastery ^3.18.0, and@deepseek-ai/dsh-session,@deepseek-ai/dsh-tools,@deepseek-ai/dsh-system-prompt,@deepseek-ai/dsh-web,@deepseek-ai/dsh-jobsat0.1.1-rc.2. - Optional siblings (never required):
ctx.webproviders for URL capture/gather,ctx.jobsfor background assembly,ctx.dataQuality(dsh-data-quality) for dataset citation cross-checks.
What you get
- Evidence ledger — a content-addressed snapshot store (
<ledgerRoot>/objects/<sha256>+ JSONL journals). The same content is stored exactly once; snapshots are immutable; every read recomputes the hash, so tampering or deletion is detected instead of trusted. - Claim ↔ evidence binding — claims register with the evidence ids they rely on; the ledger keeps the binding and every verification verdict (latest wins).
- Byte-level verification — every number and quoted span in a claim must be locatable verbatim in the bound snapshots. No bound evidence, or no checkable literal, marks the claim
unverified; bound evidence that cannot confirm or deny the claimed literals marks itinsufficient; a label whose snapshot value differs (the claimed value absent) marks itdisproven; tampered/missing snapshots mark itcontradicted. No semantics, no embeddings — auditable byte checks. - Optional numeric bridge — when a claim cites a structured workspace dataset (CSV/JSON) and
dsh-data-qualityis mounted, citations are cross-checked with tolerances through its frozenverifyCitationscontract; a dataset mismatch disproves the claim. - DOI evidence (zero network) — DOI origins are validated deterministically (
10.xxxx/xxxxstructure, a prefix whitelist, and a DOI character set); invalid DOIs fail loud. Optional journal/year metadata is accepted, andrequireJournalMetadatagates academic DOI evidence only when enabled. - Versioned sealed reports —
<reportRoot>/<slug(topic)>/<YYYYMMDD-HHmmss>/report.md+manifest.json+verification.jsonl+disconfirmation.jsonl; the seal hash is the SHA-256 of the manifest, which itself carries the report hash, every evidence hash, and the hash of each audit journal. - Pre-delivery re-audit & seal interception — before sealing, every bound claim is re-verified offline and journaled to
verification.jsonl; verdict drift, tampered/missing bound evidence, or a journal serialization failure blocks the seal (fail loud, no tunable). - Falsification ledger — every contradicted or disproven claim is recorded in
disconfirmation.jsonl(claim + evidence references + reason) and listed in the report's证伪记录appendix. - Negative knowledge — a disproven claim is remembered by its content hash (
disproofs.jsonl); the same text re-reported against unchanged evidence is forced back todisprovenand only re-verifies once the evidence changes. - Read-only verifier loop — after sealing, a deterministic
verifySealedReportfallback (zero network, zero model) recomputes the seal and audit hashes and re-checks every claim, writing the machine check toverifier-note.md; whenctx.jobsis mounted a read-only verifier job is also spawned (the model review is an enhancement, never a replacement). - Session-anchored evidence —
evidence_addaccepts an optionalsessionRef(sessionId+eventRange, validated loud); the anchor is stored, rendered in Appendix B, and registered in the manifest andverification.jsonl. Session-anchored evidence verifies honestly asunverified(会话锚定证据需人工回查会话日志). - Honest gaps — unverified, insufficient, contradicted, and disproven claims keep a visible
[未核实]/[证据不足]/[与证据矛盾]/[已证伪]marker in the report body and are listed in Appendix A. Nothing is silently passed. - No deep-research loop — retrieval orchestration is deliberately reused:
ctx.webfor search/fetch,ctx.jobsfor long runs. Planning and synthesis stay with the model (or an upstream plugin).
Quick start
git channel
# 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 channel
dsh plugin --profile demo add dsh-research-report
Both channels install the bundle row (see cordis.patch.yml) into the profile's dsh.profile.bundles stack and take effect on restart.
Then, in a session:
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
Install & uninstall
dsh plugin --profile demo add dsh-research-report # install
dsh plugin --profile demo remove dsh-research-report # uninstall
Verify the row mounts: dsh --profile demo --dump-config | grep dsh-research-report.
Configuration
All tunables are Schemastery Config fields; invalid values fail the profile load loudly. Relative roots resolve against the harness working directory (the workspace).
| Key | Default | Description |
|---|---|---|
enabled |
true |
Master switch; false mounts nothing. |
ledgerRoot |
.research-ledger |
Evidence-ledger directory (objects + JSONL journals). |
reportRoot |
research-reports |
Sealed-report root (versioned per topic and timestamp). |
maxEvidenceBytes |
2097152 |
Hard cap on one evidence snapshot's UTF-8 bytes. |
maxEvidencePerReport |
200 |
Hard cap on evidence items bound into one report. |
fetchTimeoutMs |
20000 |
Deadline (ms) for one ctx.web fetch during capture. |
requireJournalMetadata |
false |
When true, DOI-typed evidence must carry a journal name and publication year at registration (fails loud otherwise). |
Tools & surfaces
evidence_add({ origin, content?, title? })— register one evidence snapshot. Withcontentthe text is stored verbatim; without it a URL origin is fetched throughctx.weband a workspace-relative path is read from disk (reads never escape the workspace). Returns the evidence id and SHA-256 hash.research_report({ topic, title?, sections, claims, evidenceRefs, gather?, depth?, background? })— assemble and seal a report: validate (unregistered claim references are rejected loudly), verify every claim, renderreport.mdwith visible markers, writemanifest.json, and return the seal hash.gather: trueruns ONE search round overctx.weband returns captured candidate evidence plus an explicit gap list — it never auto-assembles.background: truereturns{ kind: 'background', jobId }overctx.jobs.ledger_query({ claimId? | evidenceId? })— read-only binding/verdict queries; evidence is re-hashed on read so a tampered or missing snapshot is reported explicitly. With no id, returns a ledger summary.ctx.researchReport.assemble(request)— the frozen service surface for sibling plugins (seesrc/service.ts; gated byte-for-byte byscripts/verify-frozen-contract.mjs).
Permissions & data
dsh-research-report consumes only public seams: ctx.tools, ctx.systemPrompt, and optionally ctx.web / ctx.jobs / ctx.dataQuality (looked up at call time, never injected). It writes only inside the configured ledger and report roots (both default to workspace-local directories), reads workspace files only inside the workspace, and reaches the network exclusively through the harness web seam — never a direct fetch. Evidence snapshots are immutable and content-addressed; claim registrations are immutable; verdicts are append-only.
Security boundaries
- Tamper-evidence by construction — every snapshot read recomputes SHA-256 against the index; a mismatch verifies the bound claims
contradictedandledger_queryreportsintegrity: tampered/missing. - Workspace confinement — local evidence reads resolve against the workspace root and refuse escapes (both sides are
path.resolved before comparison). - Fail-loud configuration — invalid bounds throw at mount; unregistered claim references, unknown evidence ids, and id/content conflicts throw at assemble.
- No credential handling, no hidden network — URL capture rides
ctx.web(provider selection, error taxonomy, and any SSRF policy stay with the deployment's web providers). - Reversible registrations — every contribution goes through
ctx.effect()/register(), so uninstall and hot reload are clean.
Known limitations
- Byte-level, not semantic — the built-in check locates number/quote literals verbatim; paraphrased claims without a checkable literal verify as
unverified, and a true claim whose number is absent while its label appears with a different value readscontradicted. This is a deliberate v1 choice (auditable beats clever). - Session events are adaptive — the plugin declares typed
research-report/evidence,research-report/verify, andresearch-report/sealsession events, but the rc.2Session.appendstill exposes noignorableoption and no plugin event-registration surface, so appends activate only when the host build knows the types (otherwise the persistence layer would refuse the log on restore). The ledger journals are always the durable source of truth. - Default profiles mount no fetch provider — the shipped
dsh-basemounts search only, so URL capture fails loud (WEB_UNAVAILABLE/WEB_PROVIDER_UNAVAILABLE) until a fetch provider is configured; search-basedgatherlists uncaptured sources in the gap list. - Single-workspace scope — ledger and report roots resolve against the harness working directory at mount; multi-workspace deployments should configure absolute roots per profile.
Development
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
typecheckresolves@deepseek-ai/*through the installed 0.1.1-rc.2 peers;typecheck:ciclearsskipLibCheckand enablesverbatimModuleSyntaxagainst the published types. Both must stay green.- Tests use the real
Context/Session/ToolRuntime/LocalJobRegistry/WebRuntimefrom the 0.1.1-rc.2 peers; only network backends are scripted providers registered through the realctx.webregistries. - Release:
node scripts/release.mjs <https://github.com/PerryLink/dsh-research-report/blob/HEAD/x.y.z>(bumps, stamps CHANGELOG, re-runs the gate, commits + tags; never pushes).
Topics
dsh, dsh-plugin, deepseek-harness, cordis, research, evidence-ledger, verifiable-report, audit, citation-verification
Contributors
- PerryLink — original author and maintainer: plugin architecture, evidence ledger, byte-level verification, sealed reports, five-language documentation, CI and release automation.
PerryLink DSH Plugin Family
This project is one of the DeepSeek Harness plugins maintained by PerryLink. If this one helps you, the others likely will too:
| Plugin | One-liner |
|---|---|
| dsh-data-quality | Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here) |
| dsh-doublecheck | Engineering-discipline guard: requirements grill, test gates, adversary review |
| dsh-fast | Read-only performance diagnostics for DeepSeek Harness. |
| dsh-industry-research | Industry research orchestration that seals its deliverables through this plugin's ctx.researchReport.assemble |
| dsh-memento | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
| dsh-score | Multi-dimensional quality scoring for DeepSeek Harness plugins. |
| dsh-test-drive | Isolated install-and-smoke test drives for DeepSeek Harness plugins. |
License
Apache-2.0 — see LICENSE.
nexu-io/open-design
ruvnet/ruflo
amruthpillai/reactive-resume
volcengine/OpenViking
Molunerfinn/PicGo
titanwings/colleague-skill
nocobase/nocobase
Tencent/WeKnora