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.pt.md
ADDED
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-doublecheck-hero-en-dark.webp">
|
|
5
|
+
<img src="docs/assets/dsh-doublecheck-hero-en-light.webp" width="100%" alt="dsh-doublecheck: o nome e o título Prove it first à esquerda; à direita, o relatório que um /gate run fixa — os requisitos passam 6/6, os testes estão em vermelho porque a cobertura é de 61% contra um mínimo de 80%, a consistência tem apenas um aviso menor que não muda o veredito, e o veredito final é rework com um item em vermelho">
|
|
6
|
+
</picture>
|
|
7
|
+
|
|
8
|
+
# dsh-doublecheck
|
|
9
|
+
|
|
10
|
+
**Transforma «já está pronto» em um veredicto com provas: interrogue os requisitos primeiro, prove o teste em vermelho e depois em verde, e deixe um portão de quatro fases decidir entregável ou retrabalho antes da entrega.**
|
|
11
|
+
|
|
12
|
+
O portão de qualidade de entrega para o DeepSeek Harness: duas linhas de plugin vigiam o mesmo registro de sessão reproduzível e transformam o ciclo de disciplina grill → design → red → green → review → verify em comandos, ferramentas e um veredicto que fica registrado em um relatório.
|
|
13
|
+
|
|
14
|
+
[Instalar](#instalação-em-três-passos) · [Configuração](#configuração) · [FAQ](#faq) · [简体中文](README.md) · [English](README.en.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
15
|
+
|
|
16
|
+
[](LICENSE)
|
|
17
|
+
[](#compatibilidade)
|
|
18
|
+
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
19
|
+
[](https://github.com/PerryLink/dsh-doublecheck/actions/workflows/ci.yml)
|
|
20
|
+
[](#compatibilidade)
|
|
21
|
+
|
|
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)
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
dsh plugin --profile <name> add dsh-doublecheck
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<sub>Plugin da comunidade, sem afiliação com a DeepSeek. Repositório canônico: <https://github.com/PerryLink/dsh-doublecheck> (o Gitee é um espelho).</sub>
|
|
36
|
+
|
|
37
|
+
## O que é
|
|
38
|
+
|
|
39
|
+
O `dsh-doublecheck` não instala um prompt: instala duas linhas de plugin. O `doublecheck-grill` interroga os requisitos e os registra como spec; o `doublecheck-guard` guarda cada limite de edição, de teste e de entrega. Os dois leem o mesmo registro de sessão durável, então depois de retomar, bifurcar ou reiniciar eles veem exatamente as mesmas provas.
|
|
40
|
+
|
|
41
|
+
Um `/gate run` dobra o que já aconteceu na sessão em uma lista de quatro fases — se os requisitos foram confirmados um a um, se a última execução de testes está em vermelho ou verde, se cada edição serve a uma dimensão do spec, o que a revisão conclui — e fixa um veredicto **entregável / requer retrabalho**, escrito como um relatório que você cola na descrição de um PR.
|
|
42
|
+
|
|
43
|
+
Ele não escreve o seu código nem julga a aparência dele. Faz uma coisa só: faz a frase «já está pronto» carregar provas.
|
|
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="Estrutura do dsh-doublecheck: à esquerda o registro de sessão durável — tool/call, tool/result, user/message, autoReview/verdict, dsh-eval report e doublecheck/state, doublecheck/gate — alimenta quatro linhas de fase: requisitos e testes são dobrados de forma determinística sem chamada ao modelo, consistência e revisão iniciam cada uma um revisor somente leitura; só uma verificação falha cruza para a via do veredito, avisos e omissões nunca o mudam, e o rodapé leva gate-report.md, gate-report.json, o código de saída da CI e a projeção de uma linha limitada">
|
|
48
|
+
</picture>
|
|
49
|
+
|
|
50
|
+
## Instalação em três passos
|
|
51
|
+
|
|
52
|
+
1. **Instalar** (escolha um canal):
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
# canal git (última main; o script prepare compila só com dependências de produção)
|
|
56
|
+
dsh plugin --profile web add github:PerryLink/dsh-doublecheck
|
|
57
|
+
# canal npm (versões publicadas)
|
|
58
|
+
dsh plugin --profile web add dsh-doublecheck
|
|
59
|
+
# canal tarball: pnpm pack neste repositório e depois
|
|
60
|
+
dsh plugin --profile web add ./dsh-doublecheck-<version>.tgz
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
As duas linhas (`doublecheck-grill` e `doublecheck-guard`) ativam com o perfil.
|
|
64
|
+
|
|
65
|
+
2. **Configuração mínima**: nenhuma é necessária — o patch do bundle já insere as duas linhas; uma sobreposição por id precisa reenunciar toda a config da linha (ver «Configuração»). A forma equivalente no patch do perfil:
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
- insert:
|
|
69
|
+
- id: doublecheck-grill
|
|
70
|
+
name: 'dsh-doublecheck/grill'
|
|
71
|
+
- id: doublecheck-guard
|
|
72
|
+
name: 'dsh-doublecheck/guard'
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
3. **Verificar que monta**:
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
> /doublecheck status
|
|
83
|
+
> /gate status
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Desinstalar**: `dsh plugin --profile web remove dsh-doublecheck` (ou remova as duas linhas do patch do perfil).
|
|
87
|
+
|
|
88
|
+
> Se quiser um modo estrito sem configuração — cada portão na intensidade `block` e com prova de cobertura obrigatória — aplique a camada incluída sobre o patch do bundle: `dsh --profile web --patch ./node_modules/dsh-doublecheck/strict.patch.yml`.
|
|
89
|
+
|
|
90
|
+
## Capacidades principais
|
|
91
|
+
|
|
92
|
+
Cada ponto de controle do `dsh-doublecheck` tira a prova do registro de sessão, não da frase «eu testei»:
|
|
93
|
+
|
|
94
|
+
- **Fornalha de requisitos (`doublecheck-grill`)** — a skill `grill-requirements`, as ferramentas `doublecheck_skills`, `doublecheck_spec` e `doublecheck_report` e o fluxo de verificação por dimensão. Sem consenso, a implementação não é tocada.
|
|
95
|
+
- **Guarda de disciplina (`doublecheck-guard`)** — o portão de grill, os portões de prova vermelho/verde, a revisão adversária, os comandos `/doublecheck` e `/gate`, o cartão de ajustes `gate` e o portão de entrega de quatro fases, na intensidade `remind` / `warn` / `block`.
|
|
96
|
+
- **A prova vem do registro, não de um autorrelato** — cada lembrete, revisão e aviso de portão injetado viaja pelos canais padrão até o registro de sessão; os fatos duráveis viajam por `doublecheck/state`, `doublecheck/gate` ou resultados de ferramentas. A reprodução é o estado, então uma sessão retomada ou bifurcada reobtém o mesmo `/gate run`.
|
|
97
|
+
- **Uma verificação falha, uma luz vermelha** — falta o spec, a última execução não está verde, a cobertura fica abaixo do limite, uma edição não se mapeia a nenhuma dimensão do spec ou aparece um achado blocker/major: tudo vira uma luz vermelha com sugestão de retrabalho; avisos e saltos nunca viram o veredicto.
|
|
98
|
+
- **Relatórios auditáveis** — os relatórios de portão e de entrega registram apenas contagens, ids e veredictos, sem conteúdo de arquivos nem texto de sessão; os textos de achados produzidos pelo modelo passam por um removedor de segredos antes de serem guardados ou exibidos.
|
|
99
|
+
|
|
100
|
+
O ciclo é uma linha só: grill → design → red → green → review → verify. Cada passo deixa prova reproduzível, enquanto as seis dimensões do requisito, o portão de consenso e o spec estruturado ficam na sessão e no espaço de trabalho.
|
|
101
|
+
|
|
102
|
+
As seis etapas do ciclo de disciplina:
|
|
103
|
+
|
|
104
|
+
| Etapa | Significado |
|
|
105
|
+
|---|---|
|
|
106
|
+
| **grill** | Interroga as seis dimensões do requisito; recusa implementar até o consenso. |
|
|
107
|
+
| **design** | O spec acordado é registrado por `doublecheck_spec`. |
|
|
108
|
+
| **red** | Uma execução de testes que falha prova a lacuna antes de tocar a implementação. |
|
|
109
|
+
| **green** | Uma execução de testes que passa depois das edições fecha o ciclo. |
|
|
110
|
+
| **review** | Um crítico adversário bifurcado audita a entrega contra o spec. |
|
|
111
|
+
| **verify** | `doublecheck_report` mais um fluxo de verificação por dimensão provam a entrega. |
|
|
112
|
+
|
|
113
|
+
## Ferramentas e superfícies
|
|
114
|
+
|
|
115
|
+
| Superfície | Tipo | Notas |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `doublecheck_skills` | ferramenta | Lista e carrega as quatro skills incluídas pelo seam de registro de skills. |
|
|
118
|
+
| `doublecheck_spec` | ferramenta | Registra o spec de seis dimensões no log de sessão e em uma cópia markdown do espaço de trabalho. |
|
|
119
|
+
| `doublecheck_report` | ferramenta | Dobra a prova de disciplina em um relatório de entrega (fluxo de verificação por dimensão opcional). |
|
|
120
|
+
| `/doublecheck status\|report\|on\|off` | comando | Interruptor, módulos, intensidade, fatos de etapa, relatório dobrado e a sobreposição durável de ligado/desligado. |
|
|
121
|
+
| `/gate status\|run\|config` | comando | Progresso ao vivo da lista, relatório já fixado de entregável/retrabalho e configuração efetiva. |
|
|
122
|
+
| `grill-requirements`, `red-green-tdd`, `delivery-review`, `delivery-proof` | skill | Skills de disciplina incluídas que cobrem as seis etapas do ciclo. |
|
|
123
|
+
| `gate` | campo de config vivo | A lista configurável é o único campo `.volatile()` da linha de guarda: é editada no cartão de ajustes da linha (namespace = id da entrada do perfil) e lida uma vez ao carregar. |
|
|
124
|
+
| `strict.patch.yml` | camada | Todos os portões na intensidade `block` mais o requisito de cobertura, em uma única camada de patch. |
|
|
125
|
+
| `dsh-doublecheck/invariant` | linha companheira | Relata contradições do caminho de escrita do pacote pelo registro `invariants` do host. |
|
|
126
|
+
| `doublecheck` | projeção de sessão | Uma linha de status limitada que um cliente renderiza: etapa, último veredicto do portão, luzes vermelhas, edições, marcas de spec/revisão. Ver [Como ler a linha de status](#como-ler-a-linha-de-status). |
|
|
127
|
+
|
|
128
|
+
### Como ler a linha de status
|
|
129
|
+
|
|
130
|
+
A projeção de sessão `doublecheck` é uma **string** e, de propósito, uma linha só — a ideia é que qualquer cliente possa mostrá-la sem cortar nada. O `/status` de uma ponte de chat, uma barra de status ou qualquer consumidor próprio renderiza exatamente como está:
|
|
131
|
+
|
|
132
|
+
```text
|
|
133
|
+
gate:rework r2 | stage:green | test:green edits:12 spec:yes review:yes | goal:ship parser fix
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
| Segmento | Lê-se como |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `gate:<veredicto> r<n>` | O último veredicto do portão de entrega — `none` antes de qualquer execução, senão `deliverable` ou `rework` — e a contagem de luzes vermelhas `r<n>`. |
|
|
139
|
+
| `stage:<etapa>` | A etapa de disciplina alcançada com base na prova durável: `grill`, `design`, `red`, `green`, `review`, `verify`. |
|
|
140
|
+
| `test:<cor>` | A cor da última execução de testes: `none`, `red`, `green`. |
|
|
141
|
+
| `edits:<n>` | Edições de implementação dobradas do log de sessão (escrever arquivos de teste não conta). |
|
|
142
|
+
| `spec:yes` / `spec:no` | Se existe um `doublecheck_spec` registrado. |
|
|
143
|
+
| `review:yes` / `review:no` | Se existe um registro de revisão adversária. |
|
|
144
|
+
| `goal:<trecho>` | O objetivo do spec registrado, cortado. Aparece só quando `spec:yes`. |
|
|
145
|
+
|
|
146
|
+
A linha é limitada **por construção**, então nenhum renderizador a trunca:
|
|
147
|
+
|
|
148
|
+
- Orçamento rígido: **120 caracteres**. Um renderizador que mantém valores de até 120 caracteres — o renderizador genérico de projeções da ponte do WeChat é um — mostra a linha inteira. A antiga forma de objeto ocupava 131 caracteres **vazia**, e por isso o veredicto e a contagem de vermelhos costumavam ser cortados.
|
|
149
|
+
- Os três primeiros segmentos são **sem perda**. Contagens acima de `9999` luzes vermelhas ou `99999` edições são impressas como `9999+` / `99999+` em vez de crescer sem limite; um valor não finito ou negativo imprime `0`.
|
|
150
|
+
- `goal:` é o único segmento com perda. Ele é achatado em uma linha (quebras e caracteres de controle viram espaços, `|` vira `/`) e cortado no orçamento restante, no máximo 40 caracteres, terminando em `…` quando cortado. O objetivo completo está em `/doublecheck status` e no relatório de entrega.
|
|
151
|
+
- Isto é um olhar rápido, não o registro: `/gate status` e `/doublecheck status` renderizam o estado completo.
|
|
152
|
+
|
|
153
|
+
O `stateVersion` da projeção é **3**. Incrementá-lo descarta a linha de cache persistida por uma versão anterior e dobra a chave de novo a partir do log de sessão, então uma sessão atualizada recalcula a linha em vez de mostrar uma obsoleta. O estado dobrado persistido não muda, e uma sessão anterior à atualização nunca falha ao carregar.
|
|
154
|
+
|
|
155
|
+
## Fases do portão
|
|
156
|
+
|
|
157
|
+
O portão de entrega agrega a prova durável da sessão em uma lista configurável de quatro fases e fixa uma decisão de **entregável / requer retrabalho**. Cada fase dobra só o log de sessão (a reprodução É o estado), então uma execução se rededuz igual depois de retomar ou bifurcar.
|
|
158
|
+
|
|
159
|
+
| Fase | Verifica | Fonte da prova | Custo de modelo |
|
|
160
|
+
|---|---|---|---|
|
|
161
|
+
| Interrogação de requisitos | Lista de perguntas-chave confirmada item por item (seis perguntas de dimensão de spec por padrão) | `doublecheck_spec` registrado + chamadas de `ask_user_question` | nenhum |
|
|
162
|
+
| Prova de testes | Cor da última execução, falhas depois do verde, limite de cobertura opcional, relatório dsh-eval opcional | Execuções de teste de shell no log de sessão (`[exit code: N]`, percentuais de cobertura); o arquivo de relatório dsh-eval quando `gate.tests.evalReports.enabled` | nenhum |
|
|
163
|
+
| Consistência da implementação | Mapa diff ↔ requisito: cada edição tem de servir a uma dimensão do spec | Revisor bifurcado local (achados estruturados, ferramentas somente leitura) | um subagent |
|
|
164
|
+
| Conclusão da revisão | O veredicto de entrega; `engine: auto` consome os registros de veredicto do dsh-auto-review quando existem, senão o revisor local | Eventos `autoReview/verdict` / `autoReview/rejection`, ou o revisor bifurcado local | um subagent (local) |
|
|
165
|
+
|
|
166
|
+
Luzes vermelhas são verificações que falharam (falta o spec, a última execução falha, cobertura abaixo do mínimo, uma edição sem mapeamento, achados blocker/major) — cada uma carrega uma sugestão de retrabalho. Avisos e saltos nunca viram a decisão. O portão integra o [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) como dependência fraca: `review.engine: auto` dobra os registros de veredicto dele quando existem e degrada para o revisor local caso contrário; `gate.tests.evalReports.enabled` dobra o relatório dsh-eval do motor de avaliação dele (suítes de regressão de prompt / estresse / justiça) na prova de testes e pula com honestidade quando não há relatório. O portão nunca sintetiza pedidos de aprovação.
|
|
167
|
+
|
|
168
|
+
## Exemplos
|
|
169
|
+
|
|
170
|
+
Estes são os pontos de entrada reais do plugin; instale uma vez e chame um.
|
|
171
|
+
|
|
172
|
+
### Exemplo detalhado
|
|
173
|
+
|
|
174
|
+
**Comando**
|
|
175
|
+
|
|
176
|
+
~~~sh
|
|
177
|
+
/gate run
|
|
178
|
+
~~~
|
|
179
|
+
|
|
180
|
+
**Saída**
|
|
181
|
+
|
|
182
|
+
~~~text
|
|
183
|
+
# Delivery gate report
|
|
184
|
+
|
|
185
|
+
> **Verdict: rework required** — 2 red item(s)
|
|
186
|
+
> The gate is red. Re-open the work in plan mode to re-check the open items before delivering.
|
|
187
|
+
~~~
|
|
188
|
+
|
|
189
|
+
*Observed from `README.md §Example report (lines 243-251)`*
|
|
190
|
+
|
|
191
|
+
### Ramo de falha
|
|
192
|
+
|
|
193
|
+
**Entrada**
|
|
194
|
+
|
|
195
|
+
~~~text
|
|
196
|
+
/doublecheck maybe
|
|
197
|
+
~~~
|
|
198
|
+
|
|
199
|
+
**Saída**
|
|
200
|
+
|
|
201
|
+
~~~text
|
|
202
|
+
Unknown /doublecheck argument "maybe". Usage: /doublecheck status|report|on|off
|
|
203
|
+
~~~
|
|
204
|
+
|
|
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`*
|
|
206
|
+
|
|
207
|
+
### Exemplos breves
|
|
208
|
+
|
|
209
|
+
- `doublecheck_skills`
|
|
210
|
+
- `doublecheck_spec`
|
|
211
|
+
|
|
212
|
+
### Relatório de exemplo
|
|
213
|
+
|
|
214
|
+
`/gate run` devolve este markdown — cole na descrição de um PR:
|
|
215
|
+
|
|
216
|
+
````markdown
|
|
217
|
+
# Delivery gate report
|
|
218
|
+
|
|
219
|
+
> **Verdict: rework required** — 2 red item(s)
|
|
220
|
+
> The gate is red. Re-open the work in plan mode to re-check the open items before delivering.
|
|
221
|
+
|
|
222
|
+
## 1. Requirements interrogation — PASS
|
|
223
|
+
- [✔] **What outcome must the delivery produce?** — spec dimension "goal" committed
|
|
224
|
+
- [✔] **What is in scope, and what is out of scope?** — spec dimension "scope" committed
|
|
225
|
+
- [✔] **Which observable checks prove the work is done?** — spec dimension "acceptanceCriteria" committed
|
|
226
|
+
- [✔] **What can go wrong, and what is the correct behavior in each case?** — spec dimension "failureModes" committed
|
|
227
|
+
- [✔] **What is traded when goals conflict; what is optional?** — spec dimension "priorities" committed
|
|
228
|
+
- [✔] **What does the user explicitly not want?** — spec dimension "nonGoals" committed
|
|
229
|
+
|
|
230
|
+
## 2. Test evidence — FAIL
|
|
231
|
+
- [✔] **passing test run** — latest test run passed
|
|
232
|
+
- [✔] **failing cases after green** — 0 failing run(s) after green (allowed: 0)
|
|
233
|
+
- [✖] **coverage evidence** — 61% coverage below the 80% minimum — rework: raise coverage above the configured minimum
|
|
234
|
+
|
|
235
|
+
## 3. Implementation consistency — WARN
|
|
236
|
+
- [⚠] **[minor] src/telemetry.ts touched without a requirement** — [minor] the edit adds a metric no spec dimension covers
|
|
237
|
+
|
|
238
|
+
## 4. Review conclusion — PASS
|
|
239
|
+
- [✔] **dsh-auto-review conclusion** — 3 call(s) approved by dsh-auto-review (latest risk: low)
|
|
240
|
+
|
|
241
|
+
## Red items
|
|
242
|
+
1. **tests/coverage** — 61% coverage below the 80% minimum — *rework: raise coverage above the configured minimum*
|
|
243
|
+
2. **consistency/finding-1** — [minor] the edit adds a metric no spec dimension covers — *rework: src/telemetry.ts touched without a requirement*
|
|
244
|
+
|
|
245
|
+
## Audit
|
|
246
|
+
- review engine: dsh-auto-review
|
|
247
|
+
- generated at: 2026-08-14T12:00:00.000Z
|
|
248
|
+
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
|
|
249
|
+
````
|
|
250
|
+
|
|
251
|
+
### Saída de CI
|
|
252
|
+
|
|
253
|
+
`/gate run` também escreve um `gate-report.json` (o mesmo estado fixado como JSON sem perda, ao lado de `gate-report.md`). A CLI `doublecheck-gate` transforma esse arquivo em saída legível por máquina para o GitHub Actions:
|
|
254
|
+
|
|
255
|
+
```sh
|
|
256
|
+
# JSON (comentário de PR / carga de status)
|
|
257
|
+
doublecheck-gate --format json --input gate-report.json
|
|
258
|
+
# SARIF 2.1.0 (envio para code-scanning / verificação de status)
|
|
259
|
+
doublecheck-gate --format sarif < gate-report.json
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
A CLI só serializa o `GateState` já fixado — ela nunca reexecuta o portão de quatro fases nem as dobras de prova. O código de saída mapeia o veredicto: `0` = entregável, `1` = retrabalho, `2` = erro de uso/análise.
|
|
263
|
+
|
|
264
|
+
## Configuração
|
|
265
|
+
|
|
266
|
+
Todos os ajustes são campos `Config` do Schemastery (modificáveis no cordis.yml). Uma sobreposição por id substitui a linha inteira — reenuncie cada chave de que você precisa. O `cordis.patch.yml` documenta cada chave em linha; os padrões do Schema são a única fonte dos ajustes.
|
|
267
|
+
|
|
268
|
+
Chaves mais usadas:
|
|
269
|
+
|
|
270
|
+
| Chave | Padrão | Significado |
|
|
271
|
+
|---|---|---|
|
|
272
|
+
| `specFile` | `'doublecheck-spec.md'` | Arquivo do espaço de trabalho para o spec markdown registrado (linha grill). |
|
|
273
|
+
| `reportFile` | `'doublecheck-report.md'` | Arquivo do espaço de trabalho para o relatório de entrega (linha grill). |
|
|
274
|
+
| `intensity` | `'remind'` | Força de aplicação dos portões de grill, vermelho/verde e revisão (`remind` / `warn` / `block`). |
|
|
275
|
+
| `enableByDefault` | `true` | Interruptor mestre para sessões sem um registro `/doublecheck on\|off`. |
|
|
276
|
+
| `language` | `'en'` | Idioma dos textos injetados de lembrete/negativa/revisão/portão (`en` / `zh`). |
|
|
277
|
+
| `modules.adversary` | `false` | Ligado, habilita a revisão do crítico bifurcado ao chegar ao verde. |
|
|
278
|
+
| `gate.enabled` | `true` | Interruptor mestre do painel do portão e do aviso vermelho no limite do turno. |
|
|
279
|
+
| `gate.review.engine` | `'auto'` | `auto` = registros de veredicto do dsh-auto-review quando existem, senão o revisor local; `local` = sempre local. |
|
|
280
|
+
|
|
281
|
+
<details>
|
|
282
|
+
<summary>Tabela completa de configuração (39 chaves)</summary>
|
|
283
|
+
|
|
284
|
+
| Chave | Padrão | Significado |
|
|
285
|
+
|---|---|---|
|
|
286
|
+
| `specFile` | `'doublecheck-spec.md'` | Arquivo do espaço de trabalho para o spec markdown registrado (linha grill). |
|
|
287
|
+
| `reportFile` | `'doublecheck-report.md'` | Arquivo do espaço de trabalho para o relatório de entrega (linha grill). |
|
|
288
|
+
| `reportVerify` | `true` | Executar o fluxo de verificação por padrão (linha grill). |
|
|
289
|
+
| `verifyProvider` | `'fork'` | Provedor de subagent para os verificadores por dimensão (linha grill). |
|
|
290
|
+
| `verifyMode` | `'all'` | `all` = um verificador paralelo por dimensão; `single` = um verificador combinado (linha grill). |
|
|
291
|
+
| `intensity` | `'remind'` | Força de aplicação dos portões de grill, vermelho/verde e revisão (`remind` / `warn` / `block`). |
|
|
292
|
+
| `enableByDefault` | `true` | Interruptor mestre para sessões sem um registro `/doublecheck on\|off`. |
|
|
293
|
+
| `language` | `'en'` | Idioma dos textos injetados de lembrete/negativa/revisão/portão (`en` / `zh`). |
|
|
294
|
+
| `guardTools` | `['edit', 'write']` | Nomes das ferramentas de mutação que os dois portões vigiam. |
|
|
295
|
+
| `vagueTaskMaxChars` | `200` | Tarefas mais longas nunca são tratadas como vagas. |
|
|
296
|
+
| `remindOnce` | `true` | Injetar cada lembrete no máximo uma vez por sessão (durável entre reinícios). |
|
|
297
|
+
| `testToolNames` | `['bash', 'pwsh']` | Nomes de ferramentas de shell que podem executar testes. |
|
|
298
|
+
| `testCommandPatterns` | *(pnpm / npm / yarn / bun test, pytest, go / cargo / make test, node --test, deno test, uv run pytest)* | Regex que um comando precisa satisfazer para contar como execução de testes. |
|
|
299
|
+
| `testFilePatterns` | *(diretórios de teste, `*.test.*` / `*.spec.*`)* | Regex que identificam arquivos de teste — sempre editáveis, isentos do portão vermelho. |
|
|
300
|
+
| `modules.grill` | `true` | Desligado, desabilita o portão de grill. |
|
|
301
|
+
| `modules.tdd` | `true` | Ligado, habilita os portões de prova vermelho/verde. |
|
|
302
|
+
| `modules.adversary` | `false` | Ligado, habilita a revisão do crítico bifurcado ao chegar ao verde. |
|
|
303
|
+
| `adversaryModel` | `null` | Rota de modelo do crítico; `null` = o modelo principal se autorrevisa. |
|
|
304
|
+
| `adversaryProvider` | `'fork'` | Provedor de subagent em que o crítico roda. |
|
|
305
|
+
| `adversaryMaxFindings` | `5` | Teto de achados (1–20) injetados na sessão. |
|
|
306
|
+
| `adversaryTools` | `['read', 'glob', 'grep']` | Lista permitida de ferramentas do crítico; mantenha somente leitura. |
|
|
307
|
+
| `adversaryTimeoutMs` | `120000` | Orçamento rígido de tempo para uma execução do crítico. |
|
|
308
|
+
| `gate.enabled` | `true` | Interruptor mestre do painel do portão e do aviso vermelho no limite do turno. |
|
|
309
|
+
| `gate.planSuggestion` | `true` | Anexar a sugestão de rechecagem em modo plano aos relatórios vermelhos. |
|
|
310
|
+
| `gate.reportFile` | `'gate-report.md'` | Arquivo do espaço de trabalho para o relatório do portão. |
|
|
311
|
+
| `gate.requirements.checklist` | *(seis perguntas de dimensão de spec)* | Lista configurável de perguntas-chave: `{ id, question, specDimension, required }`. |
|
|
312
|
+
| `gate.requirements.minConfirmed` | `6` | Mínimo de perguntas obrigatórias que precisam passar (1..número de obrigatórias). |
|
|
313
|
+
| `gate.requirements.interrogateTool` | `'ask_user_question'` | Nome de ferramenta cujas chamadas contam como prova de interrogação. |
|
|
314
|
+
| `gate.tests.requirePassingRun` | `true` | Uma última execução de testes não aprovada (ou ausente) é luz vermelha. |
|
|
315
|
+
| `gate.tests.allowFailingRuns` | `0` | Execuções com falha após o último verde permitidas antes da luz vermelha. |
|
|
316
|
+
| `gate.tests.requireCoverage` | `false` | Ligado, exige prova de cobertura na saída dos testes. |
|
|
317
|
+
| `gate.tests.minCoveragePct` | `80` | Percentual mínimo de cobertura (0–100). |
|
|
318
|
+
| `gate.tests.evalReports.enabled` | `false` | Ligado, dobra o relatório dsh-eval (o motor de avaliação do dsh-auto-review) na prova de testes. |
|
|
319
|
+
| `gate.tests.evalReports.dir` | `'.eval-reports'` | Diretório relativo ao espaço de trabalho que guarda o relatório do motor. |
|
|
320
|
+
| `gate.tests.evalReports.file` | `'report.json'` | Nome do arquivo de relatório dentro do diretório. |
|
|
321
|
+
| `gate.tests.evalReports.required` | `false` | Um relatório ausente é luz vermelha exatamente quando true (senão é pulado). |
|
|
322
|
+
| `gate.consistency.*` | `provider: 'fork'`, `model: null`, `tools: ['read','glob','grep']`, `timeoutMs: 120000`, `maxFindings: 5` | Os ajustes do revisor de consistência local (`model: null` = modelo principal). |
|
|
323
|
+
| `gate.review.engine` | `'auto'` | `auto` = registros de veredicto do dsh-auto-review quando existem, senão o revisor local; `local` = sempre local. |
|
|
324
|
+
| `gate.review.provider` | `'fork'` | Provedor do revisor local (seu `model`/`tools`/`timeoutMs`/`maxFindings` coincidem com `gate.consistency.*`). |
|
|
325
|
+
|
|
326
|
+
</details>
|
|
327
|
+
|
|
328
|
+
Cada chave `gate.*` acima faz parte de um único **campo vivo**: a linha de guarda marca o bloco `gate` inteiro como `.volatile()`, então ele é o cartão de ajustes editável da linha (o namespace do formulário é o id da entrada do perfil). As demais são config de composição normal do patch do perfil. O bloco é lido uma vez ao carregar, então uma edição vale no próximo carregamento — `gate.enabled` decide se o aviso vermelho do limite do turno é instalado. Em uma linha de host cuja schemastery é anterior a `.volatile()` a linha monta de qualquer forma: o cartão não existe e o bloco vem do patch do perfil exatamente como antes.
|
|
329
|
+
|
|
330
|
+
Configuração errada falha alto ao carregar: regex inválidas, listas de nomes vazias ou duplicadas, limites fora de faixa e ids de lista duplicados lançam erro em vez de não fazer nada em silêncio. O `strict.patch.yml` é a camada que bloqueia todos os portões e reenuncia a linha de guarda com `intensity: block`, todos os módulos ligados e o requisito de cobertura ativado.
|
|
331
|
+
|
|
332
|
+
Exemplo de sobreposição no patch do perfil:
|
|
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
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## FAQ
|
|
350
|
+
|
|
351
|
+
<details>
|
|
352
|
+
<summary>Onde os dados ficam? Um relatório pode vazar o conteúdo dos meus arquivos?</summary>
|
|
353
|
+
|
|
354
|
+
Os fatos duráveis são dois eventos de sessão, `doublecheck/state` (o interruptor durável) e `doublecheck/gate` (o estado de portão fixado), mais quatro arquivos do espaço de trabalho: `doublecheck-spec.md`, `doublecheck-report.md`, `gate-report.md`, `gate-report.json` (caminhos configuráveis). Os relatórios de portão e de entrega registram apenas contagens, ids e veredictos: sem conteúdo de arquivos e sem texto de sessão, e os textos de achados produzidos pelo modelo passam por um removedor de segredos antes de serem guardados ou exibidos. Nada fora do espaço de trabalho da sessão é tocado.
|
|
355
|
+
|
|
356
|
+
</details>
|
|
357
|
+
|
|
358
|
+
<details>
|
|
359
|
+
<summary>O que acontece em hosts sem escritas duráveis? Falha em silêncio?</summary>
|
|
360
|
+
|
|
361
|
+
Nada é silencioso. Os registros duráveis por trás de `/doublecheck on|off` e `/gate run` viajam pela superfície de append `ignorable` do host; em um host sem ela as escritas são puladas e o interruptor volta ao estado de processo (ver «Limitações conhecidas»). O cartão de ajustes da linha de guarda precisa do serviço de settings: onde a schemastery do host é anterior a `.volatile()` não há cartão, mas a linha monta mesmo assim e o bloco `gate` continua vindo do patch do perfil. Quando um seam de revisor ou de adversário não pode rodar, a conclusão é escrita com honestidade como «unavailable»/pulo em vez de um veredicto fabricado.
|
|
362
|
+
|
|
363
|
+
</details>
|
|
364
|
+
|
|
365
|
+
<details>
|
|
366
|
+
<summary>Ele briga com outros plugins por nomes de comando, eventos ou slots?</summary>
|
|
367
|
+
|
|
368
|
+
Não. Cada ferramenta leva namespace, não oferece nenhuma chave de serviço, não registra slots de cliente nem prefixos `webServer`, e cada listener de evento compartilhado delega com `next()` sem curto-circuitar a cadeia. O argumento ponto por ponto está em «Interoperabilidade com outros plugins DSH».
|
|
369
|
+
|
|
370
|
+
</details>
|
|
371
|
+
|
|
372
|
+
<details>
|
|
373
|
+
<summary>Quantas chamadas de modelo custa um `/gate run`?</summary>
|
|
374
|
+
|
|
375
|
+
As fases de interrogação de requisitos e de prova de testes são dobras puras, sem custo de modelo; as fases de consistência e de conclusão da revisão iniciam um subagent bifurcado cada uma (com `gate.review.engine: auto` e registros de veredicto do dsh-auto-review presentes, a fase de conclusão pode ser consumida a custo zero). A revisão adversária opcional soma mais um. Nada mais chama modelo ou rede.
|
|
376
|
+
|
|
377
|
+
</details>
|
|
378
|
+
|
|
379
|
+
## Limites de segurança
|
|
380
|
+
|
|
381
|
+
- **Visível ao modelo ⟺ registrado.** Cada lembrete, revisão e aviso de portão injetado viaja pelos canais padrão e fica no log de sessão; os fatos duráveis de spec/estado/portão viajam por resultados de ferramentas ou por membros de `SessionEventMap`.
|
|
382
|
+
- **Falhar fechado / falhar alto.** A config de guarda e de portão é validada em `apply` (as asserções lançam); um seam de revisor ou de adversário que não pode rodar se resolve como um aviso honesto de «unavailable»/pulo em vez de um veredicto falso.
|
|
383
|
+
- **Relatórios auditáveis.** Os relatórios de portão e de entrega registram apenas contagens, ids e veredictos — sem conteúdo de arquivos nem texto de sessão — e os textos de achados produzidos pelo modelo passam por um removedor de segredos antes de serem guardados ou exibidos.
|
|
384
|
+
- **Sem rede própria.** O plugin não faz requisições de rede diretas; os subagents crítico e revisor viajam pelo seam de subagents do host.
|
|
385
|
+
- **Dependência fraca do dsh-auto-review.** Ele nunca é importado nem exigido de forma dura; o portão dobra os registros de veredicto duráveis dele e degrada para o revisor local, e nunca sintetiza pedidos de aprovação.
|
|
386
|
+
|
|
387
|
+
## Permissões e dados
|
|
388
|
+
|
|
389
|
+
- **Leituras**: o log de sessão (`tool/call` / `tool/result` / `tool/ptc-dispatch`, fontes `user/message` injetadas e os registros de veredicto alheios `autoReview/*`) só em processo; o estado opcional do serviço de modo plano. As subchamadas PTC carregam o rótulo predecessor `tool/code-dispatch` em hosts anteriores à renomeação V3; os dois rótulos dobram igual. Os avisos injetados carregam o kind de origem `dsh-doublecheck` do próprio produtor; logs gravados antes desse kind chegam como `plugin:dsh-doublecheck` (a migração V3→V4 do harness sobre um wrapper catch-all publicado) ou como o wrapper `plugin` publicado, e as três formas dobram igual.
|
|
390
|
+
- **Escritas**: `doublecheck-spec.md`, `doublecheck-report.md`, `gate-report.md` e `gate-report.json` no espaço de trabalho da sessão (caminhos configuráveis) pelo seam `ctx.fs`; os eventos de sessão duráveis `doublecheck/state` e `doublecheck/gate`.
|
|
391
|
+
- **Chamadas de modelo**: as fases de consistência e de revisão local do portão (um subagent cada por `/gate run`), a revisão adversária opcional e o fluxo de verificação do `doublecheck_report` iniciam subagents; nada mais chama modelo ou rede.
|
|
392
|
+
- **Nunca tocado**: credenciais, variáveis de ambiente ou qualquer arquivo fora do espaço de trabalho da sessão. O manifesto de workshop declara apenas `filesystem:read` e `filesystem:write`. Os relatórios de portão carregam só contagens, ids e veredictos; segredos reconhecidos nos textos de revisão são removidos antes de serem guardados ou exibidos.
|
|
393
|
+
|
|
394
|
+
## Limitações conhecidas
|
|
395
|
+
|
|
396
|
+
- **Escritas duráveis.** `/doublecheck on\|off` → `doublecheck/state` e `/gate run` → `doublecheck/gate` viajam pela superfície de append `ignorable` do host (depois da rc.6 até `0.1.1-rc.2`). Em hosts sem essa superfície (rc.6/rc.8, e `0.1.2-alpha.1`, que removeu o envelope — `0.1.2-rc.1` restaura o campo só para compatibilidade de leitura de logs guardados e continua sem poder estampá-lo), as escritas são puladas e o interruptor fica em estado de processo.
|
|
397
|
+
0.1.2-rc.1 (adaptado 2026-09-02): o envelope de sessão mantém o campo ignorable só para compatibilidade de leitura de logs guardados - Session.append continua sem poder estampá-lo, então o comportamento do portão de auditoria não muda.
|
|
398
|
+
0.1.5-alpha.1 (adaptado 2026-09-09): o formato de sessão V3 renomeia o evento durável de subdespacho `tool/code-dispatch` para `tool/ptc-dispatch` (carga inalterada; os dois rótulos dobram igual). Session.append continua sem expor um canal `ignorable`, então as escritas duráveis seguem puladas e o interruptor segue em estado de processo - comportamento inalterado. (O namespace de settings `doublecheck-gate` que esta entrada introduziu foi removido em 0.1.7-alpha.1, quando o harness apagou o registro de namespaces.)
|
|
399
|
+
0.1.5-rc.1 (adaptado 2026-09-10): os pins de dependências passam para a linha publicada 0.1.5-rc.1; nenhuma mudança de seam afeta o comportamento deste plugin.
|
|
400
|
+
0.1.5-rc.2 (adaptado 2026-09-11): os pins de dependências passam para a linha publicada 0.1.5-rc.2; nenhuma mudança de seam afeta o comportamento deste plugin.
|
|
401
|
+
0.1.7-alpha.1 (adaptado 2026-10-04): o harness removeu o kind de origem de mensagem catch-all `plugin` compartilhado (os avisos agora carregam o kind `dsh-doublecheck` do próprio produtor, e a dobra `remindOnce` continua lendo as duas formas anteriores à atualização que um log durável pode conter) e substituiu o registro de namespaces de settings por `SettingsForms` (o namespace `doublecheck-gate` desaparece; a lista do portão agora é o único campo `.volatile()` da linha de guarda, ainda lido uma vez ao carregar). Os pins de dev/teste de `@deepseek-ai/cordis` e `@deepseek-ai/schemastery` passam para `^4.0.3` / `^3.18.3`, onde `Volatile` e `.volatile()` existem pela primeira vez; as faixas de peer continuam `^4.0.2` / `^3.18.2` e a superfície de campo vivo é detectada ao carregar, então as linhas de host mais antigas montam a linha sem cartão de ajustes. Nenhuma mudança de comportamento além do local de armazenamento dos settings.
|
|
402
|
+
- **Seams opcionais.** O cartão de ajustes da linha de guarda aparece quando o serviço de settings está montado; o cartão é a Config da própria linha (namespace = seu id de entrada no perfil), e o bloco `gate` é lido uma vez ao carregar, então seus valores valem para o painel `/gate` e o aviso vermelho no próximo carregamento. A superfície de campo vivo é detectada ao carregar, então em uma linha de host cuja schemastery é anterior a `.volatile()` a linha monta mesmo assim — sem cartão, com o bloco `gate` vindo do patch do perfil. A linha de modo plano de `/gate status` lê o opcional `ctx.planMode` (mostra `unknown` sem ele); a revisão adversária precisa de `ctx.subagents`; a verificação precisa de `workflowEngine`.
|
|
403
|
+
- **Degradação local.** `gate.review.engine: auto` degrada para o revisor local quando o dsh-auto-review está ausente ou não tem registros de veredicto nesta sessão — o relatório nomeia o motivo em vez de inventar um veredicto.
|
|
404
|
+
- **A prova do dsh-eval é por arquivo.** O motor de avaliação do dsh-auto-review (`dsh-eval`) grava seus resultados de regressão de prompt / estresse / justiça em um arquivo de relatório do espaço de trabalho, não no log de sessão. `gate.tests.evalReports.enabled` dobra esse arquivo (desligado por padrão; pula quando ausente) e as contagens dobradas viajam com o registro durável `doublecheck/gate` para que uma execução fixada continue reproduzível.
|
|
405
|
+
|
|
406
|
+
## Interoperabilidade com outros plugins DSH
|
|
407
|
+
|
|
408
|
+
Verificado contra **DSH `0.2.0-rc.2`** (o runtime para o qual este README é publicado) e o conjunto de plugins de muitas estrelas sondado em 2026-10-05.
|
|
409
|
+
|
|
410
|
+
Este plugin **não interfere** em outros plugins, incluindo os de muitas estrelas amplamente instalados:
|
|
411
|
+
|
|
412
|
+
- **Sem colisão de nome de ferramenta.** Cada ferramenta leva namespace; nenhum nome nu de uma ferramenta publicada ou de outro plugin é registrado.
|
|
413
|
+
- **Sem colisão de chave de serviço.** Não oferece nenhuma chave de serviço, então não pode colidir em uma.
|
|
414
|
+
- **Sem colisão de slot.** Não registra chave de slot de cliente, então não disputa um assento de `shadows-shipped-ui`.
|
|
415
|
+
- **Sem colisão de rota HTTP.** Não registra nenhum prefixo `webServer`.
|
|
416
|
+
- **Sem colisão de camada de patch.** O patch do bundle só `insert`a a própria linha; nunca sobrescreve a `config` de uma linha embutida.
|
|
417
|
+
- **Sem mutação global.** Não altera protótipos, não reescreve `process.env` nem substitui o dispatcher global de fetch.
|
|
418
|
+
|
|
419
|
+
**Os listeners de eventos compartilhados não interferem por construção.** Ele observa os eventos sensíveis à ordem `agent/turn-stopping`, `tools/post-execute`, `tools/pre-execute` com `ctx.on()` — o registro de difusão do Cordis, em que cada listener roda e nenhum pode matar de fome outro. **Cada listener delega com `next()`**, então a cadeia nunca é curto-circuitada, e uma mutação é aplicada ao valor que `next()` produziu em vez de ser devolvida no lugar dele:
|
|
420
|
+
|
|
421
|
+
- `tools/post-execute` — also used by `cc-safety-net` (1576★).
|
|
422
|
+
- `tools/pre-execute` — also used by `cc-safety-net` (1576★).
|
|
423
|
+
|
|
424
|
+
Prova estática: `dsh-plugin-doctor` K10–K13 informa `pass` em cada verificação deste repositório.
|
|
425
|
+
|
|
426
|
+
## Compatibilidade
|
|
427
|
+
|
|
428
|
+
| Superfície | Estado |
|
|
429
|
+
|---|---|
|
|
430
|
+
| Harness | DeepSeek Harness `dsh-v0.2.2-rc.1` (adaptado 2026-11-05): `engines.dsh` ganha `>=0.2.2-0 <0.3.0` (toda linha anterior continua admitida); os caminhos do portão e da projeção são cobertos pela suíte rc.1. |
|
|
431
|
+
| Node | `^22.19.0 \|\| >=24.9.0` |
|
|
432
|
+
| Plataformas | Todas (host puro; sem código nativo, sem requisições de rede próprias) |
|
|
433
|
+
| Modelo | Qualquer (a guarda nunca chama um modelo; as fases de crítico e revisor rodam como subagents do harness) |
|
|
434
|
+
|
|
435
|
+
## Ecossistema e qualidade
|
|
436
|
+
|
|
437
|
+
- [Espelho Gitee](https://gitee.com/perrylink/dsh-doublecheck) (espelho sincronizado; o GitHub é o canônico)
|
|
438
|
+
- [Página do plugin no dshfind](https://dshfind.com/plugins/PerryLink/dsh-doublecheck) (instalações e ranking)
|
|
439
|
+
- [Relatório OpenSSF Scorecard](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-doublecheck) (gerado por [.github/workflows/scorecard.yml](.github/workflows/scorecard.yml))
|
|
440
|
+
- [Relatório de verificação do dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章) (K10–K13 todos `pass`)
|
|
441
|
+
- [DSH Market](https://dsh.market/) (listado)
|
|
442
|
+
- **Canal da loja 1024**: `npm i -g dsh1024` uma vez, depois `dsh1024 plugin --profile web add dsh-doublecheck` (conta para o ranking de instalações do [deepseek1024.com](https://deepseek1024.com))
|
|
443
|
+
- [Base de conhecimento do ecossistema](https://perrylink.github.io/dsh-plugin-guide/): dados medidos, não marketing: guia de desenvolvimento de plugins · dados de seleção de plugins · critérios de manutenção
|
|
444
|
+
|
|
445
|
+
## Desenvolvimento
|
|
446
|
+
|
|
447
|
+
```sh
|
|
448
|
+
pnpm install # node ^22.19 || >=24
|
|
449
|
+
pnpm run build # tsc --noEmitOnError (lib/ é comprometido no repo)
|
|
450
|
+
pnpm run prepare # tsc --noEmitOnError (canal de instalação git)
|
|
451
|
+
pnpm run prepublishOnly # build + suíte completa de testes
|
|
452
|
+
pnpm run typecheck # tsc --noEmit + tsconfig de testes
|
|
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 + empacotar o tarball
|
|
457
|
+
pnpm run check:readmes # portão de consistência dos README em cinco idiomas
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
`lib/` é comprometido de propósito: o canal de instalação git resolve o pacote sem etapa de build, então reconstrua com `pnpm run build` e confirme a árvore regenerada depois de mudar o código-fonte. As imagens do README são geradas programaticamente por [`scripts/gen-readme-assets.py`](scripts/gen-readme-assets.py): o Pillow desenha o banner hero (zh/en × claro/escuro, WebP) e um SVG escrito à mão desenha o diagrama de estrutura (flow-v5, claro/escuro), então o script pode ser reexecutado sem risco e sobrescreve de forma idempotente. O diagrama de fluxo antigo de uma só pele e as imagens de demonstração ficam em `docs/assets/` para links externos; os READMEs referenciam apenas o novo hero e o flow-v5.
|
|
461
|
+
|
|
462
|
+
Topics: `dsh`, `dsh-plugin`, `deepseek-harness`, `engineering-discipline`, `requirements`, `guard`, `skill`, `quality-gate`, `delivery-gate`
|
|
463
|
+
|
|
464
|
+
## Família e agradecimentos
|
|
465
|
+
|
|
466
|
+
Este projeto faz parte da família de plugins de DeepSeek Harness da [PerryLink](https://github.com/PerryLink) (todos Apache-2.0). Se ele for útil, **uma estrela ajuda a próxima pessoa a encontrá-lo** — nada fica bloqueado atrás dela.
|
|
467
|
+
|
|
468
|
+
- [@PerryLink](https://github.com/PerryLink) — criador e mantenedor: o ciclo de disciplina grill → design → red → green → review → verify, o portão de entrega de quatro fases, a documentação em cinco idiomas e a esteira de CI/release.
|
|
469
|
+
|
|
470
|
+
<details>
|
|
471
|
+
<summary>Expandir todos os plugins</summary>
|
|
472
|
+
|
|
473
|
+
| Plugin | Status |
|
|
474
|
+
|---|---|
|
|
475
|
+
| **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
|
|
476
|
+
| **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
|
|
477
|
+
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
|
|
478
|
+
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊 CONGELADO — ver o README do repo |
|
|
479
|
+
| **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
|
|
480
|
+
| **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
|
|
481
|
+
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊 CONGELADO — ver o README do repo |
|
|
482
|
+
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
|
|
483
|
+
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
|
|
484
|
+
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
|
|
485
|
+
| **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
|
|
486
|
+
| **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
|
|
487
|
+
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 🧊 CONGELADO — ver o README do repo |
|
|
488
|
+
| **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
|
|
489
|
+
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
|
|
490
|
+
| **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
|
|
491
|
+
| **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** | |
|
|
492
|
+
| **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** | |
|
|
493
|
+
| **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** | |
|
|
494
|
+
| **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** | |
|
|
495
|
+
| **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** | |
|
|
496
|
+
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | |
|
|
497
|
+
| **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** | |
|
|
498
|
+
| **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** | |
|
|
499
|
+
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | |
|
|
500
|
+
| **[dsh-github](https://github.com/PerryLink/dsh-github)** | |
|
|
501
|
+
| **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** | |
|
|
502
|
+
| **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** | |
|
|
503
|
+
| **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** | |
|
|
504
|
+
| **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** | |
|
|
505
|
+
| **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** | |
|
|
506
|
+
| **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** | |
|
|
507
|
+
| **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** | |
|
|
508
|
+
| **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** | |
|
|
509
|
+
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | |
|
|
510
|
+
| **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** | |
|
|
511
|
+
| **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | |
|
|
512
|
+
| **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** | |
|
|
513
|
+
| **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** | |
|
|
514
|
+
| **[dsh-library](https://github.com/PerryLink/dsh-library)** | |
|
|
515
|
+
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | |
|
|
516
|
+
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | |
|
|
517
|
+
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
|
|
518
|
+
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
|
|
519
|
+
| **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
|
|
520
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | 🧊 CONGELADO — ver o README do repo |
|
|
521
|
+
| **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
|
|
522
|
+
| **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
|
|
523
|
+
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
|
|
524
|
+
| **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** | |
|
|
525
|
+
| **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** | |
|
|
526
|
+
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | |
|
|
527
|
+
| **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** | |
|
|
528
|
+
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | |
|
|
529
|
+
| **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
|
|
530
|
+
| **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
|
|
531
|
+
| **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
|
|
532
|
+
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | 🚫 APOSENTADO (repo arquivado) |
|
|
533
|
+
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
|
|
534
|
+
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | 🚫 APOSENTADO (repo arquivado) |
|
|
535
|
+
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | 🚫 APOSENTADO (repo arquivado) |
|
|
536
|
+
| **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
|
|
537
|
+
| **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
|
|
538
|
+
| **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
|
|
539
|
+
| **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** | |
|
|
540
|
+
| **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** | |
|
|
541
|
+
| **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** | |
|
|
542
|
+
| **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** | |
|
|
543
|
+
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | |
|
|
544
|
+
| **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
|
|
545
|
+
| **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
|
|
546
|
+
| **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
|
|
547
|
+
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | 🧊 CONGELADO — ver o README do repo |
|
|
548
|
+
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
|
|
549
|
+
| **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
|
|
550
|
+
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
|
|
551
|
+
| **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** | |
|
|
552
|
+
| **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** | |
|
|
553
|
+
| **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** | |
|
|
554
|
+
| **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** | |
|
|
555
|
+
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | |
|
|
556
|
+
| **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
|
|
557
|
+
| **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
|
|
558
|
+
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
|
|
559
|
+
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | 🚫 APOSENTADO (repo arquivado) |
|
|
560
|
+
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
|
|
561
|
+
| **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
|
|
562
|
+
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 CONGELADO — ver o README do repo |
|
|
563
|
+
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 CONGELADO — ver o README do repo |
|
|
564
|
+
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 CONGELADO — ver o README do repo |
|
|
565
|
+
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 CONGELADO — ver o README do repo |
|
|
566
|
+
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 CONGELADO — ver o README do repo |
|
|
567
|
+
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 APOSENTADO (repo arquivado) |
|
|
568
|
+
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 APOSENTADO (repo arquivado) |
|
|
569
|
+
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 APOSENTADO (repo arquivado) |
|
|
570
|
+
|
|
571
|
+
</details>
|
|
572
|
+
|
|
573
|
+
## Licença
|
|
574
|
+
|
|
575
|
+
[Apache License 2.0](LICENSE) © 2026 dsh-doublecheck contributors
|
|
576
|
+
|
|
577
|
+
<p align="center"><sub>Apache-2.0 · Plugin da comunidade, sem afiliação com a DeepSeek.</sub></p>
|
package/lib/domain/report.d.ts
CHANGED
|
@@ -55,6 +55,12 @@ export interface ReportData extends ReportFacts {
|
|
|
55
55
|
checks: VerifyCheck[];
|
|
56
56
|
complete: boolean;
|
|
57
57
|
} | null;
|
|
58
|
+
/**
|
|
59
|
+
* Why verification did not run, when it was requested. `null` when it ran or
|
|
60
|
+
* was not requested — the renderer must not reduce a failed attempt to a
|
|
61
|
+
* bare "Not run.".
|
|
62
|
+
*/
|
|
63
|
+
verificationNote: string | null;
|
|
58
64
|
/** Workspace markdown copy outcome. */
|
|
59
65
|
path: string | null;
|
|
60
66
|
written: boolean;
|
package/lib/domain/report.js
CHANGED
|
@@ -179,7 +179,7 @@ export function renderReportMarkdown(data) {
|
|
|
179
179
|
}
|
|
180
180
|
lines.push('', '## Verification');
|
|
181
181
|
if (data.verification === null) {
|
|
182
|
-
lines.push('Not run.');
|
|
182
|
+
lines.push(data.verificationNote === null || data.verificationNote === undefined ? 'Not run.' : `Not run — ${data.verificationNote}`);
|
|
183
183
|
}
|
|
184
184
|
else {
|
|
185
185
|
for (const check of data.verification.checks) {
|
package/lib/events.d.ts
CHANGED
|
@@ -196,6 +196,8 @@ declare module '@deepseek-ai/cordis' {
|
|
|
196
196
|
checks: VerifyCheck[];
|
|
197
197
|
complete: boolean;
|
|
198
198
|
} | null;
|
|
199
|
+
/** Why verification did not run, when it was requested; null otherwise. */
|
|
200
|
+
verificationNote?: string | null;
|
|
199
201
|
path: string | null;
|
|
200
202
|
written: boolean;
|
|
201
203
|
}): void;
|