@saulwade/swl-ses 1.1.3 → 1.2.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.
Files changed (37) hide show
  1. package/CLAUDE.md +5 -3
  2. package/README.md +3 -3
  3. package/bin/swl-mcp-server.js +187 -0
  4. package/habilidades/benchmark-memoria/SKILL.md +186 -0
  5. package/habilidades/contenedores-docker/SKILL.md +8 -1
  6. package/habilidades/datos-etl/SKILL.md +18 -1
  7. package/habilidades/eval-framework/SKILL.md +212 -0
  8. package/habilidades/memoria-busqueda/SKILL.md +24 -1
  9. package/habilidades/planear-fase/SKILL.md +299 -269
  10. package/habilidades/postgresql-experto/SKILL.md +24 -1
  11. package/habilidades/verificar-trabajo/SKILL.md +7 -1
  12. package/hooks/lib/evolution-tracker.js +65 -11
  13. package/hooks/lib/memory-search.js +44 -13
  14. package/hooks/sugerir-contribuir.js +226 -0
  15. package/manifiestos/hooks-config.json +9 -0
  16. package/manifiestos/modulos.json +36 -2
  17. package/manifiestos/perfiles.json +2 -1
  18. package/manifiestos/skills-lock.json +1 -1
  19. package/package.json +4 -3
  20. package/plugin.json +343 -343
  21. package/reglas/analisis-previo-tareas-grandes.md +172 -0
  22. package/reglas/arreglar-al-detectar.md +147 -0
  23. package/scripts/benchmark-memoria.js +167 -0
  24. package/scripts/detectar-aprendizajes-duplicados.js +151 -0
  25. package/scripts/lib/benchmark-metrics.js +160 -0
  26. package/scripts/lib/eval-metrics-store.js +218 -0
  27. package/scripts/lib/eval-quality.js +171 -0
  28. package/scripts/lib/eval-schemas.js +144 -0
  29. package/scripts/lib/eval-self-correct.js +106 -0
  30. package/scripts/lib/eval-validator.js +185 -0
  31. package/scripts/lib/jaccard-similarity.js +98 -0
  32. package/scripts/lib/longmemeval-runner.js +125 -0
  33. package/scripts/lib/rrf-fusion.js +175 -0
  34. package/scripts/lib/scoring-instintos.js +40 -3
  35. package/scripts/mcp-server/README.md +128 -0
  36. package/scripts/mcp-server/handlers.js +206 -0
  37. package/scripts/run-eval.js +141 -0
@@ -1,269 +1,299 @@
1
- ---
2
- name: planear-fase
3
- description: Crea el PLAN.md ejecutable para una fase de desarrollo. Descompone la fase en tareas atómicas con dependencias explícitas, las agrupa en oleadas de ejecución paralela cuando es posible, y aplica verificación goal-backward para garantizar que el plan completo satisface los criterios de éxito definidos en CONTEXTO.md.
4
- version: "1.0.0"
5
- herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
6
- exclusiones:
7
- - "No cargar si no existe CONTEXTO.md para la fase — ejecutar `discutir-fase` primero."
8
- - "No cargar para replanificar una tarea individual dentro de una fase ya en ejecución; eso es desviación moderada, manejar con `ejecutar-fase`."
9
- - "No cargar para generar backlog de producto o roadmap de alto nivel; usar `nuevo-proyecto` o conversar directamente con el usuario."
10
- - "No cargar si el usuario pide 'ajustar' el PLAN.md ya aprobado sin nueva información — cada modificación al plan aprobado debe pasar por discusión primero."
11
- evolvable: true # default para skill estandar
12
- ---
13
- # Habilidad: Planear Fase de Desarrollo
14
-
15
- ## Propósito
16
-
17
- Un plan ejecutable no es una lista de tareas — es un grafo de dependencias con
18
- criterios de verificación por tarea. Esta habilidad transforma el CONTEXTO.md de
19
- una fase en un PLAN.md que el agente ejecutor puede seguir sin ambigüedad y sin
20
- interrumpir al usuario para pedir aclaraciones.
21
-
22
- ## Cuándo activar
23
-
24
- - Después de ejecutar `discutir-fase` y tener CONTEXTO.md listo
25
- - Cuando el usuario pide "planear la fase N"
26
- - Cuando un plan existente necesita revisión o replanificación
27
-
28
- ## Cuándo NO cargar
29
-
30
- - No existe `.planning/fases/0N-CONTEXTO.md`; en ese caso usar `discutir-fase` antes. Un PLAN.md sin contexto es un plan con suposiciones implícitas.
31
- - El usuario pide ajustar el PLAN.md aprobado solo porque cambia de opinión en mitad de la ejecución — eso es desviación mayor que requiere pausa en `ejecutar-fase`, no re-planificación completa.
32
- - Se quiere generar únicamente un listado de tareas sin grafo de dependencias ni oleadas; ese backlog plano no es el producto de esta habilidad.
33
- - La fase ya completó todos sus slices y se busca solo actualizar HOJA-RUTA.md — eso lo hace `ejecutar-fase` al cerrar.
34
-
35
- ## Prerrequisito obligatorio
36
-
37
- Leer `.planning/fases/0N-CONTEXTO.md` antes de generar cualquier tarea. Si no existe,
38
- activar primero `discutir-fase`.
39
-
40
- ---
41
-
42
- ## Principios de descomposición
43
-
44
- ### 1. Atomicidad
45
-
46
- Una tarea es atómica si:
47
- - Puede completarse en una sola sesión de trabajo (< 2 horas de desarrollo)
48
- - Tiene un único criterio de verificación binario (funciona / no funciona)
49
- - Puede hacerse commit de forma independiente sin romper el sistema
50
-
51
- Si una tarea viola alguna de estas condiciones, subdividirla.
52
-
53
- ### 2. Dependencias explícitas
54
-
55
- Cada tarea declara sus dependencias en formato `[T-XX, T-YY]`. Una tarea sin
56
- dependencias puede ejecutarse en la primera oleada. El grafo NO puede tener ciclos.
57
-
58
- ### 3. Clasificación AFK / HITL
59
-
60
- | Tipo | Definición |
61
- |------|-----------|
62
- | AFK (autónoma) | El agente puede completarla sin intervención humana |
63
- | HITL (human-in-the-loop) | Requiere decisión, revisión o input del usuario |
64
-
65
- Las tareas HITL son puntos de parada obligatoria en la ejecución.
66
-
67
- ### 4. Oleadas de ejecución
68
-
69
- Agrupa tareas sin dependencias mutuas en la misma oleada. Las tareas de una
70
- oleada pueden ejecutarse en paralelo (o en secuencia rápida si el contexto lo
71
- requiere).
72
-
73
- ---
74
-
75
- ## Algoritmo de construcción del plan
76
-
77
- **Paso 0 — Recopilar inteligencia del codebase (obligatorio)**
78
- ANTES de planear, investigar el código existente para que el plan sea auto-contenido:
79
-
80
- 1. Ejecutar `Grep` y `Glob` para encontrar archivos relacionados con la feature
81
- 2. Leer los archivos encontrados y extraer:
82
- - Patrones de implementación reales (con `archivo:línea`)
83
- - Convenciones de naming, imports, estructura de archivos
84
- - Tests existentes como referencia de estilo
85
- 3. Documentar en el PLAN.md bajo `## Inteligencia del codebase`:
86
- - **Patrones a imitar**: snippets reales del código existente con `archivo:línea`
87
- - **Archivos a modificar**: lista con propósito de cada cambio
88
- - **Dependencias relevantes**: versiones y APIs que se usarán
89
- - **Convenciones observadas**: naming, estructura, error handling del proyecto
90
-
91
- > El plan debe ser auto-contenido: el implementador puede ejecutar cada tarea
92
- > sin investigar el codebase por su cuenta ni tomar decisiones de diseño.
93
-
94
- **Paso 1 Listar entregables**
95
- Del CONTEXTO.md, extraer todos los entregables (features, endpoints, componentes,
96
- migraciones, documentos).
97
-
98
- **Paso 2 — Identificar capas**
99
- Para cada entregable de software, descomponerlo en capas estándar:
100
- - Tipos e interfaces / esquemas
101
- - Modelos de datos y migraciones
102
- - Lógica de negocio (services)
103
- - Interfaz externa (endpoints / componentes UI)
104
- - Tests
105
- - Documentación
106
-
107
- **Paso 3 Asignar dependencias**
108
- Aplicar regla: una capa no puede implementarse sin las capas de las que depende.
109
- Orden típico: tipos → modelos → services → endpoints → UI → tests.
110
-
111
- **Paso 4 — Agrupar en oleadas**
112
- Usar topological sort mental: la Oleada N contiene todas las tareas cuyas
113
- dependencias están en oleadas anteriores.
114
-
115
- **Paso 5 — Verificación goal-backward**
116
- Preguntar: "Si ejecuto todas las tareas del plan, ¿el criterio de éxito del
117
- CONTEXTO.md queda satisfecho?" Si la respuesta es no, agregar las tareas faltantes.
118
-
119
- ---
120
-
121
- ## Estructura del PLAN.md
122
-
123
- ```markdown
124
- # PLAN.md — Fase [N]: [Nombre]
125
- **Generado**: [fecha]
126
- **Basado en**: 0N-CONTEXTO.md
127
- **Criterio de éxito**: [copiado del CONTEXTO.md]
128
-
129
- ## Resumen del plan
130
- - Total de tareas: N
131
- - Oleadas: M
132
- - Tareas HITL: K (paradas de revisión)
133
- - Duración estimada: X horas / Y días
134
-
135
- ---
136
-
137
- ## Inteligencia del codebase
138
-
139
- ### Patrones a imitar
140
- | Patrón | Archivo:línea | Ejemplo |
141
- |--------|-------------|---------|
142
- | [nombre del patrón] | `src/services/ejemplo.py:42` | [snippet real del código] |
143
-
144
- ### Archivos a modificar
145
- | Archivo | Propósito del cambio |
146
- |---------|---------------------|
147
- | `src/...` | [qué se agrega/modifica y por qué] |
148
-
149
- ### Dependencias relevantes
150
- | Dependencia | Versión | API que se usa |
151
- |------------|---------|---------------|
152
- | [nombre] | [versión] | [funciones/clases] |
153
-
154
- ### Convenciones observadas
155
- - Naming: [convención real del proyecto]
156
- - Imports: [orden y estilo]
157
- - Error handling: [patrón usado]
158
- - Tests: [framework, estructura, naming]
159
-
160
- ---
161
-
162
- ## Oleada 1 Fundamentos (sin dependencias)
163
-
164
- ### T-01: [Nombre de la tarea]
165
- - **Tipo**: AFK
166
- - **Descripción**: [Qué hacer, sin ambigüedad. Incluir nombres de archivos si aplica.]
167
- - **Entregable verificable**: [Qué existe cuando está completa]
168
- - **Criterio de verificación**: [Comando de verificación o descripción observable]
169
- - **Dependencias**: ninguna
170
- - **Tiempo estimado**: 30 min
171
-
172
- ### T-02: [Nombre]
173
- - **Tipo**: AFK
174
- - **Descripción**:
175
- - **Entregable verificable**:
176
- - **Criterio de verificación**:
177
- - **Dependencias**: ninguna
178
- - **Tiempo estimado**:
179
-
180
- ---
181
-
182
- ## Oleada 2 — [Nombre conceptual]
183
-
184
- ### T-03: [Nombre]
185
- - **Tipo**: AFK
186
- - **Descripción**:
187
- - **Entregable verificable**:
188
- - **Criterio de verificación**:
189
- - **Dependencias**: [T-01, T-02]
190
- - **Tiempo estimado**:
191
-
192
- ---
193
-
194
- ## Oleada N — Verificación y cierre
195
-
196
- ### T-NN: Verificación goal-backward
197
- - **Tipo**: HITL
198
- - **Descripción**: Revisar que todos los criterios de éxito del CONTEXTO.md estén
199
- satisfechos. Presentar evidencia al usuario.
200
- - **Entregable verificable**: Reporte de verificación firmado
201
- - **Criterio de verificación**: Usuario confirma aprobación
202
- - **Dependencias**: [todas las tareas anteriores]
203
- - **Tiempo estimado**: 30 min
204
-
205
- ---
206
-
207
- ## Matriz de riesgos del plan
208
-
209
- | Tarea | Riesgo | Probabilidad | Mitigación |
210
- |-------|--------|-------------|-----------|
211
- | | | | |
212
-
213
- ## Tareas excluidas explícitamente
214
- - [Feature X]: diferida a siguiente fase por [razón]
215
-
216
- ## Notas de diseño del plan
217
- [Decisiones tomadas durante la planeación que el ejecutor debe conocer]
218
- ```
219
-
220
- ---
221
-
222
- ## Anti-patrones a evitar en el plan
223
-
224
- - **Tarea "Implementar módulo X"**: demasiado vaga, no atómica
225
- - **Dependencias circulares**: T-03 depende de T-05 que depende de T-03
226
- - **Tarea sin criterio de verificación**: no se puede saber si está hecha
227
- - **Plan sin oleada de verificación final**: el plan puede estar completo pero
228
- los criterios de éxito sin satisfacer
229
- - **Mezclar implementación y tests en una sola tarea**: deben ser tareas separadas
230
-
231
- ---
232
-
233
- ## Checklist antes de entregar el PLAN.md
234
-
235
- - [ ] Todas las tareas son atómicas (< 2 horas)
236
- - [ ] Todas las dependencias forman un DAG (sin ciclos)
237
- - [ ] Cada tarea tiene criterio de verificación binario
238
- - [ ] Las tareas HITL están identificadas y justificadas
239
- - [ ] La verificación goal-backward confirma que el plan satisface CONTEXTO.md
240
- - [ ] El plan está guardado en `.planning/fases/0N-PLAN.md`
241
-
242
- ---
243
-
244
- ## Gotchas / Errores comunes no obvios
245
-
246
- - **Plan sin Paso 0 (inteligencia del codebase)**: el agente genera tareas basadas en supuestos de estructura de archivos sin leer el codebase real. Causa: se omite el Paso 0 por urgencia. Solución: ejecutar `Grep` y `Glob` sobre los módulos que la fase tocará antes de escribir la primera tarea; los nombres de archivos en el PLAN.md deben ser rutas reales, no inventadas.
247
- - **Ciclo en el DAG de dependencias**: T-03 depende de T-05 que depende de T-03, imposibilitando cualquier oleada de inicio. Causa: se asignan dependencias sin verificar acyclicidad. Solución: hacer topological sort mental tras asignar dependencias; si aparece un ciclo, extraer la interfaz compartida como una tarea T-00 sin dependencias.
248
- - **Oleada de verificación final mezclada con implementación**: la tarea de verificación goal-backward se agrupa en la misma oleada que la última tarea de implementación, permitiendo que el ejecutor la omita. Causa: se trata la verificación como un paso más, no como una oleada separada. Solución: la oleada de verificación siempre es la última, con dependencias de todas las oleadas anteriores.
249
- - **Criterio de verificación observable por el ejecutor, no por el usuario**: el criterio dice "que funcione correctamente" en lugar de un comando ejecutable. Causa: redacción laxa. Solución: el criterio debe ser un comando concreto (`pytest tests/modulo/ -v`, `curl http://localhost:8000/endpoint`) o una observación binaria ("la tabla X aparece en alembic history").
250
- - **PLAN.md aprobado sin estado: aprobado en frontmatter**: el ejecutor inicia sin verificar que el plan está aprobado, lo que puede llevar a ejecutar un plan en borrador. Causa: el frontmatter no incluye `estado: aprobado`. Solución: agregar `estado: aprobado` al frontmatter antes de entregar al ejecutor, ya que `seguridad-agentes.md` exige esta verificación.
251
-
252
- ## Reglas anti-placeholder (obligatorio)
253
-
254
- Un plan con placeholders es un defecto. El implementador debe poder ejecutar cada tarea
255
- sin tomar decisiones de diseno ni pedir aclaraciones.
256
-
257
- ### Placeholders prohibidos
258
- - `TBD`, `PENDIENTE`, `por definir`, `implementar despues`
259
- - "agregar manejo de errores" (debe decir QUE errores y COMO)
260
- - "agregar validacion" (debe decir CUAL validacion con CUAL regla)
261
- - "similar a la tarea N" (debe repetir el contenido relevante)
262
- - "agregar tests apropiados" (debe especificar QUE tests con QUE escenarios)
263
- - Referencias a tipos/funciones no definidos en el plan
264
-
265
- ### Auto-revision antes de entregar
266
- 1. `grep -rni "TBD\|PENDIENTE\|por definir\|implementar despues" PLAN.md`
267
- 2. Cada tarea: el implementador puede ejecutarla sin preguntas?
268
- 3. Interfaces entre tareas: tipos y nombres consistentes?
269
- 4. Cada requisito tiene al menos una tarea?
1
+ ---
2
+ name: planear-fase
3
+ description: Crea el PLAN.md ejecutable para una fase de desarrollo. Descompone la fase en tareas atómicas con dependencias explícitas, las agrupa en oleadas de ejecución paralela cuando es posible, y aplica verificación goal-backward para garantizar que el plan completo satisface los criterios de éxito definidos en CONTEXTO.md.
4
+ version: "1.1.0"
5
+ evolved: true
6
+ evolved-from: "1.0.0"
7
+ evolved-at: "2026-05-09"
8
+ evolved-by: "aprender"
9
+ evolved-note: "Sección nueva 'Convivencia con placeholders previos del roadmap' anti-patrón confirmado en auditoría SIGM 2026-05-09 (3 placeholders PLAN-fase-3/4/5.md desactualizados coexistiendo con 0N-PLAN.md reales)"
10
+ herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
11
+ exclusiones:
12
+ - "No cargar si no existe CONTEXTO.md para la fase — ejecutar `discutir-fase` primero."
13
+ - "No cargar para replanificar una tarea individual dentro de una fase ya en ejecución; eso es desviación moderada, manejar con `ejecutar-fase`."
14
+ - "No cargar para generar backlog de producto o roadmap de alto nivel; usar `nuevo-proyecto` o conversar directamente con el usuario."
15
+ - "No cargar si el usuario pide 'ajustar' el PLAN.md ya aprobado sin nueva información — cada modificación al plan aprobado debe pasar por discusión primero."
16
+ evolvable: true # default para skill estandar
17
+ ---
18
+ # Habilidad: Planear Fase de Desarrollo
19
+
20
+ ## Propósito
21
+
22
+ Un plan ejecutable no es una lista de tareas — es un grafo de dependencias con
23
+ criterios de verificación por tarea. Esta habilidad transforma el CONTEXTO.md de
24
+ una fase en un PLAN.md que el agente ejecutor puede seguir sin ambigüedad y sin
25
+ interrumpir al usuario para pedir aclaraciones.
26
+
27
+ ## Cuándo activar
28
+
29
+ - Después de ejecutar `discutir-fase` y tener CONTEXTO.md listo
30
+ - Cuando el usuario pide "planear la fase N"
31
+ - Cuando un plan existente necesita revisión o replanificación
32
+
33
+ ## Cuándo NO cargar
34
+
35
+ - No existe `.planning/fases/0N-CONTEXTO.md`; en ese caso usar `discutir-fase` antes. Un PLAN.md sin contexto es un plan con suposiciones implícitas.
36
+ - El usuario pide ajustar el PLAN.md aprobado solo porque cambia de opinión en mitad de la ejecución — eso es desviación mayor que requiere pausa en `ejecutar-fase`, no re-planificación completa.
37
+ - Se quiere generar únicamente un listado de tareas sin grafo de dependencias ni oleadas; ese backlog plano no es el producto de esta habilidad.
38
+ - La fase ya completó todos sus slices y se busca solo actualizar HOJA-RUTA.md — eso lo hace `ejecutar-fase` al cerrar.
39
+
40
+ ## Prerrequisito obligatorio
41
+
42
+ Leer `.planning/fases/0N-CONTEXTO.md` antes de generar cualquier tarea. Si no existe,
43
+ activar primero `discutir-fase`.
44
+
45
+ ---
46
+
47
+ ## Principios de descomposición
48
+
49
+ ### 1. Atomicidad
50
+
51
+ Una tarea es atómica si:
52
+ - Puede completarse en una sola sesión de trabajo (< 2 horas de desarrollo)
53
+ - Tiene un único criterio de verificación binario (funciona / no funciona)
54
+ - Puede hacerse commit de forma independiente sin romper el sistema
55
+
56
+ Si una tarea viola alguna de estas condiciones, subdividirla.
57
+
58
+ ### 2. Dependencias explícitas
59
+
60
+ Cada tarea declara sus dependencias en formato `[T-XX, T-YY]`. Una tarea sin
61
+ dependencias puede ejecutarse en la primera oleada. El grafo NO puede tener ciclos.
62
+
63
+ ### 3. Clasificación AFK / HITL
64
+
65
+ | Tipo | Definición |
66
+ |------|-----------|
67
+ | AFK (autónoma) | El agente puede completarla sin intervención humana |
68
+ | HITL (human-in-the-loop) | Requiere decisión, revisión o input del usuario |
69
+
70
+ Las tareas HITL son puntos de parada obligatoria en la ejecución.
71
+
72
+ ### 4. Oleadas de ejecución
73
+
74
+ Agrupa tareas sin dependencias mutuas en la misma oleada. Las tareas de una
75
+ oleada pueden ejecutarse en paralelo (o en secuencia rápida si el contexto lo
76
+ requiere).
77
+
78
+ ---
79
+
80
+ ## Algoritmo de construcción del plan
81
+
82
+ **Paso 0 Recopilar inteligencia del codebase (obligatorio)**
83
+ ANTES de planear, investigar el código existente para que el plan sea auto-contenido:
84
+
85
+ 1. Ejecutar `Grep` y `Glob` para encontrar archivos relacionados con la feature
86
+ 2. Leer los archivos encontrados y extraer:
87
+ - Patrones de implementación reales (con `archivo:línea`)
88
+ - Convenciones de naming, imports, estructura de archivos
89
+ - Tests existentes como referencia de estilo
90
+ 3. Documentar en el PLAN.md bajo `## Inteligencia del codebase`:
91
+ - **Patrones a imitar**: snippets reales del código existente con `archivo:línea`
92
+ - **Archivos a modificar**: lista con propósito de cada cambio
93
+ - **Dependencias relevantes**: versiones y APIs que se usarán
94
+ - **Convenciones observadas**: naming, estructura, error handling del proyecto
95
+
96
+ > El plan debe ser auto-contenido: el implementador puede ejecutar cada tarea
97
+ > sin investigar el codebase por su cuenta ni tomar decisiones de diseño.
98
+
99
+ **Paso 1 Listar entregables**
100
+ Del CONTEXTO.md, extraer todos los entregables (features, endpoints, componentes,
101
+ migraciones, documentos).
102
+
103
+ **Paso 2 Identificar capas**
104
+ Para cada entregable de software, descomponerlo en capas estándar:
105
+ - Tipos e interfaces / esquemas
106
+ - Modelos de datos y migraciones
107
+ - Lógica de negocio (services)
108
+ - Interfaz externa (endpoints / componentes UI)
109
+ - Tests
110
+ - Documentación
111
+
112
+ **Paso 3 Asignar dependencias**
113
+ Aplicar regla: una capa no puede implementarse sin las capas de las que depende.
114
+ Orden típico: tipos → modelos → services → endpoints → UI → tests.
115
+
116
+ **Paso 4 Agrupar en oleadas**
117
+ Usar topological sort mental: la Oleada N contiene todas las tareas cuyas
118
+ dependencias están en oleadas anteriores.
119
+
120
+ **Paso 5 — Verificación goal-backward**
121
+ Preguntar: "Si ejecuto todas las tareas del plan, ¿el criterio de éxito del
122
+ CONTEXTO.md queda satisfecho?" Si la respuesta es no, agregar las tareas faltantes.
123
+
124
+ ---
125
+
126
+ ## Estructura del PLAN.md
127
+
128
+ ```markdown
129
+ # PLAN.md Fase [N]: [Nombre]
130
+ **Generado**: [fecha]
131
+ **Basado en**: 0N-CONTEXTO.md
132
+ **Criterio de éxito**: [copiado del CONTEXTO.md]
133
+
134
+ ## Resumen del plan
135
+ - Total de tareas: N
136
+ - Oleadas: M
137
+ - Tareas HITL: K (paradas de revisión)
138
+ - Duración estimada: X horas / Y días
139
+
140
+ ---
141
+
142
+ ## Inteligencia del codebase
143
+
144
+ ### Patrones a imitar
145
+ | Patrón | Archivo:línea | Ejemplo |
146
+ |--------|-------------|---------|
147
+ | [nombre del patrón] | `src/services/ejemplo.py:42` | [snippet real del código] |
148
+
149
+ ### Archivos a modificar
150
+ | Archivo | Propósito del cambio |
151
+ |---------|---------------------|
152
+ | `src/...` | [qué se agrega/modifica y por qué] |
153
+
154
+ ### Dependencias relevantes
155
+ | Dependencia | Versión | API que se usa |
156
+ |------------|---------|---------------|
157
+ | [nombre] | [versión] | [funciones/clases] |
158
+
159
+ ### Convenciones observadas
160
+ - Naming: [convención real del proyecto]
161
+ - Imports: [orden y estilo]
162
+ - Error handling: [patrón usado]
163
+ - Tests: [framework, estructura, naming]
164
+
165
+ ---
166
+
167
+ ## Oleada 1 Fundamentos (sin dependencias)
168
+
169
+ ### T-01: [Nombre de la tarea]
170
+ - **Tipo**: AFK
171
+ - **Descripción**: [Qué hacer, sin ambigüedad. Incluir nombres de archivos si aplica.]
172
+ - **Entregable verificable**: [Qué existe cuando está completa]
173
+ - **Criterio de verificación**: [Comando de verificación o descripción observable]
174
+ - **Dependencias**: ninguna
175
+ - **Tiempo estimado**: 30 min
176
+
177
+ ### T-02: [Nombre]
178
+ - **Tipo**: AFK
179
+ - **Descripción**:
180
+ - **Entregable verificable**:
181
+ - **Criterio de verificación**:
182
+ - **Dependencias**: ninguna
183
+ - **Tiempo estimado**:
184
+
185
+ ---
186
+
187
+ ## Oleada 2 — [Nombre conceptual]
188
+
189
+ ### T-03: [Nombre]
190
+ - **Tipo**: AFK
191
+ - **Descripción**:
192
+ - **Entregable verificable**:
193
+ - **Criterio de verificación**:
194
+ - **Dependencias**: [T-01, T-02]
195
+ - **Tiempo estimado**:
196
+
197
+ ---
198
+
199
+ ## Oleada N Verificación y cierre
200
+
201
+ ### T-NN: Verificación goal-backward
202
+ - **Tipo**: HITL
203
+ - **Descripción**: Revisar que todos los criterios de éxito del CONTEXTO.md estén
204
+ satisfechos. Presentar evidencia al usuario.
205
+ - **Entregable verificable**: Reporte de verificación firmado
206
+ - **Criterio de verificación**: Usuario confirma aprobación
207
+ - **Dependencias**: [todas las tareas anteriores]
208
+ - **Tiempo estimado**: 30 min
209
+
210
+ ---
211
+
212
+ ## Matriz de riesgos del plan
213
+
214
+ | Tarea | Riesgo | Probabilidad | Mitigación |
215
+ |-------|--------|-------------|-----------|
216
+ | | | | |
217
+
218
+ ## Tareas excluidas explícitamente
219
+ - [Feature X]: diferida a siguiente fase por [razón]
220
+
221
+ ## Notas de diseño del plan
222
+ [Decisiones tomadas durante la planeación que el ejecutor debe conocer]
223
+ ```
224
+
225
+ ---
226
+
227
+ ## Anti-patrones a evitar en el plan
228
+
229
+ - **Tarea "Implementar módulo X"**: demasiado vaga, no atómica
230
+ - **Dependencias circulares**: T-03 depende de T-05 que depende de T-03
231
+ - **Tarea sin criterio de verificación**: no se puede saber si está hecha
232
+ - **Plan sin oleada de verificación final**: el plan puede estar completo pero
233
+ los criterios de éxito sin satisfacer
234
+ - **Mezclar implementación y tests en una sola tarea**: deben ser tareas separadas
235
+
236
+ ---
237
+
238
+ ## Convivencia con placeholders previos del roadmap
239
+
240
+ Si al iniciar la planeación de la Fase N existe un archivo legado tipo
241
+ `PLAN-fase-N.md` (placeholder breve generado al definir el roadmap original),
242
+ NO coexistir con el `0N-PLAN.md` recién generado. La presencia de dos archivos
243
+ con scopes potencialmente contradictorios confunde a futuros lectores y agentes
244
+ (observado en SIGM mayo 2026: placeholder de Fase 5 describía "Portal CMS" del
245
+ roadmap v3.0 mientras `05-PLAN.md` ya describía "Complementarios" del roadmap v5.4).
246
+
247
+ Acciones obligatorias al generar `0N-PLAN.md`:
248
+
249
+ 1. Verificar si existe `PLAN-fase-N.md` placeholder en `.planning/fases/`.
250
+ 2. Si existe y su scope coincide con el plan nuevo: eliminarlo (`git rm`) ya que
251
+ `0N-PLAN.md` lo supersede con detalle real.
252
+ 3. Si existe y su scope difiere del roadmap actual (señal de renumeración previa):
253
+ eliminarlo y notificar al usuario que el placeholder estaba desincronizado.
254
+ 4. Reportar en el output: "Placeholder previo eliminado: `PLAN-fase-N.md`" o
255
+ "Sin placeholder previo detectado".
256
+
257
+ Esto previene la deuda silenciosa de placeholders viejos coexistiendo con planes
258
+ reales patrón confirmado en auditoría de gaps SIGM 2026-05-09 que detectó 3
259
+ placeholders desactualizados (`PLAN-fase-3/4/5.md`).
260
+
261
+ ---
262
+
263
+ ## Checklist antes de entregar el PLAN.md
264
+
265
+ - [ ] Todas las tareas son atómicas (< 2 horas)
266
+ - [ ] Todas las dependencias forman un DAG (sin ciclos)
267
+ - [ ] Cada tarea tiene criterio de verificación binario
268
+ - [ ] Las tareas HITL están identificadas y justificadas
269
+ - [ ] La verificación goal-backward confirma que el plan satisface CONTEXTO.md
270
+ - [ ] El plan está guardado en `.planning/fases/0N-PLAN.md`
271
+
272
+ ---
273
+
274
+ ## Gotchas / Errores comunes no obvios
275
+
276
+ - **Plan sin Paso 0 (inteligencia del codebase)**: el agente genera tareas basadas en supuestos de estructura de archivos sin leer el codebase real. Causa: se omite el Paso 0 por urgencia. Solución: ejecutar `Grep` y `Glob` sobre los módulos que la fase tocará antes de escribir la primera tarea; los nombres de archivos en el PLAN.md deben ser rutas reales, no inventadas.
277
+ - **Ciclo en el DAG de dependencias**: T-03 depende de T-05 que depende de T-03, imposibilitando cualquier oleada de inicio. Causa: se asignan dependencias sin verificar acyclicidad. Solución: hacer topological sort mental tras asignar dependencias; si aparece un ciclo, extraer la interfaz compartida como una tarea T-00 sin dependencias.
278
+ - **Oleada de verificación final mezclada con implementación**: la tarea de verificación goal-backward se agrupa en la misma oleada que la última tarea de implementación, permitiendo que el ejecutor la omita. Causa: se trata la verificación como un paso más, no como una oleada separada. Solución: la oleada de verificación siempre es la última, con dependencias de todas las oleadas anteriores.
279
+ - **Criterio de verificación observable por el ejecutor, no por el usuario**: el criterio dice "que funcione correctamente" en lugar de un comando ejecutable. Causa: redacción laxa. Solución: el criterio debe ser un comando concreto (`pytest tests/modulo/ -v`, `curl http://localhost:8000/endpoint`) o una observación binaria ("la tabla X aparece en alembic history").
280
+ - **PLAN.md aprobado sin estado: aprobado en frontmatter**: el ejecutor inicia sin verificar que el plan está aprobado, lo que puede llevar a ejecutar un plan en borrador. Causa: el frontmatter no incluye `estado: aprobado`. Solución: agregar `estado: aprobado` al frontmatter antes de entregar al ejecutor, ya que `seguridad-agentes.md` exige esta verificación.
281
+
282
+ ## Reglas anti-placeholder (obligatorio)
283
+
284
+ Un plan con placeholders es un defecto. El implementador debe poder ejecutar cada tarea
285
+ sin tomar decisiones de diseno ni pedir aclaraciones.
286
+
287
+ ### Placeholders prohibidos
288
+ - `TBD`, `PENDIENTE`, `por definir`, `implementar despues`
289
+ - "agregar manejo de errores" (debe decir QUE errores y COMO)
290
+ - "agregar validacion" (debe decir CUAL validacion con CUAL regla)
291
+ - "similar a la tarea N" (debe repetir el contenido relevante)
292
+ - "agregar tests apropiados" (debe especificar QUE tests con QUE escenarios)
293
+ - Referencias a tipos/funciones no definidos en el plan
294
+
295
+ ### Auto-revision antes de entregar
296
+ 1. `grep -rni "TBD\|PENDIENTE\|por definir\|implementar despues" PLAN.md`
297
+ 2. Cada tarea: el implementador puede ejecutarla sin preguntas?
298
+ 3. Interfaces entre tareas: tipos y nombres consistentes?
299
+ 4. Cada requisito tiene al menos una tarea?
@@ -1,7 +1,12 @@
1
1
  ---
2
2
  name: postgresql-experto
3
3
  description: PostgreSQL avanzado. JSONB, arrays, tipos personalizados, búsqueda de texto completo, window functions, CTEs recursivos, Row Level Security y funciones almacenadas.
4
- version: "1.0.0"
4
+ version: "1.1.0"
5
+ evolved: true
6
+ evolved-from: "1.0.0"
7
+ evolved-at: "2026-05-05"
8
+ evolved-by: "aprender"
9
+ evolved-note: "3 gotchas nuevos de la sesión SIGM 2026-05-05: RLS bypass por superusuarios, UUIDs hex en seeds, consultar enum_range antes de seedear (L2/L4/L8)"
5
10
  herramientasPermitidas: [Read, Grep]
6
11
  exclusiones:
7
12
  - "No cargar para optimización de queries SQL (EXPLAIN ANALYZE, índices, partitioning) — para optimización cargar `sql-optimizacion`."
@@ -144,6 +149,24 @@ ver [recursos/referencia-completa.md](recursos/referencia-completa.md).
144
149
 
145
150
  **`SET LOCAL app.empresa_id` para RLS no persiste fuera de una transacción**: `SET LOCAL` establece la variable solo para la transacción actual — si se ejecuta fuera de `BEGIN/COMMIT`, tiene el mismo efecto que `SET` (sesión completa). En aplicaciones con pooling (PgBouncer en transaction mode), la sesión se reutiliza entre conexiones y la variable puede persistir de una petición anterior. Causa: el pool de conexiones reutiliza sessions sin limpiar el estado. Fix: usar SIEMPRE `SET LOCAL` dentro de una transacción explícita (`async with session.begin()`) y verificar que el pool esté en transaction mode.
146
151
 
152
+ **RLS NO se aplica a superusuarios — verificar siempre con rol app-only**: `FORCE ROW LEVEL SECURITY` hace que las policies apliquen al OWNER de la tabla, pero los superusuarios SIEMPRE bypassean RLS. En imágenes oficiales (`postgis/postgis`, `postgres`), el rol que se crea por defecto (con `POSTGRES_USER`) es superusuario. Caso real: `SET app.tenant_id = COAT` mostraba 20 predios del tenant MINA porque la query corría como `sigm` superuser. Fix: para verificar aislamiento RLS o exponer al backend de producción, crear un rol app-only sin BYPASSRLS:
153
+ ```sql
154
+ CREATE ROLE sigm_app NOLOGIN;
155
+ GRANT USAGE ON SCHEMA <s> TO sigm_app;
156
+ GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA <s> TO sigm_app;
157
+ SET ROLE sigm_app; -- ahora RLS aplica
158
+ ```
159
+ NUNCA usar el rol propietario del schema (suele ser superuser) como rol de aplicación.
160
+
161
+ **UUIDs deterministas en seeds DEBEN usar SOLO chars hex (0-9, a-f)**: la convención común de "prefijo legible" (`vut00000-...` para valores unitarios terreno, `z0000000-...` para zonas, `tv000000-...` para tipos vialidad) produce strings inválidos como UUID. PostgreSQL rechaza con `invalid input syntax for type uuid: "vut00000-..."`. Detectado en sesión 2026-05-04 con 30+ UUIDs inválidos cascadeando errores en seeds dependientes. Fix: usar dígitos hex como prefijo discriminador (`30000000-` zonas, `40000000-` manzanas, `b0000000-` colonias) o usar `gen_random_uuid()` y resolver vínculos via subqueries (`(SELECT id FROM ... WHERE clave = 'X')`).
162
+
163
+ **Enum types: nunca presumir variantes — consultar `enum_range` antes de seedear**: PostgreSQL crea tipos enum con variantes específicas que pueden diferir del nombre de dominio. Ejemplos reales: `tipo_suelo` no tiene `'rústico'` (con acento) sino `'rural'`; `tipo_estatus_medidor` no tiene `'funcionando'` sino `'funcional'`. Fix: antes de incluir un valor literal en seed o INSERT, ejecutar:
164
+ ```sql
165
+ SELECT enum_range(NULL::<schema>.<tipo>);
166
+ -- {funcional,descompuesto,sin_medidor,retirado}
167
+ ```
168
+ Si el valor que necesitas no existe, agregar la variante con `ALTER TYPE ... ADD VALUE` en una migración separada — no improvisar en seeds.
169
+
147
170
  **GIN index en columna JSONB no se usa con el operador `->>` en una cláusula WHERE**: `WHERE metadata ->> 'marca' = 'Dell'` extrae texto y compara — este operador no usa el índice GIN. Solo los operadores `@>`, `?`, `?|`, `?&` usan el índice GIN. Causa: `->>` convierte JSONB a texto y la comparación es una operación de texto sin índice JSONB. Fix: para búsquedas de igualdad con índice, usar `WHERE metadata @> '{"marca": "Dell"}'` que sí usa el índice GIN, o crear un índice de expresión B-Tree sobre `(metadata ->> 'marca')`.
148
171
 
149
172
  **`FORCE ROW LEVEL SECURITY` no protege al usuario dueño de la tabla (superuser/owner)**: el propietario de la tabla y los superusuarios de PostgreSQL bypasean RLS por defecto aunque esté `FORCE` habilitado. Causa: `FORCE` aplica a todos los usuarios excepto al dueño de la tabla y a superusuarios. Fix: si la aplicación conecta como el dueño de la tabla, cambiar el rol de conexión a un rol de aplicación sin privilegios de dueño (`GRANT CONNECT ON DATABASE ... TO app_user`), no usar el usuario `postgres` para conexiones de aplicación.