dsh-doublecheck 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/README.es.md +259 -34
- package/README.hi.md +265 -40
- package/README.md +236 -27
- package/README.pt.md +259 -34
- package/README.zh.md +326 -115
- package/lib/domain/evidence.d.ts +4 -1
- package/lib/domain/evidence.js +7 -2
- package/lib/domain/gate.d.ts +263 -0
- package/lib/domain/gate.js +658 -0
- package/lib/domain/projection.d.ts +5 -0
- package/lib/domain/projection.js +12 -0
- package/lib/domain/vocabulary.d.ts +2 -0
- package/lib/domain/vocabulary.js +4 -0
- package/lib/events.d.ts +44 -2
- package/lib/grill/index.js +8 -1
- package/lib/guard/command.d.ts +7 -0
- package/lib/guard/command.js +28 -21
- package/lib/guard/gate.d.ts +170 -0
- package/lib/guard/gate.js +518 -0
- package/lib/guard/index.d.ts +14 -0
- package/lib/guard/index.js +93 -7
- package/lib/guard/prose.d.ts +64 -0
- package/lib/guard/prose.js +79 -0
- package/lib/guard/review.d.ts +8 -0
- package/lib/guard/review.js +20 -20
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/invariant.d.ts +2 -0
- package/lib/invariant.js +17 -3
- package/lib/types.d.ts +7 -0
- package/lib/types.js +2 -0
- package/package.json +56 -6
- package/skills/delivery-proof/SKILL.md +12 -0
- package/strict.patch.yml +70 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,42 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to dsh-doublecheck are recorded here, newest first.
|
|
4
4
|
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
- **OMDSH Workshop intake manifest**: `package.json#dshWorkshop` (`omdsh-workshop-package/v1`) declares the transactional `harness-profile` integration, lifecycle, permissions, and the named runtime capability (`/gate status`) for the hub.omdsh.dev Registry intake. Author-declared facts only — verification evidence stays pending until the Workshop adapter run produces it.
|
|
8
|
+
- **Community engineering**: structured issue forms (bug report / feature request), a pull-request checklist template, a security policy with private vulnerability reporting, GitHub Discussions enabled (welcome post), main-branch CI status protection, npm downloads badge, and a Contributors section across the five READMEs.
|
|
9
|
+
- **CI profile smoke**: a `smoke` job packs the bundle, installs it into a scratch profile with the real `dsh` CLI, and asserts both rows mount (`scripts/assert-profile.mjs`) — the end-to-end check for `cordis.patch.yml` that unit tests cannot see. Ported from PR #1, which this closes.
|
|
10
|
+
|
|
11
|
+
## v0.7.0 — 2026-08-16
|
|
12
|
+
|
|
13
|
+
The delivery quality gate release: the discipline loop grows a productized front panel that aggregates the session's durable evidence into one **deliverable / rework required** decision.
|
|
14
|
+
|
|
15
|
+
- **Delivery quality gate** (`/gate status|run|config`): a configurable four-phase checklist — **requirements interrogation** (a key-question checklist confirmed item by item against the committed spec), **test evidence** (latest run color, failing runs after green, and an optional coverage threshold parsed from test output), **implementation consistency** (a local forked reviewer maps diffs to spec dimensions), and the **review conclusion** — folded from the durable session log. One binary decision with red items, rework suggestions, and a PR-ready markdown report (`gate-report.md` + the durable `doublecheck/gate` session event, `ignorable`-stamped).
|
|
16
|
+
- **dsh-auto-review weak dependency**: `gate.review.engine: auto` consumes the engine's durable `autoReview/verdict` / `autoReview/rejection` records when they exist (rejections become red lights), and degrades to the local forked reviewer with an honest warn note — "not installed" vs "installed but has no verdict records in this session" (detected structurally plus a `ctx.commands.list()` presence probe; no import, no hard dependency). `engine: local` always reviews locally. The gate never synthesizes approval requests.
|
|
17
|
+
- **Plan-mode integration**: a rework verdict suggests re-opening the work in plan mode — in the report banner, on the `/gate status` panel line (reading the optional `ctx.planMode` service), and in a once-per-session short turn notice riding the new `doublecheck-gate` message source (`doublecheck/reminder` gate `'gate'`, verdict `'gate-red'`).
|
|
18
|
+
- **Pluggable checklist (Schema config)**: `gate.requirements.checklist` is a Schema-validated array (`id` / `question` / `specDimension` / `required`), every phase has an `enabled` switch, and the thresholds and reviewer knobs are config keys; validated fail-loud at load (duplicate ids, unknown dimensions, bad regexes, empty tool lists throw) and exposed through the **`doublecheck.gate` settings namespace** (`expose: true`, `applies: restart`) when the harness settings service is mounted.
|
|
19
|
+
- **Audit-safe reports**: gate reports embed counts, ids, and verdicts only — no file contents or session text. Model-produced finding texts pass a secret redactor (cloud keys, GitHub/OpenAI/Slack tokens, bearer tokens, private-key blocks, password assignments, long hex/base64 runs) before storage or display.
|
|
20
|
+
- **Panel surfaces**: `/gate status` renders the live deterministic phases plus the latest settled run (verdict, red count, engine, timestamp); the `doublecheck` session projection now carries `gateVerdict` + `gateRedCount` (stateVersion 2); `/doublecheck status` shows the latest gate verdict; the four-phase progress doubles as the in-conversation card.
|
|
21
|
+
- **Short role-statement prose**: the gate-red turn notice and the consistency reviewer task open with a one-sentence role statement and stay short (Minimal-persona style); `en` / `zh` localized.
|
|
22
|
+
- **Invariant companion + skills**: the invariant now checks the `doublecheck/gate` announcement (verdict re-derivation, all four phases present); the `delivery-proof` skill routes the model through `/gate run` before completion claims; `strict.patch.yml` restates the full gate block with `requireCoverage: true`.
|
|
23
|
+
|
|
24
|
+
## v0.6.0 — 2026-08-14
|
|
25
|
+
|
|
26
|
+
The hardening release: the whole model-visible surface honors `language`, the projection schema's runtime dependency is declared, and the gates get quieter and more precise.
|
|
27
|
+
|
|
28
|
+
- **Runtime dependency fix**: `zod` moved from devDependencies to `dependencies` — the built `lib/` imports it for the `doublecheck` projection schema (`ZodType` is the sessionProjections registry contract), and git-hosted installs skip devDependencies.
|
|
29
|
+
- **Complete localization**: the switch notices, the `/doublecheck` command replies (including a richer `status` line with intensity, default switch, `remindOnce`, and the edit count), the held-back-findings note, and the critic's task prompt now honor `language: 'en' | 'zh'`. The workspace spec/report documents keep their English headings as stable artifacts.
|
|
30
|
+
- **Fail-fast spec commit**: `doublecheck_spec` rejects empty or whitespace-only dimensions instead of recording an uncheckable contract (the invariant companion reuses the shared field list).
|
|
31
|
+
- **Deterministic review order**: findings are sorted blocker-first (stable within a severity) in both the injected prose and the durable `doublecheck-review` record.
|
|
32
|
+
- **Custom guard tools**: `mutationTargetPath` recognizes the `path` argument key beside `file_path`, and a guard-tool call that names no file at all no longer trips the red gate.
|
|
33
|
+
- **O(1) switch reads**: the durable `doublecheck/state` fold rides the guard's incremental snapshot instead of rescanning the whole log per tool call.
|
|
34
|
+
- **One effective switch**: the `/doublecheck` command now reads the same effective switch the gates enforce (process-local override → durable `doublecheck/state` → configured default), so `status` and repeated `on|off` answer consistently even on rc.6 hosts where the override is in-memory.
|
|
35
|
+
- **Standalone invariant companion subpath**: `dsh-doublecheck/invariant` is now a real `exports` entry (`./invariant` → `lib/invariant.js` + `.d.ts`); the row was documented but not importable before.
|
|
36
|
+
- **Wider default test coverage**: `deno test` and `uv run pytest` joined the default test-command patterns.
|
|
37
|
+
- **`strict.patch.yml` restored**: the v0.5-changeloged all-gates-`block` overlay now actually ships (added to `files`).
|
|
38
|
+
- **Release pipeline**: `NPM_TOKEN` lives in the repo secrets; the publish step skips versions already on the registry (idempotent re-tags) instead of failing, and a new `release` job creates the GitHub Release with the top changelog section as its notes.
|
|
39
|
+
- **Package metadata**: `publishConfig.access: 'public'`, `sideEffects: false`, an npm version badge across the five READMEs, and `README.hi.md` fully synced to v0.6.
|
|
40
|
+
|
|
5
41
|
## v0.5.0 — 2026-08-14
|
|
6
42
|
|
|
7
43
|
The discipline loop gets a human-facing cockpit and a hardened delivery pipeline.
|
package/README.es.md
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# dsh-doublecheck
|
|
2
2
|
|
|
3
|
-
> **
|
|
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.**
|
|
4
4
|
|
|
5
|
-
[](https://github.com/PerryLink/dsh-doublecheck/releases)
|
|
6
|
+
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
7
|
+
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
6
8
|
[](LICENSE)
|
|
7
9
|
[](https://github.com/topics/dsh-plugin)
|
|
10
|
+
[](https://github.com/PerryLink/dsh-doublecheck/actions/workflows/ci.yml)
|
|
8
11
|
|
|
9
|
-
Un **bundle de disciplina de ingeniería** 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** —
|
|
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`.
|
|
10
13
|
|
|
11
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.
|
|
12
15
|
|
|
@@ -14,6 +17,7 @@ La metodología está inspirada en [obra/superpowers](https://github.com/obra/su
|
|
|
14
17
|
|
|
15
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.
|
|
16
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.
|
|
17
21
|
|
|
18
22
|
## El bucle de disciplina
|
|
19
23
|
|
|
@@ -35,20 +39,105 @@ grill ──▶ design ──▶ red ──▶ green ──▶ review ──▶
|
|
|
35
39
|
| **review** | Un crítico adversario bifurcado audita la entrega contra el spec. | ✅ v0.3 |
|
|
36
40
|
| **verify** | `doublecheck_report` + un workflow de verificación por dimensión demuestran la entrega. | ✅ v0.4 |
|
|
37
41
|
|
|
38
|
-
##
|
|
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"]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Fase | Comprobaciones | Fuente de evidencia | Coste de modelo |
|
|
60
|
+
|---|---|---|---|
|
|
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) |
|
|
65
|
+
|
|
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.
|
|
70
|
+
|
|
71
|
+
### Informe de ejemplo
|
|
72
|
+
|
|
73
|
+
`/gate run` devuelve este markdown — pégalo en la descripción de un PR:
|
|
74
|
+
|
|
75
|
+
````markdown
|
|
76
|
+
# Delivery gate report
|
|
77
|
+
|
|
78
|
+
> **Verdict: rework required** — 2 red item(s)
|
|
79
|
+
> The gate is red. Re-open the work in plan mode to re-check the open items before delivering.
|
|
80
|
+
|
|
81
|
+
## 1. Requirements interrogation — PASS
|
|
82
|
+
- [✔] **What outcome must the delivery produce?** — spec dimension "goal" committed
|
|
83
|
+
- [✔] **What is in scope, and what is out of scope?** — spec dimension "scope" committed
|
|
84
|
+
- [✔] **Which observable checks prove the work is done?** — spec dimension "acceptanceCriteria" committed
|
|
85
|
+
- [✔] **What can go wrong, and what is the correct behavior in each case?** — spec dimension "failureModes" committed
|
|
86
|
+
- [✔] **What is traded when goals conflict; what is optional?** — spec dimension "priorities" committed
|
|
87
|
+
- [✔] **What does the user explicitly not want?** — spec dimension "nonGoals" committed
|
|
88
|
+
|
|
89
|
+
## 2. Test evidence — FAIL
|
|
90
|
+
- [✔] **passing test run** — latest test run passed
|
|
91
|
+
- [✔] **failing cases after green** — 0 failing run(s) after green (allowed: 0)
|
|
92
|
+
- [✖] **coverage evidence** — 61% coverage below the 80% minimum — rework: raise coverage above the configured minimum
|
|
93
|
+
|
|
94
|
+
## 3. Implementation consistency — WARN
|
|
95
|
+
- [⚠] **[minor] src/telemetry.ts touched without a requirement** — [minor] the edit adds a metric no spec dimension covers
|
|
96
|
+
|
|
97
|
+
## 4. Review conclusion — PASS
|
|
98
|
+
- [✔] **dsh-auto-review conclusion** — 3 call(s) approved by dsh-auto-review (latest risk: low)
|
|
99
|
+
|
|
100
|
+
## Red items
|
|
101
|
+
1. **tests/coverage** — 61% coverage below the 80% minimum — *rework: raise coverage above the configured minimum*
|
|
102
|
+
2. **consistency/finding-1** — [minor] the edit adds a metric no spec dimension covers — *rework: src/telemetry.ts touched without a requirement*
|
|
103
|
+
|
|
104
|
+
## Audit
|
|
105
|
+
- review engine: dsh-auto-review
|
|
106
|
+
- generated at: 2026-08-14T12:00:00.000Z
|
|
107
|
+
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
|
|
108
|
+
````
|
|
109
|
+
|
|
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
|
|
39
123
|
|
|
40
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.
|
|
41
|
-
- 🧰 **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 antes de declarar completado) se unen a `grill-requirements`: las seis etapas tienen guía de modelo, no solo la primera.
|
|
42
|
-
- 📜 **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.
|
|
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.
|
|
43
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.
|
|
44
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`.
|
|
45
|
-
- 🟥🟩 **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.
|
|
46
|
-
- 👁️ **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. `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.
|
|
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.
|
|
47
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.
|
|
48
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`.
|
|
49
|
-
- 🔁 **Estado duradero** — todo artefacto visible para el modelo (spec, recordatorios, feedback de denegación, hallazgos de revisión, el interruptor `/doublecheck on|off`) queda en el registro de sesión; las decisiones de
|
|
50
|
-
- ⌨️ **Comando de sesión `/doublecheck`** — `status` informa el interruptor efectivo, los módulos configurados
|
|
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.
|
|
51
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.
|
|
52
141
|
|
|
53
142
|
## Demo
|
|
54
143
|
|
|
@@ -64,6 +153,7 @@ dsh --profile demo headless "把这个项目里最慢的代码直接改快,别
|
|
|
64
153
|
3. Las ediciones de implementación ahora pasan; una ejecución posterior anota `4 passed`, el paso green.
|
|
65
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.
|
|
66
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.
|
|
67
157
|
|
|
68
158
|
## Instalación
|
|
69
159
|
|
|
@@ -76,13 +166,19 @@ Ambas filas de plugin se activan automáticamente con el profile. También sirve
|
|
|
76
166
|
|
|
77
167
|
```sh
|
|
78
168
|
pnpm pack
|
|
79
|
-
dsh plugin --profile <name> add ./dsh-doublecheck-0.
|
|
169
|
+
dsh plugin --profile <name> add ./dsh-doublecheck-0.7.0.tgz
|
|
80
170
|
```
|
|
81
171
|
|
|
82
172
|
La instalación por git no necesita npm:
|
|
83
173
|
|
|
84
174
|
```sh
|
|
85
|
-
dsh plugin --profile <name> add "github:PerryLink/dsh-doublecheck#v0.
|
|
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
|
|
86
182
|
```
|
|
87
183
|
|
|
88
184
|
## Desinstalación
|
|
@@ -96,14 +192,16 @@ Para mantener el paquete pero desactivar una fila: sobrescríbela por id con `di
|
|
|
96
192
|
## Compatibilidad
|
|
97
193
|
|
|
98
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).
|
|
99
|
-
-
|
|
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`.
|
|
100
198
|
|
|
101
199
|
## Permisos y datos
|
|
102
200
|
|
|
103
|
-
- **Lee**: solo en proceso el registro de sesión (`tool/call` / `tool/result` / `tool/code-dispatch
|
|
104
|
-
- **Escribe**: `doublecheck-spec.md` y `
|
|
105
|
-
- **Llamadas al modelo**:
|
|
106
|
-
- **Nunca toca**: credenciales, variables de entorno ni archivos fuera del workspace de la sesión.
|
|
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.
|
|
107
205
|
|
|
108
206
|
## Resolución de problemas
|
|
109
207
|
|
|
@@ -114,6 +212,10 @@ Para mantener el paquete pero desactivar una fila: sobrescríbela por id con `di
|
|
|
114
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`. |
|
|
115
213
|
| `doublecheck_report` muestra `verification: null` | Falta el seam `workflowEngine` o el run fue rechazado/abortado — el informe lo indica en lugar de adivinar. |
|
|
116
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`. |
|
|
117
219
|
|
|
118
220
|
## Configuración
|
|
119
221
|
|
|
@@ -122,15 +224,16 @@ Sobrescribe cualquier fila **por id** en el `cordis.patch.yml` del profile. Un p
|
|
|
122
224
|
```yaml
|
|
123
225
|
- id: doublecheck-grill
|
|
124
226
|
config:
|
|
125
|
-
specFile: 'specs/doublecheck-spec.md' #
|
|
126
|
-
reportFile: 'specs/doublecheck-report.md' #
|
|
127
|
-
reportVerify: true #
|
|
128
|
-
verifyProvider: 'fork' # provider
|
|
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
|
|
129
231
|
reportTestToolNames: ['bash', 'pwsh']
|
|
130
232
|
reportTestCommandPatterns:
|
|
131
233
|
- '(?:^|[;&|]\s*)(?:(?:pnpm|npm|npx|yarn|bun)(?:\s+run)?\s+(?:test|vitest|jest|mocha)(?:\s|$))'
|
|
132
234
|
- '(?:^|[;&|]\s*)(?:(?:pytest|go\s+test|cargo\s+test|make\s+test|ctest)(?:\s|$))'
|
|
133
235
|
- '(?:^|[;&|]\s*)(?:node\s+--test(?:\s|$))'
|
|
236
|
+
- '(?:^|[;&|]\s*)(?:deno\s+test|uv\s+run\s+pytest)(?:\s|$)'
|
|
134
237
|
reportMutationTools: ['edit', 'write']
|
|
135
238
|
reportTestFilePatterns:
|
|
136
239
|
- '(^|[\\/])(tests?|__tests__|specs?)([\\/]|$)'
|
|
@@ -141,13 +244,13 @@ Sobrescribe cualquier fila **por id** en el `cordis.patch.yml` del profile. Un p
|
|
|
141
244
|
intensity: warn
|
|
142
245
|
modules:
|
|
143
246
|
grill: true
|
|
144
|
-
tdd: true #
|
|
145
|
-
adversary: true #
|
|
146
|
-
adversaryModel: null
|
|
147
|
-
adversaryProvider: 'fork' # provider
|
|
148
|
-
adversaryMaxFindings: 5 #
|
|
149
|
-
adversaryTools: ['read', 'glob', 'grep'] #
|
|
150
|
-
adversaryTimeoutMs: 120000 #
|
|
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
|
|
151
254
|
guardTools: ['edit', 'write']
|
|
152
255
|
vagueTaskMaxChars: 200
|
|
153
256
|
remindOnce: true
|
|
@@ -156,11 +259,51 @@ Sobrescribe cualquier fila **por id** en el `cordis.patch.yml` del profile. Un p
|
|
|
156
259
|
- '(?:^|[;&|]\s*)(?:(?:pnpm|npm|npx|yarn|bun)(?:\s+run)?\s+(?:test|vitest|jest|mocha)(?:\s|$))'
|
|
157
260
|
- '(?:^|[;&|]\s*)(?:(?:pytest|go\s+test|cargo\s+test|make\s+test|ctest)(?:\s|$))'
|
|
158
261
|
- '(?:^|[;&|]\s*)(?:node\s+--test(?:\s|$))'
|
|
262
|
+
- '(?:^|[;&|]\s*)(?:deno\s+test|uv\s+run\s+pytest)(?:\s|$)'
|
|
159
263
|
testFilePatterns:
|
|
160
264
|
- '(^|[\\/])(tests?|__tests__|specs?)([\\/]|$)'
|
|
161
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
|
|
162
303
|
```
|
|
163
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
|
+
|
|
164
307
|
### `intensity`
|
|
165
308
|
|
|
166
309
|
| Valor | Comportamiento ante un `edit`/`write` sujeto a la puerta |
|
|
@@ -174,13 +317,15 @@ Sobrescribe cualquier fila **por id** en el `cordis.patch.yml` del profile. Un p
|
|
|
174
317
|
| Clave | Por defecto | Significado |
|
|
175
318
|
|---|---|---|
|
|
176
319
|
| `modules.grill` | `true` | En `false` desactiva la puerta grill. El interruptor de los skills/herramientas grill es el flag `disabled` de su fila. |
|
|
177
|
-
| `modules.tdd` | `
|
|
320
|
+
| `modules.tdd` | `true` | En `true` activa las puertas de evidencia red/green (v0.2); activado por defecto desde v0.5. |
|
|
178
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`). |
|
|
179
324
|
| `guardTools` | `['edit', 'write']` | Nombres de herramientas de mutación que vigila el guard. |
|
|
180
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. |
|
|
181
|
-
| `remindOnce` | `true` | Inyectar el recordatorio de cada puerta como máximo una vez por sesión. |
|
|
326
|
+
| `remindOnce` | `true` | Inyectar el recordatorio de cada puerta como máximo una vez por sesión — durable entre reinicios (plegado desde el registro). |
|
|
182
327
|
| `testToolNames` | `['bash', 'pwsh']` | Nombres de herramientas de shell que pueden ejecutar pruebas. |
|
|
183
|
-
| `testCommandPatterns` | *(pnpm/npm/yarn/bun test, pytest, go/cargo/make test, node --test)* | Expresiones regulares con las que debe coincidir un comando para contar como ejecución de prueba. |
|
|
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. |
|
|
184
329
|
| `testFilePatterns` | *(directorios de prueba, `*.test.*` / `*.spec.*`)* | Expresiones regulares que identifican archivos de prueba — siempre editables, exentos de la puerta red. |
|
|
185
330
|
| `adversaryModel` | `null` | Ruta del modelo crítico; `null` = el modelo principal se autorrevisa. |
|
|
186
331
|
| `adversaryProvider` | `'fork'` | Nombre del provider de subagentes en el que corre el crítico. |
|
|
@@ -197,11 +342,37 @@ La mala configuración falla en voz alta: una regex inválida, una lista de nomb
|
|
|
197
342
|
| `reportFile` | `'doublecheck-report.md'` | Archivo del workspace que recibe el markdown del informe. |
|
|
198
343
|
| `reportVerify` | `true` | Valor por defecto para el flag `verify` de la herramienta. |
|
|
199
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). |
|
|
200
346
|
| `reportTestToolNames` / `reportTestCommandPatterns` | *(same defaults as the guard row)* | Clasificación de ejecuciones de prueba con alcance de informe. |
|
|
201
347
|
| `reportMutationTools` / `reportTestFilePatterns` | *(same defaults as the guard row)* | Clasificación de ediciones de implementación con alcance de informe. |
|
|
202
348
|
|
|
203
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.
|
|
204
350
|
|
|
351
|
+
### Controles de puerta (fila guard)
|
|
352
|
+
|
|
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. |
|
|
373
|
+
|
|
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.
|
|
375
|
+
|
|
205
376
|
## Cómo funciona (puntos de extensión)
|
|
206
377
|
|
|
207
378
|
| Contribución | Mecanismo DSH |
|
|
@@ -216,8 +387,16 @@ Los controles de clasificación del informe son independientes de los del guard:
|
|
|
216
387
|
| Revisión adversaria | `ctx.subagents.start()` — forked critic with structured findings schema, injected at green; `warn`/`block` steer one round |
|
|
217
388
|
| Informe de entrega | `doublecheck_report` tool — session-log fold + workspace markdown |
|
|
218
389
|
| Workflow de verificación | `ctx.workflowEngine.start()` — one parallel checker per spec dimension, structured checks |
|
|
219
|
-
|
|
|
220
|
-
|
|
|
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`) |
|
|
221
400
|
|
|
222
401
|
Sin cambios en el agent-loop. Cada registro es un `ctx.effect` / `ctx.on` / `register()` de servicio reversible.
|
|
223
402
|
|
|
@@ -228,10 +407,28 @@ Sin cambios en el agent-loop. Cada registro es un `ctx.effect` / `ctx.on` / `reg
|
|
|
228
407
|
- Los recordatorios llegan como contexto `{kind:'plugin'}`, así que las UIs de transcripción los muestran como metadatos de inyección.
|
|
229
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.
|
|
230
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.
|
|
231
428
|
|
|
232
429
|
## Hoja de ruta
|
|
233
430
|
|
|
234
|
-
El bucle de disciplina de
|
|
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.
|
|
235
432
|
|
|
236
433
|
## Desarrollo
|
|
237
434
|
|
|
@@ -247,6 +444,34 @@ pnpm run build
|
|
|
247
444
|
|
|
248
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.
|
|
249
446
|
|
|
447
|
+
## Colaboradores
|
|
448
|
+
|
|
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)).
|
|
450
|
+
|
|
451
|
+
Issues, pull requests y Discussions son bienvenidos — los puntos de entrada están al inicio de este documento.
|
|
452
|
+
|
|
453
|
+
## Familia de plugins DSH de PerryLink
|
|
454
|
+
|
|
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:
|
|
456
|
+
|
|
457
|
+
| Plugin | Una línea |
|
|
458
|
+
|---|---|
|
|
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 |
|
|
474
|
+
|
|
250
475
|
## Licencia
|
|
251
476
|
|
|
252
477
|
[Apache-2.0](LICENSE)
|