@saulwade/swl-ses 1.6.1 → 1.6.5

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 (85) hide show
  1. package/CLAUDE.md +3 -3
  2. package/README.md +4 -4
  3. package/agentes/_intent-spec.md +73 -0
  4. package/agentes/auto-evolucion-swl.md +24 -0
  5. package/agentes/cloud-infra-swl.md +25 -0
  6. package/agentes/datos-swl.md +23 -0
  7. package/agentes/devops-ci-swl.md +24 -0
  8. package/agentes/gh-fix-ci-swl.md +275 -0
  9. package/agentes/migrador-swl.md +22 -0
  10. package/agentes/nemesis-auditor-swl.md +90 -1
  11. package/agentes/pagos-swl.md +25 -0
  12. package/agentes/release-manager-swl.md +24 -0
  13. package/agentes/sre-swl.md +24 -0
  14. package/comandos/swl/exportar-vault.md +106 -14
  15. package/comandos/swl/nemesis.md +70 -3
  16. package/comandos/swl/planear-fase.md +16 -0
  17. package/comandos/swl/release.md +62 -2
  18. package/comandos/swl/salud.md +32 -0
  19. package/comandos/swl/verificar.md +116 -2
  20. package/habilidades/agent-browser/SKILL.md +111 -4
  21. package/habilidades/agent-deep-links/SKILL.md +148 -0
  22. package/habilidades/aprender-de-git-diff/SKILL.md +288 -0
  23. package/habilidades/backend-async-postgres-testing/SKILL.md +215 -0
  24. package/habilidades/backend-error-design/SKILL.md +221 -0
  25. package/habilidades/browser-interaction-patterns/SKILL.md +514 -0
  26. package/habilidades/browser-research-domains/SKILL.md +635 -0
  27. package/habilidades/changelog-generator/SKILL.md +172 -0
  28. package/habilidades/changelog-generator/scripts/parse-commits.js +354 -0
  29. package/habilidades/devsecops-pipeline-security/SKILL.md +3 -0
  30. package/habilidades/diseno-herramientas-agente/SKILL.md +17 -1
  31. package/habilidades/fastapi-experto/SKILL.md +49 -4
  32. package/habilidades/harness-claude-code/SKILL.md +4 -1
  33. package/habilidades/meta-skills-estandar/SKILL.md +6 -0
  34. package/habilidades/meta-skills-estandar/recursos/skill-judge-rubrica.md +281 -0
  35. package/habilidades/postgresql-experto/SKILL.md +80 -4
  36. package/habilidades/proceso-autoverificacion-evidencias/SKILL.md +258 -0
  37. package/habilidades/proceso-confianza-pre-implementacion/SKILL.md +246 -0
  38. package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -0
  39. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -0
  40. package/habilidades/proceso-discovery-machote/SKILL.md +157 -0
  41. package/habilidades/proceso-intent-engineering/SKILL.md +269 -0
  42. package/habilidades/proceso-modular-split/SKILL.md +256 -0
  43. package/habilidades/reducir-entropia/SKILL.md +219 -0
  44. package/habilidades/tdd-workflow/SKILL.md +12 -5
  45. package/hooks/extraccion-aprendizajes.js +8 -0
  46. package/hooks/lib/deep-links.js +185 -0
  47. package/hooks/lib/evolution-tracker.js +115 -18
  48. package/hooks/lib/gateway-notify.js +70 -7
  49. package/hooks/lib/task-budget.js +218 -0
  50. package/hooks/validar-intent-spec.js +222 -0
  51. package/manifiestos/hooks-config.json +9 -0
  52. package/manifiestos/modulos.json +22 -3
  53. package/manifiestos/skills-lock.json +1247 -1142
  54. package/package.json +3 -3
  55. package/plugin.json +18 -2
  56. package/reglas/arquitectura.md +38 -0
  57. package/reglas/arreglar-al-detectar.md +93 -0
  58. package/reglas/auditorias-documentales-estructurales.md +38 -0
  59. package/reglas/fragmentos-compartidos.md +26 -0
  60. package/reglas/intent-engineering.md +214 -0
  61. package/reglas/registro-componentes-nuevos.md +52 -0
  62. package/reglas/tests-cleanup.md +220 -0
  63. package/schemas/agent-frontmatter.schema.json +294 -167
  64. package/schemas/agent-message.schema.json +73 -53
  65. package/schemas/agent-output-implementacion.schema.json +114 -85
  66. package/schemas/agent-output-planificacion.schema.json +150 -113
  67. package/schemas/agent-output-review.schema.json +98 -78
  68. package/schemas/diary-entry.schema.json +42 -10
  69. package/schemas/hook-profiles.schema.json +54 -39
  70. package/schemas/hooks-config.schema.json +89 -74
  71. package/schemas/instinct.schema.json +152 -115
  72. package/schemas/modulos.schema.json +38 -29
  73. package/schemas/perfiles.schema.json +36 -28
  74. package/schemas/plugin.schema.json +77 -64
  75. package/schemas/skill-evals.schema.json +119 -95
  76. package/schemas/skill-frontmatter.schema.json +245 -170
  77. package/scripts/generar-inventario.js +3 -1
  78. package/scripts/lib/mcp_config.py +29 -14
  79. package/scripts/lib/schema-version.js +164 -0
  80. package/scripts/mcp-orchestrator.py +153 -131
  81. package/scripts/mcp-pool-manager.py +132 -107
  82. package/scripts/mcp-telemetry.py +139 -120
  83. package/scripts/validar-manifest.js +1 -1
  84. package/scripts/validar.js +3 -2
  85. package/scripts/verificar-release.js +199 -1
@@ -10,7 +10,7 @@ description: >
10
10
  Cargar cuando el usuario reporte "se acabó la cuota", se prepare una
11
11
  sesión Opus larga (>2h), se planifique adopción de MCP servers, o se
12
12
  detecte context-rot recurrente.
13
- version: "1.0.0"
13
+ version: "1.0.1"
14
14
  evolved: false
15
15
  herramientasPermitidas: [Read]
16
16
  exclusiones:
@@ -268,6 +268,9 @@ Sin observar la métrica, no puedes optimizarla.
268
268
  - **`/clear` mid-session destruye el plan en curso**: usuario pierde el roadmap acumulado. Causa: confundir `/clear` con `/compact`. Solución: `/compact` resume manteniendo conocimiento; `/clear` empieza desde cero. Antes de `/clear`, escribir un handoff a `.planning/COMPACTACION.md` con `/swl:compactar`.
269
269
  - **Tag files con `@` apuntando a archivos enormes**: Claude carga el archivo completo en contexto aunque solo necesite una sección. Causa: usar `@` con archivos >500 líneas. Solución: para archivos grandes, citar sección específica en el prompt (`@ src/auth.py líneas 100-150`) o pre-extraer con `Read offset/limit`.
270
270
  - **`/effort high` que se queda activo en prompts simples**: el siguiente prompt trivial gasta 2× tokens innecesarios. Causa: el effort se interpreta como "session-wide" cuando es per-prompt. Solución: explícito `/effort medium` (o lo que aplique) en el siguiente prompt si la complejidad bajó.
271
+ - **`child_process.spawn(cmd, args, { env: {} })` REEMPLAZA el env del padre con vacío, NO hereda** [CONFIRMADO 2026-05-18]: el cliente MCP de Claude Code (y el de Cursor) lee `mcpServers.X.env` del config JSON y lo pasa literal al spawn. Si la config tiene `"env": {}` explícito, el binario hijo arranca SIN ninguna variable de entorno del padre — rompe la herencia de apiKeys que viven en HKCU/registry. Síntoma: MCP server da `40101 Authorization required` aunque `setx OBSIDIAN_API_KEY` esté correcto en HKCU y curl con esa key responda HTTP 200 al plugin. Causa: Node `child_process.spawn` con `env: {}` ≠ sin `env` option. Solución: **OMITIR la clave `env` por completo en el JSON** (no dejarla vacía). Verificado empíricamente con `spawn(binario, [], { /* sin env */ })` → binario heredó `OBSIDIAN_API_KEY`; `spawn(binario, [], { env: {} })` → binario sin env. El patch SWL para Python (`scripts/lib/mcp_config.py::build_stdio_env`) merge `os.environ + overrides` para corregir el mismo síntoma en el lado Python.
272
+ - **MCP server devuelve auth error con apiKey correcta en disco → el proceso vivo arrancó con apiKey vieja** [CONFIRMADO 2026-05-18]: aunque `~/.cursor/mcp.json` y `~/.claude/settings.json` tengan la apiKey actual del plugin, los procesos del binario MCP (ej. `mcp-obsidian.exe`) que ya están corriendo retuvieron la apiKey del momento de su spawn. Síntoma: actualizar JSONs no soluciona 40101. Solución: `taskkill /F /IM mcp-obsidian.exe /T` (Windows) o `pkill mcp-obsidian` (Unix) + **quit total del cliente parent** (Cursor.exe / claude.exe) — no basta reload de ventana. Al reabrir, el cliente respawnea el binario con env actual. Verificar con `ps -W | grep mcp-obsidian` que solo haya procesos con timestamp posterior al reinicio.
273
+ - **Cursor y Claude Code CLI dentro de Cursor son clientes MCP DISTINTOS con procesos independientes** [CONFIRMADO 2026-05-18]: cuando se ejecuta Claude Code CLI en una terminal embebida de Cursor, hay DOS procesos del binario MCP corriendo simultáneamente — uno por cliente. Cada uno lee SU PROPIA config: Cursor lee `~/.cursor/mcp.json`, Claude Code CLI lee `~/.claude/settings.json` + `<proyecto>/.claude/settings.local.json`. Una apiKey actualizada en uno no propaga al otro. Síntoma observado: el agente AI de Cursor responde MCP OK pero Claude Code CLI da 40101 (o viceversa). Solución: usar variable de entorno persistente del SO (`setx OBSIDIAN_API_KEY` → HKCU\Environment) como single source of truth y dejar configs JSON sin clave `env` para heredar del padre. Cada regeneración de apiKey requiere un solo `setx` + reiniciar Cursor (que reinicia ambos clientes).
271
274
 
272
275
  ---
273
276
 
@@ -272,6 +272,12 @@ el contenido específico, sin inflar el contexto con cada invocación:
272
272
  valor depende de mostrar diff MAL→BIEN lado a lado (decisiones, arquitectura,
273
273
  anti-patrones sutiles). NO retroactiva — las 63 carpetas `recursos/` existentes
274
274
  no se renombran. Ver [recursos/convencion-examples.md](recursos/convencion-examples.md).
275
+ - **Rúbrica skill-judge (Knowledge Delta + Freedom Calibration + 5 patrones)** —
276
+ tres lentes complementarios a las 10 dimensiones de `/swl:evaluar-skill`
277
+ para autoría: detectar contenido redundante, matchear libertad a fragilidad,
278
+ elegir patrón estructural al inicio. NO reemplaza el gate `/swl:evaluar-skill`;
279
+ aplica durante la escritura. Ver [recursos/skill-judge-rubrica.md](recursos/skill-judge-rubrica.md).
280
+ Origen: ADR-0024.
275
281
 
276
282
  Cada recurso tiene ToC al inicio y es autocontenido — leer solo el relevante
277
283
  al caso en cuestión en lugar de los tres.
@@ -0,0 +1,281 @@
1
+ # Rúbrica skill-judge — 3 dimensiones complementarias a `evaluar-skill`
2
+
3
+ Recurso opcional que se carga bajo demanda cuando se autora un SKILL.md y se
4
+ quieren aplicar tres lentes adicionales que el comando `/swl:evaluar-skill`
5
+ no mide directamente. Adaptación de la rúbrica `skill-judge` (agent-toolkit,
6
+ 8 dimensiones × 120 puntos) para complementar las 10 dimensiones ponderadas
7
+ del comando SWL.
8
+
9
+ **Origen**: análisis comparativo documentado en ADR-0024 — Opción B.
10
+ **NO reemplaza** `/swl:evaluar-skill`; añade tres lentes de autoría que el
11
+ comando deja fuera por ser difíciles de medir programáticamente.
12
+
13
+ ---
14
+
15
+ ## Por qué este recurso existe
16
+
17
+ El comando `/swl:evaluar-skill` mide 10 dimensiones que cubren bien:
18
+ trigger, orquestación, scope, progressive disclosure, robustez, completitud
19
+ estructural. Tras comparar con la rúbrica de 8 dimensiones de
20
+ `temp/agent-toolkit/skills/skill-judge/`, detecté tres lentes que aporta
21
+ valor agregado al **autor del skill**, no al evaluador automático:
22
+
23
+ | Lente skill-judge | Por qué falta en SWL | Cuándo aporta |
24
+ |---|---|---|
25
+ | **Knowledge Delta** | Difícil de medir programáticamente | Al escribir skill nuevo: detectar contenido redundante |
26
+ | **Freedom Calibration** | Subjetivo (alta/media/baja libertad) | Al elegir nivel de prescripción según fragilidad |
27
+ | **Pattern Recognition (5 patrones)** | Clasificación, no calidad | Al elegir estructura del skill al inicio |
28
+
29
+ Estas tres dimensiones se aplican durante la **autoría**, no la **evaluación
30
+ final**. Para el gate de calidad sigue usándose `/swl:evaluar-skill`.
31
+
32
+ ---
33
+
34
+ ## Lente 1 — Knowledge Delta
35
+
36
+ > **Buen Skill = Conocimiento de experto − lo que el modelo ya sabe.**
37
+
38
+ El valor de un skill se mide por su **delta de conocimiento** — la brecha
39
+ entre lo que provee y lo que el modelo ya tiene en sus pesos.
40
+
41
+ ### Las 3 categorías de contenido
42
+
43
+ | Tipo | Definición | Tratamiento |
44
+ |------|-----------|-------------|
45
+ | **Expert** | El modelo genuinamente no lo sabe | Mantener — es el valor del skill |
46
+ | **Activation** | El modelo lo sabe pero podría no pensar en ello | Mantener si es breve — funciona como recordatorio |
47
+ | **Redundant** | El modelo definitivamente lo sabe | Borrar — desperdicia tokens |
48
+
49
+ ### Red flags (contenido a borrar agresivamente)
50
+
51
+ - "¿Qué es [concepto básico]?" — el modelo lo sabe.
52
+ - Tutoriales paso a paso para operaciones estándar (open file, read, write).
53
+ - Explicaciones de uso de librerías comunes (cómo usar `requests`,
54
+ `fetch`, etc.).
55
+ - Best practices genéricas ("escribe código limpio", "maneja errores").
56
+ - Definiciones de términos estándar de la industria.
57
+
58
+ ### Green flags (contenido de alto valor)
59
+
60
+ - Decision trees para decisiones no obvias ("cuando X falla, intenta Y
61
+ porque Z").
62
+ - Trade-offs que solo un experto conoce ("A es más rápido pero B maneja
63
+ el edge case C").
64
+ - Edge cases de experiencia real ("MissingGreenlet pasa cuando…").
65
+ - "NEVER hagas X porque [razón no obvia]".
66
+ - Frameworks de pensamiento específicos del dominio.
67
+
68
+ ### Test mental
69
+
70
+ Al revisar cada sección de tu SKILL.md, preguntar:
71
+
72
+ 1. *¿El modelo ya sabe esto?* Si sí → marcar como Redundant, borrar.
73
+ 2. *¿Esto explica TO el modelo o FOR el modelo?* TO = redundant; FOR = valor.
74
+ 3. Calcular ratio E:A:R. Bueno: >70% Expert, <20% Activation, <10% Redundant.
75
+
76
+ ### Conexión con `reducir-entropia`
77
+
78
+ El skill SWL `reducir-entropia` aplica el mismo principio al codebase
79
+ (menos líneas finales = win). Knowledge delta lo aplica al SKILL.md
80
+ (menos tokens redundantes = win). Mismo lente, distinto target.
81
+
82
+ ---
83
+
84
+ ## Lente 2 — Freedom Calibration
85
+
86
+ > **Match freedom to fragility.**
87
+
88
+ Diferentes tareas requieren diferentes niveles de restricción en el skill.
89
+
90
+ ### El espectro
91
+
92
+ | Tipo de tarea | Debería tener | Por qué |
93
+ |---|---|---|
94
+ | Creativo / Diseño | Alta libertad | Múltiples caminos válidos; diferenciación es el valor |
95
+ | Code review | Libertad media | Hay principios, pero juicio requerido |
96
+ | Operaciones en formato de archivo | Baja libertad | Un byte mal corrompe el archivo |
97
+
98
+ ### Ejemplos
99
+
100
+ **Alta libertad** (principios, no pasos):
101
+
102
+ ```markdown
103
+ Commit a una dirección estética BOLD. Elige un extremo: minimalismo
104
+ brutal, caos maximalista, retro-futurista, orgánico natural…
105
+ ```
106
+
107
+ **Libertad media** (priorización + criterio):
108
+
109
+ ```markdown
110
+ Prioridad de revisión:
111
+ 1. Vulnerabilidades de seguridad (must fix)
112
+ 2. Errores de lógica (must fix)
113
+ 3. Performance (should fix)
114
+ 4. Mantenibilidad (opcional)
115
+ ```
116
+
117
+ **Baja libertad** (script exacto):
118
+
119
+ ```markdown
120
+ **OBLIGATORIO**: usar exactamente `scripts/create-doc.py` con parámetros
121
+ `--title "X" --author "Y"`. NO modificar el script.
122
+ ```
123
+
124
+ ### Test
125
+
126
+ Pregunta: *si el modelo comete error, ¿cuál es la consecuencia?*
127
+
128
+ - Consecuencia alta → libertad baja (prescriptivo).
129
+ - Consecuencia baja → libertad alta (principios).
130
+
131
+ ### Errores comunes de calibración
132
+
133
+ - **Rígido para tarea creativa**: skill que prescribe paso a paso una
134
+ decisión estética destruye el valor del skill.
135
+ - **Vago para operación frágil**: skill que dice "ten cuidado al editar
136
+ XML" sin reglas exactas garantiza archivos corruptos.
137
+
138
+ ---
139
+
140
+ ## Lente 3 — Patrones reconocibles (5 patrones del agent-toolkit)
141
+
142
+ Al elegir la **estructura** de un skill nuevo, identificar a cuál de
143
+ estos 5 patrones se ajusta. Ayuda a calibrar tamaño y profundidad.
144
+
145
+ | Patrón | Líneas | Características clave | Cuándo usarlo |
146
+ |---|---|---|---|
147
+ | **Mindset** | ~50 | Pensamiento > técnica, NEVER list fuerte, alta libertad | Tareas creativas que requieren gusto |
148
+ | **Navigation** | ~30 | SKILL.md mínimo, rutea a sub-archivos en `recursos/` | Múltiples escenarios distintos |
149
+ | **Philosophy** | ~150 | Dos pasos: Filosofía → Express, enfatiza craft | Arte/creación que requiere originalidad |
150
+ | **Process** | ~200 | Workflow por fases, checkpoints, libertad media | Proyectos multi-paso complejos |
151
+ | **Tool** | ~300 | Decision trees, ejemplos de código, libertad baja | Operaciones precisas en formato específico |
152
+
153
+ ### Guía de selección
154
+
155
+ | Tu tarea es… | Patrón recomendado |
156
+ |---|---|
157
+ | Requiere gusto y creatividad | Mindset (~50 líneas) |
158
+ | Requiere originalidad y craft quality | Philosophy (~150 líneas) |
159
+ | Tiene múltiples sub-escenarios distintos | Navigation (~30 líneas) |
160
+ | Proyecto complejo multi-paso | Process (~200 líneas) |
161
+ | Operación precisa en formato específico | Tool (~300 líneas) |
162
+
163
+ ### Mapeo a skills SWL existentes (referencia)
164
+
165
+ - `meta-skills-estandar` — Philosophy/Process (526 líneas; rebasa el ideal
166
+ pero contiene 5 secciones extendidas justificadas por ADR).
167
+ - `tdd-workflow` — Process.
168
+ - `verificar-trabajo` — Process con decision trees.
169
+ - `discutir-fase` — Process.
170
+ - `reducir-entropia` — Mindset (~200 líneas, anti-patrón consciente).
171
+ - `proceso-confianza-pre-implementacion` — Process.
172
+ - `proceso-autoverificacion-evidencias` — Process.
173
+ - `aprender-de-git-diff` — Mindset/Process híbrido.
174
+ - Skills de formato de archivo (cuando aplique) — Tool.
175
+
176
+ ---
177
+
178
+ ## Las 7 fallas comunes (Common Failure Patterns)
179
+
180
+ Adaptado de skill-judge "Common Failure Patterns". Si tu skill cae en uno
181
+ de estos, refactorizar antes de mergear.
182
+
183
+ ### 1. The Tutorial
184
+
185
+ **Síntoma**: explica qué es PDF, cómo funciona Python, uso básico de librería.
186
+ **Causa**: autor asume que el skill debe "enseñar" al modelo.
187
+ **Fix**: el modelo ya sabe esto. Borrar todas las explicaciones básicas.
188
+ Enfocar en decisiones de experto, trade-offs, anti-patrones.
189
+
190
+ ### 2. The Dump
191
+
192
+ **Síntoma**: SKILL.md de 800+ líneas con todo incluido.
193
+ **Causa**: sin diseño de progressive disclosure.
194
+ **Fix**: routing y decision trees en SKILL.md (<300 líneas ideal). Contenido
195
+ detallado a `recursos/`, cargado bajo demanda.
196
+
197
+ ### 3. The Orphan References
198
+
199
+ **Síntoma**: directorio `recursos/` existe pero los archivos nunca se cargan.
200
+ **Causa**: sin triggers explícitos de carga.
201
+ **Fix**: agregar "OBLIGATORIO — LEER ARCHIVO COMPLETO" en puntos de
202
+ decisión del workflow. Agregar "NO cargar" para prevenir sobre-carga.
203
+
204
+ ### 4. The Checkbox Procedure
205
+
206
+ **Síntoma**: Paso 1, Paso 2, Paso 3… procedimientos mecánicos.
207
+ **Causa**: autor piensa en procedimientos, no en frameworks de pensamiento.
208
+ **Fix**: transformar en "Antes de hacer X, pregúntate…". Enfocar en
209
+ principios de decisión, no secuencias de operación.
210
+
211
+ ### 5. The Vague Warning
212
+
213
+ **Síntoma**: "Ten cuidado", "evita errores", "considera edge cases".
214
+ **Causa**: autor sabe que cosas pueden salir mal pero no las articuló.
215
+ **Fix**: NEVER list específico con ejemplos concretos y razones no obvias.
216
+ "NEVER uses X porque [problema específico que solo experiencia enseña]".
217
+
218
+ ### 6. The Invisible Skill
219
+
220
+ **Síntoma**: gran contenido pero el skill raramente se activa.
221
+ **Causa**: description vaga, sin keywords, sin trigger scenarios.
222
+ **Fix**: description responde WHAT + WHEN + KEYWORDS. "Usar cuando…" +
223
+ escenarios específicos + términos buscables.
224
+
225
+ ### 7. The Over-Engineered
226
+
227
+ **Síntoma**: README.md, CHANGELOG.md, INSTALLATION_GUIDE.md, CONTRIBUTING.md
228
+ dentro del directorio del skill.
229
+ **Causa**: tratar al skill como proyecto de software.
230
+ **Fix**: borrar todos los archivos auxiliares. Solo incluir lo que el
231
+ modelo necesita para la tarea. Cero documentación sobre el skill mismo.
232
+
233
+ ---
234
+
235
+ ## NUNCA al evaluar (skill-judge)
236
+
237
+ - **NUNCA** dar score alto solo porque "se ve profesional" o bien formateado.
238
+ - **NUNCA** ignorar token waste — cada párrafo redundante penaliza.
239
+ - **NUNCA** dejar que la longitud te impresione — un skill de 43 líneas
240
+ puede superar a uno de 500.
241
+ - **NUNCA** saltarse el test mental de los decision trees — ¿realmente
242
+ llevan a la elección correcta?
243
+ - **NUNCA** perdonar explicaciones básicas con "pero da contexto útil".
244
+ - **NUNCA** subvalorar el campo `description` — pobre description = skill
245
+ nunca se activa.
246
+
247
+ ---
248
+
249
+ ## La pregunta meta
250
+
251
+ Al revisar cualquier skill, regresar a:
252
+
253
+ > **"¿Un experto en este dominio, mirando este skill, diría: 'sí, esto
254
+ > captura conocimiento que me tomó años aprender'?"**
255
+
256
+ Si la respuesta es sí → valor genuino.
257
+ Si la respuesta es no → comprime lo que el modelo ya sabe → basura.
258
+
259
+ Los mejores skills son **cerebros expertos comprimidos** — toman 10 años
260
+ de acumulación de un diseñador y los comprimen en 43 líneas, o la
261
+ experiencia operacional de un experto en documentos en un decision tree
262
+ de 200 líneas.
263
+
264
+ Lo que se comprime debe ser cosas que el modelo NO tiene. De lo contrario,
265
+ es compresión basura.
266
+
267
+ ---
268
+
269
+ ## Cómo aplicar este recurso durante autoría
270
+
271
+ 1. **Antes de escribir**: identificar patrón (Mindset/Navigation/Philosophy/
272
+ Process/Tool) según la tabla de selección. Esto define tamaño objetivo.
273
+ 2. **Durante escritura**: aplicar Freedom Calibration — match libertad a
274
+ fragilidad.
275
+ 3. **Después de primera versión**: pasar el lente de Knowledge Delta sección
276
+ por sección. Marcar E/A/R. Borrar Redundant agresivamente.
277
+ 4. **Antes de commit**: revisar contra las 7 fallas comunes.
278
+ 5. **Antes de merge**: ejecutar `/swl:evaluar-skill <nombre>` para el score
279
+ formal de las 10 dimensiones SWL.
280
+
281
+ Los 3 lentes de este recurso son aditivos al gate formal. No lo reemplazan.
@@ -1,12 +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.1.0"
4
+ version: "1.2.0"
5
5
  evolved: true
6
- evolved-from: "1.0.0"
7
- evolved-at: "2026-05-05"
6
+ evolved-from: "1.1.0"
7
+ evolved-at: "2026-05-20"
8
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)"
9
+ evolved-note: "4 gotchas nuevos consolidados SIGM L-152/L-153/L-156 + SIGAF 2026-05-15: race condition SELECT-then-write fuera de transaction (CONFIRMADO x4), UPDATE WHERE col1 sin dimensiones de scoping, drift triple Literal↔validator↔ENUM, partial unique index con WHERE requiere predicado puro (no subqueries)"
10
10
  herramientasPermitidas: [Read, Grep]
11
11
  exclusiones:
12
12
  - "No cargar para optimización de queries SQL (EXPLAIN ANALYZE, índices, partitioning) — para optimización cargar `sql-optimizacion`."
@@ -172,3 +172,79 @@ Si el valor que necesitas no existe, agregar la variante con `ALTER TYPE ... ADD
172
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.
173
173
 
174
174
  **`tsvector` `GENERATED ALWAYS AS STORED` no actualiza cuando cambia la configuración de idioma**: si la columna `busqueda_ts` fue generada con `to_tsvector('spanish', ...)` y luego se cambia el contenido con texto en otro idioma, las palabras no se stemmizan correctamente — pero la columna no se regenera. Causa: la columna generada se recalcula solo cuando cambia la fila, no cuando cambia la lógica de la expresión. Fix: si se cambia la expresión de la columna generada, hacer `ALTER TABLE ... DROP COLUMN busqueda_ts; ALTER TABLE ... ADD COLUMN ...` para regenerar todos los valores.
175
+
176
+ **SELECT-then-INSERT/UPDATE FUERA de `conn.transaction()` produce race condition** (CONFIRMADO x4 en sesiones SIGM 2026-05-20): patrón `SELECT id FROM X WHERE clave=$1` seguido de `INSERT/UPDATE X` sin envolver en transacción permite a otra petición concurrente insertar entre el SELECT y el write — viola unicidad lógica aunque haya UNIQUE constraint (la 2da petición recibe error pero después de hacer trabajo). Casos: doble VIGENTE en valuación, doble documento/orden con mismo folio, subdivisión/fusión/traslado de predios concurrentes. Fix obligatorio:
177
+ ```python
178
+ async with self._conn.transaction():
179
+ # SELECT con lock explícito
180
+ row = await self._conn.fetchrow(
181
+ "SELECT id, version FROM tabla WHERE clave=$1 FOR UPDATE",
182
+ clave,
183
+ )
184
+ if row is None:
185
+ await self._conn.execute(
186
+ "INSERT INTO tabla (clave, ...) VALUES ($1, ...)",
187
+ clave, ...,
188
+ )
189
+ else:
190
+ # Si requiere CAS: WHERE clave=$1 AND version=$N en el UPDATE
191
+ await self._conn.execute(
192
+ "UPDATE tabla SET ... WHERE id=$1",
193
+ row["id"],
194
+ )
195
+ ```
196
+ Alternativas:
197
+ - `INSERT ... ON CONFLICT (clave) DO NOTHING/UPDATE` cuando la lógica es upsert puro.
198
+ - `SELECT FOR UPDATE` para bloquear filas existentes durante el chequeo.
199
+ - CAS en `WHERE version=$N` cuando el lock es muy costoso y se prefiere reintento.
200
+
201
+ Regla de auditoría: cualquier endpoint con `SELECT ... WHERE` seguido de `INSERT`/`UPDATE` sobre la misma tabla DEBE estar dentro de `async with self._conn.transaction():`. El UNIQUE constraint NO sustituye el lock — es defensa de último recurso.
202
+
203
+ **`UPDATE ... WHERE columna1 = $1` sin filtrar dimensiones adicionales des-actualiza filas hermanas**: SIGM NEM-VA-03 (2026-05-20). `UPDATE valuacion SET es_vigente=false WHERE predio_id=$1` cuando el predio tiene múltiples ejercicios fiscales des-vigentaba TODOS los ejercicios, no solo el actual. El bug pasó UNIQUE constraint (cada fila era válida individualmente) pero rompió integridad de dominio (debe haber 1 VIGENTE por (predio, ejercicio), no 1 VIGENTE por predio). Fix:
204
+ ```sql
205
+ -- MAL
206
+ UPDATE valuacion SET es_vigente=false WHERE predio_id=$1;
207
+
208
+ -- BIEN
209
+ UPDATE valuacion SET es_vigente=false
210
+ WHERE predio_id=$1 AND ejercicio=$2;
211
+ ```
212
+ Regla de auditoría: antes de aceptar un UPDATE, listar TODAS las dimensiones de dominio que definen "una fila lógica" (tenant_id, ejercicio, tipo, estatus, ...) y verificar que el WHERE incluye cada dimensión que aplica al scope del cambio. Las dimensiones implícitas (`es_vigente=true`, `activo=true`) también cuentan — un UPDATE que apaga `es_vigente` debe filtrar por la dimensión que define la unicidad de "vigente".
213
+
214
+ **Drift triple Pydantic `Literal` ↔ validator de schema ↔ ENUM PostgreSQL**: SIGM NEM-VA-11 (2026-05-20). Tres universos incompatibles del mismo concepto: `Literal["A", "B", ..., "F"]` (6 valores) en el schema Pydantic, validator personalizado aceptando 8 valores, ENUM en PostgreSQL declarado con 12 valores. Cast `$N::schema.tipo_enum` falla en BD cuando llega un valor permitido por el Literal pero ausente del ENUM. Fix: **PostgreSQL ENUM como única fuente de verdad** cuando existe. Validar al arrancar la app:
215
+ ```python
216
+ from sqlalchemy import text
217
+
218
+ async def validar_enum_alineado(session, schema: str, enum_name: str, pydantic_values: set[str]):
219
+ rows = await session.execute(
220
+ text(f"SELECT enum_range(NULL::{schema}.{enum_name})")
221
+ )
222
+ pg_values = set(rows.scalar().strip("{}").split(","))
223
+ if pydantic_values != pg_values:
224
+ raise RuntimeError(
225
+ f"Drift ENUM {enum_name}: pydantic={pydantic_values} pg={pg_values}"
226
+ )
227
+ ```
228
+ O generar el `Literal` Pydantic desde el ENUM PostgreSQL al startup (más estricto pero requiere conexión a BD para arrancar). Tests obligatorios: para cada ENUM, un test que compare `enum_range` contra el `Literal` del schema. La regla simple: si existe ENUM en BD, NO declarar Literal en código — derivarlo. Si NO existe ENUM en BD, NO declarar Literal en código — usar string libre con validator que consulta tabla de catálogo.
229
+
230
+ **Partial unique index requiere predicado puro sobre columnas de la propia tabla**: SIGAF DT-TRANSICION-UC 2026-05-15. Intento inicial: `CREATE UNIQUE INDEX ... WHERE estatus_destino_id != (SELECT id FROM cat_estatus_acto WHERE clave='CANCELADO')`. PostgreSQL rechaza el predicado en partial index porque no permite subqueries. Workaround común: resolver el UUID en `upgrade()` con `SELECT` y embeber el literal — frágil porque en BD limpia (CI) la tabla está vacía → query retorna None → el índice se crea SIN filtro WHERE → seeds posteriores fallan al insertar lo que el índice ahora rechaza. Fix correcto:
231
+ ```sql
232
+ -- 1. Agregar columna discriminadora en la tabla (boolean o enum)
233
+ ALTER TABLE transicion_estatus_acto
234
+ ADD COLUMN es_automatica BOOLEAN NOT NULL DEFAULT FALSE;
235
+
236
+ -- 2. Backfill condicional desde el join con la tabla externa
237
+ UPDATE transicion_estatus_acto t
238
+ SET es_automatica = TRUE
239
+ FROM cat_estatus_acto c
240
+ WHERE t.estatus_destino_id = c.id AND c.clave = 'CANCELADO';
241
+
242
+ -- 3. Partial index con predicado puro sobre columnas propias
243
+ CREATE UNIQUE INDEX uq_transicion_origen_automatica
244
+ ON transicion_estatus_acto (estatus_origen_id)
245
+ WHERE es_automatica = TRUE;
246
+ ```
247
+ Regla:
248
+ - El `WHERE` de un partial index DEBE ser sobre columnas de la propia tabla. NUNCA subquery a otra tabla.
249
+ - Si la lógica requiere distinguir filas por relación con otro catálogo, agregar columna discriminadora con backfill desde el JOIN.
250
+ - Toda migración que dependa de datos de catálogo DEBE ser idempotente para BD vacía. NO confiar en que el seed corra antes — en CI fresh corre después.
@@ -0,0 +1,258 @@
1
+ ---
2
+ name: proceso-autoverificacion-evidencias
3
+ description: >
4
+ Protocolo de auto-verificación post-implementación basado en las Four
5
+ Questions (tests passing / requirements met / assumptions verified /
6
+ evidence exists) + 7 red flags de alucinación. Cargar al cerrar una
7
+ feature, bugfix o refactor — antes de reportar "completado" al usuario,
8
+ antes del commit final, antes de mergear. Adaptación del SelfCheckProtocol
9
+ de SuperClaude_Framework, accuracy reportada 94% en detección de claims
10
+ no verificadas.
11
+ version: "1.0.0"
12
+ herramientasPermitidas: [Read, Grep, Glob, Bash]
13
+ exclusiones:
14
+ - "No cargar para cambios triviales (typo, formato, comentario) — los checks no aportan valor."
15
+ - "No cargar en mitad de la implementación; este skill aplica al CIERRE. Para verificación pre-implementación usar `proceso-confianza-pre-implementacion`."
16
+ - "No cargar si ya se ejecutó `/swl:verificar` o el revisor de código emitió veredicto APROBADO — esos cubren el rol al nivel de fase/sesión."
17
+ - "No cargar para trabajo de research/discovery donde no hay implementación que cerrar."
18
+ evolvable: true
19
+ ---
20
+
21
+ # Habilidad: Auto-verificación con evidencias
22
+
23
+ ## Propósito
24
+
25
+ Cerrar el trabajo con evidencias verificables, no con claims. El material
26
+ fuente (SuperClaude_Framework `pm_agent/self_check.py`) reporta 94% de
27
+ accuracy detectando los patrones de alucinación más comunes ("tests pass"
28
+ sin mostrar output, "implementación completa" con tests rotos, lenguaje
29
+ de incertidumbre). En SWL este patrón complementa la regla
30
+ `verificar-citas-normativas.md` (que cubre citas durante el trabajo) con
31
+ el protocolo de cierre obligatorio.
32
+
33
+ ## Cuándo cargar
34
+
35
+ - Antes de reportar "completado" al usuario tras una implementación.
36
+ - Antes del commit final de una feature/bugfix/refactor.
37
+ - Antes de mergear un PR.
38
+ - Cuando un sub-agente reporta éxito y el agente padre debe validar.
39
+ - Cuando el usuario pregunta "¿está terminado?" y el agente está a punto
40
+ de responder "sí" — pasar por las Four Questions primero.
41
+
42
+ ## Cuándo NO cargar
43
+
44
+ Listado en el campo `exclusiones` del frontmatter — incluye cambios
45
+ triviales, mitad de implementación, casos donde `/swl:verificar` o el
46
+ revisor ya emitió veredicto.
47
+
48
+ ---
49
+
50
+ ## Las Four Questions
51
+
52
+ El protocolo es **mandatorio** — todas las cuatro preguntas se responden
53
+ explícitamente. Si una se omite, el trabajo NO está cerrado.
54
+
55
+ ### Pregunta 1 — ¿Pasan todos los tests?
56
+
57
+ No basta con afirmar "los tests pasan". Hay que **mostrar el output real**
58
+ del runner.
59
+
60
+ - Ejecutar el suite con el runner del proyecto (`npm test`, `pytest`,
61
+ `cargo test`, etc.).
62
+ - Mostrar las últimas 20-50 líneas del output que incluyen el resumen
63
+ ("X passed, 0 failed").
64
+ - Si hay tests skipped, indicar el conteo y la razón documentada.
65
+ - Si los tests aún no se han escrito (TDD inverso, fix urgente), declararlo
66
+ explícitamente con plan de cierre.
67
+
68
+ **Anti-patrón crítico**: "tests pasan" sin pegar el output. Es la red
69
+ flag #1 de alucinación detectada por el patrón Reflexion.
70
+
71
+ ### Pregunta 2 — ¿Se cumplen todos los requisitos?
72
+
73
+ Comparar requirements vs implementación, item por item:
74
+
75
+ - Listar los requisitos originales del usuario o del plan.
76
+ - Marcar cada uno: ✅ Hecho / ⚠️ Parcial / ❌ Pendiente.
77
+ - Si hay parciales o pendientes: declarar por qué y cuándo se cierran.
78
+ - No declarar "completo" si quedan ❌ no negociados.
79
+
80
+ La regla `arreglar-al-detectar.md` prohíbe deuda silenciosa: si algo se
81
+ deja para "después", se documenta como DA formal con trigger verificable,
82
+ no como "lo dejo pendiente".
83
+
84
+ ### Pregunta 3 — ¿Hay suposiciones sin verificar?
85
+
86
+ Toda suposición técnica usada durante la implementación debe estar
87
+ verificada contra fuente autoritativa:
88
+
89
+ - Suposiciones sobre APIs internas: verificadas leyendo el módulo, no por
90
+ nombre.
91
+ - Suposiciones sobre librerías externas: verificadas en Context7 o doc
92
+ oficial (regla `usar-context7.md`).
93
+ - Suposiciones sobre estructura del codebase: verificadas con `Grep`/`Glob`.
94
+ - Suposiciones sobre comportamiento esperado del sistema: verificadas con
95
+ test o evidencia de ejecución.
96
+
97
+ **Anti-patrón**: dejar "probablemente funciona", "debería andar", "creo
98
+ que sí". Lenguaje de incertidumbre = red flag #7.
99
+
100
+ ### Pregunta 4 — ¿Hay evidencia?
101
+
102
+ Evidencia concreta en tres ejes:
103
+
104
+ - **Test results**: output del runner pegado (no resumen propio).
105
+ - **Code changes**: lista de archivos modificados (`git diff --stat`).
106
+ - **Validation**: lint, typecheck, build exitosos — output pegado.
107
+
108
+ Si falta cualquiera de los tres, el trabajo NO está cerrado.
109
+
110
+ ---
111
+
112
+ ## Las 7 Red Flags de alucinación
113
+
114
+ Patrones que indican que el agente está "cerrando sin verificar". Si el
115
+ agente detecta cualquiera de estos en su propio output, debe corregir
116
+ ANTES de reportar:
117
+
118
+ 1. **"Tests pass" sin output** — afirmación sin evidencia.
119
+ 2. **"Everything works" sin evidencia** — claim de completitud sin pruebas.
120
+ 3. **"Implementation complete" con tests rotos** — contradicción directa.
121
+ 4. **Saltar mensajes de error** — el runner reportó errores y el agente
122
+ los ignora en el reporte.
123
+ 5. **Ignorar warnings** — warnings tratados como ruido en lugar de señales
124
+ accionables.
125
+ 6. **Esconder fallos** — reportar éxitos parciales como totales.
126
+ 7. **Lenguaje de incertidumbre** — "probably", "should work", "might
127
+ work" en un reporte de cierre.
128
+
129
+ Cada red flag detectada bloquea el cierre hasta que se resuelva.
130
+
131
+ ---
132
+
133
+ ## Formato de reporte obligatorio
134
+
135
+ Al cerrar el trabajo, emitir al usuario (o registrar en
136
+ `.planning/sessions/`) el siguiente formato:
137
+
138
+ ```
139
+ ### Auto-verificación de cierre
140
+
141
+ **Pregunta 1 — Tests passing?**
142
+ <output del runner pegado, últimas 20-50 líneas con resumen>
143
+ Estado: ✅ N passed / ⚠️ M skipped con razón / ❌ K failed
144
+
145
+ **Pregunta 2 — Requirements met?**
146
+ - ✅ Requisito A: <evidencia / referencia a commit / archivo:línea>
147
+ - ✅ Requisito B: <evidencia>
148
+ - ⚠️ Requisito C: parcial — <qué falta y cuándo cierra>
149
+ - ❌ Requisito D: pendiente — DA formal en `.planning/...` con trigger X
150
+
151
+ **Pregunta 3 — Assumptions verified?**
152
+ - ✅ Suposición X verificada en <fuente>
153
+ - ✅ Suposición Y verificada con <comando/test>
154
+
155
+ **Pregunta 4 — Evidence?**
156
+ - Test results: <pegado arriba>
157
+ - Code changes: `git diff --stat` → <output>
158
+ - Validation: lint/typecheck/build → <output o "no aplica al proyecto">
159
+
160
+ **Red flags detectadas**: <lista o "ninguna">
161
+
162
+ **Veredicto**: ✅ Cerrado con evidencias / ❌ Bloqueado por <razón>
163
+ ```
164
+
165
+ Si el veredicto es ❌, el agente NO reporta "completado" al usuario.
166
+ Reporta el bloqueo y propone el siguiente paso.
167
+
168
+ ---
169
+
170
+ ## Reglas obligatorias
171
+
172
+ 1. **Evidencia, no claims**: cualquier afirmación de éxito requiere output
173
+ pegado, no resumen propio. **Por qué**: el resumen propio puede ser
174
+ alucinado; el output real del runner no.
175
+
176
+ 2. **Las 4 preguntas son AND, no OR**: las cuatro deben pasar para cerrar.
177
+ No se puede compensar el fallo de una con el éxito de las otras.
178
+ **Por qué**: la regla `arreglar-al-detectar.md` exige resolver todo,
179
+ no esquivar; cerrar con 3 de 4 es deuda silenciosa.
180
+
181
+ 3. **Sin lenguaje de incertidumbre en el reporte**: las palabras
182
+ "probablemente", "creo que", "debería", "tal vez" están prohibidas en
183
+ el output de cierre. Si hay incertidumbre, verificarla; si no se puede
184
+ verificar, declararla explícitamente como gap con plan de cierre.
185
+
186
+ 4. **Re-leer el propio reporte**: antes de enviarlo, escanear las 7 red
187
+ flags. La detección es self-applied — si el agente no se audita, el
188
+ skill no funciona.
189
+
190
+ 5. **Si el cierre falla, NO ocultar**: reportar el fallo al usuario en
191
+ el mismo turno (regla `arreglar-al-detectar.md`). "Detecté que el
192
+ Check N falla porque X — voy a corregir Y" es la respuesta correcta.
193
+
194
+ ---
195
+
196
+ ## Relación con otras herramientas SWL
197
+
198
+ - **Regla `verificar-citas-normativas.md`**: aplica DURANTE el trabajo a
199
+ cada cita verificable (archivo:línea, artículo de ley, etc.). Este
200
+ skill aplica al CIERRE del trabajo completo.
201
+ - **Skill `proceso-confianza-pre-implementacion`**: aplica al INICIO con
202
+ las 5 dimensiones de confianza. Este aplica al CIERRE con las 4
203
+ preguntas. Forman par.
204
+ - **Skill `verificar-trabajo`**: el agente Verificador SWL lo usa para
205
+ validación de fase con goal-backward 4 niveles. Si se ejecutó
206
+ `/swl:verificar` y aprobó, este skill no es necesario (cobertura
207
+ redundante).
208
+ - **`revisor-codigo-swl`**: emite veredicto APROBADO/RECHAZADO sobre
209
+ código terminado. Si aprobó, este skill no es necesario.
210
+ - **Skill `monitor-ci`** (regla global): aplica a CI post-push. Este
211
+ skill aplica antes del push.
212
+
213
+ ---
214
+
215
+ ## Ejemplo de uso
216
+
217
+ Tras implementar el endpoint POST /facturas/cancelar:
218
+
219
+ ```
220
+ ### Auto-verificación de cierre
221
+
222
+ **Pregunta 1 — Tests passing?**
223
+
224
+ PASS tests/api/facturas-cancelar.test.ts
225
+ PASS tests/services/factura-service.test.ts
226
+ Tests: 23 passed, 0 failed, 1 skipped
227
+ Time: 4.2 s
228
+
229
+ Estado: ✅ 23 passed, 1 skipped (test de integración E2E pendiente de
230
+ fixture de pago — no bloqueante, documentado en TODO.md).
231
+
232
+ **Pregunta 2 — Requirements met?**
233
+ - ✅ Endpoint POST /facturas/{id}/cancelar: implementado en
234
+ `backend/app/api/facturas.py:142`.
235
+ - ✅ Validación de estatus permitido (solo "pendiente" o "emitida"):
236
+ implementada en `factura_service.py:88-101`.
237
+ - ✅ Auditoría: registro en tabla `factura_historial`: confirmado en
238
+ test `factura-cancelar-audit.test.py:55`.
239
+
240
+ **Pregunta 3 — Assumptions verified?**
241
+ - ✅ Modelo Factura tiene método `puede_cancelarse()`: confirmado leyendo
242
+ `models/factura.py:120-135`.
243
+ - ✅ FastAPI `Depends(get_db)` es la inyección estándar del proyecto:
244
+ confirmado en ADR-0008 y 12 endpoints existentes.
245
+
246
+ **Pregunta 4 — Evidence?**
247
+ - Test results: pegado arriba.
248
+ - Code changes:
249
+ 3 files changed, 84 insertions(+), 2 deletions(-)
250
+ backend/app/api/facturas.py | 32 ++++++++++++++++++--
251
+ backend/app/services/factura_service.py | 18 +++++++++++
252
+ backend/tests/api/facturas-cancelar.test.ts | 36 +++++++++++++++++++
253
+ - Validation: `ruff check .` → 0 errors, `mypy backend/` → 0 errors.
254
+
255
+ **Red flags detectadas**: ninguna.
256
+
257
+ **Veredicto**: ✅ Cerrado con evidencias.
258
+ ```