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/README-es.md DELETED
@@ -1,496 +0,0 @@
1
- <div align="center">
2
-
3
- # dsh-doublecheck
4
- - **Canal 1024 store**: `npm i -g dsh1024` una vez, luego `dsh1024 plugin --profile web add dsh-doublecheck` (cuenta para el ranking de instalaciones de [deepseek1024.com](https://deepseek1024.com)).
5
-
6
- **La puerta de calidad de entrega para DeepSeek Harness: interroga los requisitos, prueba la implementación, demuestra la entrega — y controla el traspaso con una decisión de entregable / rehacer.**
7
-
8
- *Los requisitos se interrogan antes de la primera edición; la entrega se demuestra, nunca se afirma.*
9
-
10
- [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
11
- [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-doublecheck)
12
- [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
13
- [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-doublecheck.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
14
- [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-listed-en.svg)](https://dsh.market/)
15
- [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
16
- [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-doublecheck/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-doublecheck/actions)
17
- [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-doublecheck?label=version)](https://github.com/PerryLink/dsh-doublecheck/releases)
18
- [![npm version](https://img.shields.io/npm/v/dsh-doublecheck)](https://www.npmjs.com/package/dsh-doublecheck)
19
- [![npm downloads](https://img.shields.io/npm/dm/dsh-doublecheck)](https://www.npmjs.com/package/dsh-doublecheck)
20
- [![dshfind](https://dshfind.com/api/badge/PerryLink/dsh-doublecheck?metric=downloads&lang=es)](https://dshfind.com/es/plugins/PerryLink/dsh-doublecheck?ref=badge)
21
-
22
- [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
23
-
24
- ```sh
25
- dsh plugin --profile <name> add dsh-doublecheck
26
- ```
27
-
28
-
29
- </div>
30
-
31
- ---
32
-
33
-
34
- **📖 Base de conocimiento del ecosistema** — datos medidos, no marketing: [guía de desarrollo · datos de selección · criterios de mantenimiento](https://perrylink.github.io/dsh-plugin-guide/).
35
-
36
- <!-- star-cta -->
37
- ## Instalación y desinstalación
38
-
39
- - **canal git** (última `main`): `dsh plugin --profile web add github:PerryLink/dsh-doublecheck` — el script `prepare` compila solo con dependencias de producción.
40
- - **canal npm** (versiones publicadas): `dsh plugin --profile web add dsh-doublecheck`.
41
- - **canal tarball**: `pnpm pack` en este repo y luego `dsh plugin --profile web add ./dsh-doublecheck-<version>.tgz`.
42
- - **desinstalar**: `dsh plugin --profile web remove dsh-doublecheck` (o elimina las filas del parche de perfil).
43
-
44
- Para un modo estricto sin configuración (cada puerta activa con intensidad `block`, cobertura de la puerta requerida), aplica la capa superpuesta incluida sobre el parche del bundle: `dsh --profile web --patch ./node_modules/dsh-doublecheck/strict.patch.yml`.
45
-
46
- ## ⭐ 如果它帮到了你
47
-
48
- Este plugin forma parte de la [familia de plugins DSH](https://github.com/PerryLink) (más de 40, todos Apache-2.0). Si te resulta útil, **dale una estrella**: no desbloquea nada, pero ayuda a que la siguiente persona lo encuentre antes.
49
-
50
- *English:* part of a 95 plugin family for DeepSeek Harness. If it is useful, **a star helps the next person find it** — nothing is gated behind it.
51
-
52
- ## What is dsh-doublecheck?
53
-
54
- La puerta de calidad de entrega para DeepSeek Harness: interroga los requisitos, prueba la implementación, demuestra la entrega — y controla el traspaso con una decisión de entregable / rehacer.
55
-
56
- Los requisitos se interrogan antes de la primera edición; la entrega se demuestra, nunca se afirma.
57
-
58
- ![Diagrama de flujo de dsh-doublecheck: solicitud → política/revisión → veredicto.](docs/assets/dsh-doublecheck-flow.svg)
59
-
60
- *Resumen del flujo: solicitud → política/revisión → veredicto. Los ejemplos siguientes usan la superficie de comandos real.*
61
-
62
-
63
- *La misma ejecución, animada.*
64
-
65
- ## Compatibilidad
66
-
67
- | Superficie | Estado |
68
- |---|---|
69
- | Harness | DeepSeek Harness `dsh-v0.2.2-rc.1` (adapted 2026-11-05): `engines.dsh` gains `>=0.2.2-0 <0.3.0` (every earlier line stays admitted); the gate and projection paths are covered by the rc.1 test suite. |
70
- | Node | `^22.19.0 \|\| >=24.9.0` |
71
- | Plataformas | Todas (host puro; sin código nativo, sin solicitudes de red directas propias) |
72
- | Modelo | Cualquiera (el guard nunca llama a un modelo; las fases de crítico y revisor se ejecutan como subagentes del harness) |
73
-
74
- ## Qué obtienes
75
-
76
- `dsh-doublecheck` instala dos filas de plugin que leen y aplican desde el mismo registro de sesión durable:
77
-
78
- 1. **`doublecheck-grill`** — el horno de requisitos: la skill empaquetada `grill-requirements` más las herramientas orientadas al modelo `doublecheck_skills`, `doublecheck_spec` y `doublecheck_report`, y el flujo de verificación por dimensión.
79
- 2. **`doublecheck-guard`** — el guard de disciplina: la puerta grill, las puertas de evidencia rojo/verde, la revisión adversarial, los comandos `/doublecheck` y `/gate`, la tarjeta de ajustes en vivo `gate` y la puerta de entrega de cuatro fases.
80
-
81
- Juntos imponen el **bucle de disciplina** — *grill → design → red → green → review → verify*:
82
-
83
- ```text
84
- grill ──▶ design ──▶ red ──▶ green ──▶ review ──▶ verify
85
- │
86
- └─ seis dimensiones de requisitos, puerta de consenso,
87
- spec estructurado confirmado en la sesión + el workspace
88
- ```
89
-
90
- | Etapa | Significado |
91
- |---|---|
92
- | **grill** | Interroga las seis dimensiones de requisitos; se niega a implementar hasta el consenso. |
93
- | **design** | El spec acordado se confirma mediante `doublecheck_spec`. |
94
- | **red** | Una ejecución de prueba fallida demuestra la brecha antes de las ediciones de implementación. |
95
- | **green** | Una ejecución de prueba aprobada tras las ediciones cierra el bucle. |
96
- | **review** | Un crítico adversarial bifurcado audita la entrega contra el spec. |
97
- | **verify** | `doublecheck_report` + un flujo de verificación por dimensión demuestran la entrega. |
98
-
99
- ## Inicio rápido
100
-
101
- ```sh
102
- dsh plugin --profile web add github:PerryLink/dsh-doublecheck
103
- ```
104
-
105
- ```sh
106
- # 1. install the bundle into your profile
107
- dsh plugin --profile web add github:PerryLink/dsh-doublecheck
108
-
109
- # or from npm (published releases)
110
- dsh plugin --profile web add dsh-doublecheck
111
-
112
- # 2. restart and verify the row
113
- dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
114
- ```
115
-
116
- Ambas filas (`doublecheck-grill` y `doublecheck-guard`) se activan automáticamente con el perfil.
117
-
118
- ### Ejemplos
119
-
120
- Son los puntos de entrada reales; instala y llama a uno.
121
-
122
- #### Ejemplo detallado
123
-
124
- **Comando**
125
-
126
- ~~~sh
127
- /gate run
128
- ~~~
129
-
130
- **Salida**
131
-
132
- ~~~text
133
- # Delivery gate report
134
-
135
- > **Verdict: rework required** — 2 red item(s)
136
- > The gate is red. Re-open the work in plan mode to re-check the open items before delivering.
137
- ~~~
138
-
139
- *Observado en `README.md §Example report (lines 243-251)`*
140
-
141
- #### Rama de fallo
142
-
143
- **Entrada**
144
-
145
- ~~~text
146
- /doublecheck maybe
147
- ~~~
148
-
149
- **Salida**
150
-
151
- ~~~text
152
- Unknown /doublecheck argument "maybe". Usage: /doublecheck status|report|on|off
153
- ~~~
154
-
155
- *Observado en `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
-
157
- #### Ejemplos breves
158
-
159
- - `doublecheck_skills`
160
- - `doublecheck_spec`
161
-
162
- ## Configuración
163
-
164
- Todos los ajustes son campos `Config` de Schemastery (modificables desde cordis.yml). Una sobrescritura dirigida por id reemplaza la fila completa — vuelve a declarar cada clave que necesites. `cordis.patch.yml` documenta cada clave en línea; los valores por defecto del Schema son la única fuente de los valores de ajuste.
165
-
166
- | Clave | Predeterminado | Significado |
167
- |---|---|---|
168
- | `specFile` | `'doublecheck-spec.md'` | Archivo del workspace para el markdown del spec confirmado (fila grill). |
169
- | `reportFile` | `'doublecheck-report.md'` | Archivo del workspace para el informe de entrega (fila grill). |
170
- | `reportVerify` | `true` | Ejecutar el flujo de verificación por defecto (fila grill). |
171
- | `verifyProvider` | `'fork'` | Proveedor de subagente para los verificadores por dimensión (fila grill). |
172
- | `verifyMode` | `'all'` | `all` = un verificador paralelo por dimensión; `single` = un verificador combinado (fila grill). |
173
- | `intensity` | `'remind'` | Fuerza de aplicación de las puertas grill, rojo/verde y de revisión (`remind` / `warn` / `block`). |
174
- | `enableByDefault` | `true` | Interruptor maestro para sesiones sin registro `/doublecheck on\|off`. |
175
- | `language` | `'en'` | Idioma de la prosa inyectada de recordatorio/denegación/revisión/puerta (`en` / `zh`). |
176
- | `guardTools` | `['edit', 'write']` | Nombres de herramientas de mutación que vigilan ambas puertas. |
177
- | `vagueTaskMaxChars` | `200` | Las tareas más largas nunca se tratan como vagas. |
178
- | `remindOnce` | `true` | Inyecta cada recordatorio como máximo una vez por sesión (durable entre reinicios). |
179
- | `testToolNames` | `['bash', 'pwsh']` | Nombres de herramientas shell que pueden ejecutar pruebas. |
180
- | `testCommandPatterns` | *(pnpm/npm/yarn/bun test, pytest, go/cargo/make test, node --test, deno test, uv run pytest)* | Regex que un comando debe coincidir para contar como ejecución de prueba. |
181
- | `testFilePatterns` | *(dirs de prueba, `*.test.*` / `*.spec.*`)* | Regex que identifican archivos de prueba — siempre editables, exentos de la puerta roja. |
182
- | `modules.grill` | `true` | Apagado desactiva la puerta grill. |
183
- | `modules.tdd` | `true` | Encendido habilita las puertas de evidencia rojo/verde. |
184
- | `modules.adversary` | `false` | Encendido habilita la revisión de crítico bifurcado en verde. |
185
- | `adversaryModel` | `null` | Ruta de modelo del crítico; `null` = el modelo principal se autorevisa. |
186
- | `adversaryProvider` | `'fork'` | Proveedor de subagente sobre el que corre el crítico. |
187
- | `adversaryMaxFindings` | `5` | Límite de hallazgos (1–20) inyectados en la sesión. |
188
- | `adversaryTools` | `['read', 'glob', 'grep']` | Lista permitida de herramientas del crítico; mantenla de solo lectura. |
189
- | `adversaryTimeoutMs` | `120000` | Presupuesto de tiempo duro para una ejecución del crítico. |
190
- | `gate.enabled` | `true` | Interruptor maestro del panel de la puerta y el aviso rojo de límite de turno. |
191
- | `gate.planSuggestion` | `true` | Añade la sugerencia de re-verificación en modo plan a los informes rojos. |
192
- | `gate.reportFile` | `'gate-report.md'` | Archivo del workspace para el informe de la puerta. |
193
- | `gate.requirements.checklist` | *(seis preguntas de dimensión de spec)* | Lista de preguntas clave enchufable: `{ id, question, specDimension, required }`. |
194
- | `gate.requirements.minConfirmed` | `6` | Preguntas obligatorias mínimas que deben aprobar (1..cantidad obligatoria). |
195
- | `gate.requirements.interrogateTool` | `'ask_user_question'` | Nombre de herramienta cuyas llamadas cuentan como evidencia de interrogatorio. |
196
- | `gate.tests.requirePassingRun` | `true` | Una última ejecución de prueba no aprobada (o ausente) es una luz roja. |
197
- | `gate.tests.allowFailingRuns` | `0` | Ejecuciones fallidas tras el último verde permitidas antes del rojo. |
198
- | `gate.tests.requireCoverage` | `false` | Encendido exige evidencia de cobertura en la salida de prueba. |
199
- | `gate.tests.minCoveragePct` | `80` | Porcentaje mínimo de cobertura (0–100). |
200
- | `gate.tests.evalReports.enabled` | `false` | Encendido pliega el informe dsh-eval (el motor de evaluación de dsh-auto-review) en la evidencia de prueba. |
201
- | `gate.tests.evalReports.dir` | `'.eval-reports'` | Directorio relativo al espacio de trabajo que contiene el informe del motor. |
202
- | `gate.tests.evalReports.file` | `'report.json'` | Nombre del archivo de informe dentro del directorio. |
203
- | `gate.tests.evalReports.required` | `false` | Un informe ausente es una luz roja exactamente cuando es true (un salto en caso contrario). |
204
- | `gate.consistency.*` | `provider: 'fork'`, `model: null`, `tools: ['read','glob','grep']`, `timeoutMs: 120000`, `maxFindings: 5` | Ajustes del revisor local de consistencia (`model: null` = modelo principal). |
205
- | `gate.review.engine` | `'auto'` | `auto` = registros de veredicto de dsh-auto-review cuando están presentes, si no el revisor local; `local` = siempre local. |
206
- | `gate.review.provider` | `'fork'` | Proveedor del revisor local de revisión (su `model`/`tools`/`timeoutMs`/`maxFindings` coinciden con `gate.consistency.*`). |
207
-
208
- Cada clave `gate.*` de arriba forma parte de un único **campo en vivo**: el guard marca todo el bloque `gate` como `.volatile()`, así que es la tarjeta de ajustes editable de la fila (el espacio de nombres del formulario es el id de entrada de perfil de la fila). Las demás claves son configuración de composición normal del parche de perfil. El bloque se lee una vez al cargar, así que una edición surte efecto en la siguiente carga: `gate.enabled` decide si el aviso rojo del límite de turno se instala. Si el schemastery del host es anterior a `.volatile()`, la fila monta igualmente: no hay tarjeta y el bloque viene del parche de perfil.
209
-
210
- La mala configuración falla en voz alta al cargar: regex inválidas, listas de nombres vacías o duplicadas, umbrales fuera de rango e ids de lista duplicados lanzan error en lugar de no hacer nada en silencio. `strict.patch.yml` es la capa de todas las puertas en bloqueo que vuelve a declarar la fila guard con `intensity: block`, todos los módulos activos y el requisito de cobertura habilitado.
211
-
212
- ## Herramientas y superficies
213
-
214
- | Superficie | Tipo | Notas |
215
- |---|---|---|
216
- | `doublecheck_skills` | herramienta | Lista y carga las cuatro skills empaquetadas a través de la interfaz del registro de skills. |
217
- | `doublecheck_spec` | herramienta | Confirma el spec de seis dimensiones en el registro de sesión y una copia markdown del workspace. |
218
- | `doublecheck_report` | herramienta | Pliega la evidencia de disciplina en un informe de entrega (flujo de verificación por dimensión opcional). |
219
- | `/doublecheck status\|report\|on\|off` | comando | Interruptor, módulos, intensidad, hechos de etapa, informe plegado y la sobrescritura durable on/off. |
220
- | `/gate status\|run\|config` | comando | Progreso de la lista en vivo, el informe entregable/rehacer asentado y la configuración efectiva. |
221
- | `grill-requirements`, `red-green-tdd`, `delivery-review`, `delivery-proof` | skill | Skills de disciplina empaquetadas que cubren las seis etapas del bucle. |
222
- | `gate` | campo de configuración en vivo | La lista enchufable es el único campo `.volatile()` de la fila del guard: se edita desde la tarjeta de ajustes de la fila (espacio de nombres = el id de entrada de perfil de la fila) y se lee una vez al cargar. |
223
- | `strict.patch.yml` | capa superpuesta | Cada puerta activa con intensidad `block` más el requisito de cobertura, en una capa de parche. |
224
- | `dsh-doublecheck/invariant` | fila acompañante | Informa contradicciones de ruta de escritura propias del paquete a través del registro `invariants` del host. |
225
- | `doublecheck` | proyección de sesión | Una línea de estado acotada que el cliente muestra: etapa, último veredicto de la puerta, cuenta de rojos, ediciones y marcas spec/review. Ver [Cómo leer la línea de estado](#cómo-leer-la-línea-de-estado). |
226
-
227
- ### Cómo leer la línea de estado
228
-
229
- La proyección de sesión `doublecheck` es una **cadena**, y es deliberadamente una sola línea: la idea es que cualquier cliente pueda mostrarla sin recortar nada. El `/status` de un puente de chat, una barra de estado o cualquier consumidor propio la muestra tal cual:
230
-
231
- ```text
232
- gate:rework r2 | stage:green | test:green edits:12 spec:yes review:yes | goal:ship parser fix
233
- ```
234
-
235
- | Segmento | Se lee como |
236
- |---|---|
237
- | `gate:<veredicto> r<n>` | El último veredicto de la puerta de entrega — `none` antes de cualquier ejecución, `deliverable` o `rework` — y su cuenta de rojos `r<n>`. |
238
- | `stage:<etapa>` | La etapa de disciplina alcanzada con evidencia durable: `grill`, `design`, `red`, `green`, `review`, `verify`. |
239
- | `test:<color>` | El color de la última ejecución de pruebas: `none`, `red`, `green`. |
240
- | `edits:<n>` | Ediciones de implementación plegadas del registro de sesión (escribir archivos de prueba no cuenta). |
241
- | `spec:yes` / `spec:no` | Si existe un `doublecheck_spec` confirmado. |
242
- | `review:yes` / `review:no` | Si existe un registro de revisión adversaria. |
243
- | `goal:<extracto>` | El objetivo del spec confirmado, recortado. Solo aparece con `spec:yes`. |
244
-
245
- La línea está acotada **por construcción**, así que ningún renderizador la trunca:
246
-
247
- - Presupuesto duro: **120 caracteres**. Un renderizador que conserva los valores de hasta 120 caracteres — el renderizador genérico de proyecciones del puente de WeChat es uno de ellos — muestra la línea completa. La forma de objeto anterior tenía 131 caracteres **en vacío**, y por eso el veredicto y la cuenta de rojos se recortaban.
248
- - Los tres primeros segmentos son **sin pérdida**. Las cuentas por encima de `9999` rojos o `99999` ediciones se imprimen como `9999+` / `99999+` en lugar de crecer sin límite; una cuenta no finita o negativa se imprime como `0`.
249
- - `goal:` es el único segmento con pérdida. Se aplana a una sola línea (los saltos de línea y los caracteres de control pasan a espacios, `|` pasa a `/`) y se recorta al presupuesto restante, como máximo 40 caracteres, terminando en `…` cuando se recortó. El objetivo completo está en `/doublecheck status` y en el informe de entrega.
250
- - Esto es un vistazo, no el registro: `/gate status` y `/doublecheck status` muestran el estado completo.
251
-
252
- El `stateVersion` de la proyección es **3**. Incrementarlo descarta una fila de caché de proyección escrita por una versión anterior y vuelve a plegar la clave desde el registro de sesión, de modo que una sesión actualizada recalcula la línea en lugar de mostrar una obsoleta. El estado plegado en sí no cambia, y una sesión anterior a la actualización nunca falla al cargar.
253
-
254
- ## Fases de la puerta
255
-
256
- La puerta de entrega agrega la evidencia durable de la sesión en una lista configurable de cuatro fases y asienta una decisión **entregable / rehacer requerido**. Cada fase pliega solo el registro de sesión (la reproducción ES el estado), por lo que una ejecución se vuelve a derivar idénticamente tras reanudar o bifurcar.
257
-
258
- | Fase | Comprobaciones | Fuente de evidencia | Costo de modelo |
259
- |---|---|---|---|
260
- | Interrogatorio de requisitos | Lista de preguntas clave confirmadas una a una (seis preguntas de dimensión de spec por defecto) | `doublecheck_spec` confirmado + llamadas `ask_user_question` | ninguno |
261
- | Evidencia de prueba | Color de la última ejecución, ejecuciones fallidas tras el verde, umbral de cobertura opcional, informe dsh-eval opcional | Ejecuciones de prueba shell en el registro de sesión (`[exit code: N]`, porcentajes de cobertura); el archivo de informe dsh-eval cuando `gate.tests.evalReports.enabled` | ninguno |
262
- | Consistencia de implementación | Mapeo diff ↔ requisito: cada edición debe servir a una dimensión de spec | Revisor bifurcado local (hallazgos estructurados, herramientas de solo lectura) | un subagente |
263
- | Conclusión de revisión | El veredicto de entrega; `engine: auto` consume los registros de veredicto durables de dsh-auto-review cuando están presentes, si no el revisor local | Eventos `autoReview/verdict` / `autoReview/rejection`, o el revisor bifurcado local | un subagente (local) |
264
-
265
- Las luces rojas son comprobaciones fallidas (un spec ausente, una última ejecución fallida, cobertura bajo el mínimo, una edición sin mapear, hallazgos blocker/major) — cada una lleva una sugerencia de retrabajo. Las advertencias y los saltos nunca invierten la decisión. La puerta integra [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) como dependencia débil: `review.engine: auto` pliega sus registros de veredicto cuando están presentes y degrada al revisor local en caso contrario; `gate.tests.evalReports.enabled` pliega el informe dsh-eval de su motor de evaluación (suites de regresión de prompt / estrés / equidad) en la evidencia de prueba y salta honestamente cuando no existe informe. La puerta nunca sintetiza solicitudes de aprobación.
266
-
267
- ## Informe de ejemplo
268
-
269
- `/gate run` devuelve este markdown — pégalo en la descripción de un PR:
270
-
271
- ````markdown
272
- # Delivery gate report
273
-
274
- > **Verdict: rework required** — 2 red item(s)
275
- > The gate is red. Re-open the work in plan mode to re-check the open items before delivering.
276
-
277
- ## 1. Requirements interrogation — PASS
278
- - [✔] **What outcome must the delivery produce?** — spec dimension "goal" committed
279
- - [✔] **What is in scope, and what is out of scope?** — spec dimension "scope" committed
280
- - [✔] **Which observable checks prove the work is done?** — spec dimension "acceptanceCriteria" committed
281
- - [✔] **What can go wrong, and what is the correct behavior in each case?** — spec dimension "failureModes" committed
282
- - [✔] **What is traded when goals conflict; what is optional?** — spec dimension "priorities" committed
283
- - [✔] **What does the user explicitly not want?** — spec dimension "nonGoals" committed
284
-
285
- ## 2. Test evidence — FAIL
286
- - [✔] **passing test run** — latest test run passed
287
- - [✔] **failing cases after green** — 0 failing run(s) after green (allowed: 0)
288
- - [✖] **coverage evidence** — 61% coverage below the 80% minimum — rework: raise coverage above the configured minimum
289
-
290
- ## 3. Implementation consistency — WARN
291
- - [⚠] **[minor] src/telemetry.ts touched without a requirement** — [minor] the edit adds a metric no spec dimension covers
292
-
293
- ## 4. Review conclusion — PASS
294
- - [✔] **dsh-auto-review conclusion** — 3 call(s) approved by dsh-auto-review (latest risk: low)
295
-
296
- ## Red items
297
- 1. **tests/coverage** — 61% coverage below the 80% minimum — *rework: raise coverage above the configured minimum*
298
- 2. **consistency/finding-1** — [minor] the edit adds a metric no spec dimension covers — *rework: src/telemetry.ts touched without a requirement*
299
-
300
- ## Audit
301
- - review engine: dsh-auto-review
302
- - generated at: 2026-08-14T12:00:00.000Z
303
- - counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
304
- ````
305
-
306
- ## Salida de CI
307
-
308
- `/gate run` también escribe un `gate-report.json` (el mismo estado asentado que el JSON sin pérdida, junto a `gate-report.md`). El CLI `doublecheck-gate` convierte ese archivo en salida legible por máquina para GitHub Actions:
309
-
310
- ```sh
311
- # JSON (comentario de PR / payload de estado)
312
- doublecheck-gate --format json --input gate-report.json
313
- # SARIF 2.1.0 (subida de code-scanning / verificación de estado)
314
- doublecheck-gate --format sarif < gate-report.json
315
- ```
316
-
317
- El CLI solo serializa el `GateState` ya asentado — nunca vuelve a ejecutar la puerta de cuatro fases ni los pliegues de evidencia. Su código de salida mapea el veredicto: `0` = entregable, `1` = retrabajo, `2` = error de uso/análisis.
318
-
319
- ## Permisos y datos
320
-
321
- - **Lee**: el registro de sesión (`tool/call` / `tool/result` / `tool/ptc-dispatch`, fuentes `user/message` inyectadas y los registros de veredicto ajenos `autoReview/*`) solo en proceso; el estado opcional del servicio de modo plan. Antes del renombrado de V3 el host registra los subenvíos PTC con la etiqueta predecesora `tool/code-dispatch`; ambas etiquetas se pliegan de forma idéntica. Los avisos inyectados llevan el kind de fuente de mensaje propio del paquete, `dsh-doublecheck`; los registros anteriores a ese kind llegan como `plugin:dsh-doublecheck` (la reescritura que la migración V3→V4 del host aplica a un envoltorio catch-all publicado) o como el envoltorio `plugin` publicado, y las tres formas se pliegan igual.
322
- - **Escribe**: `doublecheck-spec.md`, `doublecheck-report.md` y `gate-report.md` en el workspace de sesión (rutas configurables) a través de la interfaz `ctx.fs`; los eventos de sesión durables `doublecheck/state` y `doublecheck/gate`.
323
- - **Llamadas a modelo**: las fases de consistencia y revisión local de la puerta (un subagente cada una por `/gate run`), la revisión adversarial opcional y el flujo de verificación de `doublecheck_report` inician ejecuciones de subagente; nada más llama a un modelo o a la red.
324
- - **Nunca toca**: credenciales, variables de entorno o cualquier archivo fuera del workspace de sesión. El manifiesto del workshop declara solo `filesystem:read` y `filesystem:write`. Los informes de la puerta llevan solo conteos, ids y veredictos; los secretos reconocidos en los textos del revisor se redactan antes de almacenarlos o mostrarlos.
325
-
326
- ## Límites de seguridad
327
-
328
- - **Visible para el modelo ⟺ registrado.** Cada recordatorio, revisión y aviso de puerta inyectado viaja por los canales estándar y cae en el registro de sesión; los hechos durables spec/state/gate viajan por resultados de herramienta o miembros de `SessionEventMap`.
329
- - **Falla cerrado / falla en voz alta.** La configuración del guard y de la puerta se valida en `apply` (las aserciones lanzan); una interfaz de revisor o adversario que no puede ejecutarse se asienta como un aviso honesto "unavailable"/salto en lugar de un veredicto falso.
330
- - **Informes auditables.** Los informes de puerta y entrega registran solo conteos, ids y veredictos — sin contenidos de archivo ni texto de sesión — y los textos de hallazgos producidos por el modelo pasan un redactor de secretos antes de almacenarlos o mostrarlos.
331
- - **Sin red propia.** El plugin no hace solicitudes de red directas; los subagentes de crítico y revisor viajan por la interfaz de subagentes del harness.
332
- - **Dependencia débil de dsh-auto-review.** Nunca se importa ni se exige; la puerta pliega sus registros de veredicto durables y degrada al revisor local, y nunca sintetiza solicitudes de aprobación.
333
-
334
- ## Limitaciones conocidas
335
-
336
- - **Escrituras durables.** `/doublecheck on\|off` → `doublecheck/state` y `/gate run` → `doublecheck/gate` necesitan la superficie de append `ignorable` del host (post-rc.6 hasta `0.1.1-rc.2`). En hosts sin esa superficie (rc.6/rc.8 y `0.1.2-alpha.1`, que eliminó el sobre — `0.1.2-rc.1` restaura el campo solo para compatibilidad de lectura de logs almacenados y aún no puede estamparlo), las escrituras se omiten y el interruptor queda en proceso.
337
- 0.1.2-rc.1 (adaptado el 2026-09-02): el sobre de sesión conserva su campo ignorable solo para compatibilidad de lectura de logs almacenados - Session.append aún no puede estamparlo, por lo que el comportamiento de la puerta no cambia.
338
- 0.1.5-alpha.1 (adaptado el 2026-09-09): el formato de sesión V3 renombra el evento durable de subenvío `tool/code-dispatch` a `tool/ptc-dispatch` (carga útil sin cambios; ambas etiquetas se pliegan de forma idéntica). Session.append sigue sin canal `ignorable`, así que las escrituras durables se omiten y el interruptor permanece en proceso - comportamiento sin cambios. (El espacio de ajustes `doublecheck-gate` que introdujo esa entrada se eliminó en 0.1.7-alpha.1, cuando el host borró el registro de espacios de nombres.)
339
- 0.1.5-rc.1 (adaptado el 2026-09-10): los pines de dependencias pasan a la línea publicada 0.1.5-rc.1; ningún cambio de interfaz afecta el comportamiento de este plugin.
340
- 0.1.5-rc.2 (adaptado el 2026-09-11): los pines de dependencias pasan a la línea publicada 0.1.5-rc.2; ningún cambio de interfaz afecta el comportamiento de este plugin.
341
- 0.1.7-alpha.1 (adaptado el 2026-10-04): el host eliminó el kind de fuente de mensaje catch-all compartido `plugin` (los avisos ahora llevan el kind propio `dsh-doublecheck`, y el plegado de `remindOnce` sigue leyendo las dos formas previas a la actualización que un registro durable puede contener) y sustituyó el registro de espacios de nombres de ajustes por `SettingsForms` (el espacio `doublecheck-gate` desaparece; la lista de la puerta pasa a ser el único campo `.volatile()` de la fila del guard, todavía leído una vez al cargar). Los pisos de peers de `@deepseek-ai/cordis` y `@deepseek-ai/schemastery` pasan a `^4.0.3` / `^3.18.3` en las dependencias de desarrollo; los rangos de peers siguen siendo `^4.0.2` / `^3.18.2` y la capacidad de campos en vivo se detecta al cargar, así que las líneas de host anteriores siguen montando la fila (sin tarjeta de ajustes). Sin cambios de comportamiento salvo la ubicación de almacenamiento de los ajustes.
342
- - **Interfaces opcionales.** La tarjeta de ajustes de la fila del guard aparece cuando el servicio de ajustes está montado; la tarjeta es la Config de esta propia fila (espacio de nombres = su id de entrada de perfil), y el bloque `gate` se lee una vez al cargar, así que sus valores aplican al panel `/gate` y al aviso rojo en la siguiente carga. La capacidad de campos en vivo se detecta al cargar: si el schemastery del host es anterior a `.volatile()`, la fila monta igualmente — sin tarjeta, con el bloque `gate` tomado del parche de perfil. La línea de modo plan de `/gate status` lee el `ctx.planMode` opcional (muestra `unknown` sin él); la revisión adversarial necesita `ctx.subagents`; la verificación necesita `workflowEngine`.
343
- - **Degradación local.** `gate.review.engine: auto` degrada al revisor local cuando dsh-auto-review está ausente o no tiene registros de veredicto en esta sesión — el informe nombra la razón en lugar de inventar un veredicto.
344
- - **La evidencia dsh-eval se basa en archivos.** El motor de evaluación de dsh-auto-review (`dsh-eval`) escribe sus resultados de regresión de prompt / estrés / equidad en un archivo de informe del espacio de trabajo, no en el registro de sesión. `gate.tests.evalReports.enabled` pliega ese archivo (desactivado por defecto; salta cuando está ausente) y los recuentos pliegados viajan en el registro duradero `doublecheck/gate` para que una ejecución asentada siga siendo reproducible.
345
-
346
- ## Desarrollo
347
-
348
- ```sh
349
- pnpm install # node ^22.19 || >=24
350
- pnpm run build # tsc --noEmitOnError (lib/ is committed)
351
- pnpm run prepare # tsc --noEmitOnError (git-install channel)
352
- pnpm run prepublishOnly # build + full test suite
353
- pnpm run typecheck # tsc --noEmit + tests tsconfig
354
- pnpm run lint # eslint src tests
355
- pnpm test # vitest run
356
- pnpm run test:coverage # vitest run --coverage
357
- pnpm run pack:check # build + pack the tarball
358
- ```
359
-
360
- ## Temas
361
-
362
- `dsh`, `dsh-plugin`, `deepseek-harness`, `engineering-discipline`, `requirements`, `guard`, `skill`, `quality-gate`, `delivery-gate`
363
-
364
- ## Contribuidores
365
-
366
- - [@PerryLink](https://github.com/PerryLink) — creador y mantenedor: el bucle de disciplina grill → design → red → green → review → verify, la puerta de entrega de cuatro fases, la documentación en cinco idiomas y el pipeline de CI/publicación.
367
-
368
- ## Interoperabilidad con otros plugins de DSH
369
-
370
- Verificado contra **DSH `0.2.0-rc.2`** (el runtime para el que se publica este README) y el conjunto de plugins con más estrellas sondeado el 2026-10-05.
371
-
372
- Este plugin **no interfiere** con otros plugins, incluidos los de más estrellas:
373
-
374
- - **Sin colisión de nombres de herramienta.** Todas las herramientas llevan espacio de nombres; ninguna ocupa un nombre desnudo ya perteneciente a una herramienta incluida u otro plugin.
375
- - **Sin colisión de clave de servicio.** No provee ninguna clave de servicio, así que no puede colisionar en una.
376
- - **Sin colisión de slot.** No registra ninguna clave de slot de cliente, así que no disputa un asiento `shadows-shipped-ui`.
377
- - **Sin colisión de ruta HTTP.** No registra ningún prefijo `webServer`.
378
- - **Sin colisión en la capa de patch.** El patch del bundle solo hace `insert` de su propia fila; nunca sobrescribe el `config` de una fila incluida.
379
- - **Sin mutación global.** No parchea prototipos, ni reescribe `process.env`, ni reemplaza el dispatcher global de fetch.
380
-
381
- **Los listeners de eventos compartidos no interfieren por construcción.** Observa los eventos sensibles al orden `agent/turn-stopping`, `tools/post-execute`, `tools/pre-execute` con `ctx.on()` — el registro de difusión de Cordis, donde cada listener se ejecuta y ninguno puede dejar sin turno a otro. **Todos los listeners aquí delegan por `next()`**, así que la cadena nunca se cortocircuita:
382
- - `tools/post-execute` — also used by `cc-safety-net` (1576★).
383
- - `tools/pre-execute` — also used by `cc-safety-net` (1576★).
384
-
385
- Evidencia estática: `dsh-plugin-doctor` K10–K13 dan `pass` en todas las comprobaciones de este repositorio.
386
-
387
- ## PerryLink DSH Plugin Family
388
-
389
- Este proyecto forma parte de la familia de plugins de DeepSeek Harness de [PerryLink](https://github.com/PerryLink). El registro permanece plegado abajo para que cada README conserve una primera pantalla corta; expándelo para ver cada fila y su estado.
390
-
391
- <details>
392
- <summary>Expandir todos los plugins</summary>
393
-
394
- | Plugin | Estado |
395
- |---|---|
396
- | **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
397
- | **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
398
- | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
399
- | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | |
400
- | **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
401
- | **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
402
- | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | |
403
- | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
404
- | **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
405
- | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
406
- | **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
407
- | **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
408
- | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | |
409
- | **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
410
- | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
411
- | **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
412
- | **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** | |
413
- | **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** | |
414
- | **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** | |
415
- | **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** | |
416
- | **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** | |
417
- | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | |
418
- | **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** | |
419
- | **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** | |
420
- | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | |
421
- | **[dsh-github](https://github.com/PerryLink/dsh-github)** | |
422
- | **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** | |
423
- | **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** | |
424
- | **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** | |
425
- | **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** | |
426
- | **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** | |
427
- | **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** | |
428
- | **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** | |
429
- | **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** | |
430
- | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | |
431
- | **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** | |
432
- | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | |
433
- | **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** | |
434
- | **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** | |
435
- | **[dsh-library](https://github.com/PerryLink/dsh-library)** | |
436
- | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | |
437
- | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | |
438
- | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
439
- | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
440
- | **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
441
- | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | |
442
- | **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
443
- | **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
444
- | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
445
- | **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** | |
446
- | **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** | |
447
- | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | |
448
- | **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** | |
449
- | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | |
450
- | **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
451
- | **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
452
- | **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
453
- | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | |
454
- | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
455
- | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | |
456
- | **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | |
457
- | **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
458
- | **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
459
- | **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
460
- | **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** | |
461
- | **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** | |
462
- | **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** | |
463
- | **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** | |
464
- | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | |
465
- | **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
466
- | **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
467
- | **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
468
- | **[dsh-score](https://github.com/PerryLink/dsh-score)** | |
469
- | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
470
- | **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
471
- | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
472
- | **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** | |
473
- | **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** | |
474
- | **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** | |
475
- | **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** | |
476
- | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | |
477
- | **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
478
- | **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
479
- | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
480
- | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | |
481
- | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
482
- | **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
483
- | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 CONGELADO — ver el README del repositorio |
484
- | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 CONGELADO — ver el README del repositorio |
485
- | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 CONGELADO — ver el README del repositorio |
486
- | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 CONGELADO — ver el README del repositorio |
487
- | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 CONGELADO — ver el README del repositorio |
488
- | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 RETIRADO — ver el README del repositorio |
489
- | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 RETIRADO — ver el README del repositorio |
490
- | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 RETIRADO — ver el README del repositorio |
491
-
492
- </details>
493
-
494
- ## Licencia
495
-
496
- [Apache License 2.0](LICENSE) © 2026 dsh-doublecheck contributors