DeepSeek Harness 插件

7starsseeker/dsh-fact-check

Star 数 ★ 5 下载量(近 30 天) 3,087 分类 技能包 收录于 2026-09-23 npm dsh-fact-check

事实核查技能:不依赖模型记忆,去公开互联网核实——把论断拆成可独立验证的事实点,先按事实范畴(政策、学术、医疗、金融、灾害事故、食品安全、科学常识、教育考试、体育、娱乐名人、司法案件等)选定该范畴的一手来源阶梯,国内外信息生态并行搜索,抓取一手页面并按来源类型分级,再用质疑关键词反查一轮,最后结论先行地输出报告,每条论断都带完整 URL 与引用位置,「未证实」「无法裁定」与「已证实」分档呈现。三类事实判断在配置了密钥时可交给 TypeSafe Jev(System One)决策模型,未配置则回退到内置的确定性规则;模型的判断只能降档、不能升档。

安装

# npm 包(预构建)

dsh plugin --profile web add dsh-fact-check

# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)

dsh plugin --profile web add github:7starsseeker/dsh-fact-check

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。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

DeepSeek Harness 用的事实核查技能:不轻信模型自己的记忆,一律去公开互联网核实——多源交叉、 国内外信息生态并行、对抗性反查,最后交出一份结论先行、每条论断都可溯源的核查报告。

English → README.md


目录

它是什么

一个事实核查技能。给它一条传闻、一个数字、一则新闻或一句「这是不是真的」,它交回一份核查报告。 它与「直接问模型」的区别在于五条不允许跳过的铁律:

  1. 知识库禁用:即便模型「认为」自己知道答案,也必须先用搜索工具从互联网核实。搜索不可用时 如实报告「无法核实」,绝不用记忆顶替。
  2. 多源交叉:每个事实点至少要有 2~3 个相互独立的来源。多家媒体转载同一篇原始报道只算一个 来源,不是三个。
  3. 国内外并行:同一核查对象同时从国内、国外两套信息生态取证并分别呈现——很多信息只在某一侧出现。
  4. 对抗性核查:结论初步成型后,主动用反向/质疑关键词再搜一轮。找不到反证才给高置信度。
  5. 全部可溯源:每一个论断、数字、日期、引述都带完整 URL + 出处名称 + 具体引用位置。

输出是结论先行的报告,来源进编号附录;部分核实的内容被物理分档——「未证实」「无法裁定」 不会和「已证实」排在同一段里,所以一条没查清的东西没法被当成已定论引用。

运行前提

必需 一个能搜索公开互联网并且能抓取页面正文的 agent(抓取链任意一条可用即可)。没有搜索能力时,技能会报「无法核实」而不是猜。
推荐 批量/多引擎搜索、存档服务(Wayback)、用于并行取证的子代理机制。
可选 Node.js ≥ 18(两个自带工具需要);TypeSafe Jev 密钥(判据层需要)。

技能正文不绑定任何产品、主机或工具链:它只写能力名,由 ADAPTING.md 把能力 落到你的环境里。

已验证宿主:DSH 0.1.7-rc.2、0.2.0-rc.2、0.2.1-rc.2、0.2.1-rc.3、0.2.1-rc.5 与 0.2.2-rc.1。 0.1.7-rc.2 于 2026-09-25 完整跑过一遍(Node 24.21.0,WSL/Linux):宿主能发现本技能并读入正文; 插件形态能挂到宿主自己的技能注册表上,source: bundled,描述取自 SKILL.md,get() 交出的正文 与 SKILL.md 逐字一致;npm run selftest 全过(插件挂载 27/27、jev-verdict 25/25、route 37/37); route.mjs regress 离线 26/26;判据语料复现 MEASUREMENTS.md §6 的预期 —— support 37/40、injection 11/12、provenance 15/16、usable_page 12/12、sufficient 24/40 (最后一条正是 §1 已写明「不要单用」的那条判据)。package.json 不声明宿主版本 —— engines 只留 node,写精确版本会让插件市场判「确认不兼容」并拦住其他所有宿主 —— 所以未列入的宿主是没验过, 而不是被禁止。

DSH 0.2.0-rc.2 于 2026-09-30 完整跑过一遍 —— 这次宿主真的升上来了(@deepseek-ai/dsh-desktop-runtime 0.2.0-rc.2、Node 24.12.0、Windows)。目录形态在上面是活的:运行中会话自己的技能目录里列着 fact-check,是宿主真实的 @deepseek-ai/dsh-skill-filesystem provider 从技能目录里扫出来的。仓库自带的工具在该宿主上对着真实判定模型重跑:npm run selftest 27/27、25/25、37/37;route.mjs regress 26/26;判据语料(需要密钥)—— support 37/40(Brier 0.0451)、injection 11/12(0.0369)、primary_source 15/16(0.0487)、usable_page 12/12(0.0031)—— 全部复现 MEASUREMENTS.md §6 的预期。实现技能注册表的那个宿主文件在 0.1.7-rc.2 与 0.2.0-rc.2 之间逐字节一致,所以无需改动、也确实一行未改。有一项仍停在 2026-09-29 那一轮的位置:插件形态没有在这台宿主上挂载 —— 那台机器跑的是目录形态,插件包并未安装 —— 它的证据仍是针对宿主自己已发布的 0.2.0-rc.2 包做的注册检查:挂到真实的 @deepseek-ai/dsh-skill 0.2.0-rc.2 注册表上,候选 rank 等于宿主自己导出的 BUNDLED_SKILL_RANK,get() 交出的正文与 SKILL.md 逐字一致(15/15);目录形态也在那里验证过同名合并以 rank 400 压过 bundled 的 600(6/6)。

DSH 0.2.1-rc.2 于 2026-10-17 完整跑过一遍(Node 24.21.0,Windows)。注册表的实现(@deepseek-ai/dsh-skill 的 lib/index.js)在 0.2.0-rc.2 与 0.2.1-rc.2 之间内容没有变化 —— diff 只有换行符与版本号(package.json 把 peer 依赖抬到 cordis ~4.0.5、加了一个 ./locale/*.json 导出)—— 所以不需要任何 API 适配。变的是 provider 能拿 control 做什么,本包两样都用上了:候选带上 path(指向绝对的 SKILL.md,摘要会保留它);provider 监听 SKILL.md,保存时调 control.invalidate(),改正文不必重启就会刷新会话里的技能目录(150 ms 去抖;control.signal abort 或上下文销毁时收尾,宿主不传 control 时退化为「改完重启生效」)。证据:插件分别挂到宿主自己那套 0.2.1-rc.2 注册表代码(从已发布的 asar 里取出,配宿主自带的 cordis 4.0.5)与已发布的 0.2.0-rc.2 包上,各 21/21 项检查通过:snapshot.complete === true、get() 交出的正文与 SKILL.md 逐字一致、provider.list() 的 rank 为 600,两轮「改文件 → 目录自动刷新」都观察到了;npm run selftest 27/27、25/25、37/37 与 route.mjs regress 26/26 均在 Node 24.21.0 上复跑。

DSH 0.2.1-rc.3 于 2026-10-24 完整跑过一遍(Node 24.22.1,Windows)。注册表契约没有位移:@deepseek-ai/dsh-skill 0.2.1-rc.3 仍导出 BUNDLED_SKILL_RANK(600)、SkillRegistry、isSkillName、isModelInvocable 与 isUserInvocable,registerProvider() 交出的 control({ signal, invalidate })不变,invalidateCache() 仍推进缓存 revision 并广播 skills/change。插件挂在这套注册表上(取自随宿主发布的 app.asar,配宿主自己的 cordis 4.0.5)通过了 28/28 项检查:inject: ['skills'];候选带 source: bundled、rank 600 等于宿主导出的常量、绝对 SKILL.md 作为 path、包根目录作为 resourceBase、描述与 frontmatter 逐字一致;get() 交出正文(13,533 字符,frontmatter 已剥离,path 保留);control.invalidate() 让注册表 revision 从 1 到 2 并恰好广播一次 skills/change;拆卸后 provider 消失且 control.signal 已 abort。两处看着像失败、其实不是的细节也一并记下:宿主的 toSummary() 有意不在目录摘要里带 rank(它是同名仲裁的输入,不是展示字段);注册只在 ctx.plugin() 的 thenable 落定后可观测 —— 在 await 之前去看,即便挂载成功也看不到 control。同一次 rc3 会话里真正运行的是目录形态(宿主自己的技能目录),会话的技能目录用本仓 SKILL.md 的描述列出了 fact-check。

DSH 0.2.1-rc.5 于 2026-10-31 完整跑过一遍(Node 26.13.0,Windows;宿主版本以随宿主发布的 app.asar 里 @deepseek-ai/dsh-desktop 声明的为准,dsh --version 报的也是同一个 0.2.1-rc.5)。注册表契约再次没有位移:@deepseek-ai/dsh-skill 0.2.1-rc.5 仍导出 BUNDLED_SKILL_RANK(600)与同一套 SkillRegistry / isSkillName / isModelInvocable / isUserInvocable,registerProvider() 交出的 control({ signal, invalidate })不变,validateCandidate、toSummary、renderSkillContent 的行为与 0.2.1-rc.3 一致 —— 均逐行对着从 app.asar 取出的那份文件、配宿主自己的 cordis 4.0.5 核过。插件挂在这套注册表上通过了 24/24 项检查:inject: ['skills'];fact-check 恰好一条候选,带 source: bundled、rank 600 等于宿主导出的常量、绝对 SKILL.md 作为 path、包根目录作为 resourceBase;get() 交出正文(14,462 字符,frontmatter 已剥离);该正文经 renderSkillContent 可正常渲染且资源基准为包根;control.invalidate() 让改动过的描述在目录里可见(探针内改完即还原,事后 git status --porcelain 为空);拆卸后 provider 再次消失。仓库自带套件在 Node 26.13.0 上复跑全绿:smoke-plugin 27/27、jev-verdict selftest 25/25、route selftest 44/44、route.mjs regress 离线 30/30、doctor exit 0。

这一版新增的一条宿主行为决定任何插件能不能加载,所以记在这里。@deepseek-ai/dsh-app-boot 加了插件↔运行时兼容门禁:声明了 engines.dsh 的插件必须满足它;没有 engines.dsh 但有 peerDependencies 的插件,其中凡是 @deepseek-ai/dsh / @deepseek-ai/dsh-* 的 peer 都必须满足;两者都没有的插件无条件通过。不兼容的 profile bundle 会被静默跳过、不打印任何东西,不兼容的 cordis.patch.yml 行会被置 disabled。本包只声明 engines.node、没有 peerDependencies,所以门禁在任何运行时上都无法拒载它 —— 这是除上面那条插件市场理由之外,又一条把 manifest 保持为「不声明宿主版本」的理由。

DSH 0.2.2-rc.1 于 2026-11-06 完整跑过一遍(Node 26.13.0,Windows;宿主版本以随宿主发布的 app.asar 里 @deepseek-ai/dsh-desktop / @deepseek-ai/dsh-desktop-runtime 声明的为准,dsh --version 报的也是同一个 0.2.2-rc.1)。这一轮以运行时证据为主,而非逐行 diff:宿主是原地升级,磁盘上已没有 0.2.1-rc.5 的对应文件可作对照。仍直接核对了随宿主发布的构建里留下的契约:@deepseek-ai/dsh-skill 的 lib/index.js 第 23 行仍是 const BUNDLED_SKILL_RANK = 600;;registerProvider() 交出的 control 仍是 { signal, invalidate },invalidate() 仍先确认 active.layer.providers.get(active.name)?.provider === provider 再刷新目录;第 566 行的导出清单不变。运行中的宿主上,插件以 link:T:/fact-check-skill 挂载;插件市场把它的激活状态报成 live(「已热加载(bundle patch)」),diagnostics.findings 为空;会话自己的技能目录列出了 fact-check、描述与本仓 SKILL.md 一致 —— 而且 $DSH_HOME/skills 与 profile 的 skills/ 下都没有 fact-check 副本,所以它只能来自插件。仓库自带套件在该宿主上复跑全绿:smoke-plugin 27/27、jev-verdict selftest 25/25、route selftest 44/44。这一轮没有覆盖:改 SKILL.md → control.invalidate() 的热刷新(需要在真实仓库里改文件才能验),以及 validateCandidate / toSummary 的内部行为(没有旧构建可逐行对照)。

安装

作为 DSH 插件

dsh plugin add dsh-fact-check

上面这条装的是已发布到 npm 的包——也就是插件市场优先采用的安装源。想直接从 GitHub 源码装,用 dsh plugin add github:7starsseeker/dsh-fact-check。

重启 DSH 后 fact-check 技能即出现在会话技能目录里。插件本体是一层很薄的接线——lib/index.js 把包自带的 SKILL.md 注册到 ctx.skills,每次加载都现读,所以改技能不需要改代码。它是 零运行时依赖(只用 node: 内置模块)。因为本 provider 注册在随包档位,你自己放在 ~/.dsh/skills/fact-check 的那一份(用户档位)在同名冲突时仍然优先——装这个插件不会覆盖你的本地修改。

git clone https://github.com/7starsseeker/dsh-fact-check.git
dsh plugin add ./dsh-fact-check

把整个文件夹交给任何 AI 工具

把本目录(或它的 zip)交给你的 AI 工具,说一句「照 FOR-AI.md 做」即可——它会自己离线探测环境、 自己适配,不需要人做配置。吃 skill 的框架直接给 SKILL.md(带 frontmatter);吃纯指令的框架用生成的 INSTRUCTIONS.md。

工作方式

拆解核查项  →  并行搜索(国内 + 国外 + 垂直域 + 质疑词)
      →  抓取一手页面  →  交叉比对与来源分级  →  对抗性反查
      →  结论先行的报告:已证实 / 未证实 / 无法裁定 + 编号来源

另外附带两个可选的离线工具:

工具 做什么
node tools/route.mjs plan --task "…" 确定性规划:这类核查该走哪条来源阶梯、哪些渠道,以及失败动作表。纯数据表,无模型、0 token。未命中任何已知事实类型的任务也照样给阶梯——给的是通用事实核查阶梯(输出里 fallback: true),不会是软件发布那套。
node tools/jev-verdict.mjs 下面说的判据客户端。

可选的 Jev 判据层

有三类判断天生是事实判断而非文风问题,本技能可以把它们交给 TypeSafe Jev(System One)决策模型, 而不是留给「裸推理」:

判断 问题类型 什么时候问
这批证据是否支持该论断 是/否 + 概率 交叉比对来源时
该来源是否一手 是/否 + 概率 给候选来源分级时
这个页面是否可用正文 是/否 + 概率 抓取之后——登录墙、验证码、JS 空壳不得计入证据

两件事是刻意的:

  • 它是可选的。 没配密钥时,这三件事由 SKILL.md 里写死的确定性规则执行,其余流程完全不变。 密钥可以来自本机配置 local.json、环境变量 TYPESAFE_API_KEY,或 tools/jev-verdict.mjs --key-file。
  • 模型的判断只能降档,不能升档。 结论档位由确定性规则「独立来源数 → 档位」裁定;模型说「支持」 不会让任何东西升级。只有「证据不足」或「与证据矛盾」才触发动作。

每条判据的实测可靠性、喂给模型前的提示注入防御、以及复跑命令都在 MEASUREMENTS.md——包括一条刻意不问的判据,它的单题准确率实测只有 62.5%。

自己验一遍

下面每条都离线、不需要密钥、几秒跑完:

node tools/smoke-plugin.mjs                          # 插件挂载是否正确、是否真的在提供 SKILL.md
node tools/route.mjs selftest                        # 确定性路由表
node tools/route.mjs regress --file cases/route-cases-neutral.json
node tools/route.mjs arms                            # 派发臂代理指标(见 MEASUREMENTS §4.1)
node tools/jev-verdict.mjs selftest                  # 判据层回归断言
node tools/doctor.mjs                                # 这台机器能做什么、缺什么

node tools/doctor.mjs --net 会额外自测抓取链与判据端点,并报告缺哪些能力、缺了会降级成什么样。 本检出上的当前状态:27/27、25/25、44/44、30/30 断言全过。

CI 在 Linux 与 Windows 上、Node 18 与 22 下跑的就是上面这几条,另外多一条检查:生成的 INSTRUCTIONS.md 是否仍然与 SKILL.md 一致。

目录结构

路径 是什么
SKILL.md 技能本体——流程与规则(唯一真相源)
INSTRUCTIONS.md 由 SKILL.md 生成,给吃纯指令的宿主
FOR-AI.md 拿到本包的那个 AI 的任务书
ADAPTING.md 换环境要改什么
MEASUREMENTS.md 实测数字与复跑方法
CHANGELOG.md 版本间净变化
RELEASING.md 一次发布怎么发到 npm(OIDC,无长期 token)
lib/index.js DSH 插件入口:把 SKILL.md 挂到 ctx.skills
cordis.patch.yml bundle patch,让本包能被 dsh plugin add 安装
tools/ 两个零依赖 Node 脚本、本机配置模板与数据表
cases/ 去痕后的回归语料
submission/ 投稿到插件市场的条目文件(不属于插件包本身)

配置

主机相关的值——端点、密钥、你那台机器上哪些渠道真的能用——一律放 local.json,它在包外 (默认 %LOCALAPPDATA%\dsh-fact-check\local.json,其它平台 ~/.config/dsh-fact-check/local.json, 可用 JEV_LOCAL_CONFIG 覆盖),这样包更新不会把它清掉。模板只分发 tools/local.example.json。代码与数据表里不写死任何主机路径、 端点或密钥,tools/*.mjs 里有断言专门守这条。

参与贡献

欢迎提 issue 与 PR——见 CONTRIBUTING.md。两条承重规则:技能正文是唯一真相源 (永远不要手改生成物,例如 INSTRUCTIONS.md);任何对判据层或路由表的改动都必须重跑回归,并把新数字 写回 MEASUREMENTS.md。

许可

MIT

内容来自项目 README(GitHub)↗

链接

同类插件

查看整个分类 →

社区评论

评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。