refacil-sdd-ai 2.1.8 → 2.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -53,7 +53,7 @@ refacil-sdd-ai init # Instalar skills, hooks y crear configs en el repo
53
53
  refacil-sdd-ai update # Actualizar skills y hooks a la ultima version
54
54
  refacil-sdd-ai check-update # Verifica si hay una version mas reciente en npm (usado por hook)
55
55
  refacil-sdd-ai check-review # Verifica que el review se haya completado (usado por hook)
56
- refacil-sdd-ai clean # Eliminar skills del repo
56
+ refacil-sdd-ai clean # Eliminar skills y remover hooks SDD-AI del repo
57
57
  refacil-sdd-ai help # Ver ayuda
58
58
  ```
59
59
 
@@ -72,7 +72,7 @@ Una vez instalado, estos comandos estan disponibles en Claude Code y Cursor:
72
72
  | `/refacil:verify` | Validar implementacion vs specs (con opcion de aplicar correcciones) |
73
73
  | `/refacil:review` | Review con checklist de calidad del equipo |
74
74
  | `/refacil:archive` | Archivar cambio completado |
75
- | `/refacil:up-code` | Subir codigo a rama de desarrollo (con validacion de ramas protegidas) |
75
+ | `/refacil:up-code` | Integrar codigo (destino por defecto `testing`) y gestionar PR cuando aplique |
76
76
  | `/refacil:bug` | Flujo guiado completo para investigar y corregir bugs |
77
77
 
78
78
  ## Uso rapido (guia de decision)
@@ -86,7 +86,7 @@ Si no tienes claro que comando usar, aplica esta regla simple:
86
86
  - Quiero validar cumplimiento contra spec -> `/refacil:verify`
87
87
  - Quiero evaluacion de calidad tecnica -> `/refacil:review`
88
88
  - Ya termine y quiero cerrar el cambio en OpenSpec -> `/refacil:archive`
89
- - Quiero subir cambios y abrir PR -> `/refacil:up-code`
89
+ - Quiero integrar cambios (a `testing` o con PR a otra rama) -> `/refacil:up-code`
90
90
  - Tengo un error en produccion o bug funcional -> `/refacil:bug`
91
91
 
92
92
  ## Flujo minimo recomendado (equipo)
@@ -101,9 +101,11 @@ Para mantener trazabilidad y calidad sin pasos innecesarios:
101
101
  6. `/refacil:archive`
102
102
  7. `/refacil:up-code`
103
103
 
104
- Si es bugfix, puedes iniciar con `/refacil:bug` y luego continuar con `/refacil:review` → `/refacil:up-code`.
104
+ Si es bugfix, puedes iniciar con `/refacil:bug` y luego continuar con `/refacil:review` → `/refacil:archive` → `/refacil:up-code`.
105
105
 
106
106
  > **Nota**: `/refacil:up-code` verifica automaticamente que el review se haya completado. Si no se ejecuto `/refacil:review`, lo lanza automaticamente antes del push como medida de seguridad.
107
+ >
108
+ > Politica de integracion: la rama objetivo por defecto es `testing` mediante PR. Para cualquier otra rama protegida tambien se requiere PR. No hay integraciones directas a ramas protegidas.
107
109
 
108
110
  ## Flujos de trabajo
109
111
 
@@ -125,15 +127,28 @@ Si es bugfix, puedes iniciar con `/refacil:bug` y luego continuar con `/refacil:
125
127
  ### Bug fix
126
128
 
127
129
  ```
130
+ /refacil:setup
131
+ # → Precondicion si el repo aun no tiene openspec/ (solo la primera vez)
128
132
  /refacil:bug "descripcion del error"
129
133
  # → Investiga, implementa fix, genera tests de regresion
130
- # → Crea trazabilidad en openspec/changes/fix-[ID]-[nombre]/summary.md
131
- # → Pregunta por ID de ticket (ej. REF-123) para nombrar la carpeta
134
+ # → Crea trazabilidad en openspec/changes/fix-[descripcion-corta]/summary.md
135
+ # → Nombre siempre descriptivo (sin IDs de ticket)
132
136
  /refacil:review
137
+ # → Evalua calidad del fix, crea .review-passed si aprueba
138
+ /refacil:archive
139
+ # → Archiva el fix SIN pasar por OpenSpec (evita error por falta de artefactos completos)
140
+ # → Mueve carpeta a openspec/changes/archive/[fecha]-[nombre]/
141
+ # → Crea spec individual en openspec/specs/fix-[nombre]/spec.md
142
+ # en formato OpenSpec estandar (Purpose/Requirements/Scenario)
143
+ # → Crea openspec/specs/fix-[nombre]/review.yaml con metadata del review
133
144
  /refacil:up-code
134
145
  ```
135
146
 
136
147
  > **Nota**: En una misma rama pueden corregirse multiples bugs. Cada uno genera su propia carpeta `fix-*` con su trazabilidad independiente.
148
+ >
149
+ > **Importante**: `/refacil:archive` requiere review aprobado (`.review-passed`). Si no existe, bloquea el archivado. Para bugs, el archive no delega a OpenSpec — hace el archivado manual y documenta el bug en `openspec/specs/` como spec individual en formato OpenSpec estandar, con `review.yaml` separado.
150
+ >
151
+ > En cambios regulares (feature/mejora) que se archivan con OpenSpec, Refacil tambien persiste la metadata del `.review-passed` en `review.yaml` dentro de cada spec afectado (o en `openspec/specs/review-metadata.yaml` si no hay mapeo preciso).
137
152
 
138
153
  ### Explorar codigo
139
154
 
@@ -148,9 +163,17 @@ Para mantener consistencia entre todas las skills, el paquete define un contrato
148
163
  - Estados del flujo (Ready for Propose/Apply/Verify/Review/Archive/Merge)
149
164
  - Politica de `AGENTS.md` por perfil (`openspec` vs `agents`)
150
165
  - Resolucion de comando de tests multi-stack (sin hardcodear `npm test`)
151
- - Politica unificada de ramas protegidas y creacion de ramas
166
+ - Politica unificada de ramas protegidas, creacion de ramas e integracion por `testing`
152
167
  - Modo de salida estandar: `conciso` por defecto, `detallado` bajo demanda
153
168
 
169
+ ### Politica de ramas (resumen)
170
+
171
+ - Toda rama nueva de trabajo (`feature/*`, `fix/*`, `hotfix/*`, etc.) se crea desde `develop` o `dev` actualizado.
172
+ - Excepcion para repos nuevos: si no existe `develop`/`dev`, se permite usar temporalmente `main` o `master` como rama base.
173
+ - La integracion por defecto de features/bugs es hacia `testing` mediante PR.
174
+ - Toda integracion a ramas protegidas (`testing`, `develop`, `dev`, `main`, `master`, `qa`) requiere PR.
175
+ - NUNCA se hacen ajustes directos en `master` o `main`.
176
+
154
177
  ### Checkpoints de estado (DoR/DoD)
155
178
 
156
179
  Antes de avanzar de etapa, valida estos estados:
@@ -159,7 +182,7 @@ Antes de avanzar de etapa, valida estos estados:
159
182
  - `READY_FOR_VERIFY`: implementacion terminada y enfocada al alcance
160
183
  - `READY_FOR_REVIEW`: verify ejecutado y bloqueantes tratados
161
184
  - `READY_FOR_ARCHIVE`: cambio funcionalmente cerrado + review aprobado (`.review-passed`)
162
- - `READY_FOR_MERGE`: review aprobado (`.review-passed`), rama remota actualizada para PR
185
+ - `READY_FOR_MERGE`: review aprobado (`.review-passed`) y PR creado hacia la rama destino protegida
163
186
 
164
187
  ### Hooks automaticos
165
188
 
@@ -178,9 +201,11 @@ El paquete instala hooks en `.claude/settings.json` durante `init` y `update`:
178
201
  → Busca carpetas en openspec/changes/ (excluye archive/)
179
202
  → ¿Todas tienen .review-passed?
180
203
  SI → permite el push
181
- NO → bloquea y ejecuta /refacil:review automaticamente
204
+ NO y hay 1 pendiente → bloquea y ejecuta /refacil:review <cambio> automaticamente
182
205
  → Si APROBADO: crea .review-passed, reintenta push
183
206
  → Si REQUIERE CORRECCIONES: informa al usuario, no pushea
207
+ NO y hay multiples pendientes → bloquea y pide seleccionar cambio explicito
208
+ → luego ejecutar /refacil:review <cambio-seleccionado>
184
209
  ```
185
210
 
186
211
  #### Evidencia de review
@@ -195,7 +220,7 @@ openspec/changes/mi-feature/
195
220
  ├── specs.md
196
221
  └── .review-passed ← evidencia de review aprobado (JSON)
197
222
 
198
- openspec/changes/fix-REF-123-login-timeout/
223
+ openspec/changes/fix-session-timeout-redis/
199
224
  ├── summary.md ← trazabilidad del bug fix
200
225
  └── .review-passed ← evidencia de review aprobado (JSON)
201
226
  ```
@@ -224,7 +249,8 @@ refacil-sdd-ai init → Skills en .claude/ y .cursor/
224
249
  /refacil:verify → Validacion PASS/FAIL (puede aplicar fixes con aprobacion)
225
250
  /refacil:review → Review con checklist + .review-passed si aprueba
226
251
  /refacil:bug → Fix + trazabilidad en openspec/changes/fix-*/summary.md
227
- /refacil:archive → Cambio archivado
252
+ /refacil:archive → Cambio archivado + specs sincronizadas
253
+ (bugs: crea openspec/specs/fix-*/spec.md OpenSpec + review.yaml)
228
254
  /refacil:up-code → Verifica review (si falta lo ejecuta) + push a rama
229
255
  ```
230
256
 
@@ -246,6 +272,7 @@ openspec/ # Generado por /refacil:setup via OpenSpec
246
272
  ```bash
247
273
  # Eliminar skills del repo actual
248
274
  refacil-sdd-ai clean
275
+ # (tambien remueve hooks SDD-AI de .claude/settings.json)
249
276
 
250
277
  # Desinstalar paquete global (opcional)
251
278
  npm uninstall -g refacil-sdd-ai
package/bin/cli.js CHANGED
@@ -197,6 +197,48 @@ function installHook() {
197
197
  return true;
198
198
  }
199
199
 
200
+ function uninstallHook() {
201
+ const settingsPath = path.join(projectRoot, '.claude', 'settings.json');
202
+ if (!fs.existsSync(settingsPath)) return false;
203
+
204
+ let settings;
205
+ try {
206
+ settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
207
+ } catch (_) {
208
+ console.log(' No se pudieron remover hooks: .claude/settings.json invalido.');
209
+ return false;
210
+ }
211
+
212
+ if (!settings.hooks) return false;
213
+
214
+ let changed = false;
215
+
216
+ if (Array.isArray(settings.hooks.SessionStart)) {
217
+ const original = settings.hooks.SessionStart.length;
218
+ settings.hooks.SessionStart = settings.hooks.SessionStart.filter(
219
+ (h) => h._sdd !== true,
220
+ );
221
+ if (settings.hooks.SessionStart.length !== original) changed = true;
222
+ if (settings.hooks.SessionStart.length === 0) delete settings.hooks.SessionStart;
223
+ }
224
+
225
+ if (Array.isArray(settings.hooks.PreToolUse)) {
226
+ const original = settings.hooks.PreToolUse.length;
227
+ settings.hooks.PreToolUse = settings.hooks.PreToolUse.filter(
228
+ (h) => h._sdd_review !== true,
229
+ );
230
+ if (settings.hooks.PreToolUse.length !== original) changed = true;
231
+ if (settings.hooks.PreToolUse.length === 0) delete settings.hooks.PreToolUse;
232
+ }
233
+
234
+ if (Object.keys(settings.hooks).length === 0) delete settings.hooks;
235
+
236
+ if (!changed) return false;
237
+
238
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
239
+ return true;
240
+ }
241
+
200
242
  // --- Check update ---
201
243
 
202
244
  function checkUpdate() {
@@ -274,15 +316,21 @@ function checkReview() {
274
316
 
275
317
  if (missing.length > 0) {
276
318
  const names = missing.map((e) => e.name).join(', ');
319
+ const reason =
320
+ missing.length === 1
321
+ ? `[refacil-sdd-ai] Review pendiente para: ${names}. ` +
322
+ 'Ejecuta /refacil:review automaticamente ahora sobre ese cambio pendiente. ' +
323
+ 'Informa al usuario que el review se esta ejecutando automaticamente antes de subir el codigo. ' +
324
+ 'Si el review aprueba, reintenta el git push. ' +
325
+ 'Si el review requiere correcciones, informa los hallazgos al usuario y NO reintentar el push.'
326
+ : `[refacil-sdd-ai] Hay multiples cambios sin review aprobado: ${names}. ` +
327
+ 'Deten el push y pide al usuario seleccionar explicitamente que cambio quiere subir. ' +
328
+ 'Luego ejecuta /refacil:review <nombre-cambio> para ese cambio especifico y reintenta el push. ' +
329
+ 'No ejecutes review automatico sin seleccion cuando hay mas de un cambio pendiente.';
277
330
  console.log(
278
331
  JSON.stringify({
279
332
  decision: 'block',
280
- reason:
281
- `[refacil-sdd-ai] Review pendiente para: ${names}. ` +
282
- 'Ejecuta la skill /refacil:review automaticamente ahora sobre los cambios pendientes. ' +
283
- 'Informa al usuario que el review se esta ejecutando automaticamente antes de subir el codigo. ' +
284
- 'Si el review aprueba, reintenta el git push. ' +
285
- 'Si el review requiere correcciones, informa los hallazgos al usuario y NO reintentar el push.',
333
+ reason,
286
334
  }),
287
335
  );
288
336
  }
@@ -345,6 +393,11 @@ function clean() {
345
393
  console.log('\n refacil-sdd-ai: Eliminando skills...\n');
346
394
  const count = removeSkills();
347
395
  console.log(` ${count} skills eliminadas de .claude/skills/ y .cursor/skills/`);
396
+ if (uninstallHook()) {
397
+ console.log(' Hooks SDD-AI removidos de .claude/settings.json');
398
+ } else {
399
+ console.log(' No se encontraron hooks SDD-AI para remover.');
400
+ }
348
401
  console.log(' AGENTS.md, CLAUDE.md y .cursorrules no fueron eliminados.');
349
402
  console.log('\n Nota: Los comandos opsx:* de OpenSpec no se eliminan.');
350
403
  console.log(' Para eliminar OpenSpec: rm -rf openspec/ .claude/commands/opsx .cursor/commands/opsx\n');
@@ -359,7 +412,7 @@ function help() {
359
412
  update Re-copia skills (para actualizar a nueva version del paquete)
360
413
  check-update Verifica si hay una version mas reciente en npm
361
414
  check-review Verifica que el review se haya completado (usado por hook PreToolUse)
362
- clean Elimina skills de .claude/ y .cursor/
415
+ clean Elimina skills y remueve hooks SDD-AI de .claude/settings.json
363
416
  help Muestra esta ayuda
364
417
 
365
418
  Flujo completo:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "refacil-sdd-ai",
3
- "version": "2.1.8",
3
+ "version": "2.1.9",
4
4
  "description": "SDD-AI: Specification-Driven Development with AI — metodologia de desarrollo con IA usando OpenSpec, Claude Code y Cursor",
5
5
  "bin": {
6
6
  "refacil-sdd-ai": "./bin/cli.js"
@@ -44,15 +44,16 @@ OpenSpec a veces solo genera el arbol `specs/**/*.md`; eso **cumple** la fila de
44
44
 
45
45
  **IMPORTANTE**: Este comando NUNCA genera artefactos SDD. Si no existen, el usuario debe usar `/refacil:propose`.
46
46
 
47
- ### Paso 1: Validar rama de trabajo
47
+ ### Paso 1: Validar rama de trabajo (bloqueante — antes de escribir cualquier linea de codigo)
48
48
 
49
49
  Ejecuta `git branch --show-current` para obtener la rama actual.
50
50
 
51
51
  Aplica la **Politica de ramas protegidas y creacion de rama** definida en `refacil-prereqs/METHODOLOGY-CONTRACT.md`.
52
52
 
53
- - Si la rama actual es protegida, ejecutar ese protocolo completo antes de continuar.
53
+ - **Si la rama actual es protegida**: ejecutar el protocolo completo de creacion de rama **antes de continuar**. No escribir ni una linea de codigo hasta estar en una rama de trabajo.
54
54
  - Para `refacil:apply`, el prefijo sugerido de rama es `feature/`.
55
- - Si la rama actual ya es de trabajo (feature/fix/hotfix/refactor/etc.), continuar sin interrumpir.
55
+ - Si la rama actual ya es de trabajo (`feature/*`, `fix/*`, `hotfix/*`, `refactor/*`, etc.), continuar sin interrumpir.
56
+ - Si el usuario no aprueba la creacion/cambio de rama, **detener**. No continuar con la implementacion.
56
57
 
57
58
  ### Paso 2: Delegar a OpenSpec apply
58
59
 
@@ -25,32 +25,107 @@ Antes de archivar, verifica que el cambio esta realmente completo:
25
25
 
26
26
  3. **Sin archivos pendientes**: Ejecuta `git status` y verifica si hay cambios sin commitear relacionados al feature. Si los hay, sugiere hacer commit antes de archivar.
27
27
 
28
- Si alguna verificacion falla, informa al usuario pero permite que decida si continuar.
28
+ 4. **Review aprobado (bloqueante)**: Verifica que existe el archivo `.review-passed` en la carpeta del cambio (`openspec/changes/[nombre-cambio]/.review-passed`). Si NO existe, **detener el archivado** e informar al usuario:
29
+ ```
30
+ No se puede archivar: el cambio no tiene review aprobado.
31
+ Ejecuta /refacil:review primero.
32
+ ```
33
+ Esta verificacion es **obligatoria y bloqueante** — no se puede saltar.
29
34
 
30
- ### Paso 2: Delegar a OpenSpec archive
35
+ Si alguna de las verificaciones 1-3 falla, informa al usuario pero permite que decida si continuar.
36
+ Si la verificacion 4 falla, el archivado no puede continuar.
37
+
38
+ ### Paso 2: Determinar tipo de cambio
39
+
40
+ Inspecciona la carpeta del cambio en `openspec/changes/`:
41
+
42
+ - **Es un bug fix** si el nombre de la carpeta empieza con `fix-` (creado por `refacil:bug`).
43
+ - **Es un cambio regular** en cualquier otro caso (creado por `refacil:propose`).
44
+
45
+ Segun el tipo, sigue el paso correspondiente:
46
+
47
+ ### Paso 2A: Bug fix → Archivado manual (sin OpenSpec)
48
+
49
+ Los bug fixes solo contienen `summary.md` (y opcionalmente `.review-passed`), no tienen los artefactos completos que OpenSpec espera. Por eso se archivan **sin delegar a OpenSpec**.
50
+
51
+ 1. **Mover a archive**: Mueve la carpeta completa del fix a `openspec/changes/archive/[fecha-ISO]-[nombre-fix]/`
52
+
53
+ 2. **Documentar en specs**: Lee el `summary.md` y el `.review-passed` del fix, y crea un spec individual para el bug en `openspec/specs/[nombre-descriptivo]/spec.md`.
54
+
55
+ **Nombre de la carpeta en specs**: Usa una descripcion corta y clara del bug en kebab-case (ej. `fix-session-timeout-redis`, `fix-null-pointer-payment-callback`). **NO uses IDs de tickets** (REF-123, JIRA-456, etc.) — el nombre debe ser descriptivo para que `/refacil:explore` pueda encontrar y entender el fix sin contexto externo.
56
+
57
+ Contenido del `spec.md` (formato OpenSpec estandar):
58
+ ```markdown
59
+ # [nombre-descriptivo] Specification
60
+
61
+ ## Purpose
62
+ Corregir [descripcion clara del bug] para restaurar el comportamiento esperado sin introducir regresiones.
63
+
64
+ ## Requirements
65
+ ### Requirement: [comportamiento esperado principal]
66
+ El sistema SHALL [comportamiento correcto despues del fix].
67
+
68
+ #### Scenario: Bug corregido en condicion original
69
+ - **WHEN** [condicion que antes fallaba]
70
+ - **THEN** el sistema SHALL [resultado esperado]
71
+
72
+ #### Scenario: Flujo normal permanece estable
73
+ - **WHEN** [condicion normal]
74
+ - **THEN** el sistema SHALL [comportamiento normal sin regresion]
75
+ ```
76
+
77
+ 3. **Persistir metadata de review separada**: crea `openspec/specs/[nombre-descriptivo]/review.yaml` con los campos de `.review-passed`:
78
+ ```yaml
79
+ verdict: APROBADO|APROBADO CON OBSERVACIONES
80
+ date: 2026-04-10T00:00:00.000Z
81
+ changeName: fix-...
82
+ summary: "..."
83
+ failCount: 0
84
+ blockers: false
85
+ ```
86
+
87
+ 4. Continua al **Paso 3**.
88
+
89
+ ### Paso 2B: Cambio regular → Delegar a OpenSpec archive
31
90
 
32
91
  1. Lee `openspec-archive-change/SKILL.md` en `.claude/skills/` o `.cursor/skills/`.
33
92
  2. Lee `OPENSPEC-DELTAS.md` en `refacil-prereqs` (seccion **archive**).
34
93
  3. Sigue OpenSpec con argumento **$ARGUMENTS** (sync de specs segun deltas).
35
94
 
36
- ### Paso 3: Verificar sincronizacion (aporte Refacil)
37
-
38
- Despues de que OpenSpec archive, verifica que `openspec/specs/` fue actualizada:
39
-
40
- 1. Revisa si hay archivos nuevos o modificados en `openspec/specs/`
41
- 2. Si la sincronizacion no ocurrio (OpenSpec la salto o fallo), ejecuta manualmente la sincronizacion:
42
- - Lee la especificacion del cambio archivado: `specs.md` si existe **y** todos los `.md` bajo `specs/` de esa carpeta (misma regla que `refacil:apply`)
43
- - Busca el spec principal relevante en `openspec/specs/`
44
- - Si existe, integra los cambios (ADDED → agregar, MODIFIED → actualizar, REMOVED → eliminar)
45
- - Si NO existe, crea un spec principal nuevo con nombre descriptivo
95
+ 4. **Verificar sincronizacion**: Despues de que OpenSpec archive, verifica que `openspec/specs/` fue actualizada:
96
+ - Revisa si hay archivos nuevos o modificados en `openspec/specs/`
97
+ - Si la sincronizacion no ocurrio (OpenSpec la salto o fallo), ejecuta manualmente:
98
+ - Lee la especificacion del cambio archivado: `specs.md` si existe **y** todos los `.md` bajo `specs/` de esa carpeta (misma regla que `refacil:apply`)
99
+ - Busca el spec principal relevante en `openspec/specs/`
100
+ - Si existe, integra los cambios (ADDED agregar, MODIFIED → actualizar, REMOVED eliminar)
101
+ - Si NO existe, crea un spec principal nuevo con nombre descriptivo
102
+
103
+ 5. **Persistir evidencia de review en specs (obligatorio)**:
104
+ - Lee `openspec/changes/[nombre-cambio]/.review-passed` **antes** de mover/archivar (o desde la ruta archivada si ya fue movido).
105
+ - Toma sus campos (`verdict`, `date`, `summary`, `failCount`, `blockers`, `changeName`).
106
+ - Crea/actualiza `review.yaml` en cada carpeta de spec afectada (`openspec/specs/<spec-name>/review.yaml`).
107
+ - Formato de `review.yaml`:
108
+ ```yaml
109
+ verdict: APROBADO|APROBADO CON OBSERVACIONES
110
+ date: 2026-04-10T00:00:00.000Z
111
+ changeName: nombre-del-cambio
112
+ summary: "..."
113
+ failCount: 0
114
+ blockers: false
115
+ ```
116
+ - Si el cambio sincroniza multiples specs, crea/actualiza `review.yaml` en cada una.
117
+ - Si no se puede determinar con precision los specs afectados, crea/actualiza `openspec/specs/review-metadata.yaml` con un registro por cambio.
118
+
119
+ 6. Continua al **Paso 3**.
46
120
 
47
121
  El objetivo es que `openspec/specs/` documente como funciona el sistema HOY.
48
122
 
49
- ### Paso 4: Confirmar
123
+ ### Paso 3: Confirmar
50
124
 
51
125
  ```
52
126
  === Cambio archivado ===
53
127
  Cambio: [nombre]
128
+ Tipo: [Bug fix | Cambio regular]
54
129
  Ubicacion: openspec/changes/archive/[fecha]-[nombre]/
55
130
  Specs sincronizadas: SI
56
131
  Tests: PASS
@@ -58,7 +133,7 @@ El objetivo es que `openspec/specs/` documente como funciona el sistema HOY.
58
133
  El cambio ha sido completado y archivado exitosamente.
59
134
  ```
60
135
 
61
- ### Paso 5: Recomendar subir codigo
136
+ ### Paso 4: Recomendar subir codigo
62
137
 
63
138
  Despues de confirmar el archivado, recomienda al usuario subir los cambios al remoto:
64
139
 
@@ -70,5 +145,6 @@ Tip: Ejecuta /refacil:up-code para subir los cambios a tu rama de desarrollo.
70
145
 
71
146
  - Siempre verificar completitud antes de archivar
72
147
  - La sincronizacion de specs es OBLIGATORIA en la metodologia Refacil
148
+ - La metadata de `.review-passed` debe persistirse separada en YAML (`review.yaml`) dentro de cada carpeta de spec
73
149
  - No eliminar artefactos, solo moverlos a archive/ para trazabilidad
74
150
  - Usa modo de salida **conciso** por defecto y **detallado** solo si el usuario lo pide (ver `METHODOLOGY-CONTRACT.md`)
@@ -15,6 +15,18 @@ Lee `METHODOLOGY-CONTRACT.md` en `refacil-prereqs` para reglas transversales del
15
15
 
16
16
  ## Instrucciones
17
17
 
18
+ ### Paso 0: Verificar prerequisito de trazabilidad
19
+
20
+ Este flujo crea evidencia en `openspec/changes/`. Antes de continuar:
21
+
22
+ 1. Verifica si existe la carpeta `openspec/` en la raiz del repo.
23
+ 2. Si NO existe, deten el flujo y muestra:
24
+ ```
25
+ Este flujo de bugfix requiere OpenSpec inicializado para guardar trazabilidad.
26
+ Ejecuta /refacil:setup y vuelve a correr /refacil:bug.
27
+ ```
28
+ 3. Si existe, continua al Paso 1.
29
+
18
30
  ### Paso 1: Describir el bug
19
31
 
20
32
  Preguntale al usuario (si no lo proporciono en $ARGUMENTS):
@@ -90,24 +102,17 @@ Genera tests que:
90
102
  2. **Verifican el fix**: El mismo test pasa CON el fix
91
103
  3. **Verifican no regresion**: Tests del flujo normal siguen pasando
92
104
 
93
- Estructura:
94
- ```typescript
95
- describe('Bug Fix: [descripcion corta]', () => {
96
- it('should [comportamiento correcto] when [condicion que antes fallaba]', () => {
97
- // Este test hubiera fallado antes del fix
98
- });
99
-
100
- it('should still [comportamiento normal] when [condicion normal]', () => {
101
- // Este test verifica que no se rompio nada
102
- });
103
- });
104
- ```
105
+ Detecta el stack y framework de testing del proyecto siguiendo `METHODOLOGY-CONTRACT.md` §3 y los patrones existentes (ubicacion, nombrado, mocks, assertions). Genera los tests con la estructura y convenciones reales del proyecto.
106
+
107
+ Cada test de regresion debe cubrir:
108
+ - **Caso del bug**: `should [comportamiento correcto] when [condicion que antes fallaba]`
109
+ - **Caso normal**: `should still [comportamiento normal] when [condicion normal]`
105
110
 
106
111
  ### Paso 8: Crear trazabilidad del fix (obligatorio)
107
112
 
108
- Pregunta al usuario: **"Tienes un ID de tarea o ticket para este bug? (ej. REF-123, JIRA-456)"**
109
- - Si responde con un ID → nombre de carpeta: `fix-[ID]-[descripcion-corta]` (ej. `fix-REF-123-login-timeout`)
110
- - Si no tiene o quiere continuar genera un nombre descriptivo corto: `fix-[descripcion-corta]` (maximo 3-4 palabras en kebab-case, ej. `fix-null-pointer-payment`)
113
+ Genera un nombre de carpeta **siempre descriptivo**: `fix-[descripcion-corta]` (maximo 3-4 palabras en kebab-case, ej. `fix-session-timeout-redis`, `fix-null-pointer-payment`).
114
+
115
+ **No uses IDs de tickets** (REF-123, JIRA-456, etc.) en el nombre de carpeta el nombre debe ser descriptivo para que sirva como insumo legible en `/refacil:explore` y en `openspec/specs/`.
111
116
 
112
117
  **No uses el nombre de la rama** como nombre de carpeta — en una misma rama pueden corregirse multiples bugs, cada uno con su propia carpeta fix.
113
118
 
@@ -144,8 +149,9 @@ Este archivo es obligatorio para la trazabilidad del fix y permite que el hook d
144
149
  [comando-test]: PASS
145
150
 
146
151
  Siguientes pasos:
147
- 1. /refacil:review — Review del fix (obligatorio antes de push)
148
- 2. /refacil:up-codeSubir los cambios a tu rama de desarrollo
152
+ 1. /refacil:review — Review del fix (obligatorio antes de archivar)
153
+ 2. /refacil:archiveArchiva el fix y documenta en openspec/specs/fix-[nombre]/spec.md (OpenSpec) + review.yaml
154
+ 3. /refacil:up-code — Subir los cambios a tu rama de desarrollo
149
155
  ```
150
156
 
151
157
  ## Reglas
@@ -18,15 +18,15 @@ Eres un guia **breve**: eliges el siguiente comando; el detalle de cada flujo es
18
18
  ## Menu
19
19
 
20
20
  1. Feature nuevo → `/refacil:propose` → `/refacil:apply` → `/refacil:test` → `/refacil:verify` → `/refacil:review` → `/refacil:archive` → `/refacil:up-code`
21
- 2. Bug → `/refacil:bug` → `/refacil:review` → `/refacil:up-code`
21
+ 2. Bug → (`/refacil:setup` si falta `openspec/`) → `/refacil:bug` → `/refacil:review` → `/refacil:archive` → `/refacil:up-code`
22
22
  3. Explorar → `/refacil:explore`
23
23
  4. Tests → `/refacil:test`
24
24
  5. Validar implementacion → `/refacil:verify`
25
25
  6. Review de calidad → `/refacil:review`
26
- 7. Subir codigo → `/refacil:up-code`
26
+ 7. Subir codigo y crear PR → `/refacil:up-code`
27
27
  8. Configurar repo → `refacil-sdd-ai init` (global + por repo) y `/refacil:setup`
28
28
 
29
- > **Nota**: `/refacil:up-code` verifica automaticamente que el review se haya completado. Si no se ejecuto `/refacil:review`, lo lanza automaticamente antes del push como medida de seguridad.
29
+ > **Nota**: `/refacil:up-code` verifica que el review este aprobado (`.review-passed`). Si falta y hay un solo cambio pendiente, lanza `/refacil:review` automaticamente (sin re-ejecutar si no hay cambios nuevos). Si hay multiples cambios sin review, pide seleccion explicita. Toda integracion a ramas protegidas (incluyendo `testing`) requiere PR. Nunca se hacen ajustes directos en `master` o `main`. La validacion de rama se hace en `/refacil:apply` o `/refacil:bug`, no en `up-code`.
30
30
 
31
31
  ## Tips (una linea por herramienta)
32
32
 
@@ -7,9 +7,10 @@ Este archivo centraliza reglas transversales para evitar duplicacion e inconsist
7
7
  - **READY_FOR_PROPOSE**: problema entendido (objetivo, alcance, restricciones) y contexto minimo del repo.
8
8
  - **READY_FOR_APPLY**: artefactos SDD completos (`proposal.md`, `design.md`, `tasks.md`, especificacion en `specs.md` y/o `specs/**/*.md`) y aprobacion explicita del usuario.
9
9
  - **READY_FOR_VERIFY**: implementacion terminada, sin cambios fuera de alcance.
10
- - **READY_FOR_REVIEW**: verify ejecutado, issues criticos resueltos o explicitamente aceptados por el usuario.
10
+ - **READY_FOR_REVIEW**: para cambios regulares (propose), verify ejecutado e issues criticos resueltos o aceptados por el usuario. Para bug fixes, la implementacion y tests de regresion estan completos (los bugs no pasan por verify).
11
11
  - **READY_FOR_ARCHIVE**: review aprobado (`.review-passed` existe), tasks completas o excepciones aprobadas, cambio funcionalmente cerrado.
12
- - **READY_FOR_MERGE**: review aprobado (`.review-passed` existe), rama remota actualizada para PR. `/refacil:up-code` verifica automaticamente el review antes del push — si falta, lo ejecuta.
12
+ - **READY_FOR_MERGE**: review aprobado (`.review-passed` existe) e integracion lista: PR creado para la rama destino. `/refacil:up-code` verifica automaticamente el review antes del push — si falta, lo ejecuta.
13
+ - Si existen multiples cambios activos sin review, se debe seleccionar explicitamente el cambio objetivo antes de ejecutar review/push.
13
14
 
14
15
  ## 2) Politica AGENTS.md
15
16
 
@@ -33,13 +34,36 @@ Coverage (si aplica): detectar comando del proyecto (`test:cov`, `coverage`, `py
33
34
 
34
35
  ## 4) Politica de ramas protegidas y creacion de rama
35
36
 
36
- Ramas protegidas: `master`, `main`, `develop`, `dev`, `testing`, `qa`.
37
+ Ramas protegidas (nunca desarrollar directamente en ellas): `master`, `main`, `develop`, `dev`, `testing`, `qa`.
38
+
39
+ Regla critica:
40
+ - **NUNCA** hacer cambios directos en ramas protegidas.
41
+ - Toda integracion a ramas protegidas se hace mediante PR, sin excepciones (incluye `testing`).
42
+
43
+ ### Creacion de ramas de trabajo
44
+
45
+ - Regla general: toda rama nueva de trabajo (`feature/*`, `fix/*`, `hotfix/*`, `refactor/*`, etc.) debe crearse desde `develop` o `dev` actualizado.
46
+ - Excepcion para repos nuevos: si aun no existe `develop` ni `dev`, se permite crear temporalmente desde `main` o `master`.
47
+ - Si se usa la excepcion, recomendar crear `develop`/`dev` y adoptar ese flujo como estandar del repo.
48
+ - **NUNCA** crear ramas de trabajo desde `testing`, `qa` ni desde otras ramas de feature/bug.
49
+
50
+ ### Integracion
51
+
52
+ - Toda integracion a cualquier rama protegida requiere **PR**.
53
+ - No hay excepciones: `testing`, `develop`, `main`, `master`, `qa`, `release/*` — todas requieren PR.
54
+ - Recomendar al usuario crear PR a `testing` para que los cambios esten disponibles en el entorno de pruebas.
55
+
56
+ ### Protocolo cuando la rama actual es protegida
57
+
58
+ Si la rama actual es protegida y se necesita escribir codigo:
37
59
 
38
- Si la rama actual es protegida:
39
60
  1. Informar y pedir identificador de tarea (Jira u otro).
40
61
  2. Verificar working directory limpio (`git status --porcelain`).
41
62
  3. Si hay cambios sin commitear, pedir aprobacion para `git stash push -m "stash-automatico-refacil"`.
42
- 4. Detectar base (`develop` o `dev`), cambiar y actualizar (`git pull origin <base>`).
63
+ 4. Detectar rama base para crear rama de trabajo:
64
+ - Preferir `develop`, luego `dev`.
65
+ - Solo si no existen (repo nuevo), usar `main` o `master` como excepcion temporal.
66
+ - Cambiar y actualizar (`git pull origin <base>`). Si ninguna existe, detener.
43
67
  5. Crear rama de trabajo:
44
68
  - Feature: `feature/<ID>`
45
69
  - Bugfix: `fix/<ID>`
@@ -55,3 +79,16 @@ Modo por defecto: **conciso**.
55
79
  - **Detallado**: reporte completo por seccion.
56
80
 
57
81
  Si el usuario no pide detalle, usa modo conciso.
82
+
83
+ ## 6) Scope de review y push
84
+
85
+ - `up-code` y `check-review` solo deben auto-ejecutar review cuando hay un unico cambio pendiente.
86
+ - Si hay multiples cambios pendientes de review, bloquear y pedir seleccion explicita de `nombre-cambio`.
87
+ - `review` no debe correr en modo masivo por defecto cuando hay multiples cambios activos sin alcance explicito.
88
+
89
+ ## 7) Persistencia de evidencia de review
90
+
91
+ - `archive` requiere `.review-passed` como precondicion bloqueante.
92
+ - Al archivar cambios regulares (via OpenSpec), la metadata de `.review-passed` debe persistirse en `openspec/specs/`.
93
+ - El formato recomendado es `review.yaml` dentro de cada carpeta de spec afectada.
94
+ - Si no se puede mapear de forma confiable a specs concretos, registrar la evidencia en `openspec/specs/review-metadata.yaml`.
@@ -31,10 +31,22 @@ Lee `METHODOLOGY-CONTRACT.md` en `refacil-prereqs` y aplica el modo de salida de
31
31
  1) Argumento del usuario (`$ARGUMENTS`)
32
32
  2) Cambio activo en `openspec/changes/`
33
33
  3) Cambios no commiteados (`git diff`)
34
+ - Si hay multiples cambios activos en `openspec/changes/` y no hay `$ARGUMENTS`, **detente** y pide al usuario seleccionar explicitamente cual cambio revisar.
35
+ - No ejecutes review masivo por defecto cuando hay multiples cambios activos.
36
+
37
+ **Review ya aprobado**: Si el cambio objetivo ya tiene `.review-passed`, verifica si hay cambios posteriores al review:
38
+ 1. Lee la `date` del `.review-passed`.
39
+ 2. Compara con `git log --since="[date]" --oneline` y `git status --porcelain` para detectar commits o archivos modificados despues del review.
40
+ 3. **Si hay cambios nuevos**: elimina el `.review-passed` anterior y re-ejecuta el review completo para evaluar el estado actual.
41
+ 4. **Si NO hay cambios nuevos**: informa al usuario y no re-ejecutes:
42
+ ```
43
+ El cambio [nombre] ya tiene review aprobado ([verdict] — [date]) y no hay cambios posteriores.
44
+ ```
34
45
 
35
46
  ### Paso 1: Identificar que revisar
36
47
 
37
48
  Si hay un cambio activo en `openspec/changes/`, usalo como referencia.
49
+ Si hay multiples cambios y el usuario ya selecciono uno, revisa solo ese cambio.
38
50
  Si el usuario paso un argumento ($ARGUMENTS), revisa ese archivo o carpeta especifica.
39
51
  Si no hay cambio activo ni argumento, revisa los cambios no commiteados (git diff).
40
52
 
@@ -1,12 +1,14 @@
1
1
  ---
2
2
  name: refacil:up-code
3
- description: Subir codigo a la rama de desarrollo — git add, commit y push con validacion de ramas protegidas
3
+ description: Subir codigo y crear PR para integracion — git add, commit, push y PR a la rama destino
4
4
  user-invocable: true
5
5
  ---
6
6
 
7
- # refacil:up-code — Subir Codigo a Rama de Desarrollo
7
+ # refacil:up-code — Integrar Codigo y Publicar Cambios
8
8
 
9
- Sube los cambios al repositorio remoto asegurando que NUNCA se haga push directo a ramas de ambiente protegidas.
9
+ Sube los cambios al repositorio remoto y genera el PR para integracion.
10
+ Toda integracion a ramas protegidas requiere PR — sin excepciones (incluye `testing`).
11
+ NUNCA se hacen ajustes directos en `master` o `main`.
10
12
 
11
13
  ## Antes de empezar
12
14
 
@@ -15,42 +17,48 @@ Lee `METHODOLOGY-CONTRACT.md` en `refacil-prereqs` para reglas transversales del
15
17
 
16
18
  ## Instrucciones
17
19
 
18
- ### Paso 1: Detectar rama actual
20
+ ### Paso 1: Detectar y validar rama actual
19
21
 
20
22
  Ejecuta `git branch --show-current` para obtener el nombre de la rama.
21
23
 
22
- ### Paso 2: Validar rama
24
+ - Si la rama actual es protegida (`master`, `main`, `develop`, `dev`, `testing`, `qa`), **detente** e informa al usuario:
25
+ ```
26
+ No se puede subir codigo desde una rama protegida ([nombre]).
27
+ La validacion de rama se hace en /refacil:apply o /refacil:bug antes de escribir codigo.
28
+ Cambia a tu rama de trabajo (feature/*, fix/*, etc.) y vuelve a ejecutar /refacil:up-code.
29
+ ```
30
+ - Si la rama es de trabajo (`feature/*`, `fix/*`, `hotfix/*`, `refactor/*`, etc.), continua.
23
31
 
24
- Aplica la **Politica de ramas protegidas y creacion de rama** definida en `refacil-prereqs/METHODOLOGY-CONTRACT.md`.
25
-
26
- - Si la rama actual es protegida, ejecutar ese protocolo completo antes de continuar.
27
- - Para `refacil:up-code`, el prefijo sugerido de rama es `feature/` (o `fix/` si el cambio es bugfix).
28
- - Si el usuario no aprueba la creacion/cambio de rama, detener. No continuar con commit/push.
29
-
30
- ### Paso 3: Verificar review (obligatorio)
32
+ ### Paso 2: Verificar review (obligatorio)
31
33
 
32
34
  Antes de continuar, verifica si hay cambios activos en `openspec/changes/` (excluir carpeta `archive/`).
33
35
 
34
36
  Si hay cambios activos:
35
- 1. Para cada carpeta activa, verifica si existe el archivo `.review-passed`
36
- 2. Si **todas** tienen `.review-passed` → continua al paso 4
37
- 3. Si **alguna** no tiene `.review-passed`:
38
- - Informa al usuario: "Se detectaron cambios sin review aprobado: [nombres de carpetas sin review]"
39
- - Ejecuta `/refacil:review` automaticamente sobre los cambios pendientes
40
- - Si el review aprueba (crea `.review-passed`) → continua al paso 4
41
- - Si el review requiere correcciones → detente e informa los hallazgos al usuario
37
+ 1. Para cada carpeta activa, verifica si existe el archivo `.review-passed`.
38
+ 2. Si **todas** tienen `.review-passed` → continua al paso 3.
39
+ 3. Si hay **una sola** carpeta sin `.review-passed`:
40
+ - Informa al usuario cual es.
41
+ - Ejecuta `/refacil:review <nombre-cambio>` automaticamente sobre ese cambio.
42
+ - Si el review aprueba (crea `.review-passed`) → continua al paso 3.
43
+ - Si el review requiere correcciones → detente e informa los hallazgos al usuario.
44
+ 4. Si hay **multiples** carpetas sin `.review-passed`:
45
+ - Deten el flujo y pide al usuario seleccionar explicitamente que cambio quiere subir.
46
+ - Ejecuta `/refacil:review <nombre-cambio-seleccionado>` solo para ese cambio.
47
+ - No ejecutes review automatico masivo en este caso.
48
+
49
+ **IMPORTANTE**: `/refacil:review` verifica internamente si `.review-passed` existe y si hay cambios posteriores. Solo re-ejecuta si detecta cambios nuevos despues del ultimo review aprobado.
42
50
 
43
- Si no hay carpeta `openspec/changes/` o no hay cambios activos → continua al paso 4 (no hay nada que revisar).
51
+ Si no hay carpeta `openspec/changes/` o no hay cambios activos → continua al paso 3 (no hay nada que revisar).
44
52
 
45
- ### Paso 4: Verificar cambios pendientes
53
+ ### Paso 3: Verificar cambios pendientes
46
54
 
47
55
  Ejecuta `git status` para verificar si hay cambios para subir.
48
56
 
49
57
  - Si no hay cambios pendientes ni commits sin push, informa al usuario y detente.
50
- - Si hay cambios sin commitear, continua al paso 5.
51
- - Si solo hay commits sin push (nada que commitear), salta directo al paso 6.
58
+ - Si hay cambios sin commitear, continua al paso 4.
59
+ - Si solo hay commits sin push (nada que commitear), salta directo al paso 5.
52
60
 
53
- ### Paso 5: Commit de cambios
61
+ ### Paso 4: Commit de cambios
54
62
 
55
63
  1. Ejecuta `git status --short` y muestra al usuario la lista de archivos detectados.
56
64
  2. Pide confirmacion explicita antes de stagear todo.
@@ -60,11 +68,11 @@ Ejecuta `git status` para verificar si hay cambios para subir.
60
68
  6. Si no se proporciono mensaje, genera uno descriptivo basado en los cambios detectados con `git diff --staged --stat`.
61
69
  7. Ejecuta `git commit -m "[mensaje]"`.
62
70
 
63
- ### Paso 6: Push a remoto
71
+ ### Paso 5: Push a remoto
64
72
 
65
73
  Ejecuta `git push -u origin [rama-actual]` para subir los cambios.
66
74
 
67
- ### Paso 7: Confirmar y crear PR
75
+ ### Paso 6: Confirmar y crear PR
68
76
 
69
77
  1. Muestra el resumen del push:
70
78
  ```
@@ -74,26 +82,28 @@ Ejecuta `git push -u origin [rama-actual]` para subir los cambios.
74
82
  Remote: origin/[nombre-rama]
75
83
  ```
76
84
 
77
- 2. **Pregunta al usuario** hacia cual rama destino quiere crear el Pull Request. **No sugieras ni asumas** una rama por defecto. Simplemente pregunta:
85
+ 2. **Pregunta al usuario** a que rama quiere crear el PR. Sugiere `testing` como destino por defecto para validacion funcional:
78
86
  ```
79
- Hacia cual rama quieres crear el Pull Request?
87
+ A que rama quieres crear el PR? (recomendado: testing)
80
88
  ```
81
89
 
82
- 3. Una vez el usuario responda, obtén la URL del repositorio remoto con `git remote get-url origin` y determina el hosting para generar el link correcto de creación del PR:
90
+ 3. Obtén la URL del repositorio remoto con `git remote get-url origin` y determina el hosting para generar el link correcto:
83
91
  - **GitHub** (url contiene `github.com`): `https://github.com/[owner]/[repo]/compare/[rama-destino]...[rama-actual]?expand=1`
84
92
  - **Bitbucket** (url contiene `bitbucket.org`): `https://bitbucket.org/[workspace]/[repo]/pull-requests/new?source=[rama-actual]&dest=[rama-destino]`
85
93
  - Si no se puede determinar el hosting, muestra ambos formatos para que el usuario elija.
94
+ - Nota: para URLs SSH (`git@github.com:owner/repo.git` o `git@bitbucket.org:workspace/repo.git`), extrae owner/workspace y repo del path tras el `:`.
86
95
 
87
- Nota: para URLs SSH (`git@github.com:owner/repo.git` o `git@bitbucket.org:workspace/repo.git`), extrae owner/workspace y repo del path tras el `:`.
88
-
89
- 4. Muestra el link al usuario:
96
+ 4. Muestra el link al usuario y recomienda PR a `testing`:
90
97
  ```
91
98
  Crea tu PR aqui: [link]
99
+
100
+ Tip: Se recomienda PR a testing para habilitar pruebas integradas
101
+ antes de promover a otras ramas protegidas.
92
102
  ```
93
103
 
94
104
  ## Reglas
95
105
 
96
- - NUNCA hacer push a ramas protegidas: master, main, develop, dev, testing, qa
97
- - Si el usuario esta en una rama protegida, SIEMPRE preguntar antes de crear una rama nueva
98
- - Siempre hacer push a ramas de desarrollo propias (feature/, fix/, hotfix/, refactor/, etc.)
106
+ - NUNCA hacer push directo a ramas protegidas: master, main, develop, dev, testing, qa
107
+ - Si la rama actual es protegida, **detener** la validacion de rama se hace en `/refacil:apply` o `/refacil:bug`, no aqui
108
+ - Toda integracion a cualquier rama protegida requiere PR
99
109
  - No forzar push (--force) a menos que el usuario lo pida explicitamente
@@ -88,8 +88,9 @@ Lista los issues para que el usuario los corrija manualmente. Sugiere ejecutar `
88
88
 
89
89
  ## Reglas
90
90
 
91
- - Durante la fase de verificacion (Pasos 1-3): NO modificar codigo, solo analizar y reportar
92
- - Las correcciones SOLO se aplican en el Paso 4, despues del reporte completo y con aprobacion explicita del usuario
91
+ - **verify NUNCA modifica codigo por cuenta propia** — los Pasos 1-3 son solo analisis y reporte
92
+ - Las correcciones SOLO se aplican en el Paso 4, **despues** de presentar el reporte completo y recibir aprobacion explicita del usuario
93
+ - Sin aprobacion explicita, verify termina en el reporte — no toca ningun archivo
93
94
  - Las correcciones deben ser quirurgicas: solo lo necesario para resolver los issues reportados
94
95
  - Ser estricto con los criterios de la spec
95
96
  - Si algo no esta en la spec pero parece necesario, mencionarlo como SUGGESTION (observacion), no como CRITICAL/WARNING