dsh-fact-check 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README.md +22 -1
- package/README.zh-CN.md +20 -1
- package/SKILL.md +1 -1
- package/lib/index.js +72 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
面向使用者的**版本间净变化**(修复 / 改进 / 新增)。只写最终结果,不写过程。
|
|
4
4
|
判据、阈值、触发词的任何改动都必须同时更新 `MEASUREMENTS.md` 的数字与 `cases/` 的回归结果。
|
|
5
5
|
|
|
6
|
+
## 1.4.0 — 2026-10-17
|
|
7
|
+
|
|
8
|
+
**新增**
|
|
9
|
+
|
|
10
|
+
- **接入 DSH 0.2.1-rc.2 的两项技能注册表能力**:① 候选与定义带 `path`(`SKILL.md` 的绝对路径,catalog 摘要保留),宿主可据此按文件定位;② provider 监听 `SKILL.md`,保存后调用 `control.invalidate()`,会话中的技能目录**无需重启**即刷新(150 ms 去抖;watcher 在 `control.signal` abort 或 context dispose 时关闭;宿主不传 `control` 时退回「重启生效」)。
|
|
11
|
+
- 这次是**增量接入而非适配**:`@deepseek-ai/dsh-skill` 的 `lib/index.js` 在 0.2.0-rc.2 与 0.2.1-rc.2 之间逐字节一致(差异仅换行与版本元数据),`registerProvider` 的签名没有变,新能力都在既有的 `control = { signal, invalidate() }` 里。同一份代码在 **0.2.0-rc.2(已发布包)** 与 **0.2.1-rc.2(宿主 asar 里抽出的注册表)** 上各 21/21 通过,因此向前兼容。
|
|
12
|
+
|
|
13
|
+
**其它**
|
|
14
|
+
|
|
15
|
+
- 发布 1.4.0:`package.json` 与 `SKILL.md` frontmatter 的版本号同步;README / README.zh-CN 的已验证宿主补上 **0.2.1-rc.2**,并记录本轮证据(两套注册表各 21/21、`snapshot.complete`、`get()` 正文逐字、`provider.list()` rank 600、两轮编辑→刷新;`selftest` 27/27 · 25/25 · 37/37,`regress` 26/26)。
|
|
16
|
+
|
|
6
17
|
## 1.3.0 — 2026-09-22
|
|
7
18
|
|
|
8
19
|
**新增**
|
package/README.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
# dsh-fact-check
|
|
2
2
|
|
|
3
3
|
[](https://github.com/7starsseeker/dsh-fact-check/tags)
|
|
4
|
+
[](https://www.npmjs.com/package/dsh-fact-check)
|
|
5
|
+
[](https://www.npmjs.com/package/dsh-fact-check)
|
|
4
6
|
[](https://github.com/7starsseeker/dsh-fact-check/actions/workflows/selftest.yml)
|
|
5
7
|
[](./LICENSE)
|
|
6
8
|
[](https://nodejs.org)
|
|
7
9
|
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
10
|
+
[](https://awesome-dsh-plugin.com)
|
|
8
11
|
[](./package.json)
|
|
9
12
|
[](https://github.com/7starsseeker/dsh-fact-check/commits/main)
|
|
10
13
|
[](https://github.com/7starsseeker/dsh-fact-check/stargazers)
|
|
@@ -64,14 +67,32 @@ are kept in their own sections — *unverified* and *undecidable* never sit in t
|
|
|
64
67
|
The skill body is not bound to any host, product or tool chain: it names *capabilities*, and
|
|
65
68
|
[`ADAPTING.md`](./ADAPTING.md) maps them onto your environment.
|
|
66
69
|
|
|
70
|
+
**Verified hosts: DSH 0.1.7-rc.2, 0.2.0-rc.2 and 0.2.1-rc.2.** DSH 0.1.7-rc.2 was checked end to end on 2026-09-25 (Node 24.21.0, WSL/Linux): the host discovers the skill
|
|
71
|
+
and loads its body; the plugin form mounts on the host's own skill registry with `source: bundled`, its
|
|
72
|
+
description read from `SKILL.md` and `get()` returning that body verbatim; `npm run selftest` passes
|
|
73
|
+
(plugin mount 27/27, `jev-verdict` 25/25, `route` 37/37); `route.mjs regress` is 26/26 offline; and the
|
|
74
|
+
judgement corpora reproduce the expectations in [`MEASUREMENTS.md`](./MEASUREMENTS.md) §6 — `support`
|
|
75
|
+
37/40, `injection` 11/12, `provenance` 15/16, `usable_page` 12/12, `sufficient` 24/40 (the last one is
|
|
76
|
+
the criterion §1 already says not to use on its own). No host version is declared in `package.json` —
|
|
77
|
+
`engines` carries only `node`, and an exact version there would make the plugin market report
|
|
78
|
+
"confirmed incompatible" and block every other host — so a host not listed here is untested, not
|
|
79
|
+
forbidden.
|
|
80
|
+
|
|
81
|
+
**DSH 0.2.0-rc.2 was checked end to end on 2026-09-30** — this time the host *was* upgraded (`@deepseek-ai/dsh-desktop-runtime` 0.2.0-rc.2, Node 24.12.0, Windows). The directory form is live on it: the running session's own skill catalog lists `fact-check`, discovered from the host's skill directory by the host's real `@deepseek-ai/dsh-skill-filesystem` provider. The tools were re-run on that host against the live judgement model: `npm run selftest` 27/27, 25/25, 37/37; `route.mjs regress` 26/26; and the judgement corpora, which need a key — `support` 37/40 (Brier 0.0451), `injection` 11/12 (0.0369), `primary_source` 15/16 (0.0487), `usable_page` 12/12 (0.0031) — all reproducing the [`MEASUREMENTS.md`](./MEASUREMENTS.md) §6 expectations. The host file implementing the skill registry is byte-identical between 0.1.7-rc.2 and 0.2.0-rc.2, so no code change was needed and none was made. One thing stays where the 2026-09-29 round left it: the **plugin** form was not mounted on this host — that machine runs the directory form, so the plugin package is not installed there — and its evidence remains the registration check against the host's own **published** `0.2.0-rc.2` packages, where it mounts on the real `@deepseek-ai/dsh-skill` 0.2.0-rc.2 registry with its candidate rank equal to the host's exported `BUNDLED_SKILL_RANK` and `get()` returning the `SKILL.md` body verbatim (15/15), and the directory form wins the same-name merge against the bundled copy at rank 400 against 600 (6/6).
|
|
82
|
+
|
|
83
|
+
**DSH 0.2.1-rc.2 was checked end to end on 2026-10-17** (Node 24.21.0, Windows). The registry implementation (`@deepseek-ai/dsh-skill`'s `lib/index.js`) has **no content change** between 0.2.0-rc.2 and 0.2.1-rc.2 — the diff is line endings and version metadata only (`package.json` bumps the peers to cordis `~4.0.5` and adds a `./locale/*.json` export) — so no API adaptation was needed. What did change is what a provider may do with `control`, and this package now uses both 0.2.1 affordances: the candidate carries `path` (the absolute `SKILL.md`, retained in catalog summaries), and the provider watches `SKILL.md` and calls `control.invalidate()` on save, so editing the body refreshes the session catalog without a restart (150 ms debounce; the watcher is torn down on `control.signal` abort or context dispose, and a host that passes no `control` keeps the previous "restart to re-read" behavior). Evidence: the plugin was mounted on the host's own `0.2.1-rc.2` registry code (taken from the shipped asar, wired with the host's own cordis 4.0.5) and on the **published** `0.2.0-rc.2` package — 21/21 checks on each, `snapshot.complete === true`, `get()` returning the body verbatim, `provider.list()` rank 600, and both edit→refresh cycles observed; `npm run selftest` 27/27, 25/25, 37/37 and `route.mjs regress` 26/26 re-run on Node 24.21.0.
|
|
84
|
+
|
|
67
85
|
## Install
|
|
68
86
|
|
|
69
87
|
### As a DSH plugin
|
|
70
88
|
|
|
71
89
|
```sh
|
|
72
|
-
dsh plugin add
|
|
90
|
+
dsh plugin add dsh-fact-check
|
|
73
91
|
```
|
|
74
92
|
|
|
93
|
+
That is the published npm package — the source the plugin market installs from by preference. The same
|
|
94
|
+
plugin straight from GitHub source is `dsh plugin add github:7starsseeker/dsh-fact-check`.
|
|
95
|
+
|
|
75
96
|
Then restart DSH: the `fact-check` skill appears in the session catalogue. The plugin itself is a thin
|
|
76
97
|
adapter — `lib/index.js` registers the bundled `SKILL.md` on `ctx.skills`, re-reading it on every load,
|
|
77
98
|
so editing the skill needs no code change. It has **zero runtime dependencies** (only `node:` builtins).
|
package/README.zh-CN.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
# dsh-fact-check
|
|
2
2
|
|
|
3
3
|
[](https://github.com/7starsseeker/dsh-fact-check/tags)
|
|
4
|
+
[](https://www.npmjs.com/package/dsh-fact-check)
|
|
5
|
+
[](https://www.npmjs.com/package/dsh-fact-check)
|
|
4
6
|
[](https://github.com/7starsseeker/dsh-fact-check/actions/workflows/selftest.yml)
|
|
5
7
|
[](./LICENSE)
|
|
6
8
|
[](https://nodejs.org)
|
|
7
9
|
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
10
|
+
[](https://awesome-dsh-plugin.com)
|
|
8
11
|
[](./package.json)
|
|
9
12
|
[](https://github.com/7starsseeker/dsh-fact-check/commits/main)
|
|
10
13
|
[](https://github.com/7starsseeker/dsh-fact-check/stargazers)
|
|
@@ -58,14 +61,30 @@
|
|
|
58
61
|
技能正文不绑定任何产品、主机或工具链:它只写**能力名**,由 [`ADAPTING.md`](./ADAPTING.md) 把能力
|
|
59
62
|
落到你的环境里。
|
|
60
63
|
|
|
64
|
+
**已验证宿主:DSH 0.1.7-rc.2、0.2.0-rc.2 与 0.2.1-rc.2。** 0.1.7-rc.2 于 2026-09-25 完整跑过一遍(Node 24.21.0,WSL/Linux):宿主能发现本技能并读入正文;
|
|
65
|
+
插件形态能挂到宿主自己的技能注册表上,`source: bundled`,描述取自 `SKILL.md`,`get()` 交出的正文
|
|
66
|
+
与 `SKILL.md` 逐字一致;`npm run selftest` 全过(插件挂载 27/27、`jev-verdict` 25/25、`route` 37/37);
|
|
67
|
+
`route.mjs regress` 离线 26/26;判据语料复现 [`MEASUREMENTS.md`](./MEASUREMENTS.md) §6 的预期 ——
|
|
68
|
+
`support` 37/40、`injection` 11/12、`provenance` 15/16、`usable_page` 12/12、`sufficient` 24/40
|
|
69
|
+
(最后一条正是 §1 已写明「不要单用」的那条判据)。`package.json` 不声明宿主版本 —— `engines` 只留
|
|
70
|
+
`node`,写精确版本会让插件市场判「确认不兼容」并拦住其他所有宿主 —— 所以未列入的宿主是没验过,
|
|
71
|
+
而不是被禁止。
|
|
72
|
+
|
|
73
|
+
**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`](./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)。
|
|
74
|
+
|
|
75
|
+
**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 上复跑。
|
|
76
|
+
|
|
61
77
|
## 安装
|
|
62
78
|
|
|
63
79
|
### 作为 DSH 插件
|
|
64
80
|
|
|
65
81
|
```sh
|
|
66
|
-
dsh plugin add
|
|
82
|
+
dsh plugin add dsh-fact-check
|
|
67
83
|
```
|
|
68
84
|
|
|
85
|
+
上面这条装的是已发布到 npm 的包——也就是插件市场优先采用的安装源。想直接从 GitHub 源码装,用
|
|
86
|
+
`dsh plugin add github:7starsseeker/dsh-fact-check`。
|
|
87
|
+
|
|
69
88
|
重启 DSH 后 `fact-check` 技能即出现在会话技能目录里。插件本体是一层很薄的接线——`lib/index.js`
|
|
70
89
|
把包自带的 `SKILL.md` 注册到 `ctx.skills`,每次加载都现读,所以改技能不需要改代码。它是
|
|
71
90
|
**零运行时依赖**(只用 `node:` 内置模块)。因为本 provider 注册在*随包*档位,你自己放在
|
package/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fact-check
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.4.0
|
|
4
4
|
description: 事实核查与资料搜索。当用户要求核实事实/传闻/新闻/数据/情况的真伪、查证信息、确认现状、补充资料时使用——即使用户只说了"查一下""确认一下""核实""这是不是真的""帮我看看",也应触发。核心行为:不依赖自身知识库,所有关键信息一律通过互联网搜索获取,搜索途径与信息来源尽量多样以便交叉核实,并同时覆盖国内与国外信息生态。执行模式按工作量自动选择:轻量核查由主对话直连完成,渠道多或需抓取大量长文时自动分派并行子代理。
|
|
5
5
|
---
|
|
6
6
|
|
package/lib/index.js
CHANGED
|
@@ -11,15 +11,25 @@
|
|
|
11
11
|
* · **零依赖** —— 只 import `node:` 内置模块(与 tools/ 下两个脚本同一原则)。判定逻辑、
|
|
12
12
|
* 路由表、回归语料全留在 tools/ 与 cases/,与宿主无关。
|
|
13
13
|
*
|
|
14
|
+
* DSH 0.2.1 起注册表在 `registerProvider` 的 create 里传入 `{ signal, invalidate }`:这里
|
|
15
|
+
* 用 `invalidate()` 接住 SKILL.md 的改动(改正文不必重启),并给出候选的 `path`(摘要会
|
|
16
|
+
* 保留它,供宿主直接定位技能文件)。老宿主不传 control 时静默退化成「重启后生效」。
|
|
17
|
+
*
|
|
14
18
|
* @module dsh-fact-check
|
|
15
19
|
*/
|
|
16
20
|
|
|
21
|
+
import { watch } from 'node:fs'
|
|
17
22
|
import { readFile } from 'node:fs/promises'
|
|
18
23
|
import { fileURLToPath } from 'node:url'
|
|
19
24
|
|
|
20
25
|
/** 包根(lib/ 的上一级)。SKILL.md、tools/、cases/ 都在那里。 */
|
|
21
26
|
const ROOT_URL = new URL('..', import.meta.url)
|
|
22
27
|
const SKILL_URL = new URL('SKILL.md', ROOT_URL)
|
|
28
|
+
/** SKILL.md 的绝对路径:候选与定义的 `path` 都用它。 */
|
|
29
|
+
const SKILL_PATH = fileURLToPath(SKILL_URL)
|
|
30
|
+
|
|
31
|
+
/** 编辑器保存常常连发好几个事件,合并成一次目录失效。 */
|
|
32
|
+
const WATCH_DEBOUNCE_MS = 150
|
|
23
33
|
|
|
24
34
|
/** provider 名,在 `ctx.skills` 注册表里唯一。 */
|
|
25
35
|
const PROVIDER_NAME = 'fact-check'
|
|
@@ -93,6 +103,8 @@ export async function list() {
|
|
|
93
103
|
// 换成 skills/ 子目录会让这些相对路径失效。
|
|
94
104
|
resourceBase: { kind: 'directory', path: fileURLToPath(ROOT_URL) },
|
|
95
105
|
rank: RANK,
|
|
106
|
+
// DSH 0.2.1 起摘要会保留 path:给宿主/子代理一个能直接打开的技能文件位置。
|
|
107
|
+
path: SKILL_PATH,
|
|
96
108
|
locator: SKILL_URL,
|
|
97
109
|
},
|
|
98
110
|
]
|
|
@@ -118,6 +130,7 @@ export async function get(candidate) {
|
|
|
118
130
|
provider: PROVIDER_NAME,
|
|
119
131
|
source: 'bundled',
|
|
120
132
|
resourceBase: candidate.resourceBase,
|
|
133
|
+
path: SKILL_PATH,
|
|
121
134
|
content: body,
|
|
122
135
|
}
|
|
123
136
|
}
|
|
@@ -130,12 +143,69 @@ export const name = PROVIDER_NAME
|
|
|
130
143
|
/** 本插件依赖的服务:技能注册表。 */
|
|
131
144
|
export const inject = ['skills']
|
|
132
145
|
|
|
146
|
+
/**
|
|
147
|
+
* 监听 SKILL.md,改动后让注册表重读目录。
|
|
148
|
+
*
|
|
149
|
+
* 监听**目录**而不是文件:编辑器「写临时文件再改名」的保存方式会让文件级 watcher 直接失效。
|
|
150
|
+
* 只认 `SKILL.md` 这一个文件名(根目录下还有 tools/、cases/,它们改了与技能目录无关)。
|
|
151
|
+
*
|
|
152
|
+
* @param {{invalidate?: Function, signal?: AbortSignal}} control - 注册表给的 control。
|
|
153
|
+
* @param {{logger?: {warn?: Function}}} ctx - 仅用于告警。
|
|
154
|
+
* @returns {() => void} 停止监听(幂等)。
|
|
155
|
+
*/
|
|
156
|
+
function watchSkillFile(control, ctx) {
|
|
157
|
+
// 老宿主(或自检里传空 control)没有 invalidate:不装监听,退化成「改完重启生效」。
|
|
158
|
+
if (typeof control?.invalidate !== 'function') return () => {}
|
|
159
|
+
let timer
|
|
160
|
+
let closed = false
|
|
161
|
+
let watcher
|
|
162
|
+
try {
|
|
163
|
+
watcher = watch(fileURLToPath(ROOT_URL), { persistent: false }, (_event, filename) => {
|
|
164
|
+
// filename 为 null 表示「根目录里有东西变了」但说不出是哪个:刷新比留着旧目录安全。
|
|
165
|
+
if (closed || (filename !== null && filename !== 'SKILL.md')) return
|
|
166
|
+
if (timer !== undefined) clearTimeout(timer)
|
|
167
|
+
timer = setTimeout(() => {
|
|
168
|
+
timer = undefined
|
|
169
|
+
if (!closed) control.invalidate()
|
|
170
|
+
}, WATCH_DEBOUNCE_MS)
|
|
171
|
+
})
|
|
172
|
+
} catch (error) {
|
|
173
|
+
ctx?.logger?.warn?.(`fact-check: SKILL.md 监听未启动,改 SKILL.md 后需重启才刷新技能目录:${error.message}`)
|
|
174
|
+
return () => {}
|
|
175
|
+
}
|
|
176
|
+
/** 幂等停止:abort、ctx 销毁、watcher 自身出错都走这里。 */
|
|
177
|
+
const stop = () => {
|
|
178
|
+
if (closed) return
|
|
179
|
+
closed = true
|
|
180
|
+
if (timer !== undefined) clearTimeout(timer)
|
|
181
|
+
watcher.close()
|
|
182
|
+
}
|
|
183
|
+
watcher.on('error', (error) => {
|
|
184
|
+
if (closed) return
|
|
185
|
+
ctx?.logger?.warn?.(`fact-check: SKILL.md 监听已停用,改 SKILL.md 后需重启才刷新技能目录:${error.message}`)
|
|
186
|
+
stop()
|
|
187
|
+
})
|
|
188
|
+
control.signal?.addEventListener?.('abort', stop, { once: true })
|
|
189
|
+
return stop
|
|
190
|
+
}
|
|
191
|
+
|
|
133
192
|
/**
|
|
134
193
|
* 挂载:把本 provider 注册到 `ctx.skills`。注册是同步的,发现与读正文都在 awaits 里。
|
|
135
194
|
*
|
|
136
|
-
*
|
|
195
|
+
* 每次 create 都配一份 SKILL.md 监听;停止句柄既挂在 `control.signal` 的 abort 上,
|
|
196
|
+
* 也交给 `ctx.effect` 在插件销毁时统一收尾(宿主没有 effect 时就不登记)。
|
|
197
|
+
*
|
|
198
|
+
* @param {{skills: {registerProvider: Function}, effect?: Function, logger?: object}} ctx - Cordis 上下文。
|
|
137
199
|
* @returns {void}
|
|
138
200
|
*/
|
|
139
201
|
export function apply(ctx) {
|
|
140
|
-
ctx.skills.registerProvider(() =>
|
|
202
|
+
ctx.skills.registerProvider((control) => {
|
|
203
|
+
const stop = watchSkillFile(control, ctx)
|
|
204
|
+
if (typeof ctx.effect === 'function') {
|
|
205
|
+
ctx.effect(function* () {
|
|
206
|
+
yield () => stop()
|
|
207
|
+
}, 'fact-check skill watcher')
|
|
208
|
+
}
|
|
209
|
+
return provider
|
|
210
|
+
})
|
|
141
211
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-fact-check",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Fact-checking skill for DeepSeek Harness: verifies claims against the open web instead of model memory, cross-checks independent sources across domestic and international search ecosystems, and can route three factual judgements (does the evidence support the claim / is this source primary / does this page carry usable text) to a TypeSafe Jev (System One) decision model when a key is configured, falling back to the skill's deterministic rules when it is not.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek-harness",
|