@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.
- package/CLAUDE.md +3 -3
- package/README.md +4 -4
- package/agentes/_intent-spec.md +73 -0
- package/agentes/auto-evolucion-swl.md +24 -0
- package/agentes/cloud-infra-swl.md +25 -0
- package/agentes/datos-swl.md +23 -0
- package/agentes/devops-ci-swl.md +24 -0
- package/agentes/gh-fix-ci-swl.md +275 -0
- package/agentes/migrador-swl.md +22 -0
- package/agentes/nemesis-auditor-swl.md +90 -1
- package/agentes/pagos-swl.md +25 -0
- package/agentes/release-manager-swl.md +24 -0
- package/agentes/sre-swl.md +24 -0
- package/comandos/swl/exportar-vault.md +106 -14
- package/comandos/swl/nemesis.md +70 -3
- package/comandos/swl/planear-fase.md +16 -0
- package/comandos/swl/release.md +62 -2
- package/comandos/swl/salud.md +32 -0
- package/comandos/swl/verificar.md +116 -2
- package/habilidades/agent-browser/SKILL.md +111 -4
- package/habilidades/agent-deep-links/SKILL.md +148 -0
- package/habilidades/aprender-de-git-diff/SKILL.md +288 -0
- package/habilidades/backend-async-postgres-testing/SKILL.md +215 -0
- package/habilidades/backend-error-design/SKILL.md +221 -0
- package/habilidades/browser-interaction-patterns/SKILL.md +514 -0
- package/habilidades/browser-research-domains/SKILL.md +635 -0
- package/habilidades/changelog-generator/SKILL.md +172 -0
- package/habilidades/changelog-generator/scripts/parse-commits.js +354 -0
- package/habilidades/devsecops-pipeline-security/SKILL.md +3 -0
- package/habilidades/diseno-herramientas-agente/SKILL.md +17 -1
- package/habilidades/fastapi-experto/SKILL.md +49 -4
- package/habilidades/harness-claude-code/SKILL.md +4 -1
- package/habilidades/meta-skills-estandar/SKILL.md +6 -0
- package/habilidades/meta-skills-estandar/recursos/skill-judge-rubrica.md +281 -0
- package/habilidades/postgresql-experto/SKILL.md +80 -4
- package/habilidades/proceso-autoverificacion-evidencias/SKILL.md +258 -0
- package/habilidades/proceso-confianza-pre-implementacion/SKILL.md +246 -0
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -0
- package/habilidades/proceso-ddia-streaming/SKILL.md +231 -0
- package/habilidades/proceso-discovery-machote/SKILL.md +157 -0
- package/habilidades/proceso-intent-engineering/SKILL.md +269 -0
- package/habilidades/proceso-modular-split/SKILL.md +256 -0
- package/habilidades/reducir-entropia/SKILL.md +219 -0
- package/habilidades/tdd-workflow/SKILL.md +12 -5
- package/hooks/extraccion-aprendizajes.js +8 -0
- package/hooks/lib/deep-links.js +185 -0
- package/hooks/lib/evolution-tracker.js +115 -18
- package/hooks/lib/gateway-notify.js +70 -7
- package/hooks/lib/task-budget.js +218 -0
- package/hooks/validar-intent-spec.js +222 -0
- package/manifiestos/hooks-config.json +9 -0
- package/manifiestos/modulos.json +22 -3
- package/manifiestos/skills-lock.json +1247 -1142
- package/package.json +3 -3
- package/plugin.json +18 -2
- package/reglas/arquitectura.md +38 -0
- package/reglas/arreglar-al-detectar.md +93 -0
- package/reglas/auditorias-documentales-estructurales.md +38 -0
- package/reglas/fragmentos-compartidos.md +26 -0
- package/reglas/intent-engineering.md +214 -0
- package/reglas/registro-componentes-nuevos.md +52 -0
- package/reglas/tests-cleanup.md +220 -0
- package/schemas/agent-frontmatter.schema.json +294 -167
- package/schemas/agent-message.schema.json +73 -53
- package/schemas/agent-output-implementacion.schema.json +114 -85
- package/schemas/agent-output-planificacion.schema.json +150 -113
- package/schemas/agent-output-review.schema.json +98 -78
- package/schemas/diary-entry.schema.json +42 -10
- package/schemas/hook-profiles.schema.json +54 -39
- package/schemas/hooks-config.schema.json +89 -74
- package/schemas/instinct.schema.json +152 -115
- package/schemas/modulos.schema.json +38 -29
- package/schemas/perfiles.schema.json +36 -28
- package/schemas/plugin.schema.json +77 -64
- package/schemas/skill-evals.schema.json +119 -95
- package/schemas/skill-frontmatter.schema.json +245 -170
- package/scripts/generar-inventario.js +3 -1
- package/scripts/lib/mcp_config.py +29 -14
- package/scripts/lib/schema-version.js +164 -0
- package/scripts/mcp-orchestrator.py +153 -131
- package/scripts/mcp-pool-manager.py +132 -107
- package/scripts/mcp-telemetry.py +139 -120
- package/scripts/validar-manifest.js +1 -1
- package/scripts/validar.js +3 -2
- 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.
|
|
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.
|
|
4
|
+
version: "1.2.0"
|
|
5
5
|
evolved: true
|
|
6
|
-
evolved-from: "1.
|
|
7
|
-
evolved-at: "2026-05-
|
|
6
|
+
evolved-from: "1.1.0"
|
|
7
|
+
evolved-at: "2026-05-20"
|
|
8
8
|
evolved-by: "aprender"
|
|
9
|
-
evolved-note: "
|
|
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
|
+
```
|