@saulwade/swl-ses 1.8.0 → 2.0.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 (135) hide show
  1. package/CLAUDE.md +8 -8
  2. package/README.md +13 -13
  3. package/agentes/accesibilidad-wcag-swl.md +3 -3
  4. package/agentes/auto-evolucion-swl.md +908 -908
  5. package/agentes/disenador-ui-swl.md +6 -5
  6. package/agentes/frontend-angular-swl.md +2 -2
  7. package/agentes/frontend-css-swl.md +2 -2
  8. package/agentes/frontend-react-swl.md +4 -4
  9. package/agentes/frontend-swl.md +6 -6
  10. package/agentes/investigador-ux-swl.md +5 -5
  11. package/agentes/orquestador-swl.md +96 -8
  12. package/agentes/perfilador-usuario-swl.md +308 -308
  13. package/agentes/producto-prd-swl.md +1 -1
  14. package/agentes/red-team-swl.md +218 -218
  15. package/agentes/revisor-codigo-swl.md +34 -10
  16. package/agentes/revisor-seguridad-swl.md +7 -0
  17. package/agentes/tdd-qa-swl.md +39 -2
  18. package/comandos/swl/actualizar.md +1 -1
  19. package/comandos/swl/aprender.md +2 -2
  20. package/comandos/swl/aprobar-plan.md +152 -0
  21. package/comandos/swl/autoresearch.md +102 -6
  22. package/comandos/swl/ayuda.md +3 -3
  23. package/comandos/swl/discutir-fase.md +20 -2
  24. package/comandos/swl/ejecutar-fase.md +53 -6
  25. package/comandos/swl/evolucionar.md +1 -1
  26. package/comandos/swl/inbox.md +1 -1
  27. package/comandos/swl/instalar.md +1 -1
  28. package/comandos/swl/nemesis.md +42 -1
  29. package/comandos/swl/planear-fase.md +25 -1
  30. package/comandos/swl/plugins.md +1 -1
  31. package/comandos/swl/predecir.md +139 -0
  32. package/comandos/swl/release.md +1 -1
  33. package/comandos/swl/status.md +279 -0
  34. package/comandos/swl/verificar.md +75 -7
  35. package/habilidades/ai-runtime-security/SKILL.md +1 -1
  36. package/habilidades/angular-moderno/SKILL.md +44 -1
  37. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
  38. package/habilidades/autoresearch/SKILL.md +15 -1
  39. package/habilidades/benchmark-memoria/SKILL.md +1 -1
  40. package/habilidades/calidad-contract-testing/SKILL.md +165 -0
  41. package/habilidades/calidad-mutation-testing/SKILL.md +170 -0
  42. package/habilidades/changelog-generator/SKILL.md +9 -2
  43. package/habilidades/changelog-generator/scripts/parse-commits.js +12 -1
  44. package/habilidades/checklist-seguridad/SKILL.md +29 -1
  45. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -0
  46. package/habilidades/css-moderno/SKILL.md +3 -1
  47. package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
  48. package/habilidades/drift-detection/SKILL.md +179 -179
  49. package/habilidades/ejecutar-fase/SKILL.md +64 -14
  50. package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
  51. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
  52. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
  53. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
  54. package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
  55. package/habilidades/fastapi-experto/SKILL.md +56 -5
  56. package/habilidades/harness-claude-code/SKILL.md +10 -7
  57. package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
  58. package/habilidades/instalar-sistema/SKILL.md +3 -3
  59. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
  60. package/habilidades/patrones-python/SKILL.md +8 -5
  61. package/habilidades/perfil-usuario/SKILL.md +200 -200
  62. package/habilidades/planear-fase/SKILL.md +25 -4
  63. package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
  64. package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
  65. package/habilidades/proceso-debate-adversarial/SKILL.md +164 -0
  66. package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -0
  67. package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -0
  68. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -0
  69. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -0
  70. package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
  71. package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
  72. package/habilidades/swl-claudemd/SKILL.md +50 -210
  73. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
  74. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
  75. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
  76. package/habilidades/swl-dashboard/SKILL.md +9 -9
  77. package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
  78. package/habilidades/tdd-workflow/SKILL.md +58 -5
  79. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -0
  80. package/habilidades/validacion-ci-sistema/SKILL.md +3 -3
  81. package/hooks/calidad-pre-commit.js +340 -3
  82. package/hooks/ciclo-evolucion-subagente.js +26 -0
  83. package/hooks/ciclo-evolucion.js +26 -0
  84. package/hooks/contexto-iteracion.js +144 -0
  85. package/hooks/extraccion-aprendizajes.js +13 -0
  86. package/hooks/lib/ciclo-evolucion.js +47 -0
  87. package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
  88. package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
  89. package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
  90. package/hooks/lib/evolution-tracker.js +24 -3
  91. package/hooks/lib/loop-telemetry.js +321 -0
  92. package/hooks/notificacion-telegram.js +11 -3
  93. package/hooks/spec-gate.js +211 -0
  94. package/hooks/tdd-gate.js +241 -0
  95. package/hooks/validar-intent-spec.js +30 -10
  96. package/llms.txt +29 -0
  97. package/manifiestos/hooks-config.json +36 -18
  98. package/manifiestos/modulos.json +23 -14
  99. package/manifiestos/skills-lock.json +100 -72
  100. package/package.json +4 -3
  101. package/plugin.json +9 -10
  102. package/reglas/accesibilidad.md +10 -0
  103. package/reglas/api-diseno.md +9 -0
  104. package/reglas/arquitectura.evolved.json +7 -0
  105. package/reglas/arquitectura.md +65 -0
  106. package/reglas/auditorias-documentales-estructurales.md +7 -0
  107. package/reglas/cloud-infra.md +8 -0
  108. package/reglas/fragmentos-compartidos.md +5 -0
  109. package/reglas/gobernanza.md +4 -4
  110. package/reglas/hooks.md +6 -0
  111. package/reglas/intent-engineering.md +4 -0
  112. package/reglas/markitdown.md +8 -0
  113. package/reglas/memoria-consolidada.md +1 -1
  114. package/reglas/patrones.md +6 -0
  115. package/reglas/registro-componentes-nuevos.md +10 -1
  116. package/reglas/seguridad-agentes.md +1 -1
  117. package/reglas/seguridad.evolved.json +7 -0
  118. package/reglas/seguridad.md +144 -0
  119. package/reglas/skills-estandar.md +6 -0
  120. package/reglas/testing.md +7 -0
  121. package/reglas/tests-cleanup.md +4 -0
  122. package/reglas/usar-sistema-swl.md +1 -1
  123. package/scripts/generar-inventario.js +64 -1
  124. package/scripts/instalador.js +32 -2
  125. package/scripts/lib/gitignore-manifest.js +29 -1
  126. package/scripts/lib/plan-lock.js +275 -0
  127. package/scripts/migrar-fase-dominio.js +0 -1
  128. package/scripts/smoke-test.js +24 -2
  129. package/scripts/verificar-trazabilidad.js +292 -0
  130. package/agentes/ux-disenador-swl.md +0 -503
  131. package/comandos/swl/dashboard.md +0 -146
  132. package/comandos/swl/evolucion-estado.md +0 -191
  133. package/comandos/swl/metricas.md +0 -342
  134. package/comandos/swl/salud.md +0 -481
  135. package/reglas/verificar-citas-temporales.md +0 -139
@@ -0,0 +1,164 @@
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.
@@ -0,0 +1,105 @@
1
+ # Personas para análisis predictivo y debate adversarial
2
+
3
+ Definiciones operativas de las personas que consume `proceso-debate-adversarial`
4
+ (modo personas) y `/swl:predecir`. Cada persona se invoca EN FRÍO (COLD START):
5
+ recibe la descripción del cambio + conocimiento del codebase + sus criterios —
6
+ nunca el análisis de otra persona.
7
+
8
+ Formato de hallazgo obligatorio por persona:
9
+
10
+ ```markdown
11
+ | # | Hallazgo | Severidad | Confianza (0-100%) | archivo:línea | Recomendación |
12
+ ```
13
+
14
+ Presupuesto: `max_hallazgos_por_persona = presupuesto_total / num_personas`
15
+ (default presupuesto 40 → 8 por persona). Obliga a priorizar, no a enumerar.
16
+
17
+ ---
18
+
19
+ ## Set default (análisis predictivo estándar)
20
+
21
+ ### 1. Arquitecto de Software
22
+ - **Enfoque**: diseño sistémico, fronteras de componentes, flujo de datos, escalabilidad.
23
+ - **Preguntas guía**: ¿Escala? ¿Los límites entre módulos son limpios? ¿El acoplamiento está minimizado? ¿Sobrevive un crecimiento 10x?
24
+ - **Evidencia exigida**: archivo:línea, grafo de dependencias, métricas de acoplamiento.
25
+ - **Red flags**: god classes, dependencias circulares, abstracciones con fugas, estado mutable compartido.
26
+
27
+ ### 2. Analista de Seguridad
28
+ - **Enfoque**: superficies de ataque, autenticación/autorización, protección de datos, vectores de inyección.
29
+ - **Preguntas guía**: ¿Es explotable? ¿Los trust boundaries se aplican? ¿El input se sanitiza? ¿Los secretos están protegidos?
30
+ - **Evidencia exigida**: archivo:línea + escenario de ataque concreto (no especulación teórica).
31
+ - **Red flags**: SQL crudo, authz faltante, secretos hardcodeados, input sin sanitizar.
32
+
33
+ ### 3. Ingeniero de Rendimiento
34
+ - **Enfoque**: latencia, throughput, uso de recursos, complejidad algorítmica.
35
+ - **Preguntas guía**: ¿Es suficientemente rápido? ¿Cuál es el peor caso? ¿Dónde están los cuellos de botella? ¿El caching es efectivo?
36
+ - **Evidencia exigida**: archivo:línea, análisis de complejidad, estimaciones de recursos.
37
+ - **Red flags**: queries N+1, loops sin cota, índices faltantes, I/O síncrono en hot paths.
38
+
39
+ ### 4. Ingeniero de Confiabilidad
40
+ - **Enfoque**: manejo de errores, modos de falla, observabilidad, recuperación.
41
+ - **Preguntas guía**: ¿Qué pasa cuando falla? ¿Podemos detectarlo? ¿Hay camino de recuperación? ¿Es observable?
42
+ - **Evidencia exigida**: archivo:línea, escenarios de falla, rutas de recuperación.
43
+ - **Red flags**: errores tragados, retries faltantes, sin circuit breakers, fallas silenciosas.
44
+
45
+ ### 5. Abogado del Diablo
46
+ - **Enfoque**: asunciones, casos límite, complejidad oculta, mantenibilidad.
47
+ - **Preguntas guía**: ¿Qué asunciones son falsas? ¿Qué rompe esto? ¿Está sobre-ingenierizado?
48
+ - **Evidencia exigida**: contraejemplos concretos, escenarios de caso límite.
49
+ - **Red flags**: diseño solo-happy-path, asunciones sin probar, complejidad sin justificación.
50
+
51
+ ---
52
+
53
+ ## Set adversarial (`--adversarial`)
54
+
55
+ Reemplaza al set default cuando el objetivo es estresar el cambio como atacante,
56
+ no como revisor.
57
+
58
+ ### 1. El Rompedor
59
+ Intenta crashear o corromper el sistema. Busca: estados imposibles, inputs
60
+ malformados, condiciones de carrera, límites de recursos.
61
+
62
+ ### 2. El Tramposo
63
+ Busca formas de saltarse reglas y abusar de features. Busca: validaciones solo
64
+ en frontend, límites evadibles, flujos alternos sin guards.
65
+
66
+ ### 3. El Escalador
67
+ Imagina carga 1000x y encuentra qué se rompe primero. Busca: queries sin
68
+ paginación, locks globales, colas sin backpressure, costos lineales ocultos.
69
+
70
+ ### 4. El Novato
71
+ Usa mal cada API esperando que funcione. Busca: defaults peligrosos, errores
72
+ crípticos, documentación que asume contexto, footguns de la interfaz.
73
+
74
+ ### 5. El Insider Malicioso
75
+ Tiene credenciales válidas y quiere exfiltrar. Busca: permisos excesivos,
76
+ auditoría faltante, datos sensibles accesibles lateralmente.
77
+
78
+ ---
79
+
80
+ ## Set red-team de seguridad (para `checklist-seguridad` modo cobertura)
81
+
82
+ Rotación de mentalidades para auditoría STRIDE/OWASP iterativa:
83
+
84
+ | Persona | Foco | Mentalidad |
85
+ |---------|------|-----------|
86
+ | Adversario de Seguridad | auth, crypto, inyección | atacante externo con browser + proxy de intercepción |
87
+ | Atacante de Supply Chain | dependencias, CI/CD, build pipeline | comprometer vía código de terceros |
88
+ | Amenaza Interna | acceso a datos, abuso de privilegios, exfiltración | usuario autenticado con intención maliciosa |
89
+ | Atacante de Infraestructura | red, configuración cloud, contenedores | apuntar a misconfigurations de infra |
90
+
91
+ ---
92
+
93
+ ## Protocolo de síntesis (tras el análisis individual)
94
+
95
+ 1. **Deduplicar**: mismo archivo:línea + mismo problema → fusionar, conservar la severidad más alta.
96
+ 2. **Resolver conflictos**: si dos personas discrepan → registrar el disenso, no silenciarlo.
97
+ 3. **Anti-herd check**: si TODAS las personas coinciden → el sintetizador DEBE producir ≥1 contraargumento.
98
+ 4. **Rankear**: `severidad × confianza promedio × número de personas que coinciden`.
99
+
100
+ Output del sintetizador:
101
+
102
+ ```markdown
103
+ ### Consenso — [N hallazgos tras dedup]
104
+ | # | Hallazgo | Severidad | Acuerdo | Personas origen | Acción |
105
+ ```
@@ -0,0 +1,138 @@
1
+ ---
2
+ name: proceso-dynamic-workflows
3
+ description: >
4
+ Patrones canónicos de dynamic workflows en Claude Code (Workflow tool / ultracode):
5
+ classify-and-act, fan-out-and-synthesize, adversarial-verification, generate-and-filter,
6
+ tournament. Cubre los 3 modos de falla que justifican orquestar (agentic laziness,
7
+ self-preferential bias, goal drift), cuándo NO usar workflows, token budgets, revisión
8
+ cross-modelo, y el anti-patrón de envolver skills auto-iterantes en /loop|/cron. Cargar
9
+ cuando se diseñe una orquestación multi-agente, se decida si una tarea amerita workflow,
10
+ o se quiera empaquetar un workflow como plantilla reutilizable en un skill.
11
+ when_to_use: >
12
+ Usar cuando el usuario diga "ultracode", "workflow", "orquesta esto", "fan-out", "panel
13
+ de revisores", "tournament", o cuando una tarea sea larga, masivamente paralela o
14
+ adversarial y un solo context window sufra laziness/goal-drift.
15
+ herramientasPermitidas: [Read, Grep, Glob]
16
+ exclusiones:
17
+ - "No cargar para tareas de codificación normales de un solo paso — la mayoría NO necesitan un workflow; el harness por defecto basta y un workflow gasta muchos más tokens."
18
+ - "No cargar para el detalle de evaluator-optimizer del nemesis — eso vive en nemesis-evaluacion-json y el comando /swl:nemesis."
19
+ - "No cargar para escribir el .js de un workflow concreto — este skill da los patrones; el script se escribe con el Workflow tool directamente."
20
+ ---
21
+
22
+ # Dynamic workflows: patrones, modos de falla y cuándo orquestar
23
+
24
+ Síntesis del blog oficial de Anthropic *"A harness for every task: dynamic workflows
25
+ in Claude Code"* + patrones validados en swl-ses (nemesis evaluator-optimizer,
26
+ `/swl:verificar --until-converge`, `/swl:autoresearch`). Un dynamic workflow deja que
27
+ Claude escriba su propio harness (JS que coordina subagentes con ventanas aisladas).
28
+
29
+ ## Cuándo cargar
30
+
31
+ - Se va a diseñar una orquestación multi-agente o decidir si una tarea amerita workflow.
32
+ - La tarea es larga, masivamente paralela, o adversarial (review, research, migración, triage).
33
+ - Se quiere empaquetar un workflow como plantilla reutilizable en un skill.
34
+
35
+ ## Cuándo NO cargar
36
+
37
+ - Tarea de codificación normal de 1-2 archivos — el harness por defecto basta. Un workflow
38
+ gasta significativamente más tokens; la mayoría de tareas de coding NO necesitan un panel
39
+ de 5 revisores.
40
+ - Ya estás dentro del detalle del nemesis (`nemesis-evaluacion-json`).
41
+ - Solo necesitas escribir el `.js` — usa el Workflow tool directo con los patrones de abajo.
42
+
43
+ ## Los 3 modos de falla que JUSTIFICAN orquestar
44
+
45
+ Un solo context window largo degrada de tres formas — nombrarlas guía cuándo separar Claudes:
46
+
47
+ 1. **Agentic laziness** — Claude se detiene antes de terminar una tarea multi-parte y la
48
+ declara hecha con progreso parcial (ej. 20 de 50 ítems de un security review). Mitiga:
49
+ fan-out (un subagente por ítem, ventana limpia) + `/goal` (requisito de completitud duro).
50
+ 2. **Self-preferential bias** — Claude prefiere sus propios resultados al verificarlos contra
51
+ un rubric. Mitiga: **adversarial-verification** con subagente separado, y mejor aún
52
+ **revisión cross-modelo** (el reviewer es OTRO modelo). Es el mismo principio que
53
+ `gobernanza.md § Separación revisor/ejecutor`.
54
+ 3. **Goal drift** — pérdida gradual de fidelidad al objetivo tras muchos turnos y compaction
55
+ (cada resumen es lossy; se pierde "no hagas X"). Mitiga: subagentes con goal aislado y
56
+ constraints explícitas por invocación; `/goal` como ancla.
57
+
58
+ ## Los 5 patrones canónicos
59
+
60
+ | Patrón | Cuándo | Forma |
61
+ |--------|--------|-------|
62
+ | **Classify-and-act** | Rutear según tipo de tarea/ítem | Clasificador → ramas distintas (al inicio o al final para decidir output) |
63
+ | **Fan-out-and-synthesize** | Muchos sub-pasos; cada uno se beneficia de ventana limpia sin cross-contaminación | N agentes en paralelo → barrier → synthesize merge. **Default** para descomponer |
64
+ | **Adversarial-verification** | Evitar self-preferential bias | Por cada agente, un agente separado verifica su output contra rubric. Diversificar lentes |
65
+ | **Generate-and-filter** | Espacio de ideas amplio (taste-based) | Generar N → filtrar por rubric/verificación → dedupe → solo las mejores probadas |
66
+ | **Tournament** | Solución taste-based con criterio | N agentes compiten con enfoques distintos → juez pairwise hasta ganador |
67
+
68
+ `pipeline()` (sin barrier entre stages) es el default; usa barrier (`parallel()` entre
69
+ stages) SOLO cuando el stage N necesita TODOS los resultados del N-1 (dedup global,
70
+ early-exit por conteo cero, comparación cruzada).
71
+
72
+ ## Revisión cross-modelo (combate self-preferential bias estructuralmente)
73
+
74
+ El reviewer adversarial en el MISMO modelo aún arrastra sesgo. La mejora: **executor en un
75
+ modelo, reviewer en otro** (Claude ejecuta → Gemini/Codex/otro revisa). Patrón de ARIS
76
+ (`mcp-servers/gemini-review`): MCP que expone `review`/`review_reply`, devuelve JSON con
77
+ `threadId` + `response` → rastro auditable de un veredicto independiente.
78
+
79
+ En swl-ses esto es **opt-in** vía `/swl:nemesis --cross-model` (ver el comando): si hay un
80
+ MCP reviewer configurado, la verificación se rutea a un modelo externo; si no, degrada al
81
+ reviewer same-model sin fallar (regla `arreglar-al-detectar.md` / no-fallback-silencioso →
82
+ se anuncia la degradación). Mejoras del reviewer (de ARIS `auto-review-loop`):
83
+ - **Reviewer memory**: el reviewer arrastra sus sospechas entre rondas (un solo `threadId`),
84
+ no parte de cero cada iteración.
85
+ - **Debate protocol**: el executor puede rebatir; el reviewer falla el veredicto final —
86
+ *"it can drive, never acquit"* (el loop conduce, el jurado decide).
87
+ - **POSITIVE_THRESHOLD compuesto**: `score ≥ N` **AND** `verdict ∈ {ready, almost}` — un
88
+ score alto con verdict "not ready" NO detiene el loop.
89
+
90
+ ## Anti-patrón: no envolver un skill auto-iterante en /loop · /cron · /schedule
91
+
92
+ Si un skill YA itera internamente (review→fix→re-review con memoria de reviewer en un
93
+ `threadId`), envolverlo en `/loop`, `/schedule` o `CronCreate` lo re-entra desde cero cada
94
+ tick → `threadId` nuevo, memoria del reviewer reseteada → dispara el veredicto por
95
+ wall-clock en vez de por cambio de artefacto: cero señal nueva, costo de tokens completo.
96
+ Aplica a `/swl:autoresearch`, `/swl:verificar --until-converge`, nemesis `--remediar`. Si
97
+ hay que agendar algo, agenda **la espera externa que lo precede** (ej. experimentos listos →
98
+ entonces corre el loop UNA vez), no el loop mismo.
99
+
100
+ ## Token budgets, /goal y model routing
101
+
102
+ - **Token budget en workflows**: el global `budget` (o "use 10k tokens" en el prompt) pone
103
+ cap duro. Alinea con `scripts/lib/budget-enforcer.js` de swl-ses.
104
+ - **/goal + /loop**: para workflows repetibles (triage, research, verificación), `/goal` da
105
+ requisito de completitud y `/loop` la cadencia. NO sobre skills auto-iterantes (arriba).
106
+ - **Dynamic model routing**: un agente clasificador investiga la complejidad real del scope
107
+ y rutea a Sonnet vs Opus por tarea (más fino que el Model-Tier estático del frontmatter).
108
+
109
+ ## Workflows como plantillas en skills
110
+
111
+ Un `.js` de workflow puede vivir en `recursos/` de un skill y referenciarse en su SKILL.md
112
+ como **plantilla** (no script verbatim) — Claude lo adapta al caso. Plantillas incluidas:
113
+
114
+ - `recursos/template-adversarial-verify.js` — fan-out de hallazgos + verificación adversarial
115
+ por hallazgo (filtra los reales).
116
+ - `recursos/template-triage.js` — clasifica ítems de un backlog, dedupe contra lo ya
117
+ trackeado, y rutea (fix automático vs escalar a humano) con patrón quarantine.
118
+
119
+ ## Quarantine (triage de contenido no confiable)
120
+
121
+ En triage que lee contenido público/no confiable, los agentes lectores quedan **barred** de
122
+ acciones de alto privilegio; esas las ejecutan agentes distintos que actúan sobre la info ya
123
+ saneada. Coherente con `seguridad-agentes.md § Prompt injection` y el quarantine de SWL.
124
+
125
+ ## Gotchas
126
+
127
+ - **Workflows gastan más tokens** — úsalos cuando la tarea de verdad necesita más cómputo
128
+ (adversarial, masivamente paralela), no por reflejo.
129
+ - **Subagentes heredan el contexto del padre** (CLAUDE.md + reglas globales). En proyectos
130
+ rule-heavy pueden saturar al arrancar (autocompact thrashing). Pasa scope acotado y evita
131
+ hacer que el subagente explore el codebase completo (ver `harness-claude-code`).
132
+ - **Barrier injustificado** mata wall-clock: si no hay dependencia cross-ítem entre stages,
133
+ usa `pipeline()`, no `parallel()` entre stages.
134
+
135
+ ## Origen
136
+
137
+ Adoptado 2026-06-05 desde análisis de `temp/` (blog Anthropic dynamic-workflows +
138
+ ARIS `auto-review-loop`/`mcp-servers`). Ver APRENDIZAJES.md Tipo D 2026-06-05.
@@ -0,0 +1,65 @@
1
+ // PLANTILLA (no ejecutar verbatim) — Workflow tool de Claude Code.
2
+ // Patrón: fan-out de hallazgos -> verificación adversarial por hallazgo -> filtrar reales.
3
+ // Combate self-preferential bias y agentic laziness. Adapta DIMENSIONS, rubrics y schemas.
4
+ //
5
+ // Uso: el agente lee esta plantilla, la ajusta al caso concreto y la pasa al Workflow tool.
6
+
7
+ export const meta = {
8
+ name: 'adversarial-verify',
9
+ description: 'Revisa por dimensiones y verifica cada hallazgo adversarialmente antes de aceptarlo',
10
+ phases: [{ title: 'Review' }, { title: 'Verify' }],
11
+ }
12
+
13
+ // Dimensiones de revisión — una por lente independiente (no se contaminan entre sí).
14
+ const DIMENSIONS = [
15
+ { key: 'correctness', prompt: 'Revisa SOLO correctness del scope. Devuelve hallazgos.' },
16
+ { key: 'security', prompt: 'Revisa SOLO seguridad del scope. Devuelve hallazgos.' },
17
+ { key: 'dry', prompt: 'Revisa SOLO duplicación/DRY del scope. Devuelve hallazgos.' },
18
+ ]
19
+
20
+ const FINDINGS = {
21
+ type: 'object', additionalProperties: false,
22
+ properties: {
23
+ findings: {
24
+ type: 'array',
25
+ items: {
26
+ type: 'object', additionalProperties: false,
27
+ properties: {
28
+ title: { type: 'string' }, file: { type: 'string' }, line: { type: 'string' },
29
+ severity: { type: 'string', enum: ['critico', 'mayor', 'menor'] },
30
+ },
31
+ required: ['title', 'file', 'severity'],
32
+ },
33
+ },
34
+ },
35
+ required: ['findings'],
36
+ }
37
+
38
+ const VERDICT = {
39
+ type: 'object', additionalProperties: false,
40
+ properties: {
41
+ isReal: { type: 'boolean' },
42
+ reason: { type: 'string' },
43
+ },
44
+ required: ['isReal', 'reason'],
45
+ }
46
+
47
+ // pipeline (sin barrier): cada dimensión verifica sus hallazgos en cuanto su review termina.
48
+ const results = await pipeline(
49
+ DIMENSIONS,
50
+ (d) => agent(d.prompt, { label: `review:${d.key}`, phase: 'Review', schema: FINDINGS }),
51
+ (review, d) =>
52
+ parallel(
53
+ (review?.findings || []).map((f) => () =>
54
+ // Verificador adversarial: prompt orientado a REFUTAR (default refutado si dudoso).
55
+ agent(
56
+ `Intenta REFUTAR este hallazgo contra el código real (cita archivo:linea). ` +
57
+ `Si no puedes probarlo, isReal=false: ${JSON.stringify(f)}`,
58
+ { label: `verify:${f.file}`, phase: 'Verify', schema: VERDICT }
59
+ ).then((v) => ({ ...f, verdict: v }))
60
+ )
61
+ )
62
+ )
63
+
64
+ const confirmados = results.flat().filter(Boolean).filter((f) => f.verdict?.isReal)
65
+ return { confirmados }
@@ -0,0 +1,65 @@
1
+ // PLANTILLA (no ejecutar verbatim) — Workflow tool de Claude Code.
2
+ // Patrón: classify-and-act + quarantine. Clasifica ítems de un backlog, dedupe contra lo
3
+ // ya trackeado, y rutea: fix automático (bajo riesgo) vs escalar a humano (alto riesgo).
4
+ // Quarantine: el agente que LEE contenido no confiable NO ejecuta acciones de alto privilegio.
5
+ //
6
+ // `args` = lista de ítems del backlog (issues, reportes, etc.). Adapta schemas y umbrales.
7
+
8
+ export const meta = {
9
+ name: 'triage',
10
+ description: 'Clasifica un backlog, dedupe contra lo trackeado y rutea fix-vs-escalar (con quarantine)',
11
+ phases: [{ title: 'Clasificar' }, { title: 'Actuar' }],
12
+ }
13
+
14
+ const items = Array.isArray(args) ? args : []
15
+
16
+ const CLASIFICACION = {
17
+ type: 'object', additionalProperties: false,
18
+ properties: {
19
+ categoria: { type: 'string', enum: ['bug', 'feature', 'duplicado', 'ruido'] },
20
+ yaTrackeado: { type: 'boolean' },
21
+ riesgo: { type: 'string', enum: ['bajo', 'alto'] },
22
+ resumen: { type: 'string' },
23
+ },
24
+ required: ['categoria', 'yaTrackeado', 'riesgo', 'resumen'],
25
+ }
26
+
27
+ const ACCION = {
28
+ type: 'object', additionalProperties: false,
29
+ properties: {
30
+ accion: { type: 'string', enum: ['fix-aplicado', 'escalado-humano', 'descartado'] },
31
+ detalle: { type: 'string' },
32
+ },
33
+ required: ['accion', 'detalle'],
34
+ }
35
+
36
+ // Stage 1 (quarantine): clasificador LEE el ítem (posible contenido no confiable) pero NO
37
+ // tiene permiso de actuar — solo emite estructura. Stage 2 actúa sobre data ya saneada.
38
+ const triaged = await pipeline(
39
+ items,
40
+ (item) =>
41
+ agent(
42
+ `Clasifica este ítem del backlog. NO ejecutes ninguna acción: solo describe. ` +
43
+ `Marca yaTrackeado=true si ya existe ticket. Ítem: ${JSON.stringify(item)}`,
44
+ { label: 'clasificar', phase: 'Clasificar', schema: CLASIFICACION }
45
+ ),
46
+ (clf, item) => {
47
+ if (!clf || clf.yaTrackeado || clf.categoria === 'ruido' || clf.categoria === 'duplicado') {
48
+ return { accion: 'descartado', detalle: clf?.resumen || 'sin señal' }
49
+ }
50
+ if (clf.riesgo === 'alto') {
51
+ // Alto riesgo: escalar a humano, no auto-actuar.
52
+ return agent(
53
+ `Redacta un escalamiento conciso para humano sobre: ${clf.resumen}`,
54
+ { label: 'escalar', phase: 'Actuar', schema: ACCION }
55
+ )
56
+ }
57
+ // Bajo riesgo: el agente que ACTÚA es distinto del que leyó contenido no confiable.
58
+ return agent(
59
+ `Aplica el fix de bajo riesgo para: ${clf.resumen}. Devuelve qué hiciste.`,
60
+ { label: 'fix', phase: 'Actuar', schema: ACCION }
61
+ )
62
+ }
63
+ )
64
+
65
+ return triaged.filter(Boolean)
@@ -242,7 +242,7 @@ El veredicto JSON se persiste en:
242
242
  .planning/audit/reviews/<task-id>-<timestamp>.json
243
243
  ```
244
244
 
245
- Esto permite que `auto-evolucion-swl` y `/swl:metricas` calculen tasas de
245
+ Esto permite que `auto-evolucion-swl` y `/swl:status metricas` calculen tasas de
246
246
  APPROVED vs REJECTED por agente revisor y por tipo de tarea — datos
247
247
  necesarios para identificar revisores con calibración floja o tipos de
248
248
  tarea sistemáticamente problemáticos.
@@ -29,7 +29,7 @@ archivos SKILL.md y scripts asociados.
29
29
 
30
30
  - Al ejecutar `/swl:crear-skill` — verificación pre-creación
31
31
  - Al ejecutar `/swl:plugins install` — gate de seguridad
32
- - Al auditar skills existentes con `/swl:salud`
32
+ - Al auditar skills existentes con `/swl:status salud`
33
33
  - Al revisar skills generados por `auto-evolucion-swl`
34
34
  - Cuando se incorporan skills de `_userland/plugins/` al sistema base
35
35