ozali 0.1.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/LICENSE +21 -0
- package/README.md +94 -0
- package/cli/bin/ozali.mjs +77 -0
- package/cli/lib/commands.mjs +235 -0
- package/cli/lib/detect.mjs +103 -0
- package/cli/lib/prompt.mjs +51 -0
- package/cli/lib/util.mjs +131 -0
- package/cli/test/smoke.test.mjs +88 -0
- package/docs/intended-usage.md +43 -0
- package/docs/security.md +47 -0
- package/docs/team-history.md +66 -0
- package/package.json +39 -0
- package/skill/SKILL.md +396 -0
- package/skill/references/agents-blueprint.md +138 -0
- package/skill/references/calibration-blueprint.md +113 -0
- package/skill/references/doc-templates.md +301 -0
- package/skill/references/engram-convention.md +186 -0
- package/skill/references/harness-template.md +214 -0
- package/skill/references/knowledge-blueprint.md +143 -0
- package/skill/references/permissions-bypass.md +232 -0
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ozali
|
|
3
|
+
description: Skill base/bootstrap interactiva que diagnostica el repositorio, valida la fuente de verdad del proyecto (AI.md/.ai o IA.md/.ia), calibra las capacidades de testing y el modo Strict TDD, y guía al usuario, paso a paso, para construir y configurar la skill `cdk` del proyecto junto con su estructura de agentes y subagentes. Úsala cuando el usuario quiera "diagnosticar el proyecto", "preparar/configurar cdk", "calibrar el proyecto", "generar la estructura de agentes", "arrancar ozali desde cero" o invoque "ozali".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: ozali
|
|
7
|
+
|
|
8
|
+
`ozali` es la skill **base/bootstrap**. Su único trabajo es llevar al usuario por una
|
|
9
|
+
experiencia interactiva que termina **generando y configurando la skill `cdk`** del proyecto,
|
|
10
|
+
usando como fuente de verdad la documentación global del repo (`AI.md` + `.ai/`, o su variante
|
|
11
|
+
`IA.md` + `.ia/`) y la **calibración real de testing** del proyecto.
|
|
12
|
+
|
|
13
|
+
`ozali` **diagnostica, calibra y planifica**. `cdk` **ejecuta** (genera código respetando reglas).
|
|
14
|
+
No mezcles responsabilidades: `ozali` nunca escribe código de negocio del proyecto; solo
|
|
15
|
+
produce documentación, la calibración, el plan y los artefactos de la skill `cdk`.
|
|
16
|
+
|
|
17
|
+
> **Regla de oro:** nada se ejecuta sin aprobación del usuario en los puntos marcados como
|
|
18
|
+
> 🛑 **GATE**. Si el usuario no aprueba, detente y pregunta.
|
|
19
|
+
|
|
20
|
+
> **Memoria de equipo (Engram):** `ozali` y `cdk` operan en modo **híbrido** — conservan los
|
|
21
|
+
> documentos legibles por humanos **y** espejan los artefactos clave a Engram para búsqueda y
|
|
22
|
+
> acumulación de conocimiento. El histórico de documentación se mantiene **aislado del repo
|
|
23
|
+
> principal** (repo de conocimiento aparte). Reglas en
|
|
24
|
+
> [`references/engram-convention.md`](references/engram-convention.md) y
|
|
25
|
+
> [team-history](../docs/team-history.md).
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Flujo general (7 fases)
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Fase 0 Identidad y registro → quién corre ozali (git/sesión)
|
|
33
|
+
Fase 1 Detección fuente de verdad → ¿existe AI.md/.ai o IA.md/.ia?
|
|
34
|
+
Fase 2 Generación conocimiento → si falta, evaluar el proyecto y generar AI.md + .ai/
|
|
35
|
+
Fase 3 Validación + ajustes → ¿coincide con la estructura real? ajustes mínimos
|
|
36
|
+
Fase 3.5 Calibración testing + TDD → detectar runner/capas/cobertura y resolver Strict TDD
|
|
37
|
+
Fase 4 Diseño de agentes (cdk) → 8 roles + esquema de responsabilidades
|
|
38
|
+
Fase 5 🛑 GATE: plan de cdk → presentar plan, esperar aprobación
|
|
39
|
+
Fase 6 Generar cdk → skill cdk + subagentes reales + wiring TDD/Engram
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Al final de **cada corrida** se escriben los **3 documentos** de registro (ver
|
|
43
|
+
[Documentación de corrida](#documentación-de-corrida)).
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Fase 0 — Identidad y registro
|
|
48
|
+
|
|
49
|
+
Antes de nada, identifica **quién** está corriendo `ozali` para el encabezado del registro.
|
|
50
|
+
|
|
51
|
+
1. Intenta obtener identidad de la sesión activa (correo/cuenta).
|
|
52
|
+
2. Complementa con la cuenta de git del repo:
|
|
53
|
+
- `git config user.name`
|
|
54
|
+
- `git config user.email`
|
|
55
|
+
- rama actual: `git rev-parse --abbrev-ref HEAD`
|
|
56
|
+
- **commit actual** (para trazabilidad del histórico aislado): `git rev-parse --short HEAD`
|
|
57
|
+
3. Construye el bloque de identidad que se usará en todos los documentos:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Autor: <user.name> <<user.email>>
|
|
61
|
+
Sesión: <correo de sesión si está disponible>
|
|
62
|
+
Rama: <branch>
|
|
63
|
+
Commit: <short SHA>
|
|
64
|
+
Generado por: ozali
|
|
65
|
+
Fecha/Hora: <yyyy-mm-dd HH:MM:SS> (zona local)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Guarda estos valores; se reutilizan en Fase 6 y en la documentación.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Fase 1 — Detección de la fuente de verdad
|
|
73
|
+
|
|
74
|
+
Busca en la raíz del repositorio, aceptando **ambas nomenclaturas**:
|
|
75
|
+
|
|
76
|
+
| Concepto | Variante A | Variante B |
|
|
77
|
+
|-----------------|------------|------------|
|
|
78
|
+
| Documento guía | `IA.md` | `AI.md` |
|
|
79
|
+
| Carpeta dotted | `.ia/` | `.ai/` |
|
|
80
|
+
|
|
81
|
+
- Si encuentras **cualquiera** de las dos variantes → **ruta FOUND** (ve a Fase 3).
|
|
82
|
+
- Si **no** encuentras ninguna → **ruta GENERATE** (ve a Fase 2).
|
|
83
|
+
|
|
84
|
+
Registra cuál variante usa el proyecto. Esa será la nomenclatura canónica de aquí en adelante;
|
|
85
|
+
**no la cambies** si el proyecto ya tiene una.
|
|
86
|
+
|
|
87
|
+
Inspecciona el contenido encontrado y trátalo como **fuente de verdad** provisional. Estructura
|
|
88
|
+
esperada dentro de la carpeta dotted:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
.ai/ (o .ia/)
|
|
92
|
+
agents/ → identidades existentes (frontend, designer, reviewer, tester, ...)
|
|
93
|
+
context/ → architecture.md, coding-standards.md, tech-stack.md
|
|
94
|
+
knowledge/ → learning-notes.md, README.md
|
|
95
|
+
workflows/ → feature.md, bugfix.md, hotfix.md, refactor.md
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Fase 2 — Generación de la base de conocimiento (evaluando el proyecto)
|
|
101
|
+
|
|
102
|
+
Solo si la Fase 1 no encontró nada. **No se descarga nada de fuentes externas:** la fuente
|
|
103
|
+
de verdad se construye **evaluando el proyecto real**. La estructura canónica, las reglas
|
|
104
|
+
de generación y las diferencias frontend/backend están en
|
|
105
|
+
[`references/knowledge-blueprint.md`](references/knowledge-blueprint.md).
|
|
106
|
+
|
|
107
|
+
Pasos:
|
|
108
|
+
1. **Detecta frontend o backend** (señales del blueprint §1; si hay ambigüedad, pregunta).
|
|
109
|
+
2. **Inspecciona el proyecto real** (blueprint §2): estructura, stack y versiones leídas de los
|
|
110
|
+
manifiestos, comandos de build/test, patrones de arquitectura, convenciones observadas,
|
|
111
|
+
configuración por entorno y estado real de pruebas.
|
|
112
|
+
3. **Genera la carpeta dotted** (`.ai/` por defecto) con la estructura canónica del blueprint §3.
|
|
113
|
+
4. **Genera el documento guía** (`AI.md`) como "Project Brain" según el blueprint §4.
|
|
114
|
+
5. **Regla anti-invención:** todo lo que no se pueda derivar del código real se marca como
|
|
115
|
+
`<!-- PROVISIONAL: confirmar con el usuario -->` o se pregunta. Nunca inventes reglas de
|
|
116
|
+
negocio, módulos, comandos ni versiones.
|
|
117
|
+
6. **Nomenclatura del repo real:** nada de nombres genéricos de plantilla.
|
|
118
|
+
|
|
119
|
+
Lo generado es **provisional**: continúa a Fase 3 y valídalo igual que una fuente encontrada.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Fase 3 — Validación contra la estructura real + ajustes mínimos
|
|
124
|
+
|
|
125
|
+
La fuente de verdad es **provisional** hasta validarla contra el código real.
|
|
126
|
+
|
|
127
|
+
1. Lee la estructura real del proyecto (p. ej. `src/app/...`, módulos, servicios).
|
|
128
|
+
2. Compara contra lo que afirma la fuente de verdad (`context/architecture.md`, `tech-stack.md`).
|
|
129
|
+
3. Marca **discrepancias** (carpetas/módulos que existen y no están documentados, o viceversa).
|
|
130
|
+
4. Aplica **solo ajustes mínimos** necesarios para una primera iteración coherente.
|
|
131
|
+
5. Todo cambio mayor se anota como **propuesta** para el documento 3 (mejoras), no se aplica.
|
|
132
|
+
|
|
133
|
+
Resultado: una fuente de verdad **validada** y el inventario de hitos/discrepancias que alimenta
|
|
134
|
+
el documento 1 (análisis).
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Fase 3.5 — Calibración de testing + Strict TDD
|
|
139
|
+
|
|
140
|
+
> Esta fase es lo que hace que `cdk` sepa **si puede exigir test-first**. Sin ella, el TDD es un
|
|
141
|
+
> deseo; con ella, es un contrato calibrado contra lo que el proyecto realmente soporta. Catálogo
|
|
142
|
+
> completo de detección en [`references/calibration-blueprint.md`](references/calibration-blueprint.md).
|
|
143
|
+
|
|
144
|
+
1. **Detecta las capacidades de testing reales** (blueprint §1): runner(s) de tests, capas
|
|
145
|
+
disponibles (unit / integración / e2e), comando(s) exactos, linter, type-checker, formatter,
|
|
146
|
+
y **cobertura/estado real** (conteo de archivos de prueba, no supuestos).
|
|
147
|
+
2. **Resuelve `strict_tdd`** con esta tabla de decisión (blueprint §2):
|
|
148
|
+
|
|
149
|
+
| Señal encontrada | `strict_tdd` |
|
|
150
|
+
|---|---|
|
|
151
|
+
| Marcador/config explícito del proyecto (`.ai/context/tech-stack.md`, CI, convención de equipo) | usa ese valor |
|
|
152
|
+
| Sin marcador, pero **existe runner de tests** | **`true`** (default: test-first) |
|
|
153
|
+
| **No hay runner de tests** | `false` + explica que no está disponible y qué falta |
|
|
154
|
+
|
|
155
|
+
3. **Persiste la calibración** como artefacto `testing-capabilities`:
|
|
156
|
+
- en la fuente de verdad: sección **"Testing & TDD"** dentro de `.ai/context/tech-stack.md`
|
|
157
|
+
(tabla de capacidades + `strict_tdd` + comandos verdes);
|
|
158
|
+
- en **Engram** (cuando esté disponible): `cdk/_project/testing-capabilities`
|
|
159
|
+
(ver [`references/engram-convention.md`](references/engram-convention.md)).
|
|
160
|
+
|
|
161
|
+
4. **Si falta información** para fijar el umbral de "verde" (qué comando corre las pruebas, qué
|
|
162
|
+
cuenta como pasar), **pregunta al usuario** lo mínimo. No inventes comandos ni umbrales.
|
|
163
|
+
|
|
164
|
+
El resultado de esta fase entra al plan del GATE (Fase 5) como la sección **"Calibración de
|
|
165
|
+
pruebas"** y condiciona el ciclo `executioners ⇄ tester` de `cdk` (Fase 6).
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Fase 4 — Diseño de agentes y subagentes para `cdk`
|
|
170
|
+
|
|
171
|
+
A partir del conocimiento consolidado, diseña la estructura de agentes de `cdk`. El catálogo
|
|
172
|
+
canónico de los **8 roles**, su esquema de responsabilidades, entradas/salidas y mapeo a la
|
|
173
|
+
fuente de verdad está en [`references/agents-blueprint.md`](references/agents-blueprint.md):
|
|
174
|
+
|
|
175
|
+
1. **project-owner** — visión, reglas y criterios de aceptación; qué se puede/no tocar.
|
|
176
|
+
2. **project-manager** — descompone la solicitud en tareas, estados y dependencias; aplica workflows.
|
|
177
|
+
3. **project-analyzer** — analiza código e impacto; produce el documento 1 (análisis + hitos).
|
|
178
|
+
4. **project-orchestrator** — enruta el trabajo entre subagentes e integra resultados.
|
|
179
|
+
5. **executioners** — implementan los cambios de código respetando estándares y arquitectura.
|
|
180
|
+
6. **project-proposer** — propone alternativas y mejoras con grados de relevancia (documento 3).
|
|
181
|
+
7. **project-documenter** — genera y mantiene los documentos `.md` con encabezado de identidad.
|
|
182
|
+
8. **tester** — valida con pruebas (unit/e2e) y reporta resultados contra criterios de aceptación.
|
|
183
|
+
|
|
184
|
+
Si la fuente de verdad **no** aporta suficiente para definir una identidad (responsabilidad,
|
|
185
|
+
herramientas permitidas, límites), **pregunta al usuario** lo mínimo necesario. No inventes
|
|
186
|
+
reglas de negocio.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Fase 5 — 🛑 GATE: presentar el plan de `cdk`
|
|
191
|
+
|
|
192
|
+
> [!IMPORTANT]
|
|
193
|
+
> **Es IMPERATIVO presentar el plan de trabajo como mensaje visible y completo al usuario
|
|
194
|
+
> ANTES de pedir cualquier aprobación.** El plan debe ir en el cuerpo del mensaje final
|
|
195
|
+
> (markdown completo: tablas, estructura de archivos, subagentes), nunca solo resumido
|
|
196
|
+
> dentro de una pregunta o herramienta de confirmación. Si el plan no se presentó de forma
|
|
197
|
+
> visible, el GATE **no es válido**: preséntalo primero y vuelve a pedir aprobación.
|
|
198
|
+
|
|
199
|
+
Presenta al usuario un plan claro y conciso que incluya:
|
|
200
|
+
|
|
201
|
+
- Nombre canónico de la fuente de verdad detectada y variante (`AI.md/.ai` vs `IA.md/.ia`).
|
|
202
|
+
- Resumen de discrepancias y ajustes mínimos aplicados en Fase 3.
|
|
203
|
+
- **Calibración de pruebas** (Fase 3.5): capacidades detectadas + `strict_tdd: true|false` + comandos verdes.
|
|
204
|
+
- Los 8 subagentes a crear (ruta, responsabilidad de una línea, herramientas).
|
|
205
|
+
- Estructura de archivos que generará `cdk`.
|
|
206
|
+
- La ruta de documentación, nomenclatura de logs y **destino del histórico** (repo de conocimiento aislado).
|
|
207
|
+
|
|
208
|
+
**Detente y espera aprobación explícita.** No generes `cdk` hasta recibir el "ok".
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Fase 6 — Generar la skill `cdk`
|
|
213
|
+
|
|
214
|
+
Solo tras la aprobación de la Fase 5. Genera:
|
|
215
|
+
|
|
216
|
+
1. `.claude/skills/cdk/SKILL.md` — orquestador de `cdk`. Debe:
|
|
217
|
+
- declarar en el frontmatter una **description con triggers ricos** (verbos y sustantivos
|
|
218
|
+
que el usuario usaría: "crea", "genera", "corrige", "refactoriza", método, clase,
|
|
219
|
+
endpoint, componente…) para mejorar la auto-invocación de la skill;
|
|
220
|
+
- declarar que ayuda a **generar código** (nuevo componente, fix de bug, análisis de impacto)
|
|
221
|
+
respetando la fuente de verdad y los estándares del proyecto;
|
|
222
|
+
- orquestar los 8 subagentes según la fase del trabajo;
|
|
223
|
+
- exigir que el análisis arranque con el **harness de verificación de estructura**
|
|
224
|
+
(punto 3 abajo) antes de planear nada;
|
|
225
|
+
- **respetar la calibración de Strict TDD** (Fase 3.5): si `strict_tdd: true`, el ciclo
|
|
226
|
+
`executioners ⇄ tester` es **test-first** (RED → GREEN → REFACTOR): se escribe la prueba que
|
|
227
|
+
falla, luego el mínimo código que la pasa, luego refactor con pruebas en verde; el GATE
|
|
228
|
+
muestra el **plan de pruebas** como sección obligatoria. Si `strict_tdd: false`, exige al
|
|
229
|
+
menos pruebas de regresión y lo deja explícito en la bitácora;
|
|
230
|
+
- definir el **formato del Plan de Acción** que ve el usuario en el GATE: tabla de
|
|
231
|
+
cambios archivo por archivo, **plan de pruebas**, riesgos con mitigación y sección
|
|
232
|
+
explícita de **"Fuera de alcance"**;
|
|
233
|
+
- **congelar el plan al aprobarse el GATE**: `02-plan-aprobado.md` se escribe en ese
|
|
234
|
+
momento (antes de tocar código) y es inmutable;
|
|
235
|
+
- soportar el **modo autónomo `--auto`** (ver [Modo autónomo (`--auto`)](#modo-autónomo---auto)):
|
|
236
|
+
`cdk` recorre el hito de punta a punta —análisis (incluida la lectura de rutas no
|
|
237
|
+
contempladas), ejecución— **sin prompts**, con el **único alto en el 🛑 GATE**; debe
|
|
238
|
+
incluir una sección breve de **permisos** con los **dos perfiles** —base del modo normal
|
|
239
|
+
(lectura + comandos + Python + fetch, confirmando ediciones) y bypass de `--auto`— que
|
|
240
|
+
apunte a [`references/permissions-bypass.md`](references/permissions-bypass.md) (config de
|
|
241
|
+
Claude Code y opencode) y **verificar/recordar** esa configuración al iniciar;
|
|
242
|
+
- incluir una sección de **Gotchas verificados** (hallazgos reales del repo) y una de
|
|
243
|
+
**Troubleshooting** (síntoma → causa/fix);
|
|
244
|
+
- **por cada solicitud/hito del usuario**, generar la documentación por hito en
|
|
245
|
+
`.ozali/docs/cdk/<hito>/` (ver [Documentación por hito de `cdk`](#documentación-por-hito-de-cdk)),
|
|
246
|
+
que son **6 documentos**: incluye la **bitácora de ejecución** (`05`) que se escribe DURANTE
|
|
247
|
+
el ciclo y el **uso de tokens** (`06`) que se escribe al cierre;
|
|
248
|
+
- **espejar a Engram** los artefactos clave del hito (análisis, plan aprobado, bitácora,
|
|
249
|
+
resumen técnico, `state`) con naming determinista, según
|
|
250
|
+
[`references/engram-convention.md`](references/engram-convention.md), y al **iniciar** un
|
|
251
|
+
hito hacer `mem_search` del proyecto/hito para recuperar contexto previo;
|
|
252
|
+
- en el **cierre del hito**, invocar la skill **`ozali-commit`** para generar el commit
|
|
253
|
+
summary (feature→`feat`, bugfix→`fix`, hotfix→`hotfix`, refactor→`refactor`; scope = módulo
|
|
254
|
+
del hito). El GATE del mensaje es independiente del GATE del plan.
|
|
255
|
+
2. `.claude/agents/<rol>.md` — un subagente real por cada uno de los 8 roles, con su system
|
|
256
|
+
prompt y herramientas, según [`references/agents-blueprint.md`](references/agents-blueprint.md).
|
|
257
|
+
3. `.claude/skills/cdk/verify-structure.mjs` — **harness del analista**: script Node sin
|
|
258
|
+
dependencias (Node 16+) adaptado a la estructura real del proyecto. Verifica paquetes/capas
|
|
259
|
+
esperados, localiza clases clave, reporta discrepancias doc↔código y, con `--grep <palabra>`,
|
|
260
|
+
lista archivos existentes relacionados (**reutilización antes de crear**). Genéralo a partir
|
|
261
|
+
del esqueleto parametrizado de [`references/harness-template.md`](references/harness-template.md)
|
|
262
|
+
con valores de la fuente de verdad validada en Fase 3 — nunca de supuestos — y **ejecútalo
|
|
263
|
+
para validarlo** antes de cerrar la fase (template §4).
|
|
264
|
+
4. Cualquier otra referencia/plantilla que `cdk` necesite.
|
|
265
|
+
|
|
266
|
+
> La fuente de verdad sigue siendo **únicamente** `AI.md` + `.ai/` — `cdk` la referencia,
|
|
267
|
+
> **no la duplica** dentro de la skill. No copies `context/` ni `workflows/` a
|
|
268
|
+
> `.claude/skills/cdk/`.
|
|
269
|
+
|
|
270
|
+
Tras generar, escribe los 3 documentos de la corrida y resume al usuario qué quedó creado y
|
|
271
|
+
cómo invocar `cdk`.
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Documentación por hito de `cdk`
|
|
276
|
+
|
|
277
|
+
Esto lo produce la skill **`cdk`** (no `ozali`), una vez por **cada solicitud/hito** del usuario.
|
|
278
|
+
Es responsabilidad del subagente `project-documenter`. `ozali` debe **cablear este comportamiento**
|
|
279
|
+
dentro del `SKILL.md` de `cdk` que genera en la Fase 6.
|
|
280
|
+
|
|
281
|
+
- **Ruta base:** `.ozali/docs/cdk/` — **gitignored en el repo principal** y sincronizada al repo
|
|
282
|
+
de conocimiento aislado (ver [team-history](../docs/team-history.md)).
|
|
283
|
+
- **Carpeta por hito:** `<hito>/` — slug corto y descriptivo (ej. `alta-componente-cobranza`).
|
|
284
|
+
Si ya existe, agrega sufijo `-2`, `-3`, …
|
|
285
|
+
- **Contenido (6 `.md`):**
|
|
286
|
+
1. `01-prompt-entrada.md` — el **prompt de entrada** del usuario, **textual**, con timestamp.
|
|
287
|
+
*Se escribe al inicio del hito.*
|
|
288
|
+
2. `02-plan-aprobado.md` — el **plan aprobado**. *Se congela AL APROBAR el GATE, antes de tocar
|
|
289
|
+
código; es inmutable.*
|
|
290
|
+
3. `03-resumen-tecnico.md` — **resumen técnico** (archivos tocados, decisiones, impacto). *Al cierre.*
|
|
291
|
+
4. `04-resumen-usuario.md` — **resumen para el usuario**, entendible y con **casos de uso
|
|
292
|
+
sencillos explicados** (sin jerga técnica). *Al cierre.*
|
|
293
|
+
5. `05-bitacora-ejecucion.md` — **bitácora viva del ciclo** (append-only): dudas, decisiones,
|
|
294
|
+
actualizaciones y desvíos DURANTE la ejecución. Mantiene íntegro el `02-plan-aprobado.md`.
|
|
295
|
+
6. `06-uso-tokens.md` — **uso de tokens**, al cerrar el hito. Métricas solo si el proveedor es
|
|
296
|
+
**Claude/Anthropic**; con otro proveedor deja estructura + nombre del proveedor (`N/A`).
|
|
297
|
+
|
|
298
|
+
Las plantillas completas están en [`references/doc-templates.md`](references/doc-templates.md).
|
|
299
|
+
Cada documento lleva el mismo encabezado de identidad (autor desde git/sesión + commit + fecha/hora).
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Memoria híbrida (Engram)
|
|
304
|
+
|
|
305
|
+
`ozali` cablea en el `SKILL.md` de `cdk` un contrato de **memoria híbrida**: cada artefacto clave
|
|
306
|
+
vive como **documento legible** (los 6 por hito) **y** como **espejo en Engram** (buscable,
|
|
307
|
+
recuperable, acumulativo). Así la herramienta **aprende de lo que el equipo va haciendo**. Contrato
|
|
308
|
+
completo (naming, llamadas inline, degradación) en
|
|
309
|
+
[`references/engram-convention.md`](references/engram-convention.md).
|
|
310
|
+
|
|
311
|
+
**Mínimos que `cdk` debe cablear** (resumen; el detalle y los `mem_*` exactos están en la convención):
|
|
312
|
+
|
|
313
|
+
- **Al iniciar un hito** → `mem_save_prompt` (captura el prompt real una vez) + `mem_search` de
|
|
314
|
+
`cdk/{hito}/state`, `cdk/_project/testing-capabilities` y `cdk/{hito}/*` → `mem_get_observation`
|
|
315
|
+
de lo relevante. Si hay `state` con pendientes, **reanuda**; con `testing-capabilities` resuelve
|
|
316
|
+
el modo TDD.
|
|
317
|
+
- **Al aprobar el GATE** → `mem_save` de `cdk/{hito}/plan-aprobado` **una sola vez** (inmutable).
|
|
318
|
+
- **Durante el ciclo** → `mem_update` (upsert) de `cdk/{hito}/bitacora` y `cdk/{hito}/state` tras
|
|
319
|
+
cada transición de fase (el archivo `05` sigue siendo append-only como fuente de verdad).
|
|
320
|
+
- **Al cerrar** → `mem_save` de `cdk/{hito}/resumen-tecnico` + `mem_session_summary` (solo el agente
|
|
321
|
+
top-level, nunca un subagente).
|
|
322
|
+
- **Naming determinista:** `cdk/{hito}/{tipo}` (o `cdk/_project/{tipo}`), `type: architecture`,
|
|
323
|
+
`capture_prompt: false` para artefactos automáticos.
|
|
324
|
+
|
|
325
|
+
**Reglas duras:** persistir **antes** del texto final del subagente; en `hybrid` el doc es la
|
|
326
|
+
fuente de verdad y Engram el índice (lectura Engram-primero, docs-fallback); **la ausencia de
|
|
327
|
+
Engram nunca bloquea** un hito — `cdk` degrada a modo `docs` y anota el espejo pendiente. El
|
|
328
|
+
**histórico se sincroniza al repo de conocimiento aislado** con `ozali sync` (no al repo principal).
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## Permisos del modo normal (sin `--auto`)
|
|
333
|
+
|
|
334
|
+
Aun **sin** `--auto`, `cdk` opera con un **perfil base de permisos** orientado al análisis y la
|
|
335
|
+
validación, para no interrumpirte por operaciones de diagnóstico:
|
|
336
|
+
|
|
337
|
+
- **Lectura dentro del proyecto** (`Read`/`Grep`/`Glob` y Bash read-only).
|
|
338
|
+
- **Ejecución de líneas de comando** (Bash/PowerShell) y **scripts de Python**.
|
|
339
|
+
- **Fetch de sitios externos para lectura** (`WebFetch`/`WebSearch`).
|
|
340
|
+
|
|
341
|
+
Lo que el modo normal **sí** sigue confirmando: **ediciones/escrituras de archivos** y los
|
|
342
|
+
comandos destructivos (`rm -rf`, `git push`). El **🛑 GATE del plan** se mantiene igual.
|
|
343
|
+
|
|
344
|
+
> Plantillas listas para copiar en [`references/permissions-bypass.md`](references/permissions-bypass.md)
|
|
345
|
+
> (Claude Code §1 y opencode §2).
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## Modo autónomo (`--auto`)
|
|
350
|
+
|
|
351
|
+
`ozali` debe cablear en el `SKILL.md` de `cdk` un **modo autónomo** que recorre el hito **de punta
|
|
352
|
+
a punta sin prompts**. La **regla del único alto** lo resume:
|
|
353
|
+
|
|
354
|
+
> 🎯 **En modo `--auto` el único punto donde `cdk` se detiene a esperar al humano es el
|
|
355
|
+
> 🛑 GATE del plan.** Todo lo demás —análisis, lectura de rutas no contempladas, ejecución— corre
|
|
356
|
+
> sin interrupciones.
|
|
357
|
+
|
|
358
|
+
- **Invocación:** el usuario antepone el flag, p. ej. `cdk --auto agrega validación de RFC en
|
|
359
|
+
cotización`. `cdk` reconoce `--auto` en cualquier posición; el inicio es la forma canónica.
|
|
360
|
+
- **El GATE (único alto):** el plan se presenta y se espera aprobación, **siempre**.
|
|
361
|
+
- **Después del GATE:** ejecuta de punta a punta dentro del alcance aprobado. Si surge algo
|
|
362
|
+
**fuera** del plan, se **detiene y pregunta** (y lo registra en la bitácora `05`).
|
|
363
|
+
- **Permisos: una skill NO puede auto-otorgarse permisos.** El bypass se configura a nivel de
|
|
364
|
+
**entorno** (settings/flags). `cdk`, al detectar `--auto`, **verifica/recuerda** la config de
|
|
365
|
+
[`references/permissions-bypass.md`](references/permissions-bypass.md).
|
|
366
|
+
- **Registro:** que el hito corrió en `--auto` (y con qué bypass) se anota en `05-bitacora-ejecucion.md`.
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## Documentación de corrida
|
|
371
|
+
|
|
372
|
+
Cada corrida de `ozali` produce **3 documentos `.md`** en una carpeta por corrida. Plantillas en
|
|
373
|
+
[`references/doc-templates.md`](references/doc-templates.md).
|
|
374
|
+
|
|
375
|
+
- **Ruta base:** `.ai/ozali/logs/` (la corrida del bootstrap puede vivir junto al cerebro; el
|
|
376
|
+
histórico **por hito** de `cdk` es el que se aísla al repo de conocimiento).
|
|
377
|
+
- **Carpeta de corrida:** `ozali.log_{{yy-mm-dd}}/` (sufijo `-2`, `-3`, … si ya existe del día).
|
|
378
|
+
- **Contenido:**
|
|
379
|
+
1. `01-analisis.md` — análisis del proyecto e **hitos de importancia**.
|
|
380
|
+
2. `02-plan.md` — el **plan ejecutado**.
|
|
381
|
+
3. `03-mejoras.md` — **mejoras posibles** a la skill y al proyecto, cada una con su **grado de
|
|
382
|
+
relevancia** (Alta/Media/Baja).
|
|
383
|
+
|
|
384
|
+
**Encabezado obligatorio** al inicio de cada documento, con la identidad de Fase 0 y la hora:
|
|
385
|
+
|
|
386
|
+
```
|
|
387
|
+
---
|
|
388
|
+
ozali.log: 26-06-27
|
|
389
|
+
documento: 01-analisis
|
|
390
|
+
Autor: <user.name> <<user.email>>
|
|
391
|
+
Sesión: <correo de sesión>
|
|
392
|
+
Rama: <branch>
|
|
393
|
+
Commit: <short SHA>
|
|
394
|
+
Creado: 2026-06-27 14:32:07 (local)
|
|
395
|
+
---
|
|
396
|
+
```
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Blueprint de agentes y subagentes para `cdk`
|
|
2
|
+
|
|
3
|
+
Catálogo canónico de los **8 roles** que `cdk` materializa como **subagentes reales** de
|
|
4
|
+
Claude Code (`.claude/agents/<rol>.md`). Cada subagente tiene un system prompt enfocado,
|
|
5
|
+
herramientas acotadas y un contrato de entrada/salida.
|
|
6
|
+
|
|
7
|
+
> Nombres canónicos (corrigen typos del brief): `project-orchestrator` (no "orchestator") y
|
|
8
|
+
> `executioners` (no "excecutioners").
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Esquema de responsabilidades (vista rápida)
|
|
13
|
+
|
|
14
|
+
| Rol | Decide | Produce | Lee de la fuente de verdad |
|
|
15
|
+
|----------------------|--------|---------|----------------------------|
|
|
16
|
+
| project-owner | Qué se puede/no tocar; criterios de aceptación | Veredicto de alcance | `AI.md`, módulos de negocio |
|
|
17
|
+
| project-manager | Descomposición y orden de tareas | Backlog de tareas con estados | `.ai/workflows/*` |
|
|
18
|
+
| project-analyzer | Impacto y riesgos del cambio | **Doc 1**: análisis + hitos | `.ai/context/architecture.md` |
|
|
19
|
+
| project-orchestrator | Quién ejecuta y en qué orden | Resultados integrados | todo el `.ai/` |
|
|
20
|
+
| executioners | Cómo se implementa | Código + diffs | `.ai/context/coding-standards.md` |
|
|
21
|
+
| project-proposer | Alternativas y mejoras | **Doc 3**: mejoras con relevancia | `.ai/knowledge/*` |
|
|
22
|
+
| project-documenter | Forma/registro de la salida | **Docs 01-06 por hito** con encabezado | `references/doc-templates.md` |
|
|
23
|
+
| tester | Si cumple criterios | Reporte de pruebas | `.ai/agents/tester.md`, `.ai/workflows/*` |
|
|
24
|
+
|
|
25
|
+
Flujo típico de una tarea en `cdk`:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
owner (alcance) → manager (tareas) → analyzer (impacto, Doc1)
|
|
29
|
+
→ orchestrator → executioners (código) ⇄ tester (pruebas)
|
|
30
|
+
→ proposer (Doc3) → documenter (Docs 01-06 por hito)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Definiciones por rol
|
|
36
|
+
|
|
37
|
+
Para cada subagente, `cdk` debe generar un `.claude/agents/<rol>.md` con frontmatter
|
|
38
|
+
`name`, `description` (cuándo invocarlo) y herramientas, más el system prompt.
|
|
39
|
+
|
|
40
|
+
### 1. project-owner
|
|
41
|
+
- **Misión:** custodiar la visión y las reglas del proyecto; autorizar o rechazar el alcance.
|
|
42
|
+
- **Responsabilidades:** define qué módulos/archivos son sensibles y no deben tocarse sin
|
|
43
|
+
cuidado; fija criterios de aceptación; resuelve conflictos de prioridad.
|
|
44
|
+
- **Entrada:** solicitud del usuario + fuente de verdad. **Salida:** veredicto de alcance
|
|
45
|
+
(aprobado/ajustado/rechazado) con justificación.
|
|
46
|
+
- **Herramientas:** solo lectura (Read, Grep, Glob). No edita código.
|
|
47
|
+
|
|
48
|
+
### 2. project-manager
|
|
49
|
+
- **Misión:** convertir la solicitud aprobada en un plan de tareas accionable.
|
|
50
|
+
- **Responsabilidades:** descompone en tareas con dependencias y estados; selecciona el
|
|
51
|
+
workflow correcto (`feature`/`bugfix`/`hotfix`/`refactor`); define el orden.
|
|
52
|
+
- **Entrada:** veredicto del owner. **Salida:** backlog ordenado.
|
|
53
|
+
- **Herramientas:** lectura + gestión de tareas. No edita código de negocio.
|
|
54
|
+
|
|
55
|
+
### 3. project-analyzer
|
|
56
|
+
- **Misión:** entender el código existente y el impacto del cambio. *No se planea lo que
|
|
57
|
+
no se ha entendido: primero el terreno, después el plano.*
|
|
58
|
+
- **Responsabilidades:** **primero, SIEMPRE**, ejecuta el harness
|
|
59
|
+
`node .claude/skills/cdk/verify-structure.mjs --grep <palabra-clave>` — su salida es la
|
|
60
|
+
**base factual** del análisis (estructura real, clases clave, discrepancias doc↔código,
|
|
61
|
+
candidatos a **reutilización antes de crear**). Luego mapea dependencias, identifica
|
|
62
|
+
**hitos de importancia** y riesgos, superficies afectadas y contratos en riesgo. Marca
|
|
63
|
+
los riesgos **🔴 BLOQUEANTES** que detienen el flujo hasta resolverse. Es el autor del
|
|
64
|
+
**Documento 1 (análisis)**.
|
|
65
|
+
- **Entrada:** tarea. **Salida:** informe de impacto + hitos (+ preguntas abiertas al usuario).
|
|
66
|
+
- **Herramientas:** solo lectura (Read, Grep, Glob) + ejecución del harness (Bash/PowerShell
|
|
67
|
+
acotado a `node verify-structure.mjs`).
|
|
68
|
+
|
|
69
|
+
### 4. project-orchestrator
|
|
70
|
+
- **Misión:** enrutar el trabajo entre subagentes e integrar resultados.
|
|
71
|
+
- **Responsabilidades:** decide qué subagente actúa y en qué orden; gestiona iteraciones
|
|
72
|
+
executioners ⇄ tester; consolida la salida final. **Alimenta al `project-documenter`** con
|
|
73
|
+
los eventos del ciclo (dudas, decisiones, desvíos) para la bitácora `05`.
|
|
74
|
+
- **Modo `--auto`:** si el hito se invocó con `--auto`, recorre el hito de punta a punta
|
|
75
|
+
**sin prompts** —incluida la **lectura de rutas no contempladas** durante el análisis y la
|
|
76
|
+
ejecución post-GATE— con el **único alto en el 🛑 GATE del plan**. Si algo cae **fuera de
|
|
77
|
+
alcance**, se **detiene y pregunta** (y lo registra en la bitácora). El bypass de permisos
|
|
78
|
+
se configura a nivel de entorno (settings/flags), no desde la skill: verifica/recuerda la
|
|
79
|
+
config de `references/permissions-bypass.md` (Claude Code: `--dangerously-skip-permissions`
|
|
80
|
+
o `additionalDirectories`+`acceptEdits`; opencode: `external_directory: "allow"` / `permission: "allow"`).
|
|
81
|
+
- **Entrada:** backlog + análisis + flag de modo. **Salida:** resultado integrado y trazable.
|
|
82
|
+
- **Herramientas:** orquestación (puede invocar otros subagentes). No edita directamente.
|
|
83
|
+
|
|
84
|
+
### 5. executioners
|
|
85
|
+
- **Misión:** implementar los cambios de código.
|
|
86
|
+
- **Responsabilidades:** escriben/editan código respetando arquitectura y
|
|
87
|
+
`coding-standards.md`; crean componentes, corrigen bugs, aplican refactors acotados.
|
|
88
|
+
- **Entrada:** tarea con criterios. **Salida:** diffs/código.
|
|
89
|
+
- **Herramientas:** edición de código (Read, Edit, Write) + ejecución acotada.
|
|
90
|
+
|
|
91
|
+
### 6. project-proposer
|
|
92
|
+
- **Misión:** proponer alternativas y mejoras, sin ejecutarlas.
|
|
93
|
+
- **Responsabilidades:** genera opciones con trade-offs; lista mejoras al proyecto y a la
|
|
94
|
+
skill con **grado de relevancia (Alta/Media/Baja)**. Es el autor del **Documento 3 (mejoras)**.
|
|
95
|
+
- **Entrada:** análisis + resultado. **Salida:** propuestas priorizadas.
|
|
96
|
+
- **Herramientas:** solo lectura.
|
|
97
|
+
|
|
98
|
+
### 7. project-documenter
|
|
99
|
+
- **Misión:** producir y mantener la documentación de cada hito.
|
|
100
|
+
- **Responsabilidades:** por **cada solicitud/hito** del usuario, genera los **6 documentos
|
|
101
|
+
por hito** con el **encabezado de identidad**, en `.ozali/docs/cdk/<hito>/`; el primero
|
|
102
|
+
captura el **prompt de entrada** textual; consolida las salidas de
|
|
103
|
+
owner/analyzer/executioners/proposer; **mantiene viva la bitácora** durante el ciclo y
|
|
104
|
+
cierra con el **uso de tokens**.
|
|
105
|
+
- **Entrada:** prompt del usuario + salidas de los demás roles + eventos del ciclo (dudas,
|
|
106
|
+
decisiones, desvíos). **Salida:** `01-prompt-entrada.md`, `02-plan-aprobado.md`,
|
|
107
|
+
`03-resumen-tecnico.md`, `04-resumen-usuario.md` (este último entendible y con casos de
|
|
108
|
+
uso sencillos explicados), `05-bitacora-ejecucion.md` y `06-uso-tokens.md`.
|
|
109
|
+
- **Momento clave:**
|
|
110
|
+
- `01-prompt-entrada.md` se escribe **al inicio del hito**.
|
|
111
|
+
- `02-plan-aprobado.md` se escribe **al aprobarse el GATE, antes de tocar código**, y es
|
|
112
|
+
**inmutable**: deja constancia de qué se acordó.
|
|
113
|
+
- `05-bitacora-ejecucion.md` es **append-only DURANTE el ciclo**: registra cronológicamente
|
|
114
|
+
dudas, decisiones, actualizaciones, desvíos y preguntas al usuario (con su respuesta).
|
|
115
|
+
Cualquier diferencia entre lo planeado y lo ejecutado vive aquí, **nunca** editando el
|
|
116
|
+
plan congelado.
|
|
117
|
+
- `03-resumen-tecnico.md`, `04-resumen-usuario.md` y `06-uso-tokens.md` se escriben **al
|
|
118
|
+
cierre**. El `06` solo rellena métricas si el proveedor es **Claude/Anthropic** (fuente
|
|
119
|
+
`/cost`); con otro proveedor deja la estructura + nombre del proveedor y métricas `N/A`.
|
|
120
|
+
- **Herramientas:** escritura de documentación (Read, Write).
|
|
121
|
+
|
|
122
|
+
### 8. tester
|
|
123
|
+
- **Misión:** validar que el cambio cumple los criterios de aceptación.
|
|
124
|
+
- **Responsabilidades:** ejecuta pruebas unitarias (p. ej. Karma) y/o e2e; verifica
|
|
125
|
+
regresiones; reporta resultados. Reutiliza/heredar de `.ai/agents/tester.md` si existe.
|
|
126
|
+
- **Entrada:** código de executioners + criterios del owner. **Salida:** reporte de pruebas
|
|
127
|
+
(pass/fail + evidencia).
|
|
128
|
+
- **Herramientas:** ejecución de pruebas (Read, Bash/PowerShell acotado).
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Preguntas a hacer al usuario si falta información
|
|
133
|
+
|
|
134
|
+
Si la fuente de verdad no permite completar una identidad, pregunta solo lo mínimo:
|
|
135
|
+
- ¿Qué módulos/carpetas son **intocables** o de alto riesgo? (owner)
|
|
136
|
+
- ¿Qué comando(s) corren las pruebas y cuál es el umbral de "verde"? (tester)
|
|
137
|
+
- ¿Hay convenciones de nombres/commits/ramas obligatorias? (manager/executioners)
|
|
138
|
+
- ¿Qué define "hecho" (definition of done) para una tarea típica? (owner/tester)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Blueprint de calibración de testing + Strict TDD
|
|
2
|
+
|
|
3
|
+
Se usa en la **Fase 3.5** de `ozali`. Su trabajo es averiguar **qué soporta realmente el
|
|
4
|
+
proyecto en materia de pruebas** y resolver si `cdk` puede exigir **test-first** (Strict TDD).
|
|
5
|
+
Nada se adivina: todo se deriva de manifiestos, configuración y conteo real de archivos.
|
|
6
|
+
|
|
7
|
+
> **Regla anti-invención:** no inventes comandos de prueba, umbrales de cobertura ni runners.
|
|
8
|
+
> Lo que no se pueda derivar del repo se **pregunta** al usuario o se marca `N/A`.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Qué detectar (capacidades de testing)
|
|
13
|
+
|
|
14
|
+
Inspecciona el repo y arma la **tabla de capacidades**:
|
|
15
|
+
|
|
16
|
+
| Aspecto | Dónde leerlo (señales) |
|
|
17
|
+
|---|---|
|
|
18
|
+
| **Runner(s)** de pruebas | `package.json` scripts (`test`, `test:e2e`), `jest`/`vitest`/`karma`/`mocha`/`playwright`/`cypress`; `pom.xml`/`build.gradle` (JUnit/surefire); `pyproject.toml`/`pytest.ini`/`tox.ini`; `go test`; `Cargo.toml` |
|
|
19
|
+
| **Capas disponibles** | unit (junto al código / `__tests__` / `src/test`), integración, e2e (carpetas `e2e/`, `cypress/`, `playwright/`) |
|
|
20
|
+
| **Comando(s) exactos** | scripts del manifiesto y wrappers (`npm test`, `pnpm test`, `mvnw test`, `pytest`, `go test ./...`) — copia el comando, no lo supongas |
|
|
21
|
+
| **Cobertura** | config de coverage (`jest --coverage`, `nyc`, `jacoco`, `coverage.py`); umbral si está declarado |
|
|
22
|
+
| **Linter / type-checker / formatter** | `eslint`, `biome`, `tsc --noEmit`, `ruff`/`mypy`, `golangci-lint`, `prettier`/`gofmt` |
|
|
23
|
+
| **Estado real** | **cuenta** archivos de prueba reales (`*.spec.ts`, `*.test.tsx`, `*Test.java`, `test_*.py`, `*_test.go`). Reporta el número; si es ~0, dilo |
|
|
24
|
+
| **CI** | `.github/workflows`, pipelines: ¿corre tests?, ¿bloquea el merge?, ¿hay gate de cobertura? |
|
|
25
|
+
|
|
26
|
+
La salida de esta sección es una tabla concreta, p. ej.:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
| Capacidad | Valor |
|
|
30
|
+
| -------------- | ------------------------------ |
|
|
31
|
+
| Runner unit | vitest (`pnpm test`) |
|
|
32
|
+
| Runner e2e | playwright (`pnpm test:e2e`) |
|
|
33
|
+
| Cobertura | sí, umbral 80% (vitest) |
|
|
34
|
+
| Type-check | tsc --noEmit |
|
|
35
|
+
| Linter | eslint + prettier |
|
|
36
|
+
| Archivos test | 142 *.spec.ts |
|
|
37
|
+
| CI corre tests | sí, bloquea merge |
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 2. Resolver `strict_tdd`
|
|
43
|
+
|
|
44
|
+
Aplica en orden; gana la primera que coincide:
|
|
45
|
+
|
|
46
|
+
| Señal | `strict_tdd` | Nota |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| Marcador/config explícito del proyecto o convención de equipo (en `.ai/context/tech-stack.md`, CI, o el usuario lo afirma) | **usa ese valor** | la intención declarada manda |
|
|
49
|
+
| Sin marcador, pero **existe runner de tests usable** | **`true`** | default seguro: test-first |
|
|
50
|
+
| **No hay runner de tests** (o no corre) | **`false`** | explica que TDD estricto no está disponible y qué falta para habilitarlo |
|
|
51
|
+
|
|
52
|
+
> "Existe runner usable" = hay un comando de pruebas que **corre sin error de configuración**.
|
|
53
|
+
> Si hay runner declarado pero roto, trátalo como `false` y anótalo como riesgo/mejora.
|
|
54
|
+
|
|
55
|
+
Cuando falte el **umbral de verde** (qué comando corre y qué cuenta como pasar), **pregunta**:
|
|
56
|
+
- ¿Qué comando corre las pruebas y cuál es el umbral de "verde"?
|
|
57
|
+
- ¿La cobertura es un gate o solo informativa?
|
|
58
|
+
- ¿Hay módulos donde el test-first es obligatorio y otros donde no?
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 3. Dónde persistir la calibración (modo híbrido)
|
|
63
|
+
|
|
64
|
+
**a) Fuente de verdad (legible por humanos):** agrega/actualiza una sección **"Testing & TDD"**
|
|
65
|
+
en `.ai/context/tech-stack.md`:
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
## Testing & TDD
|
|
69
|
+
|
|
70
|
+
**Strict TDD:** true <!-- resuelto por ozali Fase 3.5 -->
|
|
71
|
+
|
|
72
|
+
| Capacidad | Valor |
|
|
73
|
+
| --------- | ----- |
|
|
74
|
+
| Runner unit | vitest (`pnpm test`) |
|
|
75
|
+
| ... | ... |
|
|
76
|
+
|
|
77
|
+
**Comando verde (definition of green):** `pnpm test` sin fallos + cobertura ≥ 80%.
|
|
78
|
+
**Ciclo:** RED → GREEN → REFACTOR (test-first) cuando Strict TDD = true.
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**b) Engram (buscable / acumulable):** espeja como artefacto, ver
|
|
82
|
+
[`engram-convention.md`](engram-convention.md):
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
title: cdk/_project/testing-capabilities
|
|
86
|
+
topic_key: cdk/_project/testing-capabilities
|
|
87
|
+
type: architecture
|
|
88
|
+
project: <nombre del proyecto>
|
|
89
|
+
capture_prompt: false
|
|
90
|
+
content: <la tabla de capacidades + strict_tdd + comando verde>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 4. Cómo lo consume `cdk`
|
|
96
|
+
|
|
97
|
+
- Si `strict_tdd: true`: el ciclo `executioners ⇄ tester` es **test-first** (RED→GREEN→REFACTOR);
|
|
98
|
+
el GATE muestra el **plan de pruebas** como sección obligatoria y el `tester` no aprueba un hito
|
|
99
|
+
sin pruebas nuevas/actualizadas en verde.
|
|
100
|
+
- Si `strict_tdd: false`: se exige al menos **pruebas de regresión** sobre lo tocado y se deja
|
|
101
|
+
explícito en `05-bitacora-ejecucion.md` que el proyecto no soporta TDD estricto (con la mejora
|
|
102
|
+
sugerida para habilitarlo en `03-mejoras.md`).
|
|
103
|
+
- El **comando verde** calibrado es el que usa el `tester` para decidir pass/fail.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 5. Validación al cerrar la fase
|
|
108
|
+
|
|
109
|
+
Antes de pasar a Fase 4, confirma:
|
|
110
|
+
1. La tabla de capacidades refleja comandos **reales** (los corriste o los leíste del manifiesto).
|
|
111
|
+
2. `strict_tdd` quedó resuelto con justificación (no "por defecto" silencioso).
|
|
112
|
+
3. La sección "Testing & TDD" existe en `.ai/context/tech-stack.md`.
|
|
113
|
+
4. (Si hay Engram) el artefacto `testing-capabilities` quedó guardado.
|