dsh-doublecheck 0.7.0 → 0.7.1

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 CHANGED
@@ -1,74 +1,155 @@
1
+ <div align="center">
2
+
1
3
  # dsh-doublecheck
2
4
 
3
- > **La puerta de calidad de entrega para DeepSeek Harness: interroga los requisitos, prueba la implementación, demuestra la entrega — y luego controla el traspaso con una decisión de entregable / rehacer requerido.**
5
+ **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.**
4
6
 
5
- [![version](https://img.shields.io/badge/version-0.7.0-blue)](https://github.com/PerryLink/dsh-doublecheck/releases)
6
- [![npm](https://img.shields.io/npm/v/dsh-doublecheck)](https://www.npmjs.com/package/dsh-doublecheck)
7
- [![downloads](https://img.shields.io/npm/dw/dsh-doublecheck)](https://www.npmjs.com/package/dsh-doublecheck)
8
- [![license](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)
9
- [![topics](https://img.shields.io/badge/topics-dsh%20%7C%20dsh--plugin-22c55e)](https://github.com/topics/dsh-plugin)
10
- [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-doublecheck/ci.yml?branch=main)](https://github.com/PerryLink/dsh-doublecheck/actions/workflows/ci.yml)
7
+ *Los requisitos se interrogan antes de la primera edición; la entrega se demuestra, nunca se afirma.*
11
8
 
12
- Un **bundle de disciplina de ingeniería y panel de puerta de calidad de entrega** para [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness). A los agentes les encanta empezar a programar; los requisitos odian que se los dé por sentados. `dsh-doublecheck` instala un bucle de disciplina que obliga al agente a **interrogar los requisitos antes de la primera edición y a demostrar la entrega en lugar de afirmarla** — y un **panel de puerta de entrega** que agrega la interrogación de requisitos, la evidencia de pruebas, la consistencia diff↔requisito y una conclusión de revisión en una única decisión de **entregable / rehacer requerido**, plasmada en un informe markdown listo para PR. Reimplementado de forma nativa sobre los puntos de extensión propios de DSH (registro de skills, pipeline de políticas de herramientas, seam de aprobación, seams de subagente y workflow, comandos, proyecciones de sesión, espacio de nombres de ajustes, modo plan), no sobre archivos de prompt prestados. Probado contra DSH `0.1.0-rc.6`.
9
+ [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
10
+ [![DSH plugin](https://img.shields.io/badge/dsh-plugin-✅-green)](https://github.com/topics/dsh-plugin)
11
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
12
+ [![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)
13
+ [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-doublecheck?label=version)](https://github.com/PerryLink/dsh-doublecheck/releases)
14
+ [![npm version](https://img.shields.io/npm/v/dsh-doublecheck)](https://www.npmjs.com/package/dsh-doublecheck)
15
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-doublecheck)](https://www.npmjs.com/package/dsh-doublecheck)
13
16
 
14
- La metodología está inspirada en [obra/superpowers](https://github.com/obra/superpowers) y [TimothyVang/Grill-me](https://github.com/TimothyVang/Grill-me). Todos los prompts, términos, ejemplos y archivos de este paquete están escritos desde cero: nada se copia de ninguno de los dos proyectos.
17
+ [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
15
18
 
16
- ## Por qué
19
+ </div>
17
20
 
18
- - Las tareas vagas producen software equivocado. Una petición breve («hazme una función») esconde seis decisiones sin resolver; hoy el agente las adivina todas y tú pagas por la suposición.
19
- - Los equipos disciplinados hacen esto con humanos: revisión de requisitos → prueba que falla → prueba que pasa → autorrevisión → prueba de entrega. Los agentes merecen el mismo bucle, impuesto por el harness y no por la buena voluntad.
20
- - Publicar necesita una decisión, no una corazonada. La puerta de entrega convierte la evidencia del bucle en un único veredicto de **entregable / rehacer requerido** con elementos rojos y sugerencias de rehacer — el panel que una plataforma de evaluación pega en la descripción de su PR.
21
+ ---
21
22
 
22
- ## El bucle de disciplina
23
+ ## Compatibilidad
23
24
 
24
- ```
25
+ | Superficie | Estado |
26
+ |---|---|
27
+ | Harness | DeepSeek Harness `0.1.0-rc.6` |
28
+ | Node | `^22.19.0 \|\| >=24.0.0` |
29
+ | Plataformas | Todas (host puro; sin código nativo, sin solicitudes de red directas propias) |
30
+ | Modelo | Cualquiera (el guard nunca llama a un modelo; las fases de crítico y revisor se ejecutan como subagentes del harness) |
31
+
32
+ ## Qué obtienes
33
+
34
+ `dsh-doublecheck` instala dos filas de plugin que leen y aplican desde el mismo registro de sesión durable:
35
+
36
+ 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.
37
+ 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`, el espacio de ajustes `doublecheck.gate` y la puerta de entrega de cuatro fases.
38
+
39
+ Juntos imponen el **bucle de disciplina** — *grill → design → red → green → review → verify*:
40
+
41
+ ```text
25
42
  grill ──▶ design ──▶ red ──▶ green ──▶ review ──▶ verify
26
- │ │
27
- │ (v0.1) (v0.2+) (v0.3) (v0.4)
28
- │
29
- └─ horno de requisitos: seis dimensiones, puerta de consenso,
30
- spec estructurado guardado en la sesión y en el workspace
43
+ │
44
+ └─ seis dimensiones de requisitos, puerta de consenso,
45
+ spec estructurado confirmado en la sesión + el workspace
31
46
  ```
32
47
 
33
- | Etapa | Significado | Estado |
34
- |---|---|---|
35
- | **grill** | Interrogar las seis dimensiones de requisitos; negarse a implementar hasta el consenso. | ✅ v0.1 |
36
- | **design** | Spec registrado con `doublecheck_spec`. | ✅ v0.1 |
37
- | **red** | Una prueba que falla demuestra el hueco; las ediciones de implementación necesitan tenerla registrada. | ✅ v0.2 |
38
- | **green** | Una prueba que pasa tras las ediciones cierra el bucle. | ✅ v0.2 |
39
- | **review** | Un crítico adversario bifurcado audita la entrega contra el spec. | ✅ v0.3 |
40
- | **verify** | `doublecheck_report` + un workflow de verificación por dimensión demuestran la entrega. | ✅ v0.4 |
41
-
42
- ## La puerta de entrega (v0.7)
43
-
44
- La puerta es el **front end productizado del bucle**: agrega la evidencia durable de la sesión en una checklist configurable de cuatro fases y emite una única decisión binaria. Cada fase se pliega solo con el registro de sesión (el replay ES el estado), de modo que una ejecución de la puerta se vuelve a derivar de forma idéntica tras reanudar o bifurcar.
45
-
46
- ```mermaid
47
- flowchart TD
48
- A["/gate run"] --> B["1. Requirements interrogation"]
49
- B --> C["2. Test evidence"]
50
- C --> D["3. Implementation consistency"]
51
- D --> E["4. Review conclusion"]
52
- E --> F{"any red item?"}
53
- F -- yes --> G["VERDICT: rework required"]
54
- F -- no --> H["VERDICT: deliverable"]
55
- G --> I["suggest plan-mode re-check + /gate run again"]
56
- H --> J["paste the report into the PR description"]
48
+ | Etapa | Significado |
49
+ |---|---|
50
+ | **grill** | Interroga las seis dimensiones de requisitos; se niega a implementar hasta el consenso. |
51
+ | **design** | El spec acordado se confirma mediante `doublecheck_spec`. |
52
+ | **red** | Una ejecución de prueba fallida demuestra la brecha antes de las ediciones de implementación. |
53
+ | **green** | Una ejecución de prueba aprobada tras las ediciones cierra el bucle. |
54
+ | **review** | Un crítico adversarial bifurcado audita la entrega contra el spec. |
55
+ | **verify** | `doublecheck_report` + un flujo de verificación por dimensión demuestran la entrega. |
56
+
57
+ ## Inicio rápido
58
+
59
+ ```sh
60
+ # 1. install the bundle into your profile
61
+ dsh plugin --profile web add "github:PerryLink/dsh-doublecheck#main"
62
+
63
+ # or from npm (published releases)
64
+ dsh plugin --profile web add dsh-doublecheck
65
+
66
+ # 2. restart and verify the row
67
+ dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
57
68
  ```
58
69
 
59
- | Fase | Comprobaciones | Fuente de evidencia | Coste de modelo |
70
+ Ambas filas (`doublecheck-grill` y `doublecheck-guard`) se activan automáticamente con el perfil.
71
+
72
+ ## Instalación y desinstalación
73
+
74
+ - **canal git** (última `main`): `dsh plugin --profile web add "github:PerryLink/dsh-doublecheck#main"` — el script `prepare` compila solo con dependencias de producción.
75
+ - **canal npm** (versiones publicadas): `dsh plugin --profile web add dsh-doublecheck`.
76
+ - **canal tarball**: `pnpm pack` en este repo y luego `dsh plugin --profile web add ./dsh-doublecheck-<version>.tgz`.
77
+ - **desinstalar**: `dsh plugin --profile web remove dsh-doublecheck` (o elimina las filas del parche de perfil).
78
+
79
+ 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`.
80
+
81
+ ## Configuración
82
+
83
+ 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.
84
+
85
+ | Clave | Predeterminado | Significado |
86
+ |---|---|---|
87
+ | `specFile` | `'doublecheck-spec.md'` | Archivo del workspace para el markdown del spec confirmado (fila grill). |
88
+ | `reportFile` | `'doublecheck-report.md'` | Archivo del workspace para el informe de entrega (fila grill). |
89
+ | `reportVerify` | `true` | Ejecutar el flujo de verificación por defecto (fila grill). |
90
+ | `verifyProvider` | `'fork'` | Proveedor de subagente para los verificadores por dimensión (fila grill). |
91
+ | `verifyMode` | `'all'` | `all` = un verificador paralelo por dimensión; `single` = un verificador combinado (fila grill). |
92
+ | `intensity` | `'remind'` | Fuerza de aplicación de las puertas grill, rojo/verde y de revisión (`remind` / `warn` / `block`). |
93
+ | `enableByDefault` | `true` | Interruptor maestro para sesiones sin registro `/doublecheck on\|off`. |
94
+ | `language` | `'en'` | Idioma de la prosa inyectada de recordatorio/denegación/revisión/puerta (`en` / `zh`). |
95
+ | `guardTools` | `['edit', 'write']` | Nombres de herramientas de mutación que vigilan ambas puertas. |
96
+ | `vagueTaskMaxChars` | `200` | Las tareas más largas nunca se tratan como vagas. |
97
+ | `remindOnce` | `true` | Inyecta cada recordatorio como máximo una vez por sesión (durable entre reinicios). |
98
+ | `testToolNames` | `['bash', 'pwsh']` | Nombres de herramientas shell que pueden ejecutar pruebas. |
99
+ | `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. |
100
+ | `testFilePatterns` | *(dirs de prueba, `*.test.*` / `*.spec.*`)* | Regex que identifican archivos de prueba — siempre editables, exentos de la puerta roja. |
101
+ | `modules.grill` | `true` | Apagado desactiva la puerta grill. |
102
+ | `modules.tdd` | `true` | Encendido habilita las puertas de evidencia rojo/verde. |
103
+ | `modules.adversary` | `false` | Encendido habilita la revisión de crítico bifurcado en verde. |
104
+ | `adversaryModel` | `null` | Ruta de modelo del crítico; `null` = el modelo principal se autorevisa. |
105
+ | `adversaryProvider` | `'fork'` | Proveedor de subagente sobre el que corre el crítico. |
106
+ | `adversaryMaxFindings` | `5` | Límite de hallazgos (1–20) inyectados en la sesión. |
107
+ | `adversaryTools` | `['read', 'glob', 'grep']` | Lista permitida de herramientas del crítico; mantenla de solo lectura. |
108
+ | `adversaryTimeoutMs` | `120000` | Presupuesto de tiempo duro para una ejecución del crítico. |
109
+ | `gate.enabled` | `true` | Interruptor maestro del panel de la puerta y el aviso rojo de límite de turno. |
110
+ | `gate.planSuggestion` | `true` | Añade la sugerencia de re-verificación en modo plan a los informes rojos. |
111
+ | `gate.reportFile` | `'gate-report.md'` | Archivo del workspace para el informe de la puerta. |
112
+ | `gate.requirements.checklist` | *(seis preguntas de dimensión de spec)* | Lista de preguntas clave enchufable: `{ id, question, specDimension, required }`. |
113
+ | `gate.requirements.minConfirmed` | `6` | Preguntas obligatorias mínimas que deben aprobar (1..cantidad obligatoria). |
114
+ | `gate.requirements.interrogateTool` | `'ask_user_question'` | Nombre de herramienta cuyas llamadas cuentan como evidencia de interrogatorio. |
115
+ | `gate.tests.requirePassingRun` | `true` | Una última ejecución de prueba no aprobada (o ausente) es una luz roja. |
116
+ | `gate.tests.allowFailingRuns` | `0` | Ejecuciones fallidas tras el último verde permitidas antes del rojo. |
117
+ | `gate.tests.requireCoverage` | `false` | Encendido exige evidencia de cobertura en la salida de prueba. |
118
+ | `gate.tests.minCoveragePct` | `80` | Porcentaje mínimo de cobertura (0–100). |
119
+ | `gate.consistency.*` | `provider: 'fork'`, `model: null`, `tools: ['read','glob','grep']`, `timeoutMs: 120000`, `maxFindings: 5` | Ajustes del revisor local de consistencia (`model: null` = modelo principal). |
120
+ | `gate.review.engine` | `'auto'` | `auto` = registros de veredicto de dsh-auto-review cuando están presentes, si no el revisor local; `local` = siempre local. |
121
+ | `gate.review.provider` | `'fork'` | Proveedor del revisor local de revisión (su `model`/`tools`/`timeoutMs`/`maxFindings` coinciden con `gate.consistency.*`). |
122
+
123
+ 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.
124
+
125
+ ## Herramientas y superficies
126
+
127
+ | Superficie | Tipo | Notas |
128
+ |---|---|---|
129
+ | `doublecheck_skills` | herramienta | Lista y carga las cuatro skills empaquetadas a través de la interfaz del registro de skills. |
130
+ | `doublecheck_spec` | herramienta | Confirma el spec de seis dimensiones en el registro de sesión y una copia markdown del workspace. |
131
+ | `doublecheck_report` | herramienta | Pliega la evidencia de disciplina en un informe de entrega (flujo de verificación por dimensión opcional). |
132
+ | `/doublecheck status\|report\|on\|off` | comando | Interruptor, módulos, intensidad, hechos de etapa, informe plegado y la sobrescritura durable on/off. |
133
+ | `/gate status\|run\|config` | comando | Progreso de la lista en vivo, el informe entregable/rehacer asentado y la configuración efectiva. |
134
+ | `grill-requirements`, `red-green-tdd`, `delivery-review`, `delivery-proof` | skill | Skills de disciplina empaquetadas que cubren las seis etapas del bucle. |
135
+ | `doublecheck.gate` | espacio de ajustes | La lista enchufable, expuesta a UIs con ajustes (`expose: true`, `applies: restart`). |
136
+ | `strict.patch.yml` | capa superpuesta | Cada puerta activa con intensidad `block` más el requisito de cobertura, en una capa de parche. |
137
+ | `dsh-doublecheck/invariant` | fila acompañante | Informa contradicciones de ruta de escritura propias del paquete a través del registro `invariants` del host. |
138
+
139
+ ## Fases de la puerta
140
+
141
+ 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.
142
+
143
+ | Fase | Comprobaciones | Fuente de evidencia | Costo de modelo |
60
144
  |---|---|---|---|
61
- | **Interrogación de requisitos** | Checklist configurable de preguntas clave, confirmada elemento a elemento (seis preguntas de dimensión del spec por defecto). | `doublecheck_spec` registrado + llamadas `ask_user_question`. | ninguno |
62
- | **Evidencia de pruebas** | Color de la última ejecución, ejecuciones fallidas después de green, umbral de cobertura opcional. | Ejecuciones de prueba de shell en el registro de sesión (`[exit code: N]`, porcentajes de cobertura). | ninguno |
63
- | **Consistencia de implementación** | Mapeo diff ↔ requisito: cada edición debe servir a una dimensión del spec. | Revisor bifurcado local (hallazgos estructurados, herramientas de solo lectura). | un subagente |
64
- | **Conclusión de revisión** | El veredicto de entrega. `engine: auto` consume los registros de veredicto durable de **dsh-auto-review** cuando están presentes y degrada al revisor local en caso contrario; `engine: local` usa siempre el revisor local. | Eventos `autoReview/verdict` / `autoReview/rejection`, o el revisor bifurcado local. | un subagente (local) |
145
+ | 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 |
146
+ | Evidencia de prueba | Color de la última ejecución, ejecuciones fallidas tras el verde, umbral de cobertura opcional | Ejecuciones de prueba shell en el registro de sesión (`[exit code: N]`, porcentajes de cobertura) | ninguno |
147
+ | 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 |
148
+ | 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) |
65
149
 
66
- - **Luces rojas** son comprobaciones fallidas: un spec ausente, una última ejecución de prueba que falla, cobertura por debajo del mínimo, una edición sin mapear, una llamada de motor rechazada, hallazgos de revisión blocker/major. Cada elemento rojo lleva una sugerencia de rehacer.
67
- - **Las advertencias y omisiones nunca cambian la decisión**: una revisión omitida mantiene el informe honesto («no revisado») sin inventar una luz roja — falla cerrado para las afirmaciones, nunca para la evidencia.
68
- - **Modo plan y aprobaciones**: un veredicto de rehacer sugiere reabrir el trabajo en modo plan (en el banner del informe, el panel `/gate status` y el aviso de turno de una vez por sesión). Las puertas de disciplina de abajo conservan su aplicación en la cadena de aprobación `warn`/`block`; la puerta en sí es consultiva.
69
- - **Auditable por construcción**: los informes registran solo conteos, ids y veredictos — sin contenidos de archivos ni texto de sesión. Los textos de hallazgos producidos por el modelo pasan por un redactor de secretos (claves de nube, tokens, bloques de clave privada, asignaciones de contraseña, secuencias largas hex/base64) antes de almacenarse o mostrarse. El estado asentado viaja por el evento de sesión durable `doublecheck/gate` y por el `gate-report.md` del workspace.
150
+ 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; la puerta nunca sintetiza solicitudes de aprobación.
70
151
 
71
- ### Informe de ejemplo
152
+ ## Informe de ejemplo
72
153
 
73
154
  `/gate run` devuelve este markdown — pégalo en la descripción de un PR:
74
155
 
@@ -107,371 +188,71 @@ flowchart TD
107
188
  - counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
108
189
  ````
109
190
 
110
- ### Dependencia débil de dsh-auto-review
111
-
112
- La puerta se integra con [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) como **«usar el motor cuando esté ahí»**, nunca como dependencia dura:
113
-
114
- - `review.engine: auto` (por defecto) pliega los registros de veredicto durable del motor (`autoReview/verdict` / `autoReview/rejection`) desde el registro de sesión — las conclusiones reales del motor sobre las revisiones de la cadena de aprobación de esta sesión. Las llamadas rechazadas o de alto riesgo se convierten en elementos rojos.
115
- - Sin registros (el motor no está instalado, o nada lo disparó en esta sesión) → la fase degrada al revisor bifurcado local y nombra el motivo en una comprobación de advertencia: `dsh-auto-review is not installed` / `dsh-auto-review is installed but has no verdict records in this session`.
116
- - La puerta **nunca sintetiza solicitudes de aprobación**: esa cadena puede llegar a un humano. Los propios registros del motor son la evidencia; `engine: local` la omite por completo.
117
-
118
- ### Superficie de ajustes
119
-
120
- La checklist conectable es config validada por Schema (`gate.*` en la fila guard) y además se registra como el **espacio de nombres de ajustes `doublecheck.gate`** (`expose: true`, `applies: restart`) cuando el servicio de ajustes del harness está montado — así las UIs capaces de ajustes pueden leer y editar la checklist sin editar un profile a mano.
121
-
122
- ## Funciones
123
-
124
- - 🔥 **Skill `grill-requirements`** — un skill empaquetado en formato Agent Skills que interroga la tarea en seis dimensiones (**objetivo, alcance, criterios de aceptación, modos de fallo, prioridades, no-objetivos**) con la UI nativa `ask_user_question` de DSH, se niega a escribir código hasta el consenso y registra el contrato.
125
- - 🧰 **Skills de etapa para todo el bucle** — `red-green-tdd` (escribe la prueba que falla, ejecuta red, implementa, ejecuta green), `delivery-review` (autorrevisión adversaria contra el spec una vez en green) y `delivery-proof` (consolida la evidencia en el informe de entrega y pasa la puerta de entrega antes de declarar completado) se unen a `grill-requirements`: las seis etapas tienen guía de modelo, no solo la primera.
126
- - 📜 **Herramienta `doublecheck_spec`** — guarda el spec acordado en el registro de sesión y escribe una copia en markdown en el workspace, para que el contrato sobreviva a la conversación. Las dimensiones vacías o solo con espacios se rechazan en el commit (v0.6): el grill debe asentar las seis antes de que el spec cuente.
127
- - 🔄 **Re-grill ante cambio de tarea** — un spec registrado cubre su propia tarea: una nueva petición directa del usuario después del último spec reabre la puerta grill para ese seguimiento, en lugar de heredar el contrato anterior en silencio.
128
- - 🛡️ **Guard de disciplina** — una puerta blanda en el pipeline de políticas de herramientas. Tarea vaga + sin spec + rumbo a `edit`/`write` → **recordar**, **pedir aprobación humana** o **bloquear**, según `intensity`.
129
- - 🟥🟩 **Puertas de evidencia red/green** (`modules.tdd`) — comprobaciones duras sobre el registro de sesión: una edición de implementación requiere una **prueba que falla registrada** desde la última prueba que pasa (escribir archivos de prueba siempre está permitido — así ocurre el paso red), y un turno que termina con ediciones pero sin ninguna prueba que pasa recibe un recordatorio green inyectado. Las herramientas guard personalizadas funcionan de serie: las puertas leen las claves de argumento `file_path` y `path`, y una llamada que no nombra ningún archivo no se trata como edición de implementación.
130
- - 👁️ **Revisión adversaria** (`modules.adversary`) — una vez que la entrega alcanza green, un subagente crítico bifurcado (seam nativo de subagentes de DSH, provider `fork` por defecto) audita la sesión contra el spec registrado con una postura adversaria y devuelve hallazgos estructurados, ordenados con los blockers primero. `remind` inyecta la crítica; `warn`/`block` además dirigen una ronda para que el modelo responda a los hallazgos. `adversaryModel` enruta al crítico hacia un modelo separado; la allowlist de herramientas del crítico es de solo lectura por defecto. Los hallazgos viajan por la fuente de mensajes durable `doublecheck-review`. La revisión se rearma cuando el crítico termina: las ediciones de implementación posteriores al último registro de revisión disparan otra ronda, y cancelar el turno aborta al crítico en vuelo.
131
- - 🚦 **Puerta de calidad de entrega** (v0.7) — la checklist configurable de cuatro fases de arriba: interrogación de requisitos (preguntas clave confirmadas elemento a elemento), evidencia de pruebas (color de ejecución, casos fallidos, umbral de cobertura), consistencia de implementación (mapeo diff ↔ requisito por un revisor local) y la conclusión de revisión (registros de veredicto de dsh-auto-review con una degradación local honesta). Una única decisión de **entregable / rehacer requerido**, elementos rojos con sugerencias de rehacer, una sugerencia de re-comprobación en modo plan en rojo, un aviso rojo en el límite del turno (breve, una vez por sesión) y el informe markdown listo para PR.
132
- - ⌨️ **Comando de sesión `/gate`** — `status` muestra el progreso en vivo de la checklist (las fases deterministas se pliegan al momento; las fases de revisor muestran la última ejecución), `run` asienta la puerta completa y devuelve el informe, `config` muestra la checklist y los umbrales efectivos.
133
- - 🌐 **Superficie de modelo totalmente localizada** — cada cadena visible para el modelo que el paquete inyecta o responde (recordatorios, feedback de denegación/consulta, dirección de revisión, avisos de puerta, avisos de cambio, respuestas de `/doublecheck` y `/gate`, y los prompts de tarea del revisor) respeta `language: 'en' | 'zh'`; los documentos spec/report/gate del workspace conservan sus encabezados estables en inglés y sus ids de auditoría.
134
- - 📊 **Informe doublecheck + workflow de verificación** (`doublecheck_report`, v0.4) — consolida la evidencia de disciplina de la sesión (spec, cronología red/green, hallazgos de revisión, ediciones) en un informe de entrega con un veredicto derivado (`grill → draft → red → green → objections/verified → proven/challenged/unverified`), escrito en el workspace. Con `verify`, los verificadores por dimensión corren a través del seam de workflow de DSH (`verifyMode: all` lanza un verificador paralelo por dimensión; `single` ejecuta uno combinado) y sus veredictos se pliegan en el informe — `proven` exige un veredicto para cada dimensión.
135
- - 🚦 **Puerta de entrega** — en el límite del turno, una entrega que llegó a green sin `doublecheck_report` registrado recibe un recordatorio de informe esperado antes de declarar completado; un informe exitoso avanza la etapa a `verify`.
136
- - 🔁 **Estado duradero** — todo artefacto visible para el modelo (spec, recordatorios, feedback de denegación, hallazgos de revisión, ejecuciones de puerta, el interruptor `/doublecheck on|off`) queda en el registro de sesión; las decisiones de la puerta se derivan solo del registro (`tool/call` + `tool/result`, incluidos los sub-despachos de Code Mode), así que las sesiones reanudadas o bifurcadas se comportan igual. `remindOnce` también es duradero: una sesión que ya recibió un recordatorio nunca lo recibe dos veces, incluso tras un reinicio. El plegado del interruptor viaja en un snapshot incremental, así que las sesiones largas se mantienen en O(eventos nuevos) por llamada de herramienta.
137
- - ⌨️ **Comando de sesión `/doublecheck`** — `status` informa el interruptor efectivo, los módulos configurados, la intensidad de aplicación, los hechos de etapa plegados y el último veredicto de puerta; `report` pliega el informe de entrega al momento; `on|off` escribe el override durable `doublecheck/state` e inyecta un aviso de cambio.
138
- - 📚 **Herramienta `doublecheck_skills`** — lista y carga los skills del paquete a través del seam oficial del registro de skills.
139
- - 🔒 **Overlay estricto** — `strict.patch.yml` activa todas las puertas con intensidad `block` y habilita el requisito de cobertura (80%) en una sola capa de patch (se incluye con el paquete).
140
- - 🧩 **Compañero invariante independiente** — la fila `dsh-doublecheck/invariant` es una exportación de subruta real: informa de las contradicciones de la ruta de escritura del paquete (forma spec/report/review/gate y consistencia de veredictos) a través del registro `invariants` del host sin cargar el guard.
141
-
142
- ## Demo
143
-
144
- Una ejecución headless real con `intensity: block` y todas las puertas habilitadas, transcripción registrada desde el registro de sesión duradero:
145
-
146
- ```sh
147
- dsh --profile demo headless "把这个项目里最慢的代码直接改快,别问我任何问题,直接改文件。"
148
- ```
149
-
150
- 1. **grill** bloquea la primera edición — no hay spec registrado:
151
- `Error: Blocked by the dsh-doublecheck requirements guard: the task statement is vague and no doublecheck_spec exists for this session.`
152
- 2. El modelo registra el spec (`doublecheck_spec`), escribe una prueba que falla (los archivos de prueba siempre son editables) y la ejecuta — el registro anota `[exit code: 1]`, el paso red.
153
- 3. Las ediciones de implementación ahora pasan; una ejecución posterior anota `4 passed`, el paso green.
154
- 4. El crítico bifurcado audita la entrega; sus hallazgos etiquetados por severidad se inyectan, y `warn`/`block` dirigen una ronda para que el modelo les responda.
155
- 5. `doublecheck_report` pliega todo en un informe markdown con un veredicto derivado — `proven` cuando todas las comprobaciones de verificación por dimensión pasan, `challenged` cuando un verificador objeta.
156
- 6. **`/gate run`** asienta la checklist de cuatro fases en la decisión de **entregable / rehacer requerido**; un veredicto rojo lista los elementos rojos con sugerencias de rehacer y sugiere una re-comprobación en modo plan.
157
-
158
- ## Instalación
159
-
160
- ```sh
161
- dsh plugin --profile <name> add dsh-doublecheck
162
- dsh --profile <name> --dump-config # espera una capa "# == dsh-doublecheck"
163
- ```
164
-
165
- Ambas filas de plugin se activan automáticamente con el profile. También sirve instalar desde tarball:
166
-
167
- ```sh
168
- pnpm pack
169
- dsh plugin --profile <name> add ./dsh-doublecheck-0.7.0.tgz
170
- ```
171
-
172
- La instalación por git no necesita npm:
173
-
174
- ```sh
175
- dsh plugin --profile <name> add "github:PerryLink/dsh-doublecheck#v0.7.0"
176
- ```
177
-
178
- Para un modo estricto sin configuración (todas las puertas activas, intensidad `block`, cobertura de puerta requerida), aplica el overlay incluido encima del bundle patch:
179
-
180
- ```sh
181
- dsh --profile <name> --patch ./node_modules/dsh-doublecheck/strict.patch.yml
182
- ```
183
-
184
- ## Desinstalación
185
-
186
- ```sh
187
- dsh plugin --profile <name> remove dsh-doublecheck
188
- ```
189
-
190
- Para mantener el paquete pero desactivar una fila: sobrescríbela por id con `disabled: true` en el `cordis.patch.yml` del profile (`doublecheck-grill` / `doublecheck-guard`).
191
-
192
- ## Compatibilidad
193
-
194
- - Verificado contra los peers `0.1.0-rc.6` (`@deepseek-ai/cordis ^4.0.1`); última verificación 2026-08-14 (Windows + Node 22).
195
- - Las escrituras de sesión durable (`/doublecheck on|off` → `doublecheck/state`, `/gate run` → `doublecheck/gate`) necesitan la superficie de escritura `ignorable` del host (harness posterior a rc.6): en los hosts rc.6 el options bag se ignora y el evento queda required-on-read, así que el interruptor se mantiene en memoria y el registro de puerta vive solo en el resultado del comando + el archivo del workspace, hasta actualizar el harness.
196
- - El espacio de nombres de ajustes `doublecheck.gate` se registra solo cuando el servicio de ajustes del harness está montado; los profiles sin él simplemente no tienen superficie de ajustes.
197
- - La línea `plan mode:` de `/gate status` lee el servicio opcional `ctx.planMode`; los profiles sin él muestran `unknown`.
198
-
199
191
  ## Permisos y datos
200
192
 
201
- - **Lee**: solo en proceso el registro de sesión (`tool/call` / `tool/result` / `tool/code-dispatch`, fuentes `user/message` inyectadas y los registros de veredicto foráneos `autoReview/*`); el estado opcional del servicio de modo plan.
202
- - **Escribe**: `doublecheck-spec.md`, `doublecheck-report.md` y `gate-report.md` en el workspace de la sesión (rutas configurables), vía el seam `ctx.fs`; los eventos de sesión durable `doublecheck/state` y `doublecheck/gate`.
203
- - **Llamadas al modelo**: las fases de consistencia y revisión local de la puerta (un subagente cada una por `/gate run`), la revisión adversaria opcional (`modules.adversary`, off por defecto) y el workflow de verificación de `doublecheck_report` (on por defecto) lanzan subagentes; nada más llama al modelo o a la red.
204
- - **Nunca toca**: credenciales, variables de entorno ni archivos fuera del workspace de la sesión. Los informes de puerta contienen solo conteos, ids y veredictos; los secretos reconocidos en los textos del revisor se redactan antes de almacenarse o mostrarse.
205
-
206
- ## Resolución de problemas
207
-
208
- | Síntoma | Causa y solución |
209
- |---|---|
210
- | No aparece la capa `# == dsh-doublecheck` en `--dump-config` | Falta el bundle patch o una fila está `disabled` — revisa el orden de parches del profile y los ids de fila. |
211
- | Los gates nunca reaccionan | Ejecuta `/doublecheck status`: el interruptor de sesión puede estar apagado, o todos los `modules.*` están en false. |
212
- | "Adversary review did not run: the subagents seam is not mounted" | Esta composición de profile no provee subagentes — monta uno (las composiciones spine lo traen) o desactiva `modules.adversary`. |
213
- | `doublecheck_report` muestra `verification: null` | Falta el seam `workflowEngine` o el run fue rechazado/abortado — el informe lo indica en lugar de adivinar. |
214
- | El informe dice `unverified` | La verificación corrió pero no todas las dimensiones del spec devolvieron veredicto — reintenta con `verify: true`; `proven` exige las seis. |
215
- | `/gate run` muestra `Review conclusion — WARN: dsh-auto-review is not installed` | Degradación esperada: la fila del motor no está en este profile. Instala `dsh-auto-review`, o pon `gate.review.engine: local` para omitir la detección. |
216
- | `/gate run` muestra `Implementation consistency — SKIP` | Falta el seam `subagents` (o el run agotó el tiempo) — monta un provider de subagentes; la puerta nunca falsifica un veredicto. |
217
- | `/gate status` muestra `plan mode: unknown` | El profile no tiene montado un servicio de modo plan; la sugerencia sigue apareciendo en el informe y en el aviso de turno. |
218
- | El registro de puerta no está en el registro de sesión | Este host rc.6 no estampa el marcador `ignorable` — el registro vive solo en el resultado del comando y en `gate-report.md`. |
219
-
220
- ## Configuración
221
-
222
- Sobrescribe cualquier fila **por id** en el `cordis.patch.yml` del profile. Un patch reemplaza toda la config de la fila — reescribe cada clave:
223
-
224
- ```yaml
225
- - id: doublecheck-grill
226
- config:
227
- specFile: 'specs/doublecheck-spec.md' # default: 'doublecheck-spec.md'
228
- reportFile: 'specs/doublecheck-report.md' # default: 'doublecheck-report.md'
229
- reportVerify: true # run the verify workflow by default
230
- verifyProvider: 'fork' # provider for the per-dimension checkers
231
- reportTestToolNames: ['bash', 'pwsh']
232
- reportTestCommandPatterns:
233
- - '(?:^|[;&|]\s*)(?:(?:pnpm|npm|npx|yarn|bun)(?:\s+run)?\s+(?:test|vitest|jest|mocha)(?:\s|$))'
234
- - '(?:^|[;&|]\s*)(?:(?:pytest|go\s+test|cargo\s+test|make\s+test|ctest)(?:\s|$))'
235
- - '(?:^|[;&|]\s*)(?:node\s+--test(?:\s|$))'
236
- - '(?:^|[;&|]\s*)(?:deno\s+test|uv\s+run\s+pytest)(?:\s|$)'
237
- reportMutationTools: ['edit', 'write']
238
- reportTestFilePatterns:
239
- - '(^|[\\/])(tests?|__tests__|specs?)([\\/]|$)'
240
- - '\\.(test|spec)\\.[A-Za-z0-9]+$'
241
-
242
- - id: doublecheck-guard
243
- config:
244
- intensity: warn
245
- modules:
246
- grill: true
247
- tdd: true # red/green evidence gates (v0.2)
248
- adversary: true # forked critic review (v0.3)
249
- adversaryModel: null # or e.g. 'deepseek-v4-pro' for a separate critic model
250
- adversaryProvider: 'fork' # subagent provider the critic runs on
251
- adversaryMaxFindings: 5 # findings cap injected into the session
252
- adversaryTools: ['read', 'glob', 'grep'] # critic tool allowlist (read-only)
253
- adversaryTimeoutMs: 120000 # hard budget for one critic run
254
- guardTools: ['edit', 'write']
255
- vagueTaskMaxChars: 200
256
- remindOnce: true
257
- testToolNames: ['bash', 'pwsh']
258
- testCommandPatterns:
259
- - '(?:^|[;&|]\s*)(?:(?:pnpm|npm|npx|yarn|bun)(?:\s+run)?\s+(?:test|vitest|jest|mocha)(?:\s|$))'
260
- - '(?:^|[;&|]\s*)(?:(?:pytest|go\s+test|cargo\s+test|make\s+test|ctest)(?:\s|$))'
261
- - '(?:^|[;&|]\s*)(?:node\s+--test(?:\s|$))'
262
- - '(?:^|[;&|]\s*)(?:deno\s+test|uv\s+run\s+pytest)(?:\s|$)'
263
- testFilePatterns:
264
- - '(^|[\\/])(tests?|__tests__|specs?)([\\/]|$)'
265
- - '\\.(test|spec)\\.[A-Za-z0-9]+$'
266
- gate:
267
- enabled: true
268
- planSuggestion: true
269
- reportFile: 'gate-report.md'
270
- requirements:
271
- enabled: true
272
- checklist:
273
- - { id: goal, question: 'What outcome must the delivery produce?', specDimension: goal, required: true }
274
- - { id: scope, question: 'What is in scope, and what is out of scope?', specDimension: scope, required: true }
275
- - { id: acceptance, question: 'Which observable checks prove the work is done?', specDimension: acceptanceCriteria, required: true }
276
- - { id: failureModes, question: 'What can go wrong, and what is the correct behavior in each case?', specDimension: failureModes, required: true }
277
- - { id: priorities, question: 'What is traded when goals conflict; what is optional?', specDimension: priorities, required: true }
278
- - { id: nonGoals, question: 'What does the user explicitly not want?', specDimension: nonGoals, required: true }
279
- minConfirmed: 6
280
- interrogateTool: 'ask_user_question'
281
- tests:
282
- enabled: true
283
- requirePassingRun: true
284
- allowFailingRuns: 0
285
- requireCoverage: false
286
- minCoveragePct: 80
287
- coveragePattern: 'coverage[^\d]{0,40}(\d+(?:\.\d+)?)\s*%'
288
- consistency:
289
- enabled: true
290
- provider: fork
291
- model: null
292
- tools: ['read', 'glob', 'grep']
293
- timeoutMs: 120000
294
- maxFindings: 5
295
- review:
296
- enabled: true
297
- engine: auto # auto = dsh-auto-review verdict records, else local
298
- provider: fork
299
- model: null
300
- tools: ['read', 'glob', 'grep']
301
- timeoutMs: 120000
302
- maxFindings: 5
303
- ```
304
-
305
- El `strict.patch.yml` incluido es exactamente esta fila guard con `intensity: block`, todos los módulos activos y el requisito de cobertura de puerta habilitado — aplícalo como capa de patch después del bundle patch para el modo estricto sin editar un profile a mano.
306
-
307
- ### `intensity`
308
-
309
- | Valor | Comportamiento ante un `edit`/`write` sujeto a la puerta |
310
- |---|---|
311
- | `remind` (por defecto) | La llamada sigue; un recordatorio viaja en el contexto del resultado hacia la siguiente petición del modelo. |
312
- | `warn` | La llamada queda retenida a la espera de aprobación humana única vía el seam de aprobación (deniega si no hay canal). |
313
- | `block` | La llamada se deniega con feedback que dirige al modelo a corregir primero la disciplina. |
314
-
315
- ### Ajustes
316
-
317
- | Clave | Por defecto | Significado |
318
- |---|---|---|
319
- | `modules.grill` | `true` | En `false` desactiva la puerta grill. El interruptor de los skills/herramientas grill es el flag `disabled` de su fila. |
320
- | `modules.tdd` | `true` | En `true` activa las puertas de evidencia red/green (v0.2); activado por defecto desde v0.5. |
321
- | `modules.adversary` | `false` | En `true` activa la revisión del crítico bifurcado en green (v0.3); usa el seam `ctx.subagents` — un seam ausente se resuelve como un aviso «no disponible». |
322
- | `enableByDefault` | `true` | Interruptor maestro para sesiones sin un registro `/doublecheck on|off`. |
323
- | `language` | `'en'` | Idioma de la prosa inyectada de recordatorio/denegación/revisión/puerta (`en` / `zh`). |
324
- | `guardTools` | `['edit', 'write']` | Nombres de herramientas de mutación que vigila el guard. |
325
- | `vagueTaskMaxChars` | `200` | Las tareas más largas nunca se consideran vagas. Las tareas breves que nombran un archivo, ruta, URL, una palabra clave con guion bajo o una palabra clave con guion son concretas. |
326
- | `remindOnce` | `true` | Inyectar el recordatorio de cada puerta como máximo una vez por sesión — durable entre reinicios (plegado desde el registro). |
327
- | `testToolNames` | `['bash', 'pwsh']` | Nombres de herramientas de shell que pueden ejecutar pruebas. |
328
- | `testCommandPatterns` | *(pnpm/npm/yarn/bun test, pytest, go/cargo/make test, node --test, deno test, uv run pytest)* | Expresiones regulares con las que debe coincidir un comando para contar como ejecución de prueba. |
329
- | `testFilePatterns` | *(directorios de prueba, `*.test.*` / `*.spec.*`)* | Expresiones regulares que identifican archivos de prueba — siempre editables, exentos de la puerta red. |
330
- | `adversaryModel` | `null` | Ruta del modelo crítico; `null` = el modelo principal se autorrevisa. |
331
- | `adversaryProvider` | `'fork'` | Nombre del provider de subagentes en el que corre el crítico. |
332
- | `adversaryMaxFindings` | `5` | Tope de hallazgos (1–20) inyectados en la sesión. |
333
- | `adversaryTools` | `['read', 'glob', 'grep']` | Allowlist de herramientas del crítico; mantenla de solo lectura. |
334
- | `adversaryTimeoutMs` | `120000` | Presupuesto de tiempo duro para una ejecución del crítico. |
335
-
336
- La mala configuración falla en voz alta: una regex inválida, una lista de nombres vacía o duplicada, o un tope de hallazgos fuera de rango lanza un error al cargar en lugar de no hacer nada en silencio. Un crítico que no puede ejecutarse (seam ausente, fallo del provider, timeout) se resuelve como un aviso honesto «no disponible» en la sesión.
337
-
338
- ### Controles del informe (fila grill)
339
-
340
- | Clave | Por defecto | Significado |
341
- |---|---|---|
342
- | `reportFile` | `'doublecheck-report.md'` | Archivo del workspace que recibe el markdown del informe. |
343
- | `reportVerify` | `true` | Valor por defecto para el flag `verify` de la herramienta. |
344
- | `verifyProvider` | `'fork'` | Provider de subagentes en el que corren los verificadores por dimensión. |
345
- | `verifyMode` | `'all'` | `all` = un verificador paralelo por dimensión; `single` = un verificador combinado (un subagente, más barato). |
346
- | `reportTestToolNames` / `reportTestCommandPatterns` | *(same defaults as the guard row)* | Clasificación de ejecuciones de prueba con alcance de informe. |
347
- | `reportMutationTools` / `reportTestFilePatterns` | *(same defaults as the guard row)* | Clasificación de ediciones de implementación con alcance de informe. |
348
-
349
- Los controles de clasificación del informe son independientes de los del guard: la aplicación de la puerta y el plegado del informe se pueden ajustar por separado sin que uno cambie silenciosamente al otro. La verificación degrada honestamente: un seam `workflowEngine` ausente o una ejecución rechazada deja `verification: null` y el markdown lo dice.
193
+ - **Lee**: el registro de sesión (`tool/call` / `tool/result` / `tool/code-dispatch`, fuentes `user/message` inyectadas y los registros de veredicto ajenos `autoReview/*`) solo en proceso; el estado opcional del servicio de modo plan.
194
+ - **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`.
195
+ - **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.
196
+ - **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.
350
197
 
351
- ### Controles de puerta (fila guard)
198
+ ## Límites de seguridad
352
199
 
353
- | Clave | Por defecto | Significado |
354
- |---|---|---|
355
- | `gate.enabled` | `true` | Interruptor maestro del panel de puerta y del aviso rojo en el límite del turno. |
356
- | `gate.planSuggestion` | `true` | Añade la sugerencia de re-comprobación en modo plan a los informes y paneles rojos. |
357
- | `gate.reportFile` | `'gate-report.md'` | Archivo del workspace que recibe el informe de puerta. |
358
- | `gate.requirements.enabled` | `true` | En `false` omite la fase de requisitos. |
359
- | `gate.requirements.checklist` | *(seis preguntas de dimensión del spec)* | La checklist conectable de preguntas clave: `{ id, question, specDimension, required }`. `specDimension: null` se muestra como una advertencia de confirmación manual; las preguntas opcionales fallidas son advertencias, no luces rojas. |
360
- | `gate.requirements.minConfirmed` | `6` | Mínimo de preguntas obligatorias que deben pasar (1..cantidad obligatoria). |
361
- | `gate.requirements.interrogateTool` | `'ask_user_question'` | Nombre de la herramienta cuyas llamadas cuentan como evidencia de interrogación. |
362
- | `gate.tests.enabled` | `true` | En `false` omite la fase de evidencia de pruebas. |
363
- | `gate.tests.requirePassingRun` | `true` | Una última ejecución de prueba que no pasa (o ausente) es una luz roja. |
364
- | `gate.tests.allowFailingRuns` | `0` | Ejecuciones fallidas después del último green permitidas antes de la luz roja. |
365
- | `gate.tests.requireCoverage` | `false` | En `true` exige evidencia de cobertura en la salida de las pruebas. |
366
- | `gate.tests.minCoveragePct` | `80` | Porcentaje mínimo de cobertura (0–100). |
367
- | `gate.tests.coveragePattern` | `coverage…(\d+…)%` | Regex con un grupo de captura que parsea el porcentaje de cobertura (compilada sin distinguir mayúsculas). |
368
- | `gate.consistency.enabled` | `true` | En `false` omite la fase de mapeo diff ↔ requisito. |
369
- | `gate.consistency.provider` / `.model` / `.tools` / `.timeoutMs` / `.maxFindings` | `fork` / `null` / `read,glob,grep` / `120000` / `5` | Controles del revisor de consistencia local (model `null` = modelo principal). |
370
- | `gate.review.enabled` | `true` | En `false` omite la conclusión de revisión. |
371
- | `gate.review.engine` | `'auto'` | `auto` = registros de veredicto de dsh-auto-review cuando están presentes, si no el revisor local; `local` = siempre el revisor local. |
372
- | `gate.review.provider` / `.model` / `.tools` / `.timeoutMs` / `.maxFindings` | *(same as consistency)* | Controles del revisor de revisión local. |
200
+ - **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`.
201
+ - **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.
202
+ - **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.
203
+ - **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.
204
+ - **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.
373
205
 
374
- La configuración de la puerta se valida fallando en voz alta al cargar (ids duplicados, dimensiones de spec desconocidas, umbrales fuera de rango, regexes inválidas, listas de herramientas vacías lanzan error), y la checklist se expone a través del espacio de nombres de ajustes `doublecheck.gate` cuando el servicio de ajustes está montado. La puerta nunca sintetiza solicitudes de aprobación; los revisores locales son de solo lectura por defecto.
206
+ ## Limitaciones conocidas
375
207
 
376
- ## Cómo funciona (puntos de extensión)
377
-
378
- | Contribución | Mecanismo DSH |
379
- |---|---|
380
- | Skills empaquetados | `ctx.skills.registerProvider()` — seam de capacidad de skills, `source: bundled` |
381
- | Herramienta de catálogo/carga | `ctx.tools.register()` — `doublecheck_skills` |
382
- | Spec + archivo en workspace | herramienta `doublecheck_spec` + escritura opcional vía `ctx.fs` |
383
- | Puerta de requisitos | waterfall `tools/pre-execute` — `allow` / `ask` (seam de aprobación) / `deny` |
384
- | Puerta red | waterfall `tools/pre-execute` — comprobación dura de la evidencia de prueba fallida antes de las ediciones de implementación |
385
- | Inyección de recordatorio | waterfall `tools/post-execute` — `additionalContexts` → registrado como `user/message` |
386
- | Puerta green | `agent/turn-stopping` serial — inyecta un recordatorio de finalización cuando las ediciones carecen de una prueba que pasa |
387
- | Revisión adversaria | `ctx.subagents.start()` — forked critic with structured findings schema, injected at green; `warn`/`block` steer one round |
388
- | Informe de entrega | `doublecheck_report` tool — session-log fold + workspace markdown |
389
- | Workflow de verificación | `ctx.workflowEngine.start()` — one parallel checker per spec dimension, structured checks |
390
- | Fases deterministas de la puerta | pliegues puros del registro de sesión — checklist de preguntas clave contra el spec registrado; evidencia de ejecución de pruebas/cobertura |
391
- | Fases de revisor de la puerta | `ctx.subagents.start()` — mapeador de consistencia + revisor local, hallazgos estructurados, herramientas de solo lectura |
392
- | Revisión de motor | pliegues durables `autoReview/verdict` / `autoReview/rejection` + sondeo de presencia `ctx.commands.list()` (dependencia débil, sin import) |
393
- | Sugerencia de modo plan | prosa de informe/panel + aviso de turno de una vez por sesión; lectura de `ctx.planMode` para la línea de estado (opcional) |
394
- | Comando `/gate` | `ctx.commands.register()` — `status|run|config`; `run` escribe el evento durable `doublecheck/gate` + `gate-report.md` |
395
- | Superficie de ajustes | `ctx.settings.register('doublecheck.gate', schema, { expose: true, applies: 'restart' })` cuando está montado |
396
- | Estado duradero | session log fold over `tool/call` + `tool/result` + `tool/code-dispatch` + injected structured sources + `doublecheck/state` + `doublecheck/gate`; model-visible ⟺ logged |
397
- | Comando de sesión | `ctx.commands.register()` — `/doublecheck status|report|on|off`; `on|off` escribe el evento de sesión durable `doublecheck/state` |
398
- | Proyección de sesión | registro `sessionProjections` — la vista `doublecheck` ahora lleva `gateVerdict` + `gateRedCount` (stateVersion 2) |
399
- | Eventos internos | `doublecheck/spec`, `doublecheck/reminder`, `doublecheck/review`, `doublecheck/report`, `doublecheck/gate` (typed via declaration merging, `@mode emit`) |
400
-
401
- Sin cambios en el agent-loop. Cada registro es un `ctx.effect` / `ctx.on` / `register()` de servicio reversible.
402
-
403
- ## Qué ve el modelo
404
-
405
- - El skill `grill-requirements` se une al catálogo de skills de la sesión y se carga con la herramienta integrada `skill` (o `doublecheck_skills`).
406
- - `ask_user_question` sigue siendo la forma nativa de DSH de preguntar al usuario; el skill solo la coreografía (y en headless sin provider degrada a preguntas en prosa).
407
- - Los recordatorios llegan como contexto `{kind:'plugin'}`, así que las UIs de transcripción los muestran como metadatos de inyección.
408
- - La crítica del adversario llega de la misma manera cuando el crítico se asienta, con hallazgos etiquetados por severidad; bajo `warn`/`block` el bucle se dirige una ronda para que el modelo les responda.
409
- - `doublecheck_report` devuelve el informe consolidado como resultado de herramienta (spec, cronología de pruebas, revisión, verificación, veredicto), así que «demostrar la entrega» está a una llamada de distancia.
410
- - El aviso rojo de puerta en el turno llega como contexto `{kind:'doublecheck-gate'}` — una frase breve de declaración de rol más el conteo de rojos y la sugerencia de modo plan.
411
- - `/doublecheck` y `/gate` responden directamente en la transcripción: `status` muestra el interruptor, los módulos, la intensidad, los hechos de etapa y el último veredicto de puerta; `report` imprime el informe plegado; `on|off` cambia el interruptor de sesión; `/gate run` devuelve el informe de puerta listo para PR.
412
-
413
- ## Comandos de sesión
414
-
415
- ```
416
- /doublecheck status|report|on|off
417
- /gate status|run|config
418
- ```
419
-
420
- - `/doublecheck status` — interruptor efectivo (el override durable vence al valor por defecto de la config), módulos configurados, intensidad de aplicación, los hechos de etapa plegados (spec registrado, color red/green, revisión en registro, número de ediciones) y el último veredicto de puerta.
421
- - `/doublecheck report` — pliega el informe de entrega desde el registro de sesión al momento (sin workflow de verificación; `doublecheck_report` es dueño de esa ruta).
422
- - `/doublecheck on|off` — escribe el evento durable `doublecheck/state` (sobrevive a reinicio, reanudación y bifurcación — el replay ES el estado) e inyecta un aviso de cambio visible para el modelo.
423
- - `/gate status` — el progreso en vivo de la checklist: las fases deterministas se pliegan al momento, las fases de revisor y el veredicto muestran la última ejecución `doublecheck/gate`, más el estado de modo plan.
424
- - `/gate run` — asienta la checklist completa de cuatro fases (pliegues deterministas + dos forks de revisor local en paralelo; los registros de veredicto del motor cuando están presentes), escribe el evento durable `doublecheck/gate` y `gate-report.md`, y devuelve el markdown del informe.
425
- - `/gate config` — muestra la checklist efectiva, los umbrales y los controles del revisor.
426
-
427
- Todas las respuestas del comando respetan el ajuste `language` de la fila guard; los documentos de informe conservan sus encabezados estables en inglés y sus ids de auditoría.
428
-
429
- ## Hoja de ruta
430
-
431
- El bucle de disciplina y la puerta de entrega se incluyen ambos: **grill → design → red → green → review → verify** (v0.1 → v0.6) más la **puerta de calidad de cuatro fases con la decisión de entregable/rehacer** (v0.7). Los fixtures de regresión con transcripciones reales fijan las formas de los eventos durables (`tests/fixtures/`). Trabajo futuro: una pestaña de ajustes en la Web UI y una insignia de puerta para la proyección `doublecheck`, un formato de informe más rico y la siembra de spec entre sesiones desde el archivo del workspace.
208
+ - **Escrituras durables en rc.6.** `/doublecheck on\|off` → `doublecheck/state` y `/gate run` → `doublecheck/gate` necesitan la superficie de append `ignorable` del host (post-rc.6); en hosts rc.6 la bolsa de opciones se ignora y el evento sigue siendo de lectura obligatoria, así que el interruptor queda en memoria y el registro de la puerta vive solo en el resultado del comando + el archivo del workspace hasta actualizar el harness.
209
+ - **Interfaces opcionales.** El espacio de ajustes `doublecheck.gate` se registra solo cuando el servicio de ajustes está montado; 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`.
210
+ - **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.
432
211
 
433
212
  ## Desarrollo
434
213
 
435
214
  ```sh
436
- pnpm install --ignore-workspace
437
- pnpm run typecheck
438
- pnpm run lint
439
- pnpm run test
440
- pnpm run build
215
+ pnpm install # node ^22.19 || >=24
216
+ pnpm run build # tsc --noEmitOnError (lib/ is committed)
217
+ pnpm run prepare # tsc --noEmitOnError (git-install channel)
218
+ pnpm run prepublishOnly # build + full test suite
219
+ pnpm run typecheck # tsc --noEmit + tests tsconfig
220
+ pnpm run lint # eslint src tests
221
+ pnpm test # vitest run
222
+ pnpm run test:coverage # vitest run --coverage
223
+ pnpm run pack:check # build + pack the tarball
441
224
  ```
442
225
 
443
- ## Agradecimientos
444
-
445
- Metodología inspirada en [obra/superpowers](https://github.com/obra/superpowers) (disciplina de ingeniería estilo TDD) y [TimothyVang/Grill-me](https://github.com/TimothyVang/Grill-me) (interrogar los requisitos antes de implementar). Este paquete es una implementación original: no se copia ningún texto, prompt o archivo de ninguno de los dos proyectos.
226
+ ## Temas
446
227
 
447
- ## Colaboradores
228
+ `dsh`, `dsh-plugin`, `deepseek-harness`, `engineering-discipline`, `requirements`, `guard`, `skill`, `quality-gate`, `delivery-gate`
448
229
 
449
- - [PerryLink](https://github.com/PerryLink) — autor y mantenedor: el bucle de disciplina v0.1 → v0.7 y la puerta de entrega, la documentación en cinco idiomas, el pipeline de CI/publicación y los envíos al ecosistema ([awesome-dsh-plugin#451](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/pull/451), [awesome-dsh-plugins#147](https://github.com/AdamPlatin123/awesome-dsh-plugins/pull/147), [awesome-deepseek-harness#179](https://github.com/0xsline/awesome-deepseek-harness/pull/179), [bruc3van/awesome-dsh-plugin#36](https://github.com/bruc3van/awesome-dsh-plugin/pull/36), [dsh-hub-workshop#13](https://github.com/omdsh-dev/dsh-hub-workshop/issues/13)/[#19](https://github.com/omdsh-dev/dsh-hub-workshop/pull/19)).
230
+ ## Contribuidores
450
231
 
451
- Issues, pull requests y Discussions son bienvenidos — los puntos de entrada están al inicio de este documento.
232
+ - [@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.
452
233
 
453
- ## Familia de plugins DSH de PerryLink
234
+ ## PerryLink DSH Plugin Family
454
235
 
455
- Este proyecto es uno de los [15 plugins de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, probablemente los demás también:
236
+ Este proyecto es uno de los [15 complementos de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, los demás probablemente también:
456
237
 
457
- | Plugin | Una línea |
238
+ | Plugin | One-liner |
458
239
  |---|---|
459
- | [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Panel de runtime MCP de solo lectura: comando /mcp + pestaña de Ajustes con estado, herramientas y errores |
460
- | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Guard de disciplina de ingeniería + puerta de calidad de entrega: grill de requisitos, puertas de pruebas, revisión adversaria, panel entregable/rehacer de /gate |
461
- | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Agentes hijos en segundo plano durables con sidebar en la Web UI, mensajería e interrupción |
462
- | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | Diagnósticos, formateo, completado, acciones de código y rename de LSP sobre servidores de lenguaje |
463
- | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Cambio de estilo de salida en runtime equivalente a outputStyles de Claude Code |
464
- | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Equivalente a /rewind de Claude Code: snapshots, forks de sesión, restauración de un disparo |
465
- | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Reglas de permisos declarativas allow/deny/ask estilo Claude Code con auditoría |
466
- | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Auto-revisión de segundo modelo en la cadena de aprobación, fail-closed por defecto |
467
- | [dsh-memento](https://github.com/PerryLink/dsh-memento) | Memoria entre sesiones con aprobación: seam ctx.memory + SQLite + herramienta de memoria |
468
- | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Pack de skills de auditoría de seguridad: escaneo de secretos, revisión de dependencias y cadena de suministro |
469
- | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Fija sesiones en el sidebar web con orden durable |
470
- | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Historial de entrada estilo terminal para el compositor web: flechas, búsqueda Ctrl+R |
471
- | [dsh-github](https://github.com/PerryLink/dsh-github) | Integración de PR/issues de GitHub para DSH, cada escritura sujeta a aprobación |
472
- | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Base de conocimiento de desarrollo de plugins como skill de agente bajo demanda |
473
- | [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migra sesiones, memoria, skills y CLAUDE.md de Claude Code a DSH |
240
+ | [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors |
241
+ | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard + delivery quality gate: requirements grill, test gates, adversary review, /gate deliverable/rework panel |
242
+ | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Durable background child agents with a Web UI sidebar, messaging and interrupt |
243
+ | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | LSP diagnostics, formatting, completion, code actions and rename over language servers |
244
+ | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Claude Code outputStyles-equivalent runtime style switching |
245
+ | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore |
246
+ | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Claude Code-style declarative allow/deny/ask permission rules with audit |
247
+ | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Second-model auto-review on the approval chain, fail-closed by default |
248
+ | [dsh-memento](https://github.com/PerryLink/dsh-memento) | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
249
+ | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Security-audit skill pack: secret scan, dependency and supply-chain review |
250
+ | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Pin sessions in the Web sidebar with durable ordering |
251
+ | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Terminal-style input history for the web composer: arrows, Ctrl+R search |
252
+ | [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues integration for DSH, every write gated by approval |
253
+ | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Plugin-development knowledge base as an on-demand agent skill |
254
+ | [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
474
255
 
475
256
  ## Licencia
476
257
 
477
- [Apache-2.0](LICENSE)
258
+ [Apache License 2.0](LICENSE) © 2026 dsh-doublecheck contributors