@saulwade/swl-ses 2.2.3 → 2.3.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 (66) hide show
  1. package/CLAUDE.md +4 -4
  2. package/README.md +3 -3
  3. package/agentes/arquitecto-swl.md +1 -1
  4. package/agentes/auto-evolucion-swl.md +908 -908
  5. package/agentes/backend-csharp-swl.md +1 -1
  6. package/agentes/backend-go-swl.md +1 -1
  7. package/agentes/backend-java-swl.md +1 -1
  8. package/agentes/backend-rust-swl.md +1 -1
  9. package/agentes/evals/orquestador-swl.evals.json +1 -1
  10. package/agentes/implementador-swl.md +2 -2
  11. package/agentes/llm-apps-swl.md +1 -1
  12. package/agentes/orquestador-swl.md +7 -7
  13. package/agentes/pagos-swl.md +1 -1
  14. package/agentes/perfilador-usuario-swl.md +321 -321
  15. package/agentes/planificador-swl.md +1 -1
  16. package/agentes/producto-prd-swl.md +1 -1
  17. package/agentes/revisor-seguridad-swl.md +1 -1
  18. package/agentes/sre-swl.md +1 -1
  19. package/comandos/swl/aprobar-plan.md +146 -141
  20. package/comandos/swl/release.md +45 -8
  21. package/comandos/swl/status.md +343 -333
  22. package/comandos/swl/verificar.md +817 -817
  23. package/habilidades/compactacion-contexto/SKILL.md +3 -3
  24. package/habilidades/contenedores-docker/SKILL.md +3 -1
  25. package/habilidades/context-builder/SKILL.md +4 -4
  26. package/habilidades/control-profundidad/SKILL.md +5 -5
  27. package/habilidades/ejecutar-fase/SKILL.md +564 -541
  28. package/habilidades/extractor-de-aprendizajes/SKILL.md +3 -3
  29. package/habilidades/guardrail-semantico/SKILL.md +1 -1
  30. package/habilidades/harness-claude-code/SKILL.md +305 -305
  31. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +1 -1
  32. package/habilidades/planear-fase/SKILL.md +15 -1
  33. package/habilidades/proceso-debate-adversarial/SKILL.md +191 -164
  34. package/habilidades/prompt-engineering/SKILL.md +5 -5
  35. package/habilidades/release-semver/SKILL.md +4 -1
  36. package/habilidades/tdd-workflow/SKILL.md +33 -1
  37. package/habilidades/workflow-claude-code/SKILL.md +6 -6
  38. package/hooks/captura-acciones-post.js +151 -0
  39. package/hooks/captura-acciones-session.js +155 -0
  40. package/hooks/lib/briefing.js +512 -474
  41. package/hooks/lib/captura-acciones.js +392 -0
  42. package/hooks/lib/context-builder.js +2 -2
  43. package/hooks/lib/model-router.js +1 -1
  44. package/hooks/lib/token-estimator.js +2 -0
  45. package/hooks/linea-estado.js +7 -5
  46. package/llms.txt +29 -29
  47. package/manifiestos/canonical-hashes.json +1964 -1310
  48. package/manifiestos/hooks-config.json +18 -0
  49. package/manifiestos/modulos.json +4 -0
  50. package/manifiestos/skills-lock.json +1282 -1282
  51. package/package.json +93 -93
  52. package/plugin.json +371 -371
  53. package/reglas/git-coauthor.md +100 -100
  54. package/reglas/memoria-consolidada.md +41 -0
  55. package/reglas/pruebas.md +15 -0
  56. package/reglas/seguridad-agentes.md +66 -0
  57. package/schemas/agent-frontmatter.schema.json +294 -294
  58. package/schemas/instinct.schema.json +161 -152
  59. package/scripts/bootstrap-instintos.js +25 -7
  60. package/scripts/lib/claude-sessions.js +1 -0
  61. package/scripts/lib/gitignore-manifest.js +44 -11
  62. package/scripts/lib/skill-metrics.js +41 -1
  63. package/scripts/lib/tool-cost-analyzer.js +1 -0
  64. package/scripts/publicar.js +34 -85
  65. package/scripts/verificar-trazabilidad.js +329 -298
  66. package/scripts/vendor/claude-usage/__pycache__/scanner.cpython-314.pyc +0 -0
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: planear-fase
3
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.3.1"
4
+ version: "1.3.2"
5
5
  herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
6
6
  exclusiones:
7
7
  - "No cargar si no existe CONTEXTO.md para la fase — ejecutar `discutir-fase` primero."
@@ -144,10 +144,24 @@ goal-backward deja de ser pregunta abierta y se vuelve **matriz verificable**:
144
144
  planes con REQ huérfanos.
145
145
  4. Tareas sin REQ son válidas (infraestructura, refactor habilitante) pero la matriz
146
146
  las hace visibles.
147
+ 5. **REQ verificable por inspección (config, CI, lint, docs) DEBE llevar la marca
148
+ literal `(verificación: inspección)` en su criterio del CONTEXTO.** Sin esa
149
+ marca, `verificar-trazabilidad.js` aplica el método por defecto (`test`) y exige
150
+ un test con marker `verifica: REQ-NN`; un REQ satisfecho por ruff/CI/prosa pero
151
+ sin esa anotación se reporta como **huérfano (REQ sin test)** aunque esté
152
+ genuinamente cubierto. Si detectas un REQ de este tipo sin la marca, agrégala al
153
+ CONTEXTO (`0N-CONTEXTO.md`) antes de construir la matriz — no inventes un test
154
+ artificial para satisfacer al verificador.
147
155
 
148
156
  En CONTEXTOs legacy sin REQ-IDs (fases 01-09): aplicar la pregunta abierta clásica
149
157
  ("¿el criterio de éxito queda satisfecho?") — cláusula de gracia, sin matriz.
150
158
 
159
+ **Formato de header de tarea — dos puntos, no em-dash.** Cada tarea se escribe
160
+ `### T-NN:` (2-4 `#`, dos puntos tras el ID). `verificar-trazabilidad.js` parsea la
161
+ matriz con `/^#{2,4}\s*T-\d{1,3}\s*:/`; un header `#### T-01 — Foo` (em-dash) deja
162
+ la tarea **invisible** y sus REQ huérfanos sin causa aparente. El verificador emite
163
+ un WARN explicando esto, pero el plan debe nacer con el separador correcto.
164
+
151
165
  ---
152
166
 
153
167
  ## Estructura del PLAN.md
@@ -1,164 +1,191 @@
1
- ---
2
- name: proceso-debate-adversarial
3
- description: >
4
- Protocolo de debate adversarial con jueces ciegos para decisiones técnicas
5
- subjetivas: dos autores en frío generan candidatos, un crítico forzosamente
6
- adversarial los ataca, un sintetizador produce un híbrido y un panel de jueces
7
- ciegos con etiquetas aleatorizadas elige al ganador hasta convergencia.
8
- Cargar cuando una decisión de arquitectura, diseño o estrategia no tiene
9
- métrica objetiva y el riesgo de sycophancy (auto-aprobarse) es alto; también
10
- cuando arquitecto-swl evalúa alternativas o /swl:predecir necesita el
11
- protocolo de personas en frío.
12
- version: "1.0.0"
13
- herramientasPermitidas: [Read, Agent, Skill]
14
- exclusiones:
15
- - "No cargar para decisiones con métrica objetiva verificable — ahí aplica el loop de autoresearch (Verify numérico), no un debate."
16
- - "No cargar para revisión de código post-implementación — eso es revisor-codigo-swl / nemesis-auditor-swl."
17
- - "No cargar para decisiones triviales o de preferencia personal sin impacto técnico — el costo de 5+ invocaciones de agente no se justifica."
18
- evolvable: true
19
- ---
20
- # Debate Adversarial con Jueces Ciegos
21
-
22
- Protocolo para decidir entre alternativas técnicas **sin métrica objetiva**
23
- eliminando los dos sesgos que arruinan las auto-evaluaciones de un LLM:
24
- **sycophancy** (el agente aprueba lo que él mismo generó) y **position bias**
25
- (el juez prefiere la opción presentada primero). Patrón adoptado del análisis
26
- de autoresearch v2.1 (`reason-judge-protocol`), adaptado al ecosistema SWL.
27
-
28
- **Principio**: el que genera nunca juzga, el que juzga nunca sabe quién generó.
29
-
30
- ## Cuándo cargar este skill
31
-
32
- - Decisión de arquitectura con 2+ alternativas viables sin benchmark objetivo
33
- (ej: event sourcing vs CRUD+audit, monolito modular vs microservicios).
34
- - `arquitecto-swl` necesita justificar un ADR con alternativas evaluadas de
35
- forma no sesgada.
36
- - `/swl:predecir` requiere el protocolo de aislamiento de personas.
37
- - Decisión de producto/estrategia donde el usuario pide "dame la mejor opción"
38
- y una sola pasada produciría la primera idea plausible, no la mejor.
39
-
40
- ## Los 5 roles — aislamiento obligatorio (COLD START)
41
-
42
- | Rol | Recibe | Produce | Regla dura |
43
- |-----|--------|---------|------------|
44
- | **Autor-A** | tarea | candidato A | No ve crítica ni candidato B |
45
- | **Crítico** | tarea + candidato A | ≥3 debilidades con evidencia + qué haría un candidato superior | NUNCA elogia — rol puramente adversarial |
46
- | **Autor-B** | tarea + candidato A + crítica | candidato B que resuelve la crítica preservando fortalezas de A | No ve al sintetizador |
47
- | **Sintetizador** | tarea + A + B | candidato híbrido AB | Fusiona lo mejor de ambos, no promedia |
48
- | **Panel de jueces** (3 default) | tarea + 3 candidatos con **etiquetas aleatorizadas** (X, Y, Z) | ranking 1°/2°/3° + justificación de un párrafo c/u | "Todos están bien" NO es veredicto válido |
49
-
50
- **COLD START**: cada rol se ejecuta como invocación independiente del Agent
51
- tool **sin contexto compartido de sesión** — recibe SOLO los insumos de su fila.
52
- Pasar el historial completo a un juez invalida el protocolo (sabría quién
53
- escribió qué).
54
-
55
- **Aleatorización de etiquetas**: antes de invocar a los jueces, mapear
56
- A/B/AB → X/Y/Z con orden aleatorio distinto por juez. Previene position bias.
57
-
58
- ## El loop de convergencia
59
-
60
- ```
61
- Ronda N:
62
- 1. Autor-A genera candidato (ronda 1) o presenta al incumbente (ronda N>1)
63
- 2. Crítico ataca → ≥3 debilidades con evidencia
64
- 3. Autor-B genera candidato alternativo
65
- 4. Sintetizador produce híbrido AB
66
- 5. Panel ciego vota → ganador por mayoría (empate → gana el híbrido)
67
- 6. ¿Ganador == incumbente? → convergencia++ ; si no → convergencia = 1,
68
- el ganador se vuelve incumbente
69
- ```
70
-
71
- | Condición | Acción |
72
- |-----------|--------|
73
- | Mismo incumbente gana 3 rondas consecutivas | **CONVERGIDO** — terminar |
74
- | Ronda ≥ max (default 8) | **ACOTADO** — reportar mejor candidato actual |
75
- | Incumbente cambió >5 veces en las últimas 8 rondas | **OSCILACIÓN** — detener y reportar: la tarea está mal planteada o las alternativas son equivalentes |
76
-
77
- Registrar cada ronda con `hooks/lib/loop-telemetry.js` (tipo `debate`,
78
- columnas `ronda, timestamp, etiqueta_ganadora, veredicto, convergencia,
79
- descripcion`) para que la trayectoria sea auditable y `/swl:status metricas` la lea.
80
-
81
- ## Anti-herd check — obligatorio
82
-
83
- Si TODOS los jueces coinciden en la primera ronda, el sintetizador DEBE
84
- producir al menos un contraargumento antes de aceptar el consenso. Unanimidad
85
- inmediata en un debate de alternativas reales es señal de herd bias, no de
86
- calidad — las alternativas genuinas siempre tienen tradeoffs defendibles.
87
-
88
- ## Criterios de juez por dominio
89
-
90
- | Dominio | Criterios de evaluación |
91
- |---------|------------------------|
92
- | Arquitectura de software | escalabilidad, mantenibilidad, rendimiento, seguridad, simplicidad |
93
- | Estrategia de producto | encaje de mercado, factibilidad, diferenciación, riesgo, tiempos |
94
- | Decisión de negocio | ROI, riesgo, alineación, recursos requeridos, reversibilidad |
95
- | Enfoque de seguridad | cobertura, tasa de falsos positivos, practicidad, cumplimiento |
96
- | Hipótesis de investigación | testabilidad, novedad, soporte de evidencia, poder explicativo |
97
-
98
- El juez evalúa CADA candidato contra TODOS los criterios del dominio y
99
- produce ranking con justificación nunca un score suelto sin comparación.
100
-
101
- ## Personas para análisis predictivo
102
-
103
- Cuando el objetivo es **predecir problemas de un cambio propuesto** (no
104
- elegir entre alternativas), usar el modo personas: 5 expertos analizan EN FRÍO
105
- el mismo cambio y un sintetizador deduplica y rankea. Definiciones completas,
106
- preguntas guía y red flags por persona en
107
- [recursos/personas.md](recursos/personas.md). Set default: Arquitecto de
108
- Software, Analista de Seguridad, Ingeniero de Rendimiento, Ingeniero de
109
- Confiabilidad, Abogado del Diablo. Set adversarial (`--adversarial`): El
110
- Rompedor, El Tramposo, El Escalador, El Novato, El Insider Malicioso.
111
-
112
- Ranking de hallazgos del sintetizador:
113
- `severidad × confianza promedio × número de personas que coinciden`.
114
-
115
- ## Integración con el ecosistema SWL
116
-
117
- | Componente | Uso del protocolo |
118
- |-----------|-------------------|
119
- | `arquitecto-swl` | Debate para la sección "Alternativas consideradas" de un ADR |
120
- | `/swl:predecir` | Modo personas pre-implementación |
121
- | `/swl:nemesis` | El evaluator puede pedir un debate cuando dos remediaciones compiten |
122
- | `hooks/lib/loop-telemetry.js` | Registro de rondas + handoff para encadenar |
123
- | `/swl:status metricas` | Lectura de trayectorias de debates en `.planning/loops/` |
124
-
125
- ## Cuándo NO cargar
126
-
127
- - La decisión tiene métrica objetiva (latencia, cobertura, bundle size) — usar
128
- el loop autoresearch con Verify numérico; un debate es más caro y menos
129
- preciso que medir.
130
- - El usuario ya tomó la decisión y está documentada en ADR/vault — aplicar
131
- `consultar-vault-primero`, no reabrir con un debate.
132
- - Hay restricción dura que elimina las alternativas (compliance, presupuesto,
133
- stack fijo) verificar restricciones ANTES de armar el debate.
134
-
135
- ## Gotchas / Errores comunes no obvios
136
-
137
- - **Jueces con contexto contaminado**: invocar a los jueces en la misma
138
- conversación donde se generaron los candidatos les revela la autoría por el
139
- historial. Causa: usar el contexto principal en vez del Agent tool con
140
- prompt acotado. Solución: cada juez es una invocación Agent independiente
141
- cuyo prompt contiene SOLO tarea + candidatos etiquetados.
142
- - **Crítico que "equilibra"**: el crítico señala 3 debilidades pero cierra con
143
- "en general es un buen enfoque" — eso re-introduce sycophancy y debilita al
144
- Autor-B. Solución: el prompt del crítico prohíbe explícitamente elogios y
145
- exige proponer qué haría un candidato superior.
146
- - **Sintetizador que promedia en vez de fusionar**: produce un candidato
147
- "tibio" que toma la mitad de cada uno y pierde la coherencia interna de
148
- ambos. Solución: el híbrido debe tener una tesis propia tomar la
149
- arquitectura dominante de uno e injertar mecanismos puntuales del otro.
150
- - **Convergencia falsa por candidatos idénticos**: si Autor-B produce
151
- esencialmente el mismo candidato que A, el panel "converge" en ronda 2 sin
152
- exploración real. Solución: el prompt de Autor-B exige divergencia
153
- estructural, no cosmética; si la crítica fue débil, regenerar la crítica.
154
-
155
- ## Anti-patrones
156
-
157
- - **Debate de 1 ronda presentado como consenso** sin convergencia ×3 no hay
158
- veredicto, hay una primera impresión cara.
159
- - **Saltarse la aleatorización de etiquetas** "porque los jueces son
160
- imparciales"el position bias es estadístico, no intencional.
161
- - **Usar el debate para decisiones ya cerradas** — teatro de proceso que
162
- quema tokens para justificar lo decidido.
163
- - **Panel de 1 juez** — un juez único reintroduce el sesgo individual que el
164
- panel existe para diluir; mínimo 3, número impar.
1
+ ---
2
+ name: proceso-debate-adversarial
3
+ description: >
4
+ Protocolo de debate adversarial con jueces ciegos para decisiones técnicas
5
+ subjetivas: dos autores en frío generan candidatos, un crítico forzosamente
6
+ adversarial los ataca, un sintetizador produce un híbrido y un panel de jueces
7
+ ciegos con etiquetas aleatorizadas elige al ganador hasta convergencia.
8
+ Cargar cuando una decisión de arquitectura, diseño o estrategia no tiene
9
+ métrica objetiva y el riesgo de sycophancy (auto-aprobarse) es alto; también
10
+ cuando arquitecto-swl evalúa alternativas o /swl:predecir necesita el
11
+ protocolo de personas en frío.
12
+ version: "1.1.0"
13
+ herramientasPermitidas: [Read, Agent, Skill]
14
+ exclusiones:
15
+ - "No cargar para decisiones con métrica objetiva verificable — ahí aplica el loop de autoresearch (Verify numérico), no un debate."
16
+ - "No cargar para revisión de código post-implementación — eso es revisor-codigo-swl / nemesis-auditor-swl."
17
+ - "No cargar para decisiones triviales o de preferencia personal sin impacto técnico — el costo de 5+ invocaciones de agente no se justifica."
18
+ evolvable: true
19
+ ---
20
+ # Debate Adversarial con Jueces Ciegos
21
+
22
+ Protocolo para decidir entre alternativas técnicas **sin métrica objetiva**
23
+ eliminando los dos sesgos que arruinan las auto-evaluaciones de un LLM:
24
+ **sycophancy** (el agente aprueba lo que él mismo generó) y **position bias**
25
+ (el juez prefiere la opción presentada primero). Patrón adoptado del análisis
26
+ de autoresearch v2.1 (`reason-judge-protocol`), adaptado al ecosistema SWL.
27
+
28
+ **Principio**: el que genera nunca juzga, el que juzga nunca sabe quién generó.
29
+
30
+ ## Cuándo cargar este skill
31
+
32
+ - Decisión de arquitectura con 2+ alternativas viables sin benchmark objetivo
33
+ (ej: event sourcing vs CRUD+audit, monolito modular vs microservicios).
34
+ - `arquitecto-swl` necesita justificar un ADR con alternativas evaluadas de
35
+ forma no sesgada.
36
+ - `/swl:predecir` requiere el protocolo de aislamiento de personas.
37
+ - Decisión de producto/estrategia donde el usuario pide "dame la mejor opción"
38
+ y una sola pasada produciría la primera idea plausible, no la mejor.
39
+
40
+ ## Los 5 roles — aislamiento obligatorio (COLD START)
41
+
42
+ | Rol | Recibe | Produce | Regla dura |
43
+ |-----|--------|---------|------------|
44
+ | **Autor-A** | tarea | candidato A | No ve crítica ni candidato B |
45
+ | **Crítico** | tarea + candidato A | ≥3 debilidades con evidencia + qué haría un candidato superior | NUNCA elogia — rol puramente adversarial |
46
+ | **Autor-B** | tarea + candidato A + crítica | candidato B que resuelve la crítica preservando fortalezas de A | No ve al sintetizador |
47
+ | **Sintetizador** | tarea + A + B | candidato híbrido AB | Fusiona lo mejor de ambos, no promedia |
48
+ | **Panel de jueces** (3 default) | tarea + 3 candidatos con **etiquetas aleatorizadas** (X, Y, Z) | ranking 1°/2°/3° + justificación de un párrafo c/u | "Todos están bien" NO es veredicto válido |
49
+
50
+ **COLD START**: cada rol se ejecuta como invocación independiente del Agent
51
+ tool **sin contexto compartido de sesión** — recibe SOLO los insumos de su fila.
52
+ Pasar el historial completo a un juez invalida el protocolo (sabría quién
53
+ escribió qué).
54
+
55
+ **Aleatorización de etiquetas**: antes de invocar a los jueces, mapear
56
+ A/B/AB → X/Y/Z con orden aleatorio distinto por juez. Previene position bias.
57
+
58
+ ## El loop de convergencia
59
+
60
+ ```
61
+ Ronda N:
62
+ 1. Autor-A genera candidato (ronda 1) o presenta al incumbente (ronda N>1)
63
+ 2. Crítico ataca → ≥3 debilidades con evidencia
64
+ 3. Autor-B genera candidato alternativo
65
+ 4. Sintetizador produce híbrido AB
66
+ 5. Panel ciego vota → ganador por mayoría (empate → gana el híbrido)
67
+ 6. ¿Ganador == incumbente? → convergencia++ ; si no → convergencia = 1,
68
+ el ganador se vuelve incumbente
69
+ ```
70
+
71
+ | Condición | Acción |
72
+ |-----------|--------|
73
+ | Mismo incumbente gana 3 rondas consecutivas | **CONVERGIDO** — terminar |
74
+ | Ronda ≥ max (default 8) | **ACOTADO** — reportar mejor candidato actual |
75
+ | Incumbente cambió >5 veces en las últimas 8 rondas | **OSCILACIÓN** — detener y reportar: la tarea está mal planteada o las alternativas son equivalentes |
76
+
77
+ Registrar cada ronda con `hooks/lib/loop-telemetry.js` (tipo `debate`,
78
+ columnas `ronda, timestamp, etiqueta_ganadora, veredicto, convergencia,
79
+ descripcion`) para que la trayectoria sea auditable y `/swl:status metricas` la lea.
80
+
81
+ ## Anti-herd check — obligatorio
82
+
83
+ Si TODOS los jueces coinciden en la primera ronda, el sintetizador DEBE
84
+ producir al menos un contraargumento antes de aceptar el consenso. Unanimidad
85
+ inmediata en un debate de alternativas reales es señal de herd bias, no de
86
+ calidad — las alternativas genuinas siempre tienen tradeoffs defendibles.
87
+
88
+ ## Voto incompleto refutado + degradación del fan-out ante rate limit
89
+
90
+ Cuando el fan-out de personas/jueces se ejecuta en paralelo y la API responde
91
+ con rate limit (429) o un juez no completa su veredicto (timeout, error
92
+ terminal), el hallazgo asociado queda **"sin verificar"**, NUNCA "refutado" ni
93
+ "descartado". Conflar "no se pudo verificar" con "verificado falso" descarta
94
+ silenciosamente hallazgos reales el modo de falla más caro de un panel
95
+ adversarial.
96
+
97
+ Reglas:
98
+
99
+ - Un veredicto que no se emite NO cuenta como voto en contra. El conteo de
100
+ refutación solo suma jueces que **emitieron** un veredicto de refutación
101
+ explícito. `votos_refutan / votos_emitidos`, nunca `/ jueces_lanzados`.
102
+ - Un hallazgo cuyos votos no se completaron se marca `estado: sin-verificar`
103
+ (distinto de `confirmado` y de `refutado`) y se reporta como tal — el usuario
104
+ decide si re-ejecutar ese subconjunto.
105
+ - Ante rate limit en el fan-out: **escalonar** las invocaciones (lanzar por
106
+ lotes con espera entre lotes) o **reducir** el número de jueces/personas a un
107
+ quórum mínimo (≥3) antes de abortar. Degradar el panel con aviso visible es
108
+ preferible a marcar todo lo no votado como refutado (regla
109
+ `seguridad-agentes.md § Anti-fallback silencioso`).
110
+
111
+ Nota de alcance: esto aplica al panel de este skill y a `/swl:predecir`. El
112
+ patrón adversarial-verify del harness de Workflow (built-in de Claude Code) NO
113
+ es editable desde swl-ses; su semántica de votos vive fuera de este repo.
114
+
115
+ ## Criterios de juez por dominio
116
+
117
+ | Dominio | Criterios de evaluación |
118
+ |---------|------------------------|
119
+ | Arquitectura de software | escalabilidad, mantenibilidad, rendimiento, seguridad, simplicidad |
120
+ | Estrategia de producto | encaje de mercado, factibilidad, diferenciación, riesgo, tiempos |
121
+ | Decisión de negocio | ROI, riesgo, alineación, recursos requeridos, reversibilidad |
122
+ | Enfoque de seguridad | cobertura, tasa de falsos positivos, practicidad, cumplimiento |
123
+ | Hipótesis de investigación | testabilidad, novedad, soporte de evidencia, poder explicativo |
124
+
125
+ El juez evalúa CADA candidato contra TODOS los criterios del dominio y
126
+ produce ranking con justificación — nunca un score suelto sin comparación.
127
+
128
+ ## Personas para análisis predictivo
129
+
130
+ Cuando el objetivo es **predecir problemas de un cambio propuesto** (no
131
+ elegir entre alternativas), usar el modo personas: 5 expertos analizan EN FRÍO
132
+ el mismo cambio y un sintetizador deduplica y rankea. Definiciones completas,
133
+ preguntas guía y red flags por persona en
134
+ [recursos/personas.md](recursos/personas.md). Set default: Arquitecto de
135
+ Software, Analista de Seguridad, Ingeniero de Rendimiento, Ingeniero de
136
+ Confiabilidad, Abogado del Diablo. Set adversarial (`--adversarial`): El
137
+ Rompedor, El Tramposo, El Escalador, El Novato, El Insider Malicioso.
138
+
139
+ Ranking de hallazgos del sintetizador:
140
+ `severidad × confianza promedio × número de personas que coinciden`.
141
+
142
+ ## Integración con el ecosistema SWL
143
+
144
+ | Componente | Uso del protocolo |
145
+ |-----------|-------------------|
146
+ | `arquitecto-swl` | Debate para la sección "Alternativas consideradas" de un ADR |
147
+ | `/swl:predecir` | Modo personas pre-implementación |
148
+ | `/swl:nemesis` | El evaluator puede pedir un debate cuando dos remediaciones compiten |
149
+ | `hooks/lib/loop-telemetry.js` | Registro de rondas + handoff para encadenar |
150
+ | `/swl:status metricas` | Lectura de trayectorias de debates en `.planning/loops/` |
151
+
152
+ ## Cuándo NO cargar
153
+
154
+ - La decisión tiene métrica objetiva (latencia, cobertura, bundle size) — usar
155
+ el loop autoresearch con Verify numérico; un debate es más caro y menos
156
+ preciso que medir.
157
+ - El usuario ya tomó la decisión y está documentada en ADR/vault aplicar
158
+ `consultar-vault-primero`, no reabrir con un debate.
159
+ - Hay restricción dura que elimina las alternativas (compliance, presupuesto,
160
+ stack fijo) verificar restricciones ANTES de armar el debate.
161
+
162
+ ## Gotchas / Errores comunes no obvios
163
+
164
+ - **Jueces con contexto contaminado**: invocar a los jueces en la misma
165
+ conversación donde se generaron los candidatos les revela la autoría por el
166
+ historial. Causa: usar el contexto principal en vez del Agent tool con
167
+ prompt acotado. Solución: cada juez es una invocación Agent independiente
168
+ cuyo prompt contiene SOLO tarea + candidatos etiquetados.
169
+ - **Crítico que "equilibra"**: el crítico señala 3 debilidades pero cierra con
170
+ "en general es un buen enfoque" — eso re-introduce sycophancy y debilita al
171
+ Autor-B. Solución: el prompt del crítico prohíbe explícitamente elogios y
172
+ exige proponer qué haría un candidato superior.
173
+ - **Sintetizador que promedia en vez de fusionar**: produce un candidato
174
+ "tibio" que toma la mitad de cada uno y pierde la coherencia interna de
175
+ ambos. Solución: el híbrido debe tener una tesis propia — tomar la
176
+ arquitectura dominante de uno e injertar mecanismos puntuales del otro.
177
+ - **Convergencia falsa por candidatos idénticos**: si Autor-B produce
178
+ esencialmente el mismo candidato que A, el panel "converge" en ronda 2 sin
179
+ exploración real. Solución: el prompt de Autor-B exige divergencia
180
+ estructural, no cosmética; si la crítica fue débil, regenerar la crítica.
181
+
182
+ ## Anti-patrones
183
+
184
+ - **Debate de 1 ronda presentado como consenso** — sin convergencia ×3 no hay
185
+ veredicto, hay una primera impresión cara.
186
+ - **Saltarse la aleatorización de etiquetas** "porque los jueces son
187
+ imparciales" — el position bias es estadístico, no intencional.
188
+ - **Usar el debate para decisiones ya cerradas** — teatro de proceso que
189
+ quema tokens para justificar lo decidido.
190
+ - **Panel de 1 juez** — un juez único reintroduce el sesgo individual que el
191
+ panel existe para diluir; mínimo 3, número impar.
@@ -3,7 +3,7 @@ name: prompt-engineering
3
3
  description: >
4
4
  Diseño y optimización de prompts para LLMs: chain-of-thought, few-shot,
5
5
  system prompts, structured outputs y técnicas de evaluación. Incluye guía
6
- para Claude Opus 4.7 y su patrón de instrucciones literales vs inferidas.
6
+ para Claude Opus 4.8 y su patrón de instrucciones literales vs inferidas.
7
7
  Cargar cuando se diseñen system prompts, se optimice la calidad de
8
8
  respuestas LLM, se implemente prompt chaining, o se evalúe la efectividad
9
9
  de prompts.
@@ -26,15 +26,15 @@ exclusiones:
26
26
  - La tarea es fine-tuning o ajuste de pesos de un modelo: usar documentación del proveedor directamente.
27
27
 
28
28
 
29
- ## Prompts literales vs inferidos (Opus 4.7)
29
+ ## Prompts literales vs inferidos (Opus 4.8)
30
30
 
31
- Desde Claude Opus 4.7 (abril 2026), Anthropic cambió cómo el modelo interpreta
31
+ Desde Claude Opus 4.8 (abril 2026), Anthropic cambió cómo el modelo interpreta
32
32
  instrucciones ambiguas:
33
33
 
34
34
  - **Opus 4.6 y anteriores**: rellenaban ambigüedades con inferencia razonable.
35
35
  Un prompt como "agrega validación al formulario" generaba validación completa
36
36
  con reglas de dominio típicas.
37
- - **Opus 4.7**: sigue instrucciones de forma más literal. El mismo prompt ahora
37
+ - **Opus 4.8**: sigue instrucciones de forma más literal. El mismo prompt ahora
38
38
  genera validación mínima (o pregunta qué validar) porque la instrucción
39
39
  literal no especifica qué campos ni qué reglas.
40
40
 
@@ -73,7 +73,7 @@ validación fallando."""
73
73
 
74
74
  ### Effort levels vs verbosidad
75
75
 
76
- Opus 4.7 no mezcla "cuánto pensar" con "cuán verboso ser". Son ejes distintos:
76
+ Opus 4.8 no mezcla "cuánto pensar" con "cuán verboso ser". Son ejes distintos:
77
77
 
78
78
  | Eje | Control |
79
79
  |-----|---------|
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: release-semver
3
3
  description: Versionado semántico (SemVer). Cuándo bumpar major/minor/patch, changelogs convencionales, estrategia de tags y proceso de release completo.
4
- version: "1.0.2"
4
+ version: "1.0.3"
5
5
  herramientasPermitidas: [Read, Bash]
6
6
  exclusiones:
7
7
  - "No cargar para versionar el sistema SWL — el bump de versión de swl-ses sigue el checklist de 15 ubicaciones documentado en `/swl:release`; este skill cubre SemVer general para proyectos de usuario, no el proceso interno de release del sistema."
@@ -325,3 +325,6 @@ de token inválido.
325
325
  - **Changelog generado con `git cliff` sin configuración personalizada incluye commits de chore y docs**: el CHANGELOG.md resultante tiene 80% de entradas de limpieza que no interesan a los consumidores. Causa: `git cliff` sin `.cliff.toml` incluye todos los tipos de commit. Solución: crear `.cliff.toml` en el repo con la sección `[git]` filtrando solo `feat`, `fix`, `perf` y `BREAKING CHANGE` para el changelog de release público.
326
326
  - **Rama `release/2.1.0` mergeada a `main` pero no a `develop`**: el próximo desarrollo parte de `develop` sin incluir los commits del release, generando conflictos en la siguiente rama de feature. Causa: el Paso 4 requiere merge a ambas ramas pero se omite el merge a `develop` por considerar que el release ya está en `main`. Solución: el proceso de release de 4 pasos del skill requiere merge a `main` Y a `develop` antes de eliminar la rama de release — ambos merges son parte del mismo paso atómico.
327
327
  - **`npx <paquete> <comando>` sin `@latest` usa caché stale indefinidamente**: tras publicar una nueva versión, `npx swl-ses doctor` sigue ejecutando la primera versión que el usuario cacheó (por ejemplo v5.7.0 cuando ya hay v5.10.3 instalada). Causa: npx resuelve a la primera versión disponible y la cachea; sin `@latest` nunca vuelve a consultar el registry. Solución: SIEMPRE usar `npx paquete@latest <comando>` en mensajes post-install, hooks de alerta de nueva versión, docs del README, ejemplos en CHANGELOG y scripts de inicialización. Nunca `npx paquete <comando>` desnudo — incluso si el paquete acaba de publicarse; el caché de un desarrollador vecino puede tener una versión anterior desde hace meses. Un bump sin `@latest` en los mensajes post-install perpetúa el problema para todos los usuarios nuevos.
328
+ - **`npm pack --ignore-scripts` mete `__pycache__/*.pyc` (o cualquier artefacto del `prepack`) en el tarball publicado**: al saltar `--ignore-scripts` el lifecycle `prepack`, se omite la limpieza de artefactos que suele ser el ÚNICO filtro efectivo — un `.npmignore` con `**/*.pyc` NO los excluye de forma fiable cuando `package.json#files` es un allowlist (los paths del allowlist se incluyen y `.npmignore` no los poda). Causa: usar `--ignore-scripts` para "acelerar" un `npm pack`/publish manual. Solución: usar `npm pack` a secas — el `prepack` (rápido) limpia el árbol; `prepublishOnly` (lento, tests) solo corre en `npm publish`, NO en `pack`, así que no hay nada que "ahorrar". Señal de alerta: un salto inesperado en `total files` del tarball (p.ej. +1) suele ser un artefacto colado.
329
+ - **Log de release con `createWriteStream` queda VACÍO al `process.exit()`**: un script de publicación que abre el log con `fs.createWriteStream` (async) y termina con `process.exit(code)` no alcanza a vaciar el buffer del stream a disco antes de que el proceso muera — justo cuando más se necesita el log para diagnosticar el fallo. Causa: asumir que `stream.end()` antes de `process.exit()` fuerza el flush (es asíncrono, no lo garantiza). Solución: para logs que DEBEN sobrevivir un `exit` inmediato, usar escritura SÍNCRONA: `fs.writeFileSync` (header) + `fs.appendFileSync` (cada chunk), que vacían en cada llamada.
330
+ - **Forzar prompt de OTP TOTP rompe a usuarios con passkey/WebAuthn**: un wrapper de publish que intercepta el `EOTP` de npm y pide un código de 6 dígitos asume 2FA tipo TOTP; si la cuenta usa passkey (flujo web "abrir URL y seleccionar la llave") el prompt es un callejón sin salida. Causa: tratar `EOTP` como sinónimo de "pedir TOTP". Solución: ante `EOTP` con TTY, reintentar el `npm publish` con **stdio heredado** (`stdio: 'inherit'`) y dejar que npm conduzca su 2FA NATIVO — soporta TOTP Y passkey según la cuenta. Alternativa permanente sin 2FA: token **Automation** (no "Publish", que sí exige 2FA).
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: tdd-workflow
3
3
  description: Flujo completo de Test-Driven Development. Ciclo RED (el test falla) → GREEN (implementación mínima) → REFACTOR (limpieza). Incluye cobertura mínima obligatoria, tests de frontera, factories, fixtures y estrategias para diferentes tipos de código (APIs, services, componentes Angular).
4
- version: "1.2.1"
4
+ version: "1.2.2"
5
5
  herramientasPermitidas: [Read, Bash]
6
6
  evolvable: true # default para skill estandar
7
7
  exclusiones:
@@ -536,6 +536,38 @@ archivo creaba el flag, sin ejecutar ninguna assertion. Fix: env var
536
536
 
537
537
  ---
538
538
 
539
+ ## Tests E2E de UI con Playwright — gotchas de actionability
540
+
541
+ Dos fallos recurrentes al automatizar UIs con Playwright donde el test "debería
542
+ pasar" pero hace timeout o no observa el efecto esperado:
543
+
544
+ - **`fill()` hace timeout en un input que el motor considera "not editable" aunque
545
+ sea interactivo para el usuario** (widgets custom: input dentro de un overlay/
546
+ option marcado `[disabled]`, combos con buscador, etc.). Playwright aplica
547
+ checks de actionability (visible, enabled, editable) y se niega a escribir.
548
+ Fix: setear el valor con el **setter nativo** y despachar el evento `input` vía
549
+ `evaluate`, en vez de `fill()`:
550
+
551
+ ```js
552
+ await page.locator('#busqueda').evaluate((el, v) => {
553
+ const setter = Object.getOwnPropertyDescriptor(
554
+ window.HTMLInputElement.prototype, 'value').set;
555
+ setter.call(el, v);
556
+ el.dispatchEvent(new Event('input', { bubbles: true }));
557
+ }, 'texto');
558
+ ```
559
+
560
+ - **Un click en «Guardar»/«Enviar» que no dispara su request** suele tener un
561
+ **paso de confirmación intermedio** (diálogo «¿Confirmar?», modal con timeout),
562
+ no un bug del submit. Antes de concluir "no persiste": verificar en la pestaña
563
+ de red si hubo (o no) la petición, y buscar un diálogo de confirmación que el
564
+ test deba cerrar dentro de su timeout. Un submit que pasa por confirmación
565
+ necesita el click de confirmación en la aserción, no solo el del botón inicial.
566
+
567
+ Regla general: ante un test E2E que falla, distinguir **bug del producto** de
568
+ **gap del test** verificando el estado real (red, DOM, BD) antes de declarar el
569
+ veredicto — un timeout de actionability casi nunca es un bug de la app.
570
+
539
571
  ## Tests E2E de CLIs interactivos sin PTY real
540
572
 
541
573
  ### El problema
@@ -3,7 +3,7 @@ name: workflow-claude-code
3
3
  description: >
4
4
  Patrones de flujo de trabajo diario con Claude Code: gestión de sesiones,
5
5
  atajos de teclado, Plan Mode, feature-per-session, gestión de contexto,
6
- jerarquía de memoria, handoff multi-sesión, niveles de esfuerzo de Opus 4.7
6
+ jerarquía de memoria, handoff multi-sesión, niveles de esfuerzo de Opus 4.8
7
7
  (high/xhigh/max) y el patrón de delegación. Cargar cuando el usuario pregunte
8
8
  cómo usar Claude Code eficientemente, cuando necesite optimizar su flujo de
9
9
  trabajo, o cuando inicie un proyecto nuevo. NO cargar para estructura de
@@ -189,9 +189,9 @@ Para ESTRUCTURA de proyecto, usar `estructura-proyecto-claude`.
189
189
 
190
190
  ---
191
191
 
192
- ## Patrón de delegación con Opus 4.7 (desde abril 2026)
192
+ ## Patrón de delegación con Opus 4.8 (desde abril 2026)
193
193
 
194
- Opus 4.7 introduce un shift operativo importante: **rinde mejor tratado como un
194
+ Opus 4.8 introduce un shift operativo importante: **rinde mejor tratado como un
195
195
  ingeniero al que delegas, no como un pair programmer al que guías línea por línea**.
196
196
  Fuente: https://claude.com/blog/best-practices-for-using-claude-opus-4-7-with-claude-code
197
197
 
@@ -228,7 +228,7 @@ el modelo decide dinámicamente cuánto razonar según la tarea.
228
228
 
229
229
  ### Sub-agentes: paralelismo explícito
230
230
 
231
- Opus 4.7 usa menos sub-agentes por defecto que 4.6. Si una tarea se beneficia
231
+ Opus 4.8 usa menos sub-agentes por defecto que 4.6. Si una tarea se beneficia
232
232
  de ejecución paralela, declararlo en el prompt:
233
233
 
234
234
  - "Ejecuta estos 3 análisis en paralelo" > confiar en que lo decidirá solo.
@@ -236,7 +236,7 @@ de ejecución paralela, declararlo en el prompt:
236
236
 
237
237
  ### Instrucciones literales
238
238
 
239
- Opus 4.7 interpreta instrucciones de forma más literal. Los prompts ambiguos
239
+ Opus 4.8 interpreta instrucciones de forma más literal. Los prompts ambiguos
240
240
  que 4.6 resolvía por inferencia ahora se ejecutan al pie de la letra. Invertir
241
241
  tiempo en eliminar ambigüedad al inicio ahorra iteraciones.
242
242
 
@@ -257,4 +257,4 @@ y quick reference completa, ver [recursos/referencia-completa.md](recursos/refer
257
257
  - **Sesión de >40 turnos sin compactar**: el agente no monitorea el conteo de turnos y continúa trabajando hasta que Claude empieza a "olvidar" decisiones tomadas temprano en la sesión. Causa: no se aplica la señal de context rot (40 turnos). Solución: al llegar a 40 turnos, ejecutar `/swl:compactar` antes de la siguiente tarea grande — no esperar a que la degradación sea visible en la calidad del output.
258
258
  - **CLAUDE.md superando 200 líneas sin subdirectorios**: el proyecto crece y todo el contexto se acumula en el CLAUDE.md raíz, incrementando la carga base de contexto de cada conversación. Causa: no se crean CLAUDE.md de subdirectorio para módulos como `backend/` o `frontend/`. Solución: extraer convenciones específicas de módulo a su propio `<directorio>/CLAUDE.md`; el CLAUDE.md raíz mantiene solo lo global.
259
259
  - **Auto Accept Mode activado en operaciones destructivas**: el usuario activa `Shift+Tab` para acelerar trabajo y olvida cambiarlo antes de un deploy o borrado de archivos. Causa: el modo no tiene contexto de operación. Solución: volver a Default Mode explícitamente antes de operaciones irreversibles (`Shift+Tab` de vuelta) — Auto Accept es para generación de código, no para operaciones con blast radius alto.
260
- - **Tokenizer 4.7 subestimado en presupuesto de contexto**: el mismo CLAUDE.md que ocupaba el 30% del contexto en Opus 4.6 ocupa hasta 40% en 4.7 debido al tokenizer más granular. Causa: el umbral de compactación no se recalibró al migrar de modelo. Solución: con Opus 4.7, bajar el umbral de compactación de 70% a 50% tal como indica el skill `compactacion-contexto`.
260
+ - **Tokenizer 4.7 subestimado en presupuesto de contexto**: el mismo CLAUDE.md que ocupaba el 30% del contexto en Opus 4.6 ocupa hasta 40% en 4.7 debido al tokenizer más granular. Causa: el umbral de compactación no se recalibró al migrar de modelo. Solución: con Opus 4.8, bajar el umbral de compactación de 70% a 50% tal como indica el skill `compactacion-contexto`.