@saulwade/swl-ses 1.4.0 → 1.4.1
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 +4 -3
- package/README.md +15 -14
- package/agentes/nemesis-auditor-swl.md +161 -0
- package/comandos/swl/nemesis.md +122 -0
- package/comandos/swl/salud.md +34 -0
- package/comandos/swl/verificar.md +45 -0
- package/habilidades/feynman-auditor-swl/SKILL.md +123 -0
- package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -0
- package/habilidades/state-inconsistency-auditor-swl/SKILL.md +166 -0
- package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -0
- package/habilidades/web-fetcher-routing/SKILL.md +75 -0
- package/hooks/lib/security-net.js +201 -0
- package/manifiestos/modulos.json +30 -0
- package/manifiestos/skills-lock.json +1114 -1093
- package/package.json +2 -2
- package/plugin.json +2 -2
- package/scripts/audit-tools/audit-history.js +330 -0
- package/scripts/audit-tools/bundle-tracker.js +290 -0
- package/scripts/audit-tools/canary-monitor.js +352 -0
- package/scripts/audit-tools/code-profiler.js +605 -0
- package/scripts/audit-tools/dep-doctor.js +320 -0
- package/scripts/audit-tools/env-validator.js +206 -0
- package/scripts/audit-tools/lib/fs-walk.js +48 -0
- package/scripts/audit-tools/lib/output.js +23 -0
- package/scripts/audit-tools/migration-checker.js +392 -0
- package/scripts/audit-tools/pentest-scanner.js +1436 -0
package/CLAUDE.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# CLAUDE.md — @saulwade/swl-ses v1.4.
|
|
1
|
+
# CLAUDE.md — @saulwade/swl-ses v1.4.1
|
|
2
2
|
|
|
3
3
|
## Reglas de máxima prioridad (aplican SIEMPRE, sin excepción)
|
|
4
4
|
|
|
@@ -92,7 +92,7 @@ El Read tool sigue siendo correcto para `.pdf` (≤20 páginas), `.md`, `.txt` y
|
|
|
92
92
|
## Qué es este repositorio
|
|
93
93
|
|
|
94
94
|
Sistema de ingeniería de software auto-evolutivo multi-runtime polyglot (SDLC completo).
|
|
95
|
-
11 lenguajes, 5 runtimes,
|
|
95
|
+
11 lenguajes, 5 runtimes, 60 agentes, 158 skills, 44 comandos, 65 reglas, 41 hooks.
|
|
96
96
|
|
|
97
97
|
## Estructura del repositorio
|
|
98
98
|
|
|
@@ -123,7 +123,8 @@ Para la lista completa con descripción ver `@COMANDOS.md`. Comandos más usados
|
|
|
123
123
|
| `/swl:claudemd` | Auditar/refactorizar/inicializar CLAUDE.md (audit, refactor, init-user, check) |
|
|
124
124
|
| `/swl:aprender` / `/swl:evolucionar` / `/swl:autoresearch` | Aprendizaje y auto-evolución |
|
|
125
125
|
| `/swl:salud` / `/swl:metricas` / `/swl:dashboard` | Diagnóstico y observabilidad |
|
|
126
|
-
| `/swl:revisar` / `/swl:verificar` | Calidad de código (revisión por stack, verificación goal-backward) |
|
|
126
|
+
| `/swl:revisar` / `/swl:verificar` | Calidad de código (revisión por stack, verificación goal-backward). `/swl:verificar --full` activa parallel scorecard con 4 audits paralelos |
|
|
127
|
+
| `/swl:nemesis` | Auditoría iterativa Feynman + State Inconsistency (loop hasta convergencia, ADR-0018). Flags: `--pass1`, `--pass2`, `--continue`, `--modulo <ruta>` |
|
|
127
128
|
| `/swl:release` | Ciclo de release SemVer |
|
|
128
129
|
| `/swl:configurar-ci` | Workflows CI/CD para proyectos del usuario |
|
|
129
130
|
| `/swl:wiki` / `/swl:mapear-codebase` | Conocimiento de proyecto |
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# swl-ses v1.4.
|
|
1
|
+
# swl-ses v1.4.1
|
|
2
2
|
|
|
3
3
|
> El paquete anterior `@saulwadeleon/swl-software-engineering-system` está deprecado. Migrar a `@saulwade/swl-ses` (npmjs.org canónico) o `@saul-wade/swl-ses` (mirror en GitHub Packages) — el CLI `swl-ses` no cambia.
|
|
4
4
|
|
|
@@ -6,17 +6,18 @@ Sistema de ingeniería de software auto-evolutivo **multi-runtime** con agentes
|
|
|
6
6
|
|
|
7
7
|
Soporta 6 runtimes de IA: Claude Code, OpenClaude, OpenCode y Gemini CLI (soporte completo), GitHub Copilot y Codex CLI (soporte parcial: agentes, reglas, hooks experimentales y MCP). Incluye sistema de transformadores que adapta el formato canónico SWL al formato nativo de cada runtime.
|
|
8
8
|
|
|
9
|
-
Cubre el SDLC completo: discovery, requisitos, arquitectura, UX/UI, frontend, backend, mobile, datos, testing, seguridad, CI/CD, observabilidad, releases, documentación, notificaciones y auto-evolución. Incluye sistema de notificaciones Telegram opt-in
|
|
9
|
+
Cubre el SDLC completo: discovery, requisitos, arquitectura, UX/UI, frontend, backend, mobile, datos, testing, seguridad, CI/CD, observabilidad, releases, documentación, notificaciones y auto-evolución. Incluye sistema de notificaciones Telegram opt-in (hook saliente, bot bidireccional con 15 comandos, autostart cross-platform) y **auditoría profunda Nemesis** (loop iterativo Feynman + State Inconsistency hasta convergencia) con 8 tools ejecutables JSON-output para code-profiler, pentest-scanner, dep-doctor, bundle-tracker y más (ADR-0018, v1.4.1).
|
|
10
10
|
|
|
11
11
|
## Inventario
|
|
12
12
|
|
|
13
13
|
| Componente | Cantidad |
|
|
14
14
|
|-----------|----------|
|
|
15
|
-
| Agentes SWL |
|
|
16
|
-
| Habilidades |
|
|
17
|
-
| Comandos (/swl:*) |
|
|
18
|
-
| Reglas |
|
|
19
|
-
| Hooks |
|
|
15
|
+
| Agentes SWL | 60 |
|
|
16
|
+
| Habilidades | 158 (todas <=300 líneas, con divulgación progresiva a recursos/) |
|
|
17
|
+
| Comandos (/swl:*) | 44 (todos <=300 líneas, delegan a skills) |
|
|
18
|
+
| Reglas | 25 base + 40 por lenguaje (8 lenguajes x 5) |
|
|
19
|
+
| Hooks | 41 + 66 librerías en hooks/lib/ |
|
|
20
|
+
| Tools ejecutables (audit-tools) | 8 (code-profiler, pentest-scanner, dep-doctor, bundle-tracker, env-validator, migration-checker, canary-monitor, audit-history) |
|
|
20
21
|
| Schemas | 15 |
|
|
21
22
|
| Perfiles de instalación | 17 |
|
|
22
23
|
| Contextos | 3 (dev, review, research) |
|
|
@@ -177,7 +178,7 @@ claude
|
|
|
177
178
|
| `mobile` | Android + iOS + React Native/Flutter + UX |
|
|
178
179
|
| `devops` | CI/CD + cloud + observabilidad + releases + seguridad |
|
|
179
180
|
| `polyglot` | Todos los lenguajes: 11 lenguajes + revisores + build resolvers |
|
|
180
|
-
| `completo` | Todo:
|
|
181
|
+
| `completo` | Todo: 60 agentes + 158 habilidades + 44 comandos + 65 reglas + 41 hooks |
|
|
181
182
|
|
|
182
183
|
### Targets soportados
|
|
183
184
|
|
|
@@ -477,12 +478,12 @@ swl-ses/
|
|
|
477
478
|
manifiestos.js # Resolución de perfiles/módulos
|
|
478
479
|
seguridad.js # Validaciones de seguridad
|
|
479
480
|
manifiestos/ # Perfiles y módulos de instalación
|
|
480
|
-
agentes/ #
|
|
481
|
-
habilidades/ #
|
|
482
|
-
comandos/swl/ #
|
|
483
|
-
reglas/ #
|
|
484
|
-
hooks/ #
|
|
485
|
-
schemas/ #
|
|
481
|
+
agentes/ # 60 agentes especializados
|
|
482
|
+
habilidades/ # 158 habilidades modulares
|
|
483
|
+
comandos/swl/ # 44 comandos slash
|
|
484
|
+
reglas/ # 25 reglas base + 40 por lenguaje
|
|
485
|
+
hooks/ # 41 hooks + 66 librerías en hooks/lib/
|
|
486
|
+
schemas/ # 15 JSON Schemas
|
|
486
487
|
contextos/ # 3 modos de desarrollo
|
|
487
488
|
instintos/ # Instintos YAML con confianza
|
|
488
489
|
plantillas/ # Templates para .planning/
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nemesis-auditor-swl
|
|
3
|
+
description: >
|
|
4
|
+
Auditor de doble paso iterativo (Feynman + State Inconsistency) que encuentra
|
|
5
|
+
bugs en la intersección que ningún paso individual detecta. Language-agnostic
|
|
6
|
+
(Python, TypeScript, Go, Rust, Java, C#). Invocar tras revisor-codigo-swl y
|
|
7
|
+
revisor-seguridad-swl cuando la fase toca lógica de negocio compleja con
|
|
8
|
+
estado acoplado.
|
|
9
|
+
tools: [Read, Grep, Glob, Bash, Write]
|
|
10
|
+
model: claude-sonnet-4-6
|
|
11
|
+
version: 1.0.0
|
|
12
|
+
nivelRiesgo: MEDIO
|
|
13
|
+
skillsInvocables: [feynman-auditor-swl, state-inconsistency-auditor-swl]
|
|
14
|
+
permisosRed: false
|
|
15
|
+
permisosEscritura: true
|
|
16
|
+
permisosComandos: true
|
|
17
|
+
maxTurnos: 20
|
|
18
|
+
evolvable: true
|
|
19
|
+
exclusiones:
|
|
20
|
+
- "No invocar para pattern-matching de CVEs conocidos — usar revisor-seguridad-swl."
|
|
21
|
+
- "No invocar para refactor o implementación — solo audita, no modifica código."
|
|
22
|
+
- "No invocar como sustituto de tests — Nemesis complementa, no reemplaza testing."
|
|
23
|
+
- "No invocar para análisis de blockchain — el agente fue generalizado a Python/TS/Go/Rust/Java/C#."
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Cuándo NO invocarme
|
|
27
|
+
|
|
28
|
+
- Para búsqueda de vulnerabilidades conocidas (CVE, OWASP Top 10) — usar `revisor-seguridad-swl`.
|
|
29
|
+
- Para refactor, limpiar deuda técnica o implementar funcionalidad nueva — Nemesis audita, no toca código.
|
|
30
|
+
- Para reemplazar un suite de tests — la cobertura de Nemesis es profundidad, no amplitud.
|
|
31
|
+
- Para código sin estado acoplado (scripts de utilería, transformaciones funcionales puras).
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
# Nemesis Auditor
|
|
36
|
+
|
|
37
|
+
Dos auditores en bucle de retroalimentación. Cada uno alimenta al siguiente con sus hallazgos. El ciclo continúa hasta que ninguno encuentre algo nuevo (convergencia) o se alcancen 6 pasadas.
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
PASADA 1: Feynman Auditor (corrida completa)
|
|
41
|
+
Cuestiona cada línea. Expone asunciones. Marca sospechosos.
|
|
42
|
+
|
|
43
|
+
| feed forward |
|
|
44
|
+
|
|
45
|
+
PASADA 2: State Inconsistency Auditor (corrida completa, enriquecido por Pasada 1)
|
|
46
|
+
Mapea estado acoplado. Encuentra gaps de mutación. Usa sospechosos de Feynman como objetivos.
|
|
47
|
+
|
|
48
|
+
| feed forward |
|
|
49
|
+
|
|
50
|
+
PASADA 3+: Pasadas alternantes dirigidas hasta convergencia
|
|
51
|
+
Cada pasada interroga los nuevos hallazgos de la anterior.
|
|
52
|
+
Máximo 6 pasadas. Nada sobrevive.
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Proceso — Fase 0: Contexto
|
|
58
|
+
|
|
59
|
+
Antes de la Pasada 1, establecer:
|
|
60
|
+
|
|
61
|
+
1. ¿Qué archivos o módulos están en scope? (sin scope → el auditor infiere desde el directorio de trabajo)
|
|
62
|
+
2. ¿Hay un comando específico (`/nemesis`, `/nemesis --pass1`, `/nemesis --pass2`, `/nemesis --continue`)?
|
|
63
|
+
3. ¿Hay un target de un solo módulo (`/nemesis --contract <nombre>`)?
|
|
64
|
+
4. ¿Existen hallazgos previos en `.audit/findings/`?
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Proceso — Fase 1: Pasada Feynman
|
|
69
|
+
|
|
70
|
+
Cargar `Skill("feynman-auditor-swl")` y ejecutar la auditoría completa.
|
|
71
|
+
|
|
72
|
+
- Salida cruda: `.audit/findings/feynman-pass1.md`
|
|
73
|
+
- Registrar sospechosos de alta confianza para alimentar la Pasada 2.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Proceso — Fase 2: Pasada State Inconsistency
|
|
78
|
+
|
|
79
|
+
Cargar `Skill("state-inconsistency-auditor-swl")` con los sospechosos de Feynman como contexto adicional.
|
|
80
|
+
|
|
81
|
+
- Los sospechosos de Feynman se convierten en **objetivos dirigidos** para el mapeo de estado acoplado.
|
|
82
|
+
- Salida cruda: `.audit/findings/state-pass1.md`
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Proceso — Fases 3+: Convergencia
|
|
87
|
+
|
|
88
|
+
Continuar alternando pasadas mientras alguna encuentre hallazgos nuevos:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Pasada N (Feynman dirigida):
|
|
92
|
+
Objetivos: funciones que rodean los hallazgos de State de la pasada anterior.
|
|
93
|
+
¿Nuevos hallazgos? → Pasada N+1
|
|
94
|
+
|
|
95
|
+
Pasada N+1 (State dirigida):
|
|
96
|
+
Objetivos: funciones que rodean los hallazgos de Feynman de la pasada anterior.
|
|
97
|
+
¿Nuevos hallazgos? → Pasada N+2
|
|
98
|
+
|
|
99
|
+
Convergencia: ninguna pasada produce hallazgos nuevos.
|
|
100
|
+
Límite duro: 6 pasadas totales (3 Feynman + 3 State).
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Proceso — Fase 7: Reporte Final
|
|
106
|
+
|
|
107
|
+
Consolidar todos los hallazgos verificados en `.audit/findings/nemesis-verified.md`.
|
|
108
|
+
|
|
109
|
+
Cada hallazgo etiquetado con su ruta de descubrimiento:
|
|
110
|
+
|
|
111
|
+
- `[Feynman-solo]` — detectado solo por la técnica Feynman
|
|
112
|
+
- `[State-solo]` — detectado solo por el mapeado de estado
|
|
113
|
+
- `[Cross-feed]` — el hallazgo emergió de la retroalimentación entre ambas pasadas
|
|
114
|
+
|
|
115
|
+
### Tabla de severidad
|
|
116
|
+
|
|
117
|
+
| Severidad | Criterio |
|
|
118
|
+
|-----------|----------|
|
|
119
|
+
| CRÍTICO | Corrupción de datos inmediata, pérdida de información, escalada de privilegios |
|
|
120
|
+
| ALTO | Fallo condicional de funcionalidad crítica, contabilidad incorrecta en paths comunes |
|
|
121
|
+
| MEDIO | Contabilidad degradada, griefing, errores en casos de borde frecuentes |
|
|
122
|
+
| BAJO | Problemas cosméticos, inaccuracy de eventos/logs, errores de casos de borde raros |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Comandos
|
|
127
|
+
|
|
128
|
+
| Comando | Acción |
|
|
129
|
+
|---------|--------|
|
|
130
|
+
| `/nemesis` | Auditoría completa iterativa |
|
|
131
|
+
| `/nemesis --pass1` | Solo Pasada 1 — Feynman completo |
|
|
132
|
+
| `/nemesis --pass2` | Solo Pasada 2 — State sobre output existente de Pasada 1 |
|
|
133
|
+
| `/nemesis --continue` | Continuar desde la última pasada |
|
|
134
|
+
| `/nemesis --contract <nombre>` | Auditoría completa sobre un módulo específico |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Adaptación por lenguaje
|
|
139
|
+
|
|
140
|
+
Detectar el lenguaje del codebase y adaptar:
|
|
141
|
+
|
|
142
|
+
| Concepto | Python | TypeScript | Go | Rust | Java | C# |
|
|
143
|
+
|---------|--------|------------|-----|------|------|-----|
|
|
144
|
+
| Estado mutable | atributos de clase / variables de módulo | propiedades de clase / estado de módulo | campos de struct / variables globales | campos de struct | campos de clase | propiedades |
|
|
145
|
+
| Almacenamiento persistente | BD / Redis / archivo | BD / Redis / localStorage | BD / Redis | BD / archivos | BD / caché | BD / caché |
|
|
146
|
+
| Actor de la operación | `request.user` / `actor_id` | `req.user` / `userId` | `ctx.UserID` | `actor_id` | `principal` | `User.Identity` |
|
|
147
|
+
| Mutación interna | método privado | método privado | función interna | `pub(crate) fn` | método privado | método privado |
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Protocolo anti-alucinación
|
|
152
|
+
|
|
153
|
+
Nunca reportar un hallazgo sin evidencia textual concreta:
|
|
154
|
+
|
|
155
|
+
- La función que rompe el invariante, con su path completo
|
|
156
|
+
- La secuencia de triggers que produce el bug
|
|
157
|
+
- El estado inconsistente resultante y su consecuencia observable
|
|
158
|
+
|
|
159
|
+
Toda hallazgo verificado incluye: par de estado acoplado, operación que rompe, secuencia de triggers, consecuencia concreta.
|
|
160
|
+
|
|
161
|
+
<!-- Adaptado de nemesis-auditor-main bajo MIT License (https://github.com/0xiehnnkta/nemesis-auditor) -->
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swl:nemesis
|
|
3
|
+
description: >
|
|
4
|
+
Auditoría iterativa Feynman + State Inconsistency (loop hasta convergencia).
|
|
5
|
+
Invoca el agente nemesis-auditor-swl con los 2 skills subordinados.
|
|
6
|
+
Persiste hallazgos en .planning/audit/findings/.
|
|
7
|
+
allowed-tools: [Read, Grep, Glob, Bash, Write, Agent]
|
|
8
|
+
argument-hint: "[--pass1 | --pass2 | --continue | --modulo <ruta>]"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /swl:nemesis — Auditoría iterativa de profundidad
|
|
12
|
+
|
|
13
|
+
Dos auditores en loop: Feynman interroga suposiciones línea por línea; State
|
|
14
|
+
Inconsistency mapea pares de estado acoplado y encuentra mutaciones
|
|
15
|
+
incompletas. Cada pasada alimenta la siguiente hasta que no aparecen hallazgos
|
|
16
|
+
nuevos o se llega al máximo de 6 pasadas.
|
|
17
|
+
|
|
18
|
+
## Cuándo invocar
|
|
19
|
+
|
|
20
|
+
- El módulo pasó `/swl:revisar` con score ≥ 9.0 pero hay sospechas de bugs
|
|
21
|
+
de lógica profunda que el revisor de código no captura (suposiciones
|
|
22
|
+
incorrectas, invariantes rotos, condiciones de carrera sutiles).
|
|
23
|
+
- Antes de un release de componente crítico: auth, pagos, contratos, permisos.
|
|
24
|
+
- Cuando un bug en producción se atribuye a lógica aparentemente correcta —
|
|
25
|
+
usar Nemesis para encontrar el patrón de fallo subyacente.
|
|
26
|
+
- Para módulos legacy con alta deuda técnica donde los tests no cubren los
|
|
27
|
+
caminos de estado.
|
|
28
|
+
|
|
29
|
+
## Cuándo NO invocar
|
|
30
|
+
|
|
31
|
+
- El módulo tiene menos de 200 LOC y es CRUD simple sin lógica de negocio.
|
|
32
|
+
- Se necesita revisión de estilo, naming o cobertura de tests — usar
|
|
33
|
+
`/swl:revisar` en su lugar.
|
|
34
|
+
- El proyecto no tiene `agentes/nemesis-auditor-swl.md` instalado — verificar
|
|
35
|
+
con `ls agentes/ | grep nemesis` antes de invocar.
|
|
36
|
+
- La tarea urgente es un hotfix en producción — Nemesis es deliberado (8-20
|
|
37
|
+
turnos); en incidente activo, usar `/swl:verificar` acotado.
|
|
38
|
+
|
|
39
|
+
## Modos disponibles
|
|
40
|
+
|
|
41
|
+
| Modo | Flag | Descripción |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| Loop completo (default) | (sin flag) | Pasada 1 (Feynman) + Pasada 2 (State) + N pasadas alternadas hasta convergencia, máximo 6 en total |
|
|
44
|
+
| Solo Feynman | `--pass1` | Una pasada Feynman exhaustiva; no ejecuta State |
|
|
45
|
+
| Solo State | `--pass2` | Una pasada State Inconsistency; puede alimentarse con findings previos de Feynman si existen en `.planning/audit/findings/` |
|
|
46
|
+
| Retomar | `--continue` | Continúa desde la última pasada registrada en `.planning/audit/findings/`; útil si la sesión se interrumpió |
|
|
47
|
+
| Acotar módulo | `--modulo <ruta>` | Limita el scope a un archivo o subdirectorio específico; se puede combinar con cualquier otro flag |
|
|
48
|
+
|
|
49
|
+
## Qué produce
|
|
50
|
+
|
|
51
|
+
Todos los archivos se crean en `.planning/audit/findings/`:
|
|
52
|
+
|
|
53
|
+
| Archivo | Cuándo se genera |
|
|
54
|
+
|---|---|
|
|
55
|
+
| `feynman-pass[N].md` | Al completar cada pasada Feynman (N = número de pasada) |
|
|
56
|
+
| `state-pass[N].md` | Al completar cada pasada State Inconsistency |
|
|
57
|
+
| `nemesis-verified.md` | Al final del loop completo; consolida todos los hallazgos con estado de verificación |
|
|
58
|
+
|
|
59
|
+
Si el directorio `.planning/audit/findings/` no existe, el agente lo crea antes
|
|
60
|
+
de la primera escritura.
|
|
61
|
+
|
|
62
|
+
## Cómo interpretar el reporte
|
|
63
|
+
|
|
64
|
+
Cada hallazgo en los archivos de pasada usa este formato:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
## [SEVERIDAD] Título del hallazgo
|
|
68
|
+
|
|
69
|
+
**Discovery path**: Feynman-only | State-only | Cross-feed Pass N → Pass M
|
|
70
|
+
**Verification**: Code trace | PoC test | Both
|
|
71
|
+
**Líneas afectadas**: archivo:L1-L2
|
|
72
|
+
|
|
73
|
+
Descripción del problema y por qué es un bug y no solo código sospechoso.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Severidades**:
|
|
77
|
+
|
|
78
|
+
| Nivel | Criterio |
|
|
79
|
+
|---|---|
|
|
80
|
+
| CRITICAL | Explotable sin precondiciones; pérdida de datos o control total |
|
|
81
|
+
| HIGH | Explotable bajo condiciones razonables; impacto severo |
|
|
82
|
+
| MEDIUM | Requiere condiciones específicas; impacto moderado |
|
|
83
|
+
| LOW | Impacto menor o difícil de explotar; documentar para trazabilidad |
|
|
84
|
+
|
|
85
|
+
**Discovery path** indica cuándo se encontró:
|
|
86
|
+
|
|
87
|
+
- `Feynman-only`: Feynman lo detectó; State no lo confirmó ni refutó.
|
|
88
|
+
- `State-only`: State Inconsistency lo encontró analizando mutaciones.
|
|
89
|
+
- `Cross-feed Pass N → Pass M`: Feynman marcó un sospechoso en la pasada N;
|
|
90
|
+
State lo confirmó como bug real en la pasada M (o viceversa). Estos
|
|
91
|
+
hallazgos son los más confiables.
|
|
92
|
+
|
|
93
|
+
**Verification** indica la evidencia disponible:
|
|
94
|
+
|
|
95
|
+
- `Code trace`: el path al bug se puede seguir leyendo el código.
|
|
96
|
+
- `PoC test`: hay un caso de prueba que demuestra el comportamiento incorrecto.
|
|
97
|
+
- `Both`: lo más sólido; implica un test listo para agregar a la suite.
|
|
98
|
+
|
|
99
|
+
## Costo estimado
|
|
100
|
+
|
|
101
|
+
| Modo | Turnos aproximados |
|
|
102
|
+
|---|---|
|
|
103
|
+
| Loop completo, módulo pequeño (< 500 LOC) | 8-12 turnos |
|
|
104
|
+
| Loop completo, módulo mediano (500-2000 LOC) | 12-18 turnos |
|
|
105
|
+
| Loop completo, módulo grande (> 2000 LOC) | 18-30 turnos |
|
|
106
|
+
| Solo `--pass1` o `--pass2` | 4-8 turnos |
|
|
107
|
+
|
|
108
|
+
Para módulos mayores a 5000 LOC, usar `--modulo <ruta>` para acotar el scope.
|
|
109
|
+
Un loop sobre un módulo gigante puede tomar 30+ turnos sin garantía de que los
|
|
110
|
+
hallazgos sean más útiles que los de un subconjunto bien elegido.
|
|
111
|
+
|
|
112
|
+
## Ejemplos de invocación
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
/swl:nemesis # loop completo del proyecto
|
|
116
|
+
/swl:nemesis --modulo src/auth # acotado al módulo auth
|
|
117
|
+
/swl:nemesis --pass1 --modulo src/auth # solo Feynman sobre auth
|
|
118
|
+
/swl:nemesis --pass2 # solo State sobre findings existentes
|
|
119
|
+
/swl:nemesis --continue # retoma desde la última pasada guardada
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
<!-- Adaptado de nemesis-auditor-main bajo MIT License (transmissions11/nemesis-auditor) -->
|
package/comandos/swl/salud.md
CHANGED
|
@@ -33,6 +33,34 @@ echo "Reglas: $(ls reglas/*.md 2>/dev/null | wc -l)" && \
|
|
|
33
33
|
echo "Hooks: $(ls hooks/*.js 2>/dev/null | wc -l)"
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
+
## Paso 0.5 — Detección automática de tier del proyecto
|
|
37
|
+
|
|
38
|
+
Antes de ejecutar los pasos de diagnóstico, /swl:salud detecta el tier del proyecto contando archivos relevantes:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
find . -type f \
|
|
42
|
+
-not -path '*/node_modules/*' \
|
|
43
|
+
-not -path '*/.git/*' \
|
|
44
|
+
-not -path '*/dist/*' \
|
|
45
|
+
-not -path '*/build/*' \
|
|
46
|
+
-not -path '*/.next/*' \
|
|
47
|
+
-not -path '*/coverage/*' \
|
|
48
|
+
-not -path '*/__pycache__/*' \
|
|
49
|
+
-not -path '*/.cache/*' \
|
|
50
|
+
-not -path '*/.planning/sessions/*' \
|
|
51
|
+
| wc -l
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| Tier | Rango | Características esperadas |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| **Simple** | <500 archivos | 1 contributor, CI mínimo o ninguno. CLAUDE.md opcional. Skills/agentes opcionales. |
|
|
57
|
+
| **Standard** | 500–5,000 archivos | Equipo pequeño con CI. CLAUDE.md + 1-2 reglas. 2-4 skills. Hooks básicos. |
|
|
58
|
+
| **Complex** | >5,000 archivos | Múltiples contributors, CI activo. Setup completo de 6 capas: agentes + skills + reglas + hooks + instintos + memoria. |
|
|
59
|
+
|
|
60
|
+
El tier detectado se reporta al inicio del SALUD.md generado.
|
|
61
|
+
|
|
62
|
+
**Default ante ambigüedad**: si el conteo cae cerca de 500 (490-510) o 5000 (4900-5100), aplicar el tier superior. Es preferible diagnosticar de más que de menos.
|
|
63
|
+
|
|
36
64
|
## Paso 1 — Diagnóstico de agentes (determinista)
|
|
37
65
|
|
|
38
66
|
Ejecutar script Bash que verifica cada agente mecánicamente:
|
|
@@ -65,6 +93,8 @@ echo "Agentes: $ok OK, $warns advertencias, $errors errores"
|
|
|
65
93
|
|
|
66
94
|
Score de agentes = `(ok / total) * 100`
|
|
67
95
|
|
|
96
|
+
**Restricción de tier**: el análisis cruzado de agentes (cross-check entre `exclusiones` declaradas y rutas reales en `manifiestos/modulos.json`) se ejecuta solo en proyectos **Standard** o **Complex**. En tier Simple, reportar el conteo básico y omitir la validación cruzada.
|
|
97
|
+
|
|
68
98
|
## Paso 2 — Diagnóstico de skills (determinista)
|
|
69
99
|
|
|
70
100
|
```bash
|
|
@@ -109,6 +139,8 @@ grep -r "Skill(" agentes/ comandos/ 2>/dev/null | grep -o '"[^"]*"' | sort | uni
|
|
|
109
139
|
|
|
110
140
|
Score de skills = `((total - errors*10 - warns*2) / total) * 100`, mínimo 0
|
|
111
141
|
|
|
142
|
+
**Restricción de tier**: la detección de skills huérfanos (no referenciados en ningún agente ni comando) se ejecuta solo en proyectos **Standard** o **Complex**. En tier Simple, donde hay menos de 10 skills esperados, la verificación de huérfanos genera falsos positivos y se omite.
|
|
143
|
+
|
|
112
144
|
## Paso 3 — Diagnóstico de comandos (determinista)
|
|
113
145
|
|
|
114
146
|
```bash
|
|
@@ -413,3 +445,5 @@ Presenta resumen con los problemas más críticos. Si hay errores, listarlos tod
|
|
|
413
445
|
- Los scores son aritmética pura. No ajustar el score "porque parece un sistema sano".
|
|
414
446
|
- Si no hay git, omitir verificaciones dependientes y notar la omisión.
|
|
415
447
|
- Si detectas un patrón sistémico (mismo error en múltiples componentes), mencionarlo en recomendaciones.
|
|
448
|
+
|
|
449
|
+
<!-- Patrón de 3 tiers adaptado de Waza/skills/health bajo MIT License (tw93/Waza) -->
|
|
@@ -13,6 +13,7 @@ Eres el coordinador de verificación SWL. Tu trabajo es asegurar la calidad del
|
|
|
13
13
|
| Flag | Efecto |
|
|
14
14
|
|------|--------|
|
|
15
15
|
| (sin flag) | Verificación estándar: tests + linter + revisor-codigo-swl + revisor-seguridad-swl |
|
|
16
|
+
| `--full` | Añade 4 audits ejecutables en paralelo al flujo estándar: `code-profiler.js`, `pentest-scanner.js`, `dep-doctor.js` y secret-scanner. Produce un scorecard agregado 0-100 con thresholds de aprobación. Ver sección "Modo `--full`". |
|
|
16
17
|
| `--ultra` | Añade tercera pasada de **revisión profunda** con Opus 4.7 sobre los hallazgos de los dos revisores. Consolida, prioriza, detecta contradicciones entre reviewers y genera plan de acción. Ideal para fases críticas (auth, pagos, migraciones de schema, endpoints públicos). |
|
|
17
18
|
| `--solo-codigo` | Ejecuta solo revisor-codigo-swl (salta seguridad). Usar solo para refactors internos sin impacto externo. |
|
|
18
19
|
| `--solo-seguridad` | Ejecuta solo revisor-seguridad-swl (salta código). Usar para auditorías de seguridad focalizadas. |
|
|
@@ -576,6 +577,48 @@ El comando:
|
|
|
576
577
|
repetía 2+ veces por sesión con alta variación sobre el alcance exacto. Formalizar
|
|
577
578
|
con flag elimina los 2 mensajes de fricción y deja el scope auditable en el comando.
|
|
578
579
|
|
|
580
|
+
## Modo `--full` — Parallel Scorecard
|
|
581
|
+
|
|
582
|
+
Al pasar el flag `--full`, /swl:verificar lanza en paralelo 4 audits ejecutables además del flujo secuencial estándar (revisor-codigo-swl + revisor-seguridad-swl). Cada audit produce score 0-100 y findings JSON. El scorecard final agrega resultados con thresholds estándar.
|
|
583
|
+
|
|
584
|
+
### Audits paralelos invocados
|
|
585
|
+
|
|
586
|
+
| Tool | Detecta | Comando |
|
|
587
|
+
|---|---|---|
|
|
588
|
+
| `code-profiler.js` | N+1 queries, sync I/O en async, memory leaks, ReDoS, queries unbounded | `node scripts/audit-tools/code-profiler.js .` |
|
|
589
|
+
| `pentest-scanner.js` | XSS, SQLi, SSTI, CORS misconfig, JWT vulnerabilities, prototype pollution | `node scripts/audit-tools/pentest-scanner.js <target>` |
|
|
590
|
+
| `dep-doctor.js` | Deps no usadas, outdated, heavy deps con alternativa | `node scripts/audit-tools/dep-doctor.js .` |
|
|
591
|
+
| `secret-scanner` (hook existente) | Credenciales hardcodeadas | (vía hook) |
|
|
592
|
+
|
|
593
|
+
### Thresholds del scorecard
|
|
594
|
+
|
|
595
|
+
| Score | Status | Acción |
|
|
596
|
+
|---|---|---|
|
|
597
|
+
| ≥80 | READY | Listo para mergear |
|
|
598
|
+
| 60-79 | NEEDS WORK | Hallazgos menores; mergear bajo decisión informada |
|
|
599
|
+
| <60 | NOT READY | Hallazgos críticos; bloquear merge |
|
|
600
|
+
|
|
601
|
+
### Salida agregada
|
|
602
|
+
|
|
603
|
+
El comando produce un reporte tipo:
|
|
604
|
+
|
|
605
|
+
```
|
|
606
|
+
SCORECARD — Audits paralelos
|
|
607
|
+
─────────────────────────────────
|
|
608
|
+
code-profiler: 95 / 100 [READY]
|
|
609
|
+
pentest-scanner: 82 / 100 [READY]
|
|
610
|
+
dep-doctor: 70 / 100 [NEEDS WORK]
|
|
611
|
+
secret-scanner: 100 / 100 [READY]
|
|
612
|
+
─────────────────────────────────
|
|
613
|
+
Score promedio: 86.75 [READY]
|
|
614
|
+
Total findings: 3 (0 críticos, 2 mayores, 1 menor)
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
### Cuándo usar `--full` vs flujo estándar
|
|
618
|
+
|
|
619
|
+
- **Flujo estándar** (`/swl:verificar`): revisión cualitativa por agentes con criterio editorial. Adecuado para PRs pequeños/medianos donde la calidad arquitectónica importa más que cobertura mecánica.
|
|
620
|
+
- **Flag `--full`**: agrega análisis estático y dinámico ejecutable. Adecuado pre-release, audit de seguridad mensual, o features que tocan endpoints, dependencias o lógica compleja.
|
|
621
|
+
|
|
579
622
|
## Reglas de comportamiento
|
|
580
623
|
|
|
581
624
|
- NUNCA marques una fase como APROBADO si hay hallazgos CRÍTICOS de seguridad.
|
|
@@ -583,3 +626,5 @@ con flag elimina los 2 mensajes de fricción y deja el scope auditable en el com
|
|
|
583
626
|
- Si los tests fallan, es siempre CRÍTICO, sin excepción.
|
|
584
627
|
- Las SUGERENCIAS son de largo plazo — no bloquean el avance pero deben documentarse.
|
|
585
628
|
- Si el RESUMEN.md no existe, usa git diff para inferir el alcance. Nunca te bloquees.
|
|
629
|
+
|
|
630
|
+
<!-- El patrón parallel scorecard adaptado de Houseofmvps/ultraship /ship bajo MIT License -->
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feynman-auditor-swl
|
|
3
|
+
description: >
|
|
4
|
+
Auditor de bugs de lógica de negocio mediante la técnica Feynman: cuestiona
|
|
5
|
+
cada línea, cada orden de operaciones, cada presencia/ausencia de guard, y
|
|
6
|
+
cada asunción implícita. Language-agnostic (Python, TS, Go, Rust, Java, C#).
|
|
7
|
+
Cargar cuando se necesite revisión profunda de funciones individuales en
|
|
8
|
+
módulos críticos, especialmente tras un revisor-codigo-swl que pasó pero
|
|
9
|
+
donde sospechas que algo no está bien.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Cuándo cargar
|
|
13
|
+
|
|
14
|
+
- El módulo maneja dinero, inventario, permisos, o datos críticos irreversibles.
|
|
15
|
+
- `revisor-codigo-swl` pasó pero hay sospecha de bug de lógica de negocio.
|
|
16
|
+
- Nemesis está corriendo su Pasada 1.
|
|
17
|
+
- Se necesita revisión profunda de una función específica antes de merge.
|
|
18
|
+
|
|
19
|
+
# Cuándo NO cargar
|
|
20
|
+
|
|
21
|
+
- Para escaneo de vulnerabilidades conocidas (CVE, inyecciones) — usar `revisor-seguridad-swl`.
|
|
22
|
+
- Para revisión de estilo o cobertura de tests — usar `revisor-codigo-swl`.
|
|
23
|
+
- Para funciones de utilería sin estado (formateo, parsing puro).
|
|
24
|
+
- Como sustituto de tests de regresión.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# Feynman Auditor
|
|
29
|
+
|
|
30
|
+
Encuentra bugs de lógica de negocio cuestionando cada línea como si tuvieras que explicarle el código a alguien que no asume nada.
|
|
31
|
+
|
|
32
|
+
Las preguntas detalladas están en [recursos/preguntas-language-agnostic.md](recursos/preguntas-language-agnostic.md).
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Mentalidad de base
|
|
37
|
+
|
|
38
|
+
Antes de leer el primer archivo, adoptar esta perspectiva:
|
|
39
|
+
|
|
40
|
+
> "Este código tiene un bug. Mi trabajo es encontrarlo.
|
|
41
|
+
> No estoy aquí para confirmar que el código es correcto.
|
|
42
|
+
> Cada línea que no entiendo completamente es un sospechoso."
|
|
43
|
+
|
|
44
|
+
Dos fuentes principales de bugs de lógica:
|
|
45
|
+
|
|
46
|
+
1. **Bugs de guard ausente**: la condición correcta existe en función A pero falta en función B que hace lo mismo por un path diferente.
|
|
47
|
+
2. **Bugs de orden de operaciones**: el cálculo es correcto, pero se ejecuta antes o después del momento en que los datos son válidos.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Fase 0: Inventario de scope
|
|
52
|
+
|
|
53
|
+
Antes de auditar, mapear:
|
|
54
|
+
|
|
55
|
+
- ¿Qué módulos/archivos están en scope?
|
|
56
|
+
- ¿Cuáles son las funciones de punto de entrada (endpoints, handlers, métodos públicos)?
|
|
57
|
+
- ¿Qué datos persisten (BD, caché, archivos, estado en memoria)?
|
|
58
|
+
- ¿Qué actores pueden llamar qué funciones?
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Fase 1: Auditoría de funciones individuales
|
|
63
|
+
|
|
64
|
+
Para cada función no trivial, hacer las preguntas Q1–Q7 del archivo de recursos.
|
|
65
|
+
|
|
66
|
+
Categorías de preguntas:
|
|
67
|
+
- **Q1** — Propósito: ¿qué hace exactamente esta función y solo esta función?
|
|
68
|
+
- **Q2** — Orden: ¿importa el orden de estas operaciones?
|
|
69
|
+
- **Q3** — Consistencia cross-función: ¿qué tienen en común dos funciones que parecen similares?
|
|
70
|
+
- **Q4** — Asunciones implícitas: ¿qué asume este código sin verificarlo?
|
|
71
|
+
- **Q5** — Límites: ¿qué pasa en los extremos (cero, máximo, vacío, ya-existe)?
|
|
72
|
+
- **Q6** — Returns y errores: ¿qué devuelve esta función cuando algo falla?
|
|
73
|
+
- **Q7** — Interacciones externas: ¿qué puede pasar mal cuando se llama a otro sistema?
|
|
74
|
+
|
|
75
|
+
Registrar como sospechoso cualquier función donde una pregunta no tenga respuesta clara en el código.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Fase 2: Auditoría cross-función
|
|
80
|
+
|
|
81
|
+
Buscar divergencias entre funciones que deberían comportarse igual:
|
|
82
|
+
|
|
83
|
+
- ¿Función A y B hacen lo mismo pero una tiene un guard que la otra no tiene?
|
|
84
|
+
- ¿La función de creación inicializa todos los campos que la función de lectura usa?
|
|
85
|
+
- ¿El path de happy path y el path de error manejan el estado de la misma manera?
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Fase 3: Síntesis de hallazgos
|
|
90
|
+
|
|
91
|
+
Convertir sospechosos en hallazgos concretos:
|
|
92
|
+
|
|
93
|
+
Para cada sospechoso, construir:
|
|
94
|
+
1. La pregunta Feynman que lo identificó
|
|
95
|
+
2. La asunción que el código hace implícitamente
|
|
96
|
+
3. El contraejemplo concreto que rompe esa asunción
|
|
97
|
+
4. La consecuencia observable del bug
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Fase 4: Verificación
|
|
102
|
+
|
|
103
|
+
Todo hallazgo CRÍTICO, ALTO y MEDIO debe verificarse antes del reporte final.
|
|
104
|
+
|
|
105
|
+
**Patrón de falsos positivos frecuentes:**
|
|
106
|
+
- El guard existe pero en un nivel superior (middleware, decorator, caller).
|
|
107
|
+
- El orden parece incorrecto pero hay un comentario que explica el diseño intencional.
|
|
108
|
+
- La función parece no validar, pero el tipo de dato ya garantiza el invariante.
|
|
109
|
+
|
|
110
|
+
**Formato de salida**: `.audit/findings/feynman-passN.md`
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Adaptación por lenguaje
|
|
115
|
+
|
|
116
|
+
| Concepto | Python | TypeScript | Go | Rust | Java | C# |
|
|
117
|
+
|---------|--------|------------|-----|------|------|-----|
|
|
118
|
+
| Actor | `request.user` | `req.user` / `userId` | `ctx.UserID` | `actor_id` | `principal` | `User.Identity` |
|
|
119
|
+
| Guard | decorador / `if not user:` | middleware / `if (!user)` | `if ctx.UserID == ""` | `if actor_id.is_none()` | `@PreAuthorize` | `[Authorize]` |
|
|
120
|
+
| Mutación interna | método privado `_fn` | método privado | función local | `pub(crate) fn` | método `private` | método `private` |
|
|
121
|
+
| Transacción | `with db.begin():` | `await trx.begin()` | `tx, _ := db.Begin()` | `conn.execute("BEGIN")` | `@Transactional` | `using var tx =` |
|
|
122
|
+
|
|
123
|
+
<!-- Adaptado de nemesis-auditor-main bajo MIT License (https://github.com/0xiehnnkta/nemesis-auditor) -->
|