dsh-doublecheck 0.9.30 → 0.9.31
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 +7 -0
- package/README.en.md +577 -0
- package/README.es.md +577 -0
- package/README.hi.md +577 -0
- package/README.md +343 -267
- package/README.pt.md +577 -0
- package/lib/domain/report.d.ts +6 -0
- package/lib/domain/report.js +1 -1
- package/lib/events.d.ts +2 -0
- package/lib/grill/index.js +84 -26
- package/lib/guard/command.js +1 -0
- package/package.json +1 -1
- package/README-es.md +0 -496
- package/README-hi.md +0 -496
- package/README-pt.md +0 -496
- package/README-zh.md +0 -496
package/README.md
CHANGED
|
@@ -1,133 +1,183 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-doublecheck-hero-zh-dark.webp">
|
|
5
|
+
<img src="docs/assets/dsh-doublecheck-hero-zh-light.webp" width="100%" alt="dsh-doublecheck 配图:左侧是插件名与「先证后交」;右侧是一次 /gate run 定下的交付报告——需求拷问 6/6 通过,测试证据因覆盖率 61% 低于 80% 下限亮红灯,实现一致性只有一条 minor 警告、不翻转裁决,最终裁决为 rework(1 个红灯)">
|
|
6
|
+
</picture>
|
|
7
|
+
|
|
3
8
|
# dsh-doublecheck
|
|
4
|
-
- **1024 store channel**: `npm i -g dsh1024` once, then `dsh1024 plugin --profile web add dsh-doublecheck` (counts toward the [deepseek1024.com](https://deepseek1024.com) install ranking).
|
|
5
|
-
[](https://gitee.com/perrylink/dsh-doublecheck)
|
|
6
|
-
[](https://dshfind.com/plugins/PerryLink/dsh-doublecheck?ref=badge)
|
|
7
|
-
[](https://api.securityscorecards.dev/projects/github.com/PerryLink/dsh-doublecheck)
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
**把交付从「自称完成」变成有证据的裁决:需求先拷问,测试先红后绿,交接之前由四阶段门禁给出可交付 / 返工。**
|
|
11
|
+
|
|
12
|
+
DeepSeek Harness 的交付质量门禁:两个插件行盯住同一份可重放的会话日志,把 grill → design → red → green → review → verify 的纪律闭环变成命令、工具,和一条会被写进报告的裁决。
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
[安装](#三步上手) · [配置](#配置) · [FAQ](#faq) · [简体中文](README.md) · [English](README.en.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
12
15
|
|
|
13
|
-
[](https://github.com/PerryLink/dsh-doublecheck/actions)
|
|
19
|
-
[](https://github.com/PerryLink/dsh-doublecheck/releases)
|
|
20
|
-
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
21
|
-
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
16
|
+
[](LICENSE)
|
|
17
|
+
[](#兼容性)
|
|
18
|
+
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
19
|
+
[](https://github.com/PerryLink/dsh-doublecheck/actions/workflows/ci.yml)
|
|
20
|
+
[](#兼容性)
|
|
22
21
|
|
|
23
|
-
[
|
|
22
|
+
[](https://github.com/PerryLink/dsh-doublecheck/stargazers)
|
|
23
|
+
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
24
|
+
[](https://dshfind.com/plugins/PerryLink/dsh-doublecheck?ref=badge)
|
|
25
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-doublecheck)
|
|
26
|
+
[](https://dsh.market/)
|
|
27
|
+
[](https://gitee.com/perrylink/dsh-doublecheck)
|
|
24
28
|
|
|
25
29
|
```sh
|
|
26
30
|
dsh plugin --profile <name> add dsh-doublecheck
|
|
27
31
|
```
|
|
28
32
|
|
|
29
|
-
|
|
30
33
|
</div>
|
|
31
34
|
|
|
32
|
-
|
|
35
|
+
<sub>社区插件,与 DeepSeek 官方无关。唯一仓库:<https://github.com/PerryLink/dsh-doublecheck>(Gitee 为镜像)。</sub>
|
|
36
|
+
|
|
37
|
+
## 它是什么
|
|
33
38
|
|
|
34
|
-
|
|
39
|
+
`dsh-doublecheck` 装进来的不是一段提示词,而是两个插件行:`doublecheck-grill` 把需求拷问清楚并落成 spec,`doublecheck-guard` 在改动、测试与交接的每个边界上把关。两者读的是同一份持久会话日志——恢复、分叉、重启之后,它们看到的证据完全一样。
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
## Install & uninstall
|
|
41
|
+
一次 `/gate run` 会把会话里已经发生的事实折叠成四阶段清单:需求是否逐项被确认、最近一次测试是红还是绿、每处改动是否服务于某个 spec 维度、评审结论是什么,然后给出**可交付 / 需要返工**的裁决,并写成一份可直接贴进 PR 描述的报告。
|
|
38
42
|
|
|
39
|
-
|
|
40
|
-
- **npm channel** (published releases): `dsh plugin --profile web add dsh-doublecheck`.
|
|
41
|
-
- **tarball channel**: `pnpm pack` in this repo, then `dsh plugin --profile web add ./dsh-doublecheck-<version>.tgz`.
|
|
42
|
-
- **uninstall**: `dsh plugin --profile web remove dsh-doublecheck` (or remove the rows from the profile patch).
|
|
43
|
+
它不替你写代码,也不判断代码好不好看;它只做一件事——让「做完了」这句话必须带上证据。
|
|
43
44
|
|
|
44
|
-
|
|
45
|
+
<picture>
|
|
46
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-doublecheck-flow-v5-dark.svg">
|
|
47
|
+
<img src="docs/assets/dsh-doublecheck-flow-v5-light.svg" width="100%" alt="dsh-doublecheck 结构图:左侧持久会话日志(tool/call、tool/result、user/message、autoReview/verdict、dsh-eval report,以及 doublecheck/state、doublecheck/gate)经总线进入四阶段清单——需求拷问与测试证据是 0 模型调用的确定性折叠,实现一致性与评审结论各起一个分叉评审者;只有失败的检查汇入右侧裁决轨,警告与跳过永不翻转裁决;底部是 gate-report.md / gate-report.json、CI 退出码与 120 字符以内的单行投影">
|
|
48
|
+
</picture>
|
|
45
49
|
|
|
46
|
-
##
|
|
50
|
+
## 三步上手
|
|
47
51
|
|
|
48
|
-
|
|
52
|
+
1. **安装**(三选一):
|
|
49
53
|
|
|
50
|
-
|
|
54
|
+
```sh
|
|
55
|
+
# git 渠道(最新 main):prepare 脚本只用生产依赖构建
|
|
56
|
+
dsh plugin --profile web add github:PerryLink/dsh-doublecheck
|
|
57
|
+
# npm 渠道(已发布版本)
|
|
58
|
+
dsh plugin --profile web add dsh-doublecheck
|
|
59
|
+
# tarball 渠道:本仓库 pnpm pack 后
|
|
60
|
+
dsh plugin --profile web add ./dsh-doublecheck-<version>.tgz
|
|
61
|
+
```
|
|
51
62
|
|
|
63
|
+
两个行(`doublecheck-grill` 与 `doublecheck-guard`)随 profile 自动激活。
|
|
52
64
|
|
|
53
|
-
|
|
65
|
+
2. **最小配置**:开箱即用,bundle patch 已经插入这两行;要覆盖时才需要重述整行 config(见「配置」)。等价的 profile patch 形态:
|
|
54
66
|
|
|
55
|
-
|
|
67
|
+
```yaml
|
|
68
|
+
- insert:
|
|
69
|
+
- id: doublecheck-grill
|
|
70
|
+
name: 'dsh-doublecheck/grill'
|
|
71
|
+
- id: doublecheck-guard
|
|
72
|
+
name: 'dsh-doublecheck/guard'
|
|
73
|
+
```
|
|
56
74
|
|
|
57
|
-
|
|
75
|
+
3. **验证已生效**:
|
|
58
76
|
|
|
59
|
-
|
|
77
|
+
```sh
|
|
78
|
+
dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
|
|
79
|
+
```
|
|
60
80
|
|
|
61
|
-
|
|
81
|
+
```text
|
|
82
|
+
> /doublecheck status
|
|
83
|
+
> /gate status
|
|
84
|
+
```
|
|
62
85
|
|
|
86
|
+
**卸载**:`dsh plugin --profile web remove dsh-doublecheck`(或从 profile patch 删掉那两行)。
|
|
63
87
|
|
|
88
|
+
> 想要零配置的严格模式——每个门禁都以 `block` 强度开启、并且要求覆盖率证据——把随包附带的覆盖层叠在 bundle patch 之上:`dsh --profile web --patch ./node_modules/dsh-doublecheck/strict.patch.yml`。
|
|
64
89
|
|
|
65
|
-
##
|
|
90
|
+
## 核心能力
|
|
66
91
|
|
|
67
|
-
|
|
92
|
+
`dsh-doublecheck` 的每一道关卡都从会话日志里取证据,而不是听一句「我测过了」:
|
|
93
|
+
|
|
94
|
+
- **需求熔炉(`doublecheck-grill`)** —— 内置的 `grill-requirements` 技能,加上面向模型的 `doublecheck_skills`、`doublecheck_spec`、`doublecheck_report` 三个工具,以及按维度执行的验证工作流。共识没达成,就不动实现。
|
|
95
|
+
- **纪律守卫(`doublecheck-guard`)** —— grill 门禁、红/绿证据门禁、对抗式评审、`/doublecheck` 与 `/gate` 命令、实时的 `gate` 设置卡片,以及四阶段交付门禁。强度分 `remind` / `warn` / `block` 三档。
|
|
96
|
+
- **证据来自日志,不来自自述** —— 每条注入的提醒、评审与门禁通知都走标准通道落进会话日志;持久事实走 `doublecheck/state`、`doublecheck/gate` 事件或工具结果。重放即状态,恢复或分叉后重跑 `/gate run` 得到同一结果。
|
|
97
|
+
- **一项不过就亮红灯** —— 缺 spec、最近一次测试不是绿的、覆盖率低于门槛、有改动没映射到 spec 维度、评审给出 blocker/major 发现,都会变成一条带返工建议的红灯;警告与跳过永远不翻转裁决。
|
|
98
|
+
- **审计安全** —— 门禁与交付报告只写计数、id 与裁决,不含文件内容或会话文本;模型产出的发现文本在存储或显示之前先过密钥脱敏。
|
|
99
|
+
|
|
100
|
+
闭环是一条线:grill → design → red → green → review → verify。每一步都留下可重放的证据,而六个需求维度、共识门禁与结构化 spec 会同时落到会话与工作区。
|
|
101
|
+
|
|
102
|
+
纪律闭环的六个阶段:
|
|
103
|
+
|
|
104
|
+
| 阶段 | 含义 |
|
|
68
105
|
|---|---|
|
|
69
|
-
|
|
|
70
|
-
|
|
|
71
|
-
|
|
|
72
|
-
|
|
|
106
|
+
| **grill** | 拷问六个需求维度;在达成共识之前拒绝实现。 |
|
|
107
|
+
| **design** | 通过 `doublecheck_spec` 提交已经确定的 spec。 |
|
|
108
|
+
| **red** | 在实现改动之前,用一次失败的测试运行证明差距。 |
|
|
109
|
+
| **green** | 改动之后一次通过的测试运行闭合闭环。 |
|
|
110
|
+
| **review** | 一个分叉的对抗式批评者对照 spec 审计交付。 |
|
|
111
|
+
| **verify** | `doublecheck_report` 加上按维度的验证工作流证明交付。 |
|
|
73
112
|
|
|
74
|
-
##
|
|
113
|
+
## 工具与界面
|
|
75
114
|
|
|
76
|
-
|
|
115
|
+
| 界面 | 类型 | 说明 |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `doublecheck_skills` | 工具 | 通过技能注册表接口列出并加载包内的四个内置技能。 |
|
|
118
|
+
| `doublecheck_spec` | 工具 | 把拷问得出的六维 spec 提交到会话日志,并在工作区留一份 markdown。 |
|
|
119
|
+
| `doublecheck_report` | 工具 | 把纪律证据折叠成交付报告(可选按维度验证工作流)。 |
|
|
120
|
+
| `/doublecheck status\|report\|on\|off` | 命令 | 开关、模块、强度、阶段事实、折叠报告,以及持久的开关覆盖。 |
|
|
121
|
+
| `/gate status\|run\|config` | 命令 | 实时清单进度、已定的可交付/返工报告,以及生效配置。 |
|
|
122
|
+
| `grill-requirements`、`red-green-tdd`、`delivery-review`、`delivery-proof` | 技能 | 覆盖全部六个闭环阶段的内置纪律技能。 |
|
|
123
|
+
| `gate` | 活动配置字段 | 可插拔清单是守卫行唯一的 `.volatile()` 字段:从该行的设置卡片编辑(命名空间 = 该行的 profile 条目 id),加载时读取一次。 |
|
|
124
|
+
| `strict.patch.yml` | 覆盖层 | 一个补丁层里以 `block` 强度打开每道门禁,并要求覆盖率。 |
|
|
125
|
+
| `dsh-doublecheck/invariant` | 伴生行 | 通过宿主的 `invariants` 注册表报告本包自有写路径的矛盾。 |
|
|
126
|
+
| `doublecheck` | 会话投影 | 客户端渲染的一行有界状态:阶段、最近裁决、红灯数、编辑数与 spec/评审标记。见[如何读状态行](#如何读状态行)。 |
|
|
77
127
|
|
|
78
|
-
|
|
79
|
-
2. **`doublecheck-guard`** — the discipline guard: the grill gate, the red/green evidence gates, the adversary review, the `/doublecheck` and `/gate` commands, the live `gate` settings card, and the four-phase delivery gate.
|
|
128
|
+
### 如何读状态行
|
|
80
129
|
|
|
81
|
-
|
|
130
|
+
`doublecheck` 会话投影是一个**字符串**,而且刻意只有一行——这样任何客户端都能完整显示它、不会切掉内容。聊天桥的 `/status`、状态栏或任何自定义消费者都原样渲染:
|
|
82
131
|
|
|
83
132
|
```text
|
|
84
|
-
|
|
85
|
-
│
|
|
86
|
-
└─ six requirement dimensions, consensus gate,
|
|
87
|
-
structured spec committed to the session + workspace
|
|
133
|
+
gate:rework r2 | stage:green | test:green edits:12 spec:yes review:yes | goal:ship parser fix
|
|
88
134
|
```
|
|
89
135
|
|
|
90
|
-
|
|
|
136
|
+
| 片段 | 读法 |
|
|
91
137
|
|---|---|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
|
|
|
96
|
-
|
|
|
97
|
-
|
|
|
138
|
+
| `gate:<裁决> r<n>` | 最近一次交付门禁的裁决——未运行时是 `none`,否则是 `deliverable` 或 `rework`——以及它的红灯数 `r<n>`。 |
|
|
139
|
+
| `stage:<阶段>` | 依据持久证据到达的纪律阶段:`grill`、`design`、`red`、`green`、`review`、`verify`。 |
|
|
140
|
+
| `test:<颜色>` | 最近一次测试运行的颜色:`none`、`red`、`green`。 |
|
|
141
|
+
| `edits:<n>` | 从会话日志折叠出的实现编辑数(写测试文件不计入)。 |
|
|
142
|
+
| `spec:yes` / `spec:no` | 日志中是否存在已提交的 `doublecheck_spec`。 |
|
|
143
|
+
| `review:yes` / `review:no` | 是否存在对抗式评审记录。 |
|
|
144
|
+
| `goal:<摘录>` | 已提交 spec 的目标,会被裁剪。仅当 `spec:yes` 时出现。 |
|
|
98
145
|
|
|
99
|
-
|
|
146
|
+
这一行的长度**由构造保证有界**,因此不会被任何渲染器截断:
|
|
100
147
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
148
|
+
- 硬预算:**120 个字符**。凡是原样保留 120 字符以内取值的渲染器——微信桥的通用投影渲染器就是其中之一——都会完整显示这一行。旧的「对象」形态**空态就有 131 个字符**,这正是裁决与红灯数过去总被切掉的原因。
|
|
149
|
+
- 前三段是**无损的**。红灯数超过 `9999`、编辑数超过 `99999` 时打印为 `9999+` / `99999+`,而不会无限增长;非有限值或负数打印为 `0`。
|
|
150
|
+
- `goal:` 是唯一有损的一段。它会被压成单行(换行与控制字符变空格,`|` 变 `/`),并裁剪到剩余预算,最多 40 个字符,被裁剪时以 `…` 结尾。完整目标见 `/doublecheck status` 与交付报告。
|
|
151
|
+
- 这是一眼速览,不是记录本身:`/gate status` 与 `/doublecheck status` 渲染完整状态。
|
|
104
152
|
|
|
105
|
-
|
|
106
|
-
# 1. install the bundle into your profile
|
|
107
|
-
dsh plugin --profile web add github:PerryLink/dsh-doublecheck
|
|
153
|
+
该投影的 `stateVersion` 为 **3**。递增它会丢弃旧版本写入的持久化投影缓存行,并以该键从会话日志重新折叠,因此升级后的会话会重算这一行,而不是显示过期值。折叠状态本身没有变化,升级前的会话也不会因此加载失败。
|
|
108
154
|
|
|
109
|
-
|
|
110
|
-
dsh plugin --profile web add dsh-doublecheck
|
|
155
|
+
## 门禁阶段
|
|
111
156
|
|
|
112
|
-
|
|
113
|
-
dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
|
|
114
|
-
```
|
|
157
|
+
交付门禁把会话的持久证据聚合成一份可配置的四阶段清单,并确定一个**可交付 / 需要返工**的裁决。每个阶段只折叠会话日志(重放即状态),因此一次运行在恢复或分叉之后会得到相同的结果。
|
|
115
158
|
|
|
116
|
-
|
|
159
|
+
| 阶段 | 检查 | 证据来源 | 模型成本 |
|
|
160
|
+
|---|---|---|---|
|
|
161
|
+
| 需求询问 | 逐项确认的关键问题清单(默认六个 spec 维度问题) | 已提交的 `doublecheck_spec` + `ask_user_question` 调用 | 无 |
|
|
162
|
+
| 测试证据 | 最近运行的颜色、绿色之后的失败运行、可选覆盖率阈值、可选 dsh-eval 报告 | 会话日志里的 shell 测试运行(`[exit code: N]`、覆盖率百分比);开启 `gate.tests.evalReports.enabled` 时的 dsh-eval 报告文件 | 无 |
|
|
163
|
+
| 实现一致性 | 差异 ↔ 需求映射:每次改动都必须服务于某个 spec 维度 | 本地分叉评审者(结构化发现、只读工具) | 一个 subagent |
|
|
164
|
+
| 评审结论 | 交付裁决;`engine: auto` 在存在时消费 dsh-auto-review 的持久裁决记录,否则用本地评审者 | `autoReview/verdict` / `autoReview/rejection` 事件,或本地分叉评审者 | 一个 subagent(本地) |
|
|
117
165
|
|
|
118
|
-
|
|
166
|
+
红灯就是失败的检查项(缺 spec、最近一次运行失败、覆盖率低于下限、有改动未映射、blocker/major 级发现),每一项都附带返工建议。警告与跳过永远不会翻转裁决。门禁把 [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) 作为弱依赖集成:`review.engine: auto` 在存在时折叠它的裁决记录,否则降级到本地评审者;`gate.tests.evalReports.enabled` 把它的评测引擎(dsh-eval)写出的报告(prompt 回归 / 压测 / 公平性套件)并进测试证据,并在报告不存在时如实跳过。门禁从不合成审批请求。
|
|
119
167
|
|
|
120
|
-
|
|
168
|
+
## 示例
|
|
121
169
|
|
|
122
|
-
|
|
170
|
+
以下都是插件真实存在的入口;装好之后直接调用其中一个即可。
|
|
123
171
|
|
|
124
|
-
|
|
172
|
+
### 详细示例
|
|
173
|
+
|
|
174
|
+
**命令**
|
|
125
175
|
|
|
126
176
|
~~~sh
|
|
127
177
|
/gate run
|
|
128
178
|
~~~
|
|
129
179
|
|
|
130
|
-
|
|
180
|
+
**输出**
|
|
131
181
|
|
|
132
182
|
~~~text
|
|
133
183
|
# Delivery gate report
|
|
@@ -138,15 +188,15 @@ These are the plugin's real entry points; install once, then call one.
|
|
|
138
188
|
|
|
139
189
|
*Observed from `README.md §Example report (lines 243-251)`*
|
|
140
190
|
|
|
141
|
-
|
|
191
|
+
### 失败分支
|
|
142
192
|
|
|
143
|
-
|
|
193
|
+
**输入**
|
|
144
194
|
|
|
145
195
|
~~~text
|
|
146
196
|
/doublecheck maybe
|
|
147
197
|
~~~
|
|
148
198
|
|
|
149
|
-
|
|
199
|
+
**输出**
|
|
150
200
|
|
|
151
201
|
~~~text
|
|
152
202
|
Unknown /doublecheck argument "maybe". Usage: /doublecheck status|report|on|off
|
|
@@ -154,126 +204,14 @@ Unknown /doublecheck argument "maybe". Usage: /doublecheck status|report|on|off
|
|
|
154
204
|
|
|
155
205
|
*Observed from `plugins/dsh-doublecheck/src/guard/prose.ts:191-192; plugins/dsh-doublecheck/src/guard/command.ts:156; plugins/dsh-doublecheck/tests/command.spec.ts:201-208`*
|
|
156
206
|
|
|
157
|
-
|
|
207
|
+
### 简短示例
|
|
158
208
|
|
|
159
209
|
- `doublecheck_skills`
|
|
160
210
|
- `doublecheck_spec`
|
|
161
211
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
All tunables are Schemastery `Config` fields (changeable from cordis.yml). An id-targeted override replaces the whole row — restate every key you need. `cordis.patch.yml` documents each key inline; Schema defaults are the single source of tuning defaults.
|
|
165
|
-
|
|
166
|
-
| Key | Default | Meaning |
|
|
167
|
-
|---|---|---|
|
|
168
|
-
| `specFile` | `'doublecheck-spec.md'` | Workspace file for the committed spec markdown (grill row). |
|
|
169
|
-
| `reportFile` | `'doublecheck-report.md'` | Workspace file for the delivery report (grill row). |
|
|
170
|
-
| `reportVerify` | `true` | Run the verification workflow by default (grill row). |
|
|
171
|
-
| `verifyProvider` | `'fork'` | Subagent provider for the per-dimension checkers (grill row). |
|
|
172
|
-
| `verifyMode` | `'all'` | `all` = one parallel checker per dimension; `single` = one combined checker (grill row). |
|
|
173
|
-
| `intensity` | `'remind'` | Enforcement strength of the grill, red/green, and review gates (`remind` / `warn` / `block`). |
|
|
174
|
-
| `enableByDefault` | `true` | Master switch for sessions without a `/doublecheck on\|off` record. |
|
|
175
|
-
| `language` | `'en'` | Injected reminder/deny/review/gate prose language (`en` / `zh`). |
|
|
176
|
-
| `guardTools` | `['edit', 'write']` | Mutation tool names both gates watch. |
|
|
177
|
-
| `vagueTaskMaxChars` | `200` | Longer tasks are never treated as vague. |
|
|
178
|
-
| `remindOnce` | `true` | Inject each reminder at most once per session (durable across restarts). |
|
|
179
|
-
| `testToolNames` | `['bash', 'pwsh']` | Shell tool names that can run tests. |
|
|
180
|
-
| `testCommandPatterns` | *(pnpm/npm/yarn/bun test, pytest, go/cargo/make test, node --test, deno test, uv run pytest)* | Regexes a command must match to count as a test run. |
|
|
181
|
-
| `testFilePatterns` | *(test dirs, `*.test.*` / `*.spec.*`)* | Regexes identifying test files — always editable, exempt from the red gate. |
|
|
182
|
-
| `modules.grill` | `true` | Off disables the grill gate. |
|
|
183
|
-
| `modules.tdd` | `true` | On enables the red/green evidence gates. |
|
|
184
|
-
| `modules.adversary` | `false` | On enables the forked critic review at green. |
|
|
185
|
-
| `adversaryModel` | `null` | Critic model route; `null` = main model self-reviews. |
|
|
186
|
-
| `adversaryProvider` | `'fork'` | Subagent provider the critic runs on. |
|
|
187
|
-
| `adversaryMaxFindings` | `5` | Findings cap (1–20) injected into the session. |
|
|
188
|
-
| `adversaryTools` | `['read', 'glob', 'grep']` | Critic tool allowlist; keep it read-only. |
|
|
189
|
-
| `adversaryTimeoutMs` | `120000` | Hard time budget for one critic run. |
|
|
190
|
-
| `gate.enabled` | `true` | Master switch for the gate panel and the turn-boundary red notice. |
|
|
191
|
-
| `gate.planSuggestion` | `true` | Append the plan-mode re-check suggestion to red reports. |
|
|
192
|
-
| `gate.reportFile` | `'gate-report.md'` | Workspace file for the gate report. |
|
|
193
|
-
| `gate.requirements.checklist` | *(six spec-dimension questions)* | Pluggable key-question checklist: `{ id, question, specDimension, required }`. |
|
|
194
|
-
| `gate.requirements.minConfirmed` | `6` | Minimum required questions that must pass (1..required count). |
|
|
195
|
-
| `gate.requirements.interrogateTool` | `'ask_user_question'` | Tool name whose calls count as interrogation evidence. |
|
|
196
|
-
| `gate.tests.requirePassingRun` | `true` | A non-passing (or missing) latest test run is a red light. |
|
|
197
|
-
| `gate.tests.allowFailingRuns` | `0` | Failing runs after the latest green allowed before red. |
|
|
198
|
-
| `gate.tests.requireCoverage` | `false` | On requires coverage evidence in the test output. |
|
|
199
|
-
| `gate.tests.minCoveragePct` | `80` | Minimum coverage percentage (0–100). |
|
|
200
|
-
| `gate.tests.evalReports.enabled` | `false` | On folds the dsh-eval report (dsh-auto-review's eval engine) into the test evidence. |
|
|
201
|
-
| `gate.tests.evalReports.dir` | `'.eval-reports'` | Workspace-relative directory holding the engine's report. |
|
|
202
|
-
| `gate.tests.evalReports.file` | `'report.json'` | Report file name inside the directory. |
|
|
203
|
-
| `gate.tests.evalReports.required` | `false` | A missing report is a red light exactly when true (a skip otherwise). |
|
|
204
|
-
| `gate.consistency.*` | `provider: 'fork'`, `model: null`, `tools: ['read','glob','grep']`, `timeoutMs: 120000`, `maxFindings: 5` | The local consistency reviewer's knobs (`model: null` = main model). |
|
|
205
|
-
| `gate.review.engine` | `'auto'` | `auto` = dsh-auto-review verdict records when present, else the local reviewer; `local` = always local. |
|
|
206
|
-
| `gate.review.provider` | `'fork'` | The local review reviewer's provider (its `model`/`tools`/`timeoutMs`/`maxFindings` match `gate.consistency.*`). |
|
|
207
|
-
|
|
208
|
-
Every `gate.*` key above is one **live field**: the guard row marks the whole
|
|
209
|
-
`gate` block `.volatile()`, so it is the row's editable settings card (the form
|
|
210
|
-
namespace is the row's profile entry id). The remaining keys are ordinary
|
|
211
|
-
composition config from the profile patch. The block is read once at load, so an
|
|
212
|
-
edit takes effect on the next load — `gate.enabled` decides whether the
|
|
213
|
-
turn-boundary red notice is installed at all. On a host line whose schemastery
|
|
214
|
-
predates `.volatile()` the row still mounts: the card is absent and the block
|
|
215
|
-
comes from the profile patch exactly as before.
|
|
216
|
-
|
|
217
|
-
Misconfiguration fails loud at load: invalid regexes, empty or duplicated name lists, out-of-range thresholds, and duplicate checklist ids throw instead of silently doing nothing. `strict.patch.yml` is the all-gates-block overlay that restates the guard row at `intensity: block` with every module on and the coverage requirement enabled.
|
|
218
|
-
|
|
219
|
-
## Tools & surfaces
|
|
220
|
-
|
|
221
|
-
| Surface | Kind | Notes |
|
|
222
|
-
|---|---|---|
|
|
223
|
-
| `doublecheck_skills` | tool | Lists and loads the package's four bundled skills through the skill registry seam. |
|
|
224
|
-
| `doublecheck_spec` | tool | Commits the grilled six-dimension spec to the session log and a workspace markdown copy. |
|
|
225
|
-
| `doublecheck_report` | tool | Folds the discipline evidence into a delivery report (optional per-dimension verification workflow). |
|
|
226
|
-
| `/doublecheck status\|report\|on\|off` | command | Switch, modules, intensity, stage facts, folded report, and the durable on/off override. |
|
|
227
|
-
| `/gate status\|run\|config` | command | Live checklist progress, the settled deliverable/rework report, and the effective config. |
|
|
228
|
-
| `grill-requirements`, `red-green-tdd`, `delivery-review`, `delivery-proof` | skill | Bundled discipline skills covering all six loop stages. |
|
|
229
|
-
| `gate` | live config field | The pluggable checklist is the guard row's one `.volatile()` field: it is edited from the row's settings card (namespace = the row's profile entry id) and read once at load. |
|
|
230
|
-
| `strict.patch.yml` | overlay | Every gate on at `block` intensity plus the coverage requirement, in one patch layer. |
|
|
231
|
-
| `dsh-doublecheck/invariant` | companion row | Reports package-owned write-path contradictions through the host `invariants` registry. |
|
|
232
|
-
| `doublecheck` | session projection | One bounded status line a client renders: stage, latest gate verdict, red-light count, edits, spec/review flags. See [Reading the status line](#reading-the-status-line). |
|
|
233
|
-
|
|
234
|
-
### Reading the status line
|
|
235
|
-
|
|
236
|
-
The `doublecheck` session projection is a plain **string**, and it is deliberately one line — the whole point is that a client can show it without cutting anything off. A chat bridge's `/status`, a status bar, or any custom consumer renders it as it is:
|
|
237
|
-
|
|
238
|
-
```text
|
|
239
|
-
gate:rework r2 | stage:green | test:green edits:12 spec:yes review:yes | goal:ship parser fix
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
| Segment | Reads as |
|
|
243
|
-
|---|---|
|
|
244
|
-
| `gate:<verdict> r<n>` | The latest delivery-gate verdict — `none` before any run, `deliverable`, or `rework` — and its red-light count `r<n>`. |
|
|
245
|
-
| `stage:<stage>` | The discipline stage reached on durable evidence: `grill`, `design`, `red`, `green`, `review`, `verify`. |
|
|
246
|
-
| `test:<color>` | The latest test-run color: `none`, `red`, `green`. |
|
|
247
|
-
| `edits:<n>` | Implementation edits folded from the session log (test-file writes are not counted). |
|
|
248
|
-
| `spec:yes` / `spec:no` | Whether a committed `doublecheck_spec` exists. |
|
|
249
|
-
| `review:yes` / `review:no` | Whether an adversary review record exists. |
|
|
250
|
-
| `goal:<excerpt>` | The committed spec goal, clipped. Present only when `spec:yes`. |
|
|
251
|
-
|
|
252
|
-
The line is bounded **by construction**, so no renderer truncates it:
|
|
253
|
-
|
|
254
|
-
- Hard budget: **120 characters**. A renderer that keeps values up to 120 characters — the WeChat bridge's generic projection renderer is one — shows the entire line. The old object-shaped payload was 131 characters when *empty*, which is why the verdict and the red count used to be cut off.
|
|
255
|
-
- The first three segments are **lossless**. Counts above `9999` red lights or `99999` edits print as `9999+` / `99999+` instead of growing without bound; a non-finite or negative count prints as `0`.
|
|
256
|
-
- `goal:` is the one lossy segment. It is flattened to a single line (newlines and control characters become spaces, `|` becomes `/`) and clipped to the budget that is left, at most 40 characters, ending in `…` when it was clipped. The complete goal is in `/doublecheck status` and the delivery report.
|
|
257
|
-
- This is a glance, not the record: `/gate status` and `/doublecheck status` render the full state.
|
|
258
|
-
|
|
259
|
-
The projection's `stateVersion` is **3**. Bumping it discards a persisted projection-cache row written by an older version and refolds the key from the session log, so an upgraded session recomputes the line instead of showing a stale one. The persisted fold state itself is unchanged, and a pre-upgrade session never fails to load.
|
|
260
|
-
|
|
261
|
-
## Gate phases
|
|
212
|
+
### 示例报告
|
|
262
213
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
| Phase | Checks | Evidence source | Model cost |
|
|
266
|
-
|---|---|---|---|
|
|
267
|
-
| Requirements interrogation | Key-question checklist confirmed item by item (six spec-dimension questions by default) | Committed `doublecheck_spec` + `ask_user_question` calls | none |
|
|
268
|
-
| Test evidence | Latest run color, failing runs after green, optional coverage threshold, optional dsh-eval report | Shell test runs in the session log (`[exit code: N]`, coverage percentages); the dsh-eval report file when `gate.tests.evalReports.enabled` | none |
|
|
269
|
-
| Implementation consistency | Diff ↔ requirement mapping: every edit must serve a spec dimension | Local forked reviewer (structured findings, read-only tools) | one subagent |
|
|
270
|
-
| Review conclusion | The delivery verdict; `engine: auto` consumes dsh-auto-review's durable verdict records when present, else the local reviewer | `autoReview/verdict` / `autoReview/rejection` events, or the local forked reviewer | one subagent (local) |
|
|
271
|
-
|
|
272
|
-
Red lights are failed checks (a missing spec, a failing latest run, coverage below minimum, an unmapped edit, blocker/major findings) — each carries a rework suggestion. Warnings and skips never flip the decision. The gate integrates [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) as a weak dependency: `review.engine: auto` folds its verdict records when present and degrades to the local reviewer otherwise; `gate.tests.evalReports.enabled` folds its eval engine's dsh-eval report (prompt-regression / stress / fairness suites) into the test evidence and skips honestly when no report exists. The gate never synthesizes approval requests.
|
|
273
|
-
|
|
274
|
-
## Example report
|
|
275
|
-
|
|
276
|
-
`/gate run` returns this markdown — paste it into a PR description:
|
|
214
|
+
`/gate run` 返回这样一份 markdown——可以直接贴进 PR 描述:
|
|
277
215
|
|
|
278
216
|
````markdown
|
|
279
217
|
# Delivery gate report
|
|
@@ -310,109 +248,243 @@ Red lights are failed checks (a missing spec, a failing latest run, coverage bel
|
|
|
310
248
|
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
|
|
311
249
|
````
|
|
312
250
|
|
|
313
|
-
|
|
251
|
+
### CI 输出
|
|
314
252
|
|
|
315
|
-
`/gate run`
|
|
253
|
+
`/gate run` 还会写一个 `gate-report.json`(同一份已定状态的无损 JSON,就在 `gate-report.md` 旁边)。`doublecheck-gate` 命令行工具把这个文件转成 GitHub Actions 可用的机器可读输出:
|
|
316
254
|
|
|
317
255
|
```sh
|
|
318
|
-
# JSON
|
|
256
|
+
# JSON(PR 评论 / 状态载荷)
|
|
319
257
|
doublecheck-gate --format json --input gate-report.json
|
|
320
|
-
# SARIF 2.1.0
|
|
258
|
+
# SARIF 2.1.0(code-scanning 上传 / 状态检查)
|
|
321
259
|
doublecheck-gate --format sarif < gate-report.json
|
|
322
260
|
```
|
|
323
261
|
|
|
324
|
-
|
|
262
|
+
这个工具只序列化已经定下来的 `GateState`——它从不重跑四阶段门禁或证据折叠。退出码映射裁决:`0` = 可交付,`1` = 返工,`2` = 用法/解析错误。
|
|
325
263
|
|
|
326
|
-
##
|
|
264
|
+
## 配置
|
|
327
265
|
|
|
328
|
-
|
|
329
|
-
- **Writes**: `doublecheck-spec.md`, `doublecheck-report.md`, `gate-report.md`, and `gate-report.json` in the session workspace (paths configurable) through the `ctx.fs` seam; the durable `doublecheck/state` and `doublecheck/gate` session events.
|
|
330
|
-
- **Model calls**: the gate's consistency and local-review phases (one subagent each per `/gate run`), the optional adversary review, and the `doublecheck_report` verification workflow start subagent runs; nothing else calls a model or the network.
|
|
331
|
-
- **Never touched**: credentials, environment variables, or any file outside the session workspace. The workshop manifest declares `filesystem:read` and `filesystem:write` only. Gate reports carry counts, ids, and verdicts only; recognized secrets in reviewer texts are redacted before storage or display.
|
|
266
|
+
所有可调项都是 Schemastery 的 `Config` 字段(可在 cordis.yml 中修改)。按 id 定位的覆盖会替换整行——你需要的每一个键都要重新声明。`cordis.patch.yml` 逐键内联说明;Schema 默认值是调优默认值的唯一来源。
|
|
332
267
|
|
|
333
|
-
|
|
268
|
+
最常用的几个键:
|
|
334
269
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
270
|
+
| 键 | 默认值 | 含义 |
|
|
271
|
+
|---|---|---|
|
|
272
|
+
| `specFile` | `'doublecheck-spec.md'` | 已提交 spec 的 markdown 文件名(grill 行)。 |
|
|
273
|
+
| `reportFile` | `'doublecheck-report.md'` | 交付报告的工作区文件名(grill 行)。 |
|
|
274
|
+
| `intensity` | `'remind'` | grill、红/绿与评审门禁的执行强度(`remind` / `warn` / `block`)。 |
|
|
275
|
+
| `enableByDefault` | `true` | 没有 `/doublecheck on\|off` 记录的会话的主开关。 |
|
|
276
|
+
| `language` | `'en'` | 注入的提醒/拒绝/评审/门禁文案语言(`en` / `zh`)。 |
|
|
277
|
+
| `modules.adversary` | `false` | 打开后在绿色之后启动分叉批评者评审。 |
|
|
278
|
+
| `gate.enabled` | `true` | 门禁面板与回合边界红灯提示的主开关。 |
|
|
279
|
+
| `gate.review.engine` | `'auto'` | `auto` = 存在 dsh-auto-review 裁决记录时用它,否则用本地评审者;`local` = 始终用本地评审者。 |
|
|
340
280
|
|
|
341
|
-
|
|
281
|
+
<details>
|
|
282
|
+
<summary>完整配置表(39 个键)</summary>
|
|
342
283
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
284
|
+
| 键 | 默认值 | 含义 |
|
|
285
|
+
|---|---|---|
|
|
286
|
+
| `specFile` | `'doublecheck-spec.md'` | 已提交 spec 的 markdown 文件名(grill 行)。 |
|
|
287
|
+
| `reportFile` | `'doublecheck-report.md'` | 交付报告的工作区文件名(grill 行)。 |
|
|
288
|
+
| `reportVerify` | `true` | 默认运行验证工作流(grill 行)。 |
|
|
289
|
+
| `verifyProvider` | `'fork'` | 各维度检查器运行的 subagent 提供者(grill 行)。 |
|
|
290
|
+
| `verifyMode` | `'all'` | `all` = 每个维度一个并行检查器;`single` = 一个合并检查器(grill 行)。 |
|
|
291
|
+
| `intensity` | `'remind'` | grill、红/绿与评审门禁的执行强度(`remind` / `warn` / `block`)。 |
|
|
292
|
+
| `enableByDefault` | `true` | 没有 `/doublecheck on\|off` 记录的会话的主开关。 |
|
|
293
|
+
| `language` | `'en'` | 注入的提醒/拒绝/评审/门禁文案语言(`en` / `zh`)。 |
|
|
294
|
+
| `guardTools` | `['edit', 'write']` | 两个门禁监视的修改工具名。 |
|
|
295
|
+
| `vagueTaskMaxChars` | `200` | 超过此长度的任务绝不会被视为模糊。 |
|
|
296
|
+
| `remindOnce` | `true` | 每条提醒每会话最多注入一次(跨重启持久)。 |
|
|
297
|
+
| `testToolNames` | `['bash', 'pwsh']` | 可以运行测试的 shell 工具名。 |
|
|
298
|
+
| `testCommandPatterns` | *(pnpm / npm / yarn / bun test、pytest、go / cargo / make test、node --test、deno test、uv run pytest)* | 命令必须匹配才计为一次测试运行的正则。 |
|
|
299
|
+
| `testFilePatterns` | *(测试目录、`*.test.*` / `*.spec.*`)* | 识别测试文件的正则——始终可编辑,不受红门禁拦截。 |
|
|
300
|
+
| `modules.grill` | `true` | 关闭则禁用 grill 门禁。 |
|
|
301
|
+
| `modules.tdd` | `true` | 打开则启用红/绿证据门禁。 |
|
|
302
|
+
| `modules.adversary` | `false` | 打开后在绿色之后启用分叉批评者评审。 |
|
|
303
|
+
| `adversaryModel` | `null` | 批评者模型路由;`null` = 主模型自评。 |
|
|
304
|
+
| `adversaryProvider` | `'fork'` | 批评者运行的 subagent 提供者。 |
|
|
305
|
+
| `adversaryMaxFindings` | `5` | 注入会话的发现上限(1–20)。 |
|
|
306
|
+
| `adversaryTools` | `['read', 'glob', 'grep']` | 批评者工具允许列表;请保持只读。 |
|
|
307
|
+
| `adversaryTimeoutMs` | `120000` | 一次批评者运行的时间上限。 |
|
|
308
|
+
| `gate.enabled` | `true` | 门禁面板与回合边界红灯提示的主开关。 |
|
|
309
|
+
| `gate.planSuggestion` | `true` | 在红灯报告末尾附加计划模式复查建议。 |
|
|
310
|
+
| `gate.reportFile` | `'gate-report.md'` | 门禁报告的工作区文件名。 |
|
|
311
|
+
| `gate.requirements.checklist` | *(六个 spec 维度问题)* | 可插拔的关键问题清单:`{ id, question, specDimension, required }`。 |
|
|
312
|
+
| `gate.requirements.minConfirmed` | `6` | 必须通过的最少必答问题数(1..必答数量)。 |
|
|
313
|
+
| `gate.requirements.interrogateTool` | `'ask_user_question'` | 其调用计为询问证据的工具名。 |
|
|
314
|
+
| `gate.tests.requirePassingRun` | `true` | 最近一次测试运行未通过(或缺失)即为红灯。 |
|
|
315
|
+
| `gate.tests.allowFailingRuns` | `0` | 最近一次绿色之后允许的失败运行次数,超过即为红灯。 |
|
|
316
|
+
| `gate.tests.requireCoverage` | `false` | 打开则要求测试输出里有覆盖率证据。 |
|
|
317
|
+
| `gate.tests.minCoveragePct` | `80` | 最低覆盖率百分比(0–100)。 |
|
|
318
|
+
| `gate.tests.evalReports.enabled` | `false` | 打开则把 dsh-eval 报告(dsh-auto-review 的评测引擎)并进测试证据。 |
|
|
319
|
+
| `gate.tests.evalReports.dir` | `'.eval-reports'` | 存放引擎报告的工作区相对目录。 |
|
|
320
|
+
| `gate.tests.evalReports.file` | `'report.json'` | 目录内的报告文件名。 |
|
|
321
|
+
| `gate.tests.evalReports.required` | `false` | 为 true 时缺失报告即为红灯(否则跳过)。 |
|
|
322
|
+
| `gate.consistency.*` | `provider: 'fork'`、`model: null`、`tools: ['read','glob','grep']`、`timeoutMs: 120000`、`maxFindings: 5` | 本地一致性评审者的旋钮(`model: null` = 主模型)。 |
|
|
323
|
+
| `gate.review.engine` | `'auto'` | `auto` = 存在时使用 dsh-auto-review 的裁决记录,否则使用本地评审者;`local` = 始终使用本地评审者。 |
|
|
324
|
+
| `gate.review.provider` | `'fork'` | 本地评审评审者的提供者(其 `model`/`tools`/`timeoutMs`/`maxFindings` 与 `gate.consistency.*` 相同)。 |
|
|
352
325
|
|
|
353
|
-
|
|
326
|
+
</details>
|
|
354
327
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
328
|
+
上面每个 `gate.*` 键都属于同一个**活动字段**:守卫行把整个 `gate` 块标记为 `.volatile()`,因此它就是该行的可编辑设置卡片(表单命名空间即该行的 profile 条目 id)。其余键是来自 profile patch 的普通 composition 配置。该块在加载时读取一次,所以编辑在下次加载时生效——`gate.enabled` 决定回合边界的红灯提示是否安装。若宿主的 schemastery 早于 `.volatile()`,本行照旧挂载:没有卡片,该块仍取自 profile patch。
|
|
329
|
+
|
|
330
|
+
配置错误会在加载时大声失败:无效的正则、空或重复的名称列表、越界阈值、重复的清单 id 都会抛错,而不是悄无声息地什么都不做。`strict.patch.yml` 是全门禁阻断覆盖层,以 `intensity: block` 重新声明守卫行,打开所有模块并要求覆盖率。
|
|
331
|
+
|
|
332
|
+
profile patch 覆盖示例:
|
|
333
|
+
|
|
334
|
+
```yaml
|
|
335
|
+
- insert:
|
|
336
|
+
- id: doublecheck-guard
|
|
337
|
+
name: 'dsh-doublecheck/guard'
|
|
338
|
+
config:
|
|
339
|
+
language: zh
|
|
340
|
+
intensity: block
|
|
341
|
+
modules:
|
|
342
|
+
tdd: true
|
|
343
|
+
adversary: true
|
|
344
|
+
gate:
|
|
345
|
+
tests:
|
|
346
|
+
requireCoverage: true
|
|
365
347
|
```
|
|
366
348
|
|
|
367
|
-
##
|
|
349
|
+
## FAQ
|
|
350
|
+
|
|
351
|
+
<details>
|
|
352
|
+
<summary>数据存在哪?报告里会不会带出我的文件内容?</summary>
|
|
353
|
+
|
|
354
|
+
持久事实只有两个会话事件:`doublecheck/state`(持久开关)与 `doublecheck/gate`(已定的门禁状态);工作区里另有 `doublecheck-spec.md`、`doublecheck-report.md`、`gate-report.md`、`gate-report.json` 四个文件(路径可配置)。门禁与交付报告只记录计数、id 与裁决——**不含文件内容或会话文本**,模型产出的发现文本在存储或显示之前会先过密钥脱敏。仓库外的东西一概不碰。
|
|
355
|
+
|
|
356
|
+
</details>
|
|
357
|
+
|
|
358
|
+
<details>
|
|
359
|
+
<summary>宿主不支持持久写入时会怎样?会静默失效吗?</summary>
|
|
360
|
+
|
|
361
|
+
不会静默。`/doublecheck on|off` 与 `/gate run` 的持久记录依赖宿主的 `ignorable` 追加面;在没有这个面的宿主上,写入被跳过、开关退回进程内状态(见「已知限制」)。守卫行的设置卡片依赖 settings 服务:宿主没有 `.volatile()` 时不出现卡片,但本行照旧挂载,`gate` 块仍取自 profile patch。评审者或批评者接口跑不起来时,结论会如实写成「unavailable」/跳过,而不是伪造一个裁决。
|
|
362
|
+
|
|
363
|
+
</details>
|
|
364
|
+
|
|
365
|
+
<details>
|
|
366
|
+
<summary>会和其他插件抢命令名、事件或 slot 吗?</summary>
|
|
367
|
+
|
|
368
|
+
不会。所有工具都带命名空间,不提供任何服务键,不注册客户端 slot,也不注册 `webServer` 前缀;共享事件监听器一律经 `next()` 委托,绝不短路链条。逐条论证见「与其他 DSH 插件的互操作性」。
|
|
369
|
+
|
|
370
|
+
</details>
|
|
371
|
+
|
|
372
|
+
<details>
|
|
373
|
+
<summary>一次 `/gate run` 要花多少模型调用?</summary>
|
|
374
|
+
|
|
375
|
+
需求询问与测试证据两个阶段是纯折叠,不调用模型;实现一致性与评审结论各启动一个分叉 subagent(`gate.review.engine: auto` 且本会话有 dsh-auto-review 裁决记录时,评审结论阶段可以零成本直接采信)。可选的对抗式评审再花一个。除此之外不调用模型、不联网。
|
|
376
|
+
|
|
377
|
+
</details>
|
|
378
|
+
|
|
379
|
+
## 安全边界
|
|
380
|
+
|
|
381
|
+
- **模型可见 ⟺ 已记录。** 每条注入的提醒、评审与门禁通知都走标准通道并落进会话日志;持久的 spec/state/gate 事实走工具结果或 `SessionEventMap` 成员。
|
|
382
|
+
- **失败关闭 / 大声失败。** 守卫与门禁配置在 `apply` 中校验(断言抛错);跑不起来的评审者或对抗式接口会退化为诚实的「不可用」/跳过通知,而不是伪造裁决。
|
|
383
|
+
- **审计安全报告。** 门禁与交付报告只记录计数、id 与裁决——不含文件内容或会话文本——模型生成的发现文本在存储或显示之前会经过密钥脱敏器。
|
|
384
|
+
- **自身无网络。** 这个插件不发起直接网络请求;批评者与评审者 subagent 经由宿主的 subagent 接口运行。
|
|
385
|
+
- **对 dsh-auto-review 的弱依赖。** 它从不被 import,也从不被硬性要求;门禁折叠它的持久裁决记录并降级到本地评审者,且从不合成审批请求。
|
|
386
|
+
|
|
387
|
+
## 权限与数据
|
|
388
|
+
|
|
389
|
+
- **读取**:只在进程内读取会话日志(`tool/call` / `tool/result` / `tool/ptc-dispatch`、注入的 `user/message` 来源,以及外部的 `autoReview/*` 裁决记录);可选的计划模式服务状态。V3 改名之前的宿主用旧标签 `tool/code-dispatch` 记录 PTC 子调用,两个标签折叠结果完全一致。注入的提示携带本包自有的 `dsh-doublecheck` 消息来源 kind;该 kind 出现之前记录的日志会以 `plugin:dsh-doublecheck`(宿主 V3→V4 迁移对已发布的 catch-all 包装所做的改写)或已发布的 `plugin` 包装抵达,三种形态折叠结果一致。
|
|
390
|
+
- **写入**:会话工作区里的 `doublecheck-spec.md`、`doublecheck-report.md`、`gate-report.md`、`gate-report.json`(路径可配置),通过 `ctx.fs` 接口;以及持久的 `doublecheck/state`、`doublecheck/gate` 会话事件。
|
|
391
|
+
- **模型调用**:门禁的一致性阶段与本地评审阶段(每次 `/gate run` 各一个 subagent)、可选的对抗式评审,以及 `doublecheck_report` 的验证工作流会启动 subagent 运行;除此之外不调用模型,也不联网。
|
|
392
|
+
- **绝不触碰**:凭据、环境变量,或会话工作区之外的任何文件。workshop 清单只声明 `filesystem:read` 与 `filesystem:write`。门禁报告只带计数、id 与裁决;评审文本中被识别出的密钥在存储或显示之前会被脱敏。
|
|
393
|
+
|
|
394
|
+
## 已知限制
|
|
395
|
+
|
|
396
|
+
- **持久写入。** `/doublecheck on\|off` → `doublecheck/state` 与 `/gate run` → `doublecheck/gate` 依赖宿主的 `ignorable` 追加面(rc.6 之后至 `0.1.1-rc.2`)。在无此面的宿主上(rc.6/rc.8,以及移除该信封的 `0.1.2-alpha.1`——`0.1.2-rc.1` 仅恢复存量日志读取兼容字段、仍无法盖章),写入被跳过,开关保持进程内状态。
|
|
397
|
+
0.1.2-rc.1(2026-09-02 已适配):会话信封保留 ignorable 字段但仅用于存量日志读取兼容——Session.append 仍无法盖章,门控行为不变。
|
|
398
|
+
0.1.5-alpha.1(2026-09-09 已适配):会话格式 V3 把持久子调用事件 `tool/code-dispatch` 改名为 `tool/ptc-dispatch`(载荷不变;两个标签折叠结果一致)。Session.append 仍无 `ignorable` 写入通道,写入继续跳过、开关保持进程内——行为不变。(该条引入的 `doublecheck-gate` 设置命名空间已在 0.1.7-alpha.1 随宿主删除命名空间注册表一并移除。)
|
|
399
|
+
0.1.5-rc.1(2026-09-10 已适配):依赖钉号移至已发布的 0.1.5-rc.1 线;无接口变更影响本插件行为。
|
|
400
|
+
0.1.5-rc.2(2026-09-11 已适配):依赖钉号移至已发布的 0.1.5-rc.2 线;无接口变更影响本插件行为。
|
|
401
|
+
0.1.7-alpha.1(2026-09-22 已适配):宿主删除了共享的 catch-all `plugin` 消息来源 kind(提示改携本包自有的 `dsh-doublecheck` kind,`remindOnce` 折叠仍能读取持久日志可能持有的两种升级前形态),并用 `SettingsForms` 取代了设置命名空间注册表(`doublecheck-gate` 命名空间消失;门禁清单改为守卫行唯一的 `.volatile()` 字段,仍在加载时读取一次)。`@deepseek-ai/cordis` 与 `@deepseek-ai/schemastery` 的 dev/test 钉号移至 `^4.0.3` / `^3.18.3`,即 `Volatile` 与 `.volatile()` 首次出现的版本;peer 区间仍为 `^4.0.2` / `^3.18.2`,且活动字段能力在加载时探测,因此更早的宿主线仍能挂载本行(只是没有设置卡片)。除设置存储位置外无行为变更。
|
|
402
|
+
- **可选接口。** 挂载设置服务时会出现守卫行自己的设置卡片;该卡片就是本行自己的 Config(命名空间 = 其 profile 条目 id),`gate` 块在加载时读取一次,因此其取值在下一次加载时作用于 `/gate` 面板与红灯提示。活动字段能力在加载时探测:若宿主的 schemastery 早于 `.volatile()`,本行照旧挂载——没有卡片,`gate` 块仍取自 profile patch。`/gate status` 的计划模式行读取可选的 `ctx.planMode`(没有则显示 `unknown`);对抗式评审需要 `ctx.subagents`;验证需要 `workflowEngine`。
|
|
403
|
+
- **本地降级。** 当 dsh-auto-review 缺失或本会话没有裁决记录时,`gate.review.engine: auto` 会降级到本地评审者——报告会写明原因,而不是捏造裁决。
|
|
404
|
+
- **dsh-eval 证据基于文件。** dsh-auto-review 的评测引擎(`dsh-eval`)把 prompt 回归 / 压测 / 公平性结果写入工作区报告文件,而不是会话日志。`gate.tests.evalReports.enabled` 折叠该文件(默认关闭;缺失时跳过),折叠出的计数随持久 `doublecheck/gate` 记录保存,使已定的运行仍可重放。
|
|
368
405
|
|
|
369
|
-
|
|
406
|
+
## 与其他 DSH 插件的互操作性
|
|
370
407
|
|
|
371
|
-
|
|
408
|
+
已对照 **DSH `0.2.0-rc.2`**(本 README 面向的运行时)与 2026-10-05 实测的高星插件集验证。
|
|
372
409
|
|
|
373
|
-
|
|
374
|
-
- **No service-key collision.** It provides no service key at all, so it cannot collide on one.
|
|
375
|
-
- **No slot collision.** It registers no client slot key, so it cannot contend for a `shadows-shipped-ui` seat.
|
|
376
|
-
- **No HTTP route collision.** It registers no `webServer` prefix.
|
|
377
|
-
- **No patch-layer collision.** The bundle patch only `insert`s its own row; it never overrides a built-in row's `config`.
|
|
378
|
-
- **No global mutation.** It does not patch prototypes, rewrite `process.env`, or replace the global fetch dispatcher.
|
|
410
|
+
本插件**不干扰**其他插件,包括广泛安装的高星插件:
|
|
379
411
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
412
|
+
- **无工具名冲突。** 所有工具都带命名空间,不占用任何已被内置工具或其他插件持有的裸名。
|
|
413
|
+
- **无服务键冲突。** 不提供任何服务键,因此不存在服务键冲突。
|
|
414
|
+
- **无 slot 冲突。** 不注册客户端 slot key,因此不参与 `shadows-shipped-ui` 座位争抢。
|
|
415
|
+
- **无 HTTP 路由冲突。** 不注册任何 `webServer` 前缀。
|
|
416
|
+
- **无 patch 层冲突。** 组合包 patch 只 `insert` 自己那一行,从不覆写内置行的 `config`。
|
|
417
|
+
- **无全局改写。** 不改原型、不改写 `process.env`、不替换全局 fetch dispatcher。
|
|
383
418
|
|
|
384
|
-
|
|
419
|
+
**共享事件监听器在构造上就不互相干扰。** 它用 `ctx.on()` 监听顺序敏感事件 `agent/turn-stopping`、`tools/post-execute`、`tools/pre-execute` —— Cordis 的**广播**语义:每个监听器都会运行,任何一个都无法饿死其他监听器。**此处每个监听器都通过 `next()` 委托**,因此链条绝不会被短路;改写作用在 `next()` 产出的值上,而不是用它顶替返回:
|
|
385
420
|
|
|
386
|
-
|
|
421
|
+
- `tools/post-execute` — also used by `cc-safety-net` (1576★).
|
|
422
|
+
- `tools/pre-execute` — also used by `cc-safety-net` (1576★).
|
|
387
423
|
|
|
388
|
-
|
|
424
|
+
静态证据:`dsh-plugin-doctor` 的 K10–K13 在本仓全部为 `pass`。
|
|
389
425
|
|
|
390
|
-
##
|
|
426
|
+
## 兼容性
|
|
391
427
|
|
|
392
|
-
|
|
428
|
+
| 方面 | 状态 |
|
|
429
|
+
|---|---|
|
|
430
|
+
| Harness | DeepSeek Harness `dsh-v0.2.2-rc.1`(2026-11-05 已适配):`engines.dsh` 增加 `>=0.2.2-0 <0.3.0`,此前每一条线仍被接受;门禁与投影路径由 rc.1 测试套件覆盖。 |
|
|
431
|
+
| Node | `^22.19.0 \|\| >=24.9.0` |
|
|
432
|
+
| 平台 | 全部(纯宿主;无原生代码,自身不发起网络请求) |
|
|
433
|
+
| 模型 | 任意(守卫本身从不调用模型;批评者与评审者阶段作为宿主 subagent 运行) |
|
|
434
|
+
|
|
435
|
+
## 生态与质量
|
|
393
436
|
|
|
394
|
-
|
|
437
|
+
- [Gitee 镜像](https://gitee.com/perrylink/dsh-doublecheck)(同步镜像,以 GitHub 为准)
|
|
438
|
+
- [dshfind 插件页](https://dshfind.com/plugins/PerryLink/dsh-doublecheck)(安装量与排名)
|
|
439
|
+
- [OpenSSF Scorecard 报告](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-doublecheck)(由 [.github/workflows/scorecard.yml](.github/workflows/scorecard.yml) 驱动)
|
|
440
|
+
- [dsh-plugin-doctor 验证报告](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)(K10–K13 全 `pass`)
|
|
441
|
+
- [DSH Market](https://dsh.market/)(已上架)
|
|
442
|
+
- **1024 商店渠道**:先 `npm i -g dsh1024`,再 `dsh1024 plugin --profile web add dsh-doublecheck`(计入 [deepseek1024.com](https://deepseek1024.com) 安装排行)
|
|
443
|
+
- [生态实测知识库](https://perrylink.github.io/dsh-plugin-guide/):插件开发指南 · 选型实测数据 · 维护取舍判据
|
|
395
444
|
|
|
396
|
-
|
|
445
|
+
## 开发
|
|
446
|
+
|
|
447
|
+
```sh
|
|
448
|
+
pnpm install # node ^22.19 || >=24
|
|
449
|
+
pnpm run build # tsc --noEmitOnError(lib/ 是被提交的产物)
|
|
450
|
+
pnpm run prepare # tsc --noEmitOnError(git 安装渠道)
|
|
451
|
+
pnpm run prepublishOnly # build + 全量测试
|
|
452
|
+
pnpm run typecheck # tsc --noEmit + 测试 tsconfig
|
|
453
|
+
pnpm run lint # eslint src tests
|
|
454
|
+
pnpm test # vitest run
|
|
455
|
+
pnpm run test:coverage # vitest run --coverage
|
|
456
|
+
pnpm run pack:check # build + 打包 tarball
|
|
457
|
+
pnpm run check:readmes # 五语 README 一致性门禁
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
`lib/` 是刻意提交的:git 安装渠道无需构建即可解析本包,源码改动后请重新 `pnpm run build` 并一并提交。README 的配图由 [`scripts/gen-readme-assets.py`](scripts/gen-readme-assets.py) 程序化生成:hero 横幅用 Pillow 画成中/英 × 深/浅四版 WebP,结构图用手写 SVG 画成 flow-v5 深/浅两版;脚本可重复执行、幂等覆盖。旧的单版流程图与演示图保留在 `docs/assets/` 供外链使用,README 只引用新的 hero 与 flow-v5。
|
|
461
|
+
|
|
462
|
+
Topics:`dsh`, `dsh-plugin`, `deepseek-harness`, `engineering-discipline`, `requirements`, `guard`, `skill`, `quality-gate`, `delivery-gate`
|
|
463
|
+
|
|
464
|
+
## 家族与致谢
|
|
465
|
+
|
|
466
|
+
本项目是 [PerryLink](https://github.com/PerryLink) 维护的 DeepSeek Harness 插件家族成员(全部 Apache-2.0)。如果它帮到了你,**给个 star**——它不解锁任何功能,但会让下一个人更容易找到它。
|
|
467
|
+
|
|
468
|
+
- [@PerryLink](https://github.com/PerryLink) —— 创建者与维护者:grill → design → red → green → review → verify 纪律闭环、四阶段交付门禁、五语文档,以及 CI/发布流水线。
|
|
397
469
|
|
|
398
470
|
<details>
|
|
399
|
-
<summary
|
|
471
|
+
<summary>展开全部插件</summary>
|
|
400
472
|
|
|
401
|
-
|
|
|
473
|
+
| 插件 | 状态 |
|
|
402
474
|
|---|---|
|
|
403
475
|
| **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
|
|
404
476
|
| **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
|
|
405
477
|
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
|
|
406
|
-
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊
|
|
478
|
+
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊 已冻结 — 见仓库 README |
|
|
407
479
|
| **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
|
|
408
480
|
| **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
|
|
409
|
-
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊
|
|
481
|
+
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊 已冻结 — 见仓库 README |
|
|
410
482
|
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
|
|
411
483
|
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
|
|
412
484
|
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
|
|
413
485
|
| **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
|
|
414
486
|
| **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
|
|
415
|
-
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** |
|
|
487
|
+
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 🧊 已冻结 — 见仓库 README |
|
|
416
488
|
| **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
|
|
417
489
|
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
|
|
418
490
|
| **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
|
|
@@ -445,7 +517,7 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
445
517
|
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
|
|
446
518
|
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
|
|
447
519
|
| **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
|
|
448
|
-
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** |
|
|
520
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | 🧊 已冻结 — 见仓库 README |
|
|
449
521
|
| **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
|
|
450
522
|
| **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
|
|
451
523
|
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
|
|
@@ -457,10 +529,10 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
457
529
|
| **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
|
|
458
530
|
| **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
|
|
459
531
|
| **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
|
|
460
|
-
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** |
|
|
532
|
+
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | 🚫 已退役(仓库已归档) |
|
|
461
533
|
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
|
|
462
|
-
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** |
|
|
463
|
-
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** |
|
|
534
|
+
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | 🚫 已退役(仓库已归档) |
|
|
535
|
+
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | 🚫 已退役(仓库已归档) |
|
|
464
536
|
| **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
|
|
465
537
|
| **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
|
|
466
538
|
| **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
|
|
@@ -472,7 +544,7 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
472
544
|
| **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
|
|
473
545
|
| **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
|
|
474
546
|
| **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
|
|
475
|
-
| **[dsh-score](https://github.com/PerryLink/dsh-score)** |
|
|
547
|
+
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | 🧊 已冻结 — 见仓库 README |
|
|
476
548
|
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
|
|
477
549
|
| **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
|
|
478
550
|
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
|
|
@@ -484,20 +556,24 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
484
556
|
| **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
|
|
485
557
|
| **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
|
|
486
558
|
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
|
|
487
|
-
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** |
|
|
559
|
+
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | 🚫 已退役(仓库已归档) |
|
|
488
560
|
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
|
|
489
561
|
| **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
|
|
490
|
-
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊
|
|
491
|
-
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊
|
|
492
|
-
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊
|
|
493
|
-
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊
|
|
494
|
-
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊
|
|
495
|
-
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫
|
|
496
|
-
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫
|
|
497
|
-
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫
|
|
562
|
+
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 已冻结 — 见仓库 README |
|
|
563
|
+
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 已冻结 — 见仓库 README |
|
|
564
|
+
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 已冻结 — 见仓库 README |
|
|
565
|
+
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 已冻结 — 见仓库 README |
|
|
566
|
+
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 已冻结 — 见仓库 README |
|
|
567
|
+
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 已退役(仓库已归档) |
|
|
568
|
+
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 已退役(仓库已归档) |
|
|
569
|
+
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 已退役(仓库已归档) |
|
|
498
570
|
|
|
499
571
|
</details>
|
|
500
572
|
|
|
501
573
|
## License
|
|
502
574
|
|
|
503
575
|
[Apache License 2.0](LICENSE) © 2026 dsh-doublecheck contributors
|
|
576
|
+
|
|
577
|
+
<p align="center"><sub>Apache-2.0 · 社区插件,与 DeepSeek 无关。</sub></p>
|
|
578
|
+
|
|
579
|
+
<p align="center"><sub>工具链:<a href="https://github.com/PerryLink/dsh-plugin-guide">dsh-plugin-guide</a> · <a href="https://github.com/PerryLink/dsh-standards">dsh-standards</a> · <a href="https://github.com/PerryLink/dsh-plugin-start">dsh-plugin-start</a></sub></p>
|