@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.
- package/CLAUDE.md +8 -8
- package/README.md +13 -13
- package/agentes/accesibilidad-wcag-swl.md +3 -3
- package/agentes/auto-evolucion-swl.md +908 -908
- package/agentes/disenador-ui-swl.md +6 -5
- package/agentes/frontend-angular-swl.md +2 -2
- package/agentes/frontend-css-swl.md +2 -2
- package/agentes/frontend-react-swl.md +4 -4
- package/agentes/frontend-swl.md +6 -6
- package/agentes/investigador-ux-swl.md +5 -5
- package/agentes/orquestador-swl.md +96 -8
- package/agentes/perfilador-usuario-swl.md +308 -308
- package/agentes/producto-prd-swl.md +1 -1
- package/agentes/red-team-swl.md +218 -218
- package/agentes/revisor-codigo-swl.md +34 -10
- package/agentes/revisor-seguridad-swl.md +7 -0
- package/agentes/tdd-qa-swl.md +39 -2
- package/comandos/swl/actualizar.md +1 -1
- package/comandos/swl/aprender.md +2 -2
- package/comandos/swl/aprobar-plan.md +152 -0
- package/comandos/swl/autoresearch.md +102 -6
- package/comandos/swl/ayuda.md +3 -3
- package/comandos/swl/discutir-fase.md +20 -2
- package/comandos/swl/ejecutar-fase.md +53 -6
- package/comandos/swl/evolucionar.md +1 -1
- package/comandos/swl/inbox.md +1 -1
- package/comandos/swl/instalar.md +1 -1
- package/comandos/swl/nemesis.md +42 -1
- package/comandos/swl/planear-fase.md +25 -1
- package/comandos/swl/plugins.md +1 -1
- package/comandos/swl/predecir.md +139 -0
- package/comandos/swl/release.md +1 -1
- package/comandos/swl/status.md +279 -0
- package/comandos/swl/verificar.md +75 -7
- package/habilidades/ai-runtime-security/SKILL.md +1 -1
- package/habilidades/angular-moderno/SKILL.md +44 -1
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
- package/habilidades/autoresearch/SKILL.md +15 -1
- package/habilidades/benchmark-memoria/SKILL.md +1 -1
- package/habilidades/calidad-contract-testing/SKILL.md +165 -0
- package/habilidades/calidad-mutation-testing/SKILL.md +170 -0
- package/habilidades/changelog-generator/SKILL.md +9 -2
- package/habilidades/changelog-generator/scripts/parse-commits.js +12 -1
- package/habilidades/checklist-seguridad/SKILL.md +29 -1
- package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -0
- package/habilidades/css-moderno/SKILL.md +3 -1
- package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
- package/habilidades/drift-detection/SKILL.md +179 -179
- package/habilidades/ejecutar-fase/SKILL.md +64 -14
- package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
- package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
- package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
- package/habilidades/fastapi-experto/SKILL.md +56 -5
- package/habilidades/harness-claude-code/SKILL.md +10 -7
- package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
- package/habilidades/instalar-sistema/SKILL.md +3 -3
- package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
- package/habilidades/patrones-python/SKILL.md +8 -5
- package/habilidades/perfil-usuario/SKILL.md +200 -200
- package/habilidades/planear-fase/SKILL.md +25 -4
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
- package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
- package/habilidades/proceso-debate-adversarial/SKILL.md +164 -0
- package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -0
- package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -0
- package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -0
- package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -0
- package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
- package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
- package/habilidades/swl-claudemd/SKILL.md +50 -210
- package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
- package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
- package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
- package/habilidades/swl-dashboard/SKILL.md +9 -9
- package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
- package/habilidades/tdd-workflow/SKILL.md +58 -5
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +3 -3
- package/hooks/calidad-pre-commit.js +340 -3
- package/hooks/ciclo-evolucion-subagente.js +26 -0
- package/hooks/ciclo-evolucion.js +26 -0
- package/hooks/contexto-iteracion.js +144 -0
- package/hooks/extraccion-aprendizajes.js +13 -0
- package/hooks/lib/ciclo-evolucion.js +47 -0
- package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
- package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
- package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
- package/hooks/lib/evolution-tracker.js +24 -3
- package/hooks/lib/loop-telemetry.js +321 -0
- package/hooks/notificacion-telegram.js +11 -3
- package/hooks/spec-gate.js +211 -0
- package/hooks/tdd-gate.js +241 -0
- package/hooks/validar-intent-spec.js +30 -10
- package/llms.txt +29 -0
- package/manifiestos/hooks-config.json +36 -18
- package/manifiestos/modulos.json +23 -14
- package/manifiestos/skills-lock.json +100 -72
- package/package.json +4 -3
- package/plugin.json +9 -10
- package/reglas/accesibilidad.md +10 -0
- package/reglas/api-diseno.md +9 -0
- package/reglas/arquitectura.evolved.json +7 -0
- package/reglas/arquitectura.md +65 -0
- package/reglas/auditorias-documentales-estructurales.md +7 -0
- package/reglas/cloud-infra.md +8 -0
- package/reglas/fragmentos-compartidos.md +5 -0
- package/reglas/gobernanza.md +4 -4
- package/reglas/hooks.md +6 -0
- package/reglas/intent-engineering.md +4 -0
- package/reglas/markitdown.md +8 -0
- package/reglas/memoria-consolidada.md +1 -1
- package/reglas/patrones.md +6 -0
- package/reglas/registro-componentes-nuevos.md +10 -1
- package/reglas/seguridad-agentes.md +1 -1
- package/reglas/seguridad.evolved.json +7 -0
- package/reglas/seguridad.md +144 -0
- package/reglas/skills-estandar.md +6 -0
- package/reglas/testing.md +7 -0
- package/reglas/tests-cleanup.md +4 -0
- package/reglas/usar-sistema-swl.md +1 -1
- package/scripts/generar-inventario.js +64 -1
- package/scripts/instalador.js +32 -2
- package/scripts/lib/gitignore-manifest.js +29 -1
- package/scripts/lib/plan-lock.js +275 -0
- package/scripts/migrar-fase-dominio.js +0 -1
- package/scripts/smoke-test.js +24 -2
- package/scripts/verificar-trazabilidad.js +292 -0
- package/agentes/ux-disenador-swl.md +0 -503
- package/comandos/swl/dashboard.md +0 -146
- package/comandos/swl/evolucion-estado.md +0 -191
- package/comandos/swl/metricas.md +0 -342
- package/comandos/swl/salud.md +0 -481
- package/reglas/verificar-citas-temporales.md +0 -139
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: calidad-contract-testing
|
|
3
|
+
description: >
|
|
4
|
+
Contract testing: verificar que la implementación honra el contrato declarado
|
|
5
|
+
en la spec (Pydantic, Zod, JSON Schema, OpenAPI/AsyncAPI, protobuf) y que
|
|
6
|
+
consumidor y proveedor de una API no divergen. Cubre herramientas por stack
|
|
7
|
+
(schemathesis, Dredd, Pact, zod, Pydantic, openapi-typescript), las dos
|
|
8
|
+
familias de contract testing (schema-based property testing y
|
|
9
|
+
consumer-driven contracts), generación de tests desde el schema del PLAN, y
|
|
10
|
+
uso como gate de verificación. Cargar cuando el PLAN declara schemas como
|
|
11
|
+
parte de la spec, al integrar dos servicios con un contrato compartido, o al
|
|
12
|
+
detectar drift entre lo que la API documenta y lo que devuelve.
|
|
13
|
+
version: "1.0.0"
|
|
14
|
+
herramientasPermitidas: [Read, Bash, Grep, Glob]
|
|
15
|
+
exclusiones:
|
|
16
|
+
- "No cargar para tests unitarios de lógica de negocio — eso es tdd-workflow; el contract testing verifica el límite spec↔implementación, no la lógica interna."
|
|
17
|
+
- "No cargar si no hay un contrato declarado (schema, OpenAPI, Pact) — sin contrato no hay nada que verificar; primero declarar el schema en el PLAN."
|
|
18
|
+
- "No cargar para validación de input en runtime — eso es responsabilidad del framework (Pydantic/Zod en el endpoint); el contract testing corre en CI, no en cada request."
|
|
19
|
+
evolvable: true
|
|
20
|
+
---
|
|
21
|
+
# Contract Testing — La Spec que se Verifica a Sí Misma
|
|
22
|
+
|
|
23
|
+
La cobertura responde "¿qué código ejecutan los tests?". El mutation testing,
|
|
24
|
+
"¿los tests detectarían un bug?". El contract testing responde la pregunta del
|
|
25
|
+
límite: **"¿la implementación honra el contrato que la spec promete?"**. Un
|
|
26
|
+
endpoint con 90% de cobertura puede devolver un campo con el tipo equivocado,
|
|
27
|
+
omitir uno requerido o aceptar un payload que el schema prohíbe — los tests
|
|
28
|
+
unitarios no lo ven porque usan los mismos supuestos que el código.
|
|
29
|
+
|
|
30
|
+
**Principio**: el schema declarado en el PLAN (Pydantic/Zod/JSON Schema/OpenAPI)
|
|
31
|
+
ES parte de la spec. Un contrato que no se verifica es documentación que miente.
|
|
32
|
+
|
|
33
|
+
## Cuándo cargar este skill
|
|
34
|
+
|
|
35
|
+
- El PLAN de la fase declara schemas (Pydantic, Zod, JSON Schema, OpenAPI) como
|
|
36
|
+
entregable — esos schemas son contrato verificable, no decoración.
|
|
37
|
+
- Integración de dos servicios (frontend↔backend, microservicio↔microservicio)
|
|
38
|
+
con un contrato compartido que ambos lados deben respetar.
|
|
39
|
+
- Drift detectado: la API documenta un campo que ya no devuelve, o devuelve uno
|
|
40
|
+
no documentado; un cliente generado rompe tras un cambio de backend.
|
|
41
|
+
- Configurar contract testing como paso de `/swl:verificar` o gate de `tdd-qa-swl`.
|
|
42
|
+
|
|
43
|
+
## Las dos familias de contract testing
|
|
44
|
+
|
|
45
|
+
| Familia | Pregunta | Cuándo |
|
|
46
|
+
|---------|----------|--------|
|
|
47
|
+
| **Schema-based / property testing** | ¿La API respeta su propio schema OpenAPI ante cualquier input válido? | API con spec OpenAPI; un solo equipo controla ambos lados |
|
|
48
|
+
| **Consumer-driven contracts (CDC)** | ¿El proveedor sigue cumpliendo lo que cada consumidor concreto espera? | Múltiples consumidores, equipos separados, despliegue independiente |
|
|
49
|
+
|
|
50
|
+
Schema-based es más barato (un solo artefacto, la spec) y cubre el 80% del valor
|
|
51
|
+
en proyectos de un equipo. CDC paga su complejidad cuando hay equipos y
|
|
52
|
+
despliegues independientes que pueden romperse mutuamente sin saberlo.
|
|
53
|
+
|
|
54
|
+
## Cómo funciona (schema-based)
|
|
55
|
+
|
|
56
|
+
1. El schema (OpenAPI/Pydantic/Zod) define el contrato: rutas, métodos, forma de
|
|
57
|
+
request y response, campos requeridos, tipos, constraints.
|
|
58
|
+
2. La herramienta **genera casos** desde el schema (property-based: cientos de
|
|
59
|
+
payloads válidos e inválidos) y los lanza contra la API real.
|
|
60
|
+
3. Verifica que cada response **conforme al schema**: status esperado, forma,
|
|
61
|
+
tipos, requeridos presentes, sin campos extra prohibidos.
|
|
62
|
+
4. Reporta violaciones: el contrato dice X, la implementación devolvió Y.
|
|
63
|
+
|
|
64
|
+
## Herramientas por stack
|
|
65
|
+
|
|
66
|
+
Antes de instalar, verificar versión vigente con Context7
|
|
67
|
+
(regla `usar-context7.md`) — los nombres de paquete cambian entre majors.
|
|
68
|
+
|
|
69
|
+
| Stack | Herramienta | Familia | Comando típico |
|
|
70
|
+
|-------|------------|---------|----------------|
|
|
71
|
+
| OpenAPI (cualquier lenguaje) | `schemathesis` | schema-based | `schemathesis run http://localhost:8000/openapi.json` |
|
|
72
|
+
| OpenAPI (Node) | Dredd | schema-based | `dredd openapi.yaml http://localhost:3000` |
|
|
73
|
+
| Python | Pydantic v2 (`model_validate`) | schema (límite) | validar request/response contra el modelo en el test |
|
|
74
|
+
| JS/TS | Zod (`.parse`/`.safeParse`) | schema (límite) | parsear la response contra el schema en el test |
|
|
75
|
+
| TS desde OpenAPI | `openapi-typescript` + tsc | schema (compile-time) | generar tipos y dejar que el compilador detecte drift |
|
|
76
|
+
| Multi-equipo (poliglota) | Pact (`@pact-foundation/pact`, `pact-python`) | CDC | consumer genera pacto → provider lo verifica |
|
|
77
|
+
| gRPC | `buf breaking` / protovalidate | schema-based | `buf breaking --against '.git#branch=main'` |
|
|
78
|
+
|
|
79
|
+
## Generar tests desde el schema del PLAN
|
|
80
|
+
|
|
81
|
+
Cuando `planear-fase` declara un schema como entregable, la tarea que lo
|
|
82
|
+
implementa se verifica generando el contract test, no escribiéndolo a mano:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
# OpenAPI + FastAPI: schemathesis deriva los casos del propio /openapi.json
|
|
86
|
+
schemathesis run http://localhost:8000/openapi.json --checks all
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```python
|
|
90
|
+
# Pydantic como contrato en el test de integración:
|
|
91
|
+
def test_endpoint_respeta_contrato():
|
|
92
|
+
# verifica: REQ-NN
|
|
93
|
+
r = client.get("/facturas/1")
|
|
94
|
+
FacturaResponse.model_validate(r.json()) # falla si la forma no conforma
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Zod como contrato del lado consumidor:
|
|
99
|
+
const FacturaSchema = z.object({ id: z.number(), total: z.number(), vigencia: z.string() });
|
|
100
|
+
const data = FacturaSchema.parse(await res.json()); // throw si el backend cambió la forma
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Umbrales y cuándo aplica el gate
|
|
104
|
+
|
|
105
|
+
| Contexto | Gate | Justificación |
|
|
106
|
+
|----------|------|---------------|
|
|
107
|
+
| API pública o consumida por otro equipo | obligatorio: 0 violaciones de contrato | Un drift rompe consumidores en silencio |
|
|
108
|
+
| Integración interna front↔back del mismo proyecto | recomendado: schema-based en CI | Barato con OpenAPI ya existente; atrapa el campo renombrado |
|
|
109
|
+
| Endpoint interno sin consumidores externos | opcional | El esfuerzo de mantener pactos no paga |
|
|
110
|
+
|
|
111
|
+
No imponer CDC donde schema-based basta: Pact con broker es infraestructura que
|
|
112
|
+
solo paga con equipos y despliegues independientes.
|
|
113
|
+
|
|
114
|
+
## Uso como gate de verificación
|
|
115
|
+
|
|
116
|
+
En `/swl:verificar`, tras los tests unitarios: si la fase declaró schemas en el
|
|
117
|
+
PLAN, correr el contract test contra la API real (entorno de test) y tratar cada
|
|
118
|
+
violación de contrato como hallazgo CRÍTICO — la implementación contradice la
|
|
119
|
+
spec aprobada. En `tdd-qa-swl` es gate opt-in: requiere la API levantable en CI.
|
|
120
|
+
|
|
121
|
+
## Cuándo NO cargar
|
|
122
|
+
|
|
123
|
+
- No hay contrato declarado (ni OpenAPI, ni schema, ni Pact) — primero declarar
|
|
124
|
+
el schema en el PLAN; sin contrato el contract testing no tiene qué verificar.
|
|
125
|
+
- Lógica de negocio pura sin límite de API — eso es `tdd-workflow`/`testing-*`.
|
|
126
|
+
- Prototipo de descarte donde la API cambia cada hora — el contrato se
|
|
127
|
+
estabiliza primero, luego se verifica.
|
|
128
|
+
|
|
129
|
+
## Gotchas / Errores comunes no obvios
|
|
130
|
+
|
|
131
|
+
- **Schema permisivo da falso verde**: un OpenAPI con `additionalProperties: true`
|
|
132
|
+
y casi todo opcional "conforma" con cualquier response — el contract test pasa
|
|
133
|
+
sin verificar nada. Causa: schema generado laxo (FastAPI sin `model_config`
|
|
134
|
+
estricto, Zod con `.passthrough()`). Solución: el contrato debe ser tan
|
|
135
|
+
estricto como la promesa real — requeridos marcados, `additionalProperties:
|
|
136
|
+
false` donde aplica.
|
|
137
|
+
- **Property testing encuentra "bugs" en el schema, no en el código**: schemathesis
|
|
138
|
+
genera un edge case válido por schema que el código nunca contempló (string de
|
|
139
|
+
10000 chars, número en el límite). A veces el bug es del schema (demasiado
|
|
140
|
+
permisivo), no del endpoint. Diagnosticar antes de "arreglar" el código.
|
|
141
|
+
- **Pact sin broker compartido es teatro**: si consumer y provider verifican
|
|
142
|
+
contra pactos en ramas distintas sin un broker central que versione, cada lado
|
|
143
|
+
pasa en aislamiento y rompen juntos en producción. CDC sin broker = falsa
|
|
144
|
+
seguridad; usar schema-based si no hay broker.
|
|
145
|
+
- **Tipos generados que nadie recompila**: `openapi-typescript` genera tipos al
|
|
146
|
+
día del commit; si el pipeline no los regenera contra la spec viva, el
|
|
147
|
+
compilador valida contra un contrato fósil. El gate debe regenerar y comparar,
|
|
148
|
+
no confiar en el archivo commiteado (regla `verificar-citas-normativas.md §
|
|
149
|
+
comentarios temporales`).
|
|
150
|
+
- **Contract test que levanta la app real es lento y flaky en CI**: si requiere
|
|
151
|
+
BD y servicios, hereda toda su fragilidad. Para schema-based puro, preferir el
|
|
152
|
+
modo que valida la spec estáticamente o contra un mock conformante antes de
|
|
153
|
+
exigir la app completa levantada.
|
|
154
|
+
|
|
155
|
+
## Anti-patrones
|
|
156
|
+
|
|
157
|
+
- **Schema decorativo**: declarar OpenAPI/Pydantic y nunca verificar que la
|
|
158
|
+
implementación lo cumple — documentación que diverge en silencio.
|
|
159
|
+
- **CDC donde basta schema-based**: montar Pact + broker para un front↔back de
|
|
160
|
+
un solo equipo; complejidad sin retorno.
|
|
161
|
+
- **Verificar el contrato contra un mock que usa el mismo schema**: tautología —
|
|
162
|
+
el mock conforma por construcción; el contract test debe correr contra la
|
|
163
|
+
implementación real.
|
|
164
|
+
- **Tratar la violación de contrato como warning**: si la API rompe su contrato,
|
|
165
|
+
un consumidor ya está roto; es CRÍTICO, no observación.
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: calidad-mutation-testing
|
|
3
|
+
description: >
|
|
4
|
+
Mutation testing: medir la calidad real de una suite de tests inyectando
|
|
5
|
+
mutantes (cambios sintácticos pequeños) en el código y verificando que los
|
|
6
|
+
tests los maten. Cubre herramientas por stack (Stryker, mutmut, cargo-mutants,
|
|
7
|
+
PIT, Stryker.NET, Infection), interpretación de mutantes sobrevivientes,
|
|
8
|
+
modo incremental para que el costo sea viable, y uso del mutation score como
|
|
9
|
+
métrica Verify/Guard en loops de autoresearch o como gate opcional de
|
|
10
|
+
tdd-qa-swl. Cargar cuando la cobertura de líneas es alta pero se sospecha de
|
|
11
|
+
asserts débiles, al endurecer la suite de un módulo crítico, o al configurar
|
|
12
|
+
el gate de mutación en CI.
|
|
13
|
+
version: "1.0.0"
|
|
14
|
+
herramientasPermitidas: [Read, Bash, Grep, Glob]
|
|
15
|
+
exclusiones:
|
|
16
|
+
- "No cargar si la suite no está verde y estable — el mutation testing presupone tests deterministas que pasan; con tests flaky el score es ruido."
|
|
17
|
+
- "No cargar para subir cobertura de líneas — eso es tdd-workflow; la mutación mide calidad de asserts, no cantidad de tests."
|
|
18
|
+
- "No cargar en proyectos sin tests — primero tdd-qa-swl construye la suite; mutar sin tests produce 100% de sobrevivientes sin información."
|
|
19
|
+
evolvable: true
|
|
20
|
+
---
|
|
21
|
+
# Mutation Testing — La Suite que Vigila a la Suite
|
|
22
|
+
|
|
23
|
+
La cobertura de líneas responde "¿qué código ejecutan los tests?". El mutation
|
|
24
|
+
testing responde la pregunta importante: **"¿los tests detectarían un bug?"**.
|
|
25
|
+
Una suite con 90% de cobertura y asserts débiles pasa el gate de `pruebas.md`
|
|
26
|
+
sin proteger nada — los mutantes sobrevivientes lo exponen.
|
|
27
|
+
|
|
28
|
+
**Principio**: un test que no mata mutantes documenta ejecución, no comportamiento.
|
|
29
|
+
|
|
30
|
+
## Cuándo cargar este skill
|
|
31
|
+
|
|
32
|
+
- Módulo crítico (pagos, auth, cálculo) con cobertura alta pero bugs que se
|
|
33
|
+
filtran a producción — sospecha de asserts débiles.
|
|
34
|
+
- Cerrar el ciclo TDD estilo Uncle Bob: spec → tests → código → revisión →
|
|
35
|
+
**mutación** como verificación final de la suite.
|
|
36
|
+
- Configurar mutation score como métrica de un loop `/swl:autoresearch --codigo`
|
|
37
|
+
o como gate opcional en CI.
|
|
38
|
+
- Auditar la suite que entrega `tdd-qa-swl` antes de declarar una fase verde.
|
|
39
|
+
|
|
40
|
+
## Cómo funciona
|
|
41
|
+
|
|
42
|
+
1. La herramienta genera **mutantes**: copias del código con un cambio mínimo
|
|
43
|
+
(`>` → `>=`, `+` → `-`, borrar una llamada, `true` → `false`).
|
|
44
|
+
2. Corre la suite contra cada mutante.
|
|
45
|
+
3. Clasifica: **muerto** (algún test falló — bien), **sobreviviente** (la suite
|
|
46
|
+
pasó con el bug inyectado — gap real), **timeout** (cuenta como muerto),
|
|
47
|
+
**no cubierto** (ningún test lo ejecuta — gap de cobertura clásico).
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
mutation score = mutantes muertos / (mutantes totales − equivalentes) × 100
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Herramientas por stack
|
|
54
|
+
|
|
55
|
+
Antes de instalar, verificar versión vigente con Context7
|
|
56
|
+
(regla `usar-context7.md`) — los nombres de paquete cambian entre majors.
|
|
57
|
+
|
|
58
|
+
| Stack | Herramienta | Comando típico | Score en JSON |
|
|
59
|
+
|-------|------------|----------------|---------------|
|
|
60
|
+
| JS/TS | Stryker (`@stryker-mutator/core`) | `npx stryker run` | `reports/mutation/mutation.json` → `.thresholds` / score en summary |
|
|
61
|
+
| Python | `mutmut` | `mutmut run && mutmut results` | `mutmut junitxml` o parsear `mutmut results` |
|
|
62
|
+
| Python (alterno) | `cosmic-ray` | `cosmic-ray init/exec/dump` | `cr-report --json` |
|
|
63
|
+
| Rust | `cargo-mutants` | `cargo mutants` | `mutants.out/outcomes.json` |
|
|
64
|
+
| Java/Kotlin | PIT (`pitest`) | `mvn org.pitest:pitest-maven:mutationCoverage` | `target/pit-reports/mutations.xml` |
|
|
65
|
+
| C#/.NET | Stryker.NET (`dotnet-stryker`) | `dotnet stryker` | `StrykerOutput/**/mutation-report.json` |
|
|
66
|
+
| PHP | Infection | `vendor/bin/infection` | `infection-log.json` → MSI |
|
|
67
|
+
| Go | `gremlins` | `gremlins unleash` | salida estructurada con `--output` |
|
|
68
|
+
|
|
69
|
+
## Hacer viable el costo — modo incremental SIEMPRE
|
|
70
|
+
|
|
71
|
+
Mutar el proyecto completo es O(mutantes × duración de suite). En un repo
|
|
72
|
+
mediano son horas. Reglas para que sea operable:
|
|
73
|
+
|
|
74
|
+
- **Mutar solo lo que cambió**: Stryker `--since`/modo incremental, `mutmut`
|
|
75
|
+
con `--paths-to-mutate`, `cargo mutants --in-diff <(git diff main)`. El gate
|
|
76
|
+
de PR muta el diff, no el repo.
|
|
77
|
+
- **Acotar al módulo crítico**: configurar `mutate:` solo sobre
|
|
78
|
+
`src/pagos/**`, no sobre todo `src/`. El score global de un repo grande es
|
|
79
|
+
una métrica vanidosa; el score del módulo de dinero es accionable.
|
|
80
|
+
- **Suite rápida primero**: si la suite tarda >2 min, mutar solo con los tests
|
|
81
|
+
unitarios del módulo (los runners permiten filtrar la suite que ejecutan).
|
|
82
|
+
- **Paralelizar**: todos los runners soportan concurrencia
|
|
83
|
+
(`--concurrency`, `--jobs`); default razonable: núcleos − 1.
|
|
84
|
+
|
|
85
|
+
## Interpretar mutantes sobrevivientes
|
|
86
|
+
|
|
87
|
+
Cada sobreviviente es una de tres cosas — diagnosticar antes de actuar:
|
|
88
|
+
|
|
89
|
+
| Diagnóstico | Señal | Acción |
|
|
90
|
+
|-------------|-------|--------|
|
|
91
|
+
| **Assert débil** | el test ejecuta la línea pero no verifica el resultado mutado | Endurecer el assert (caso típico: verifica que no lanza, no el valor) |
|
|
92
|
+
| **Test faltante** | ningún test cubre el comportamiento de esa rama | Escribir test de frontera dirigido al mutante (`tdd-qa-swl`) |
|
|
93
|
+
| **Mutante equivalente** | el mutante no cambia el comportamiento observable (ej: optimización interna) | Excluirlo/anotarlo — NO escribir un test artificial para matarlo |
|
|
94
|
+
|
|
95
|
+
Anti-patrón crítico: escribir tests que asertan detalles de implementación
|
|
96
|
+
solo para matar mutantes — eso acopla la suite y degrada el refactor. El
|
|
97
|
+
mutante manda la pregunta; el test responde al **comportamiento**.
|
|
98
|
+
|
|
99
|
+
## Umbrales recomendados
|
|
100
|
+
|
|
101
|
+
| Contexto | Score objetivo | Justificación |
|
|
102
|
+
|----------|---------------|---------------|
|
|
103
|
+
| Módulo crítico (dinero, auth, cálculo regulatorio) | ≥ 85% | Un bug aquí cuesta más que el CI lento |
|
|
104
|
+
| Lógica de negocio estándar | ≥ 70% | Equilibrio costo/valor |
|
|
105
|
+
| Glue code, configs, controllers delgados | sin gate | El esfuerzo no paga; cubrir con tests de integración |
|
|
106
|
+
|
|
107
|
+
No imponer un score global de repo: produce esfuerzo uniforme sobre código de
|
|
108
|
+
valor desigual. Gates por módulo, declarados en la config del runner.
|
|
109
|
+
|
|
110
|
+
## Uso como métrica en loops SWL
|
|
111
|
+
|
|
112
|
+
El mutation score es la métrica ideal para `/swl:autoresearch --codigo` porque
|
|
113
|
+
es numérica, determinista y su Guard natural es la propia suite:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
Goal: subir mutation score de src/pagos/ de 62% a 85%
|
|
117
|
+
Scope: tests/pagos/**
|
|
118
|
+
Metric: mutation score (higher_is_better)
|
|
119
|
+
Verify: npx stryker run --mutate "src/pagos/**" --incremental && <extraer score del JSON>
|
|
120
|
+
Guard: npm test (la suite completa sigue verde)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Cada iteración: agregar/endurecer UN test → correr Verify → keep si el score
|
|
124
|
+
sube y el Guard pasa. Registrar con `hooks/lib/loop-telemetry.js`.
|
|
125
|
+
|
|
126
|
+
**Gate opcional en tdd-qa-swl**: tras alcanzar cobertura ≥80%, correr mutación
|
|
127
|
+
incremental sobre el diff de la fase; sobrevivientes con diagnóstico "assert
|
|
128
|
+
débil" o "test faltante" se atienden antes del cierre (regla
|
|
129
|
+
`arreglar-al-detectar.md`). Es opt-in: requiere runner instalado y suite <2 min.
|
|
130
|
+
|
|
131
|
+
## Cuándo NO cargar
|
|
132
|
+
|
|
133
|
+
- Suite roja o flaky — primero estabilizar (`pruebas.md § deterministas`); el
|
|
134
|
+
mutation testing amplifica el ruido de tests no deterministas.
|
|
135
|
+
- Prototipo o spike de descarte — el costo del setup no se recupera.
|
|
136
|
+
- Presupuesto de CI ya saturado — correr mutación local/nightly, no por PR,
|
|
137
|
+
hasta resolver el presupuesto.
|
|
138
|
+
|
|
139
|
+
## Gotchas / Errores comunes no obvios
|
|
140
|
+
|
|
141
|
+
- **El score baja al agregar código nuevo bien testeado**: el denominador
|
|
142
|
+
crece con mutantes del código nuevo; si el módulo viejo tenía deuda, el
|
|
143
|
+
score agregado oscila. Causa: medir score global en vez de por módulo/diff.
|
|
144
|
+
Solución: gates incrementales (`--since`, `--in-diff`) — el código nuevo se
|
|
145
|
+
evalúa contra su propio diff.
|
|
146
|
+
- **Timeouts contados como éxito inflan el score**: un mutante que cuelga la
|
|
147
|
+
suite cuenta como "muerto" aunque ningún assert lo detectó. Si el módulo
|
|
148
|
+
tiene loops sensibles, revisar el desglose `timeout` vs `killed` antes de
|
|
149
|
+
celebrar — un ratio de timeouts >10% amerita bajar el timeout factor.
|
|
150
|
+
- **Mutación sobre código generado**: mutar archivos generados (protobuf,
|
|
151
|
+
cliente OpenAPI, migraciones) quema horas sin información. Excluirlos
|
|
152
|
+
explícitamente en la config del runner desde el día uno.
|
|
153
|
+
- **mutmut y el cache stale**: `mutmut` cachea resultados en `.mutmut-cache`;
|
|
154
|
+
tras un refactor grande el cache puede reportar resultados de código que ya
|
|
155
|
+
no existe. Ante números inverosímiles: borrar el cache y re-correr.
|
|
156
|
+
- **Stryker incremental tras rebase**: el archivo `.stryker-tmp`/incremental
|
|
157
|
+
referencia commits que el rebase reescribió — el modo incremental se
|
|
158
|
+
degrada a corrida completa sin avisar. Presupuestar la primera corrida
|
|
159
|
+
post-rebase como completa.
|
|
160
|
+
|
|
161
|
+
## Anti-patrones
|
|
162
|
+
|
|
163
|
+
- **Tests escritos para matar mutantes, no para verificar comportamiento** —
|
|
164
|
+
acoplan la suite a la implementación.
|
|
165
|
+
- **Score global de repo como KPI de equipo** — métrica vanidosa; gates por
|
|
166
|
+
módulo crítico.
|
|
167
|
+
- **Correr mutación completa en cada PR** — CI de horas; incremental por diff
|
|
168
|
+
en PR, completa nightly.
|
|
169
|
+
- **Ignorar el desglose y mirar solo el porcentaje** — los sobrevivientes
|
|
170
|
+
individuales son la información; el score es solo el resumen.
|
|
@@ -8,7 +8,12 @@ description: >
|
|
|
8
8
|
de conformidad para decidir fallback manual. Cargar en /swl:release Paso 7
|
|
9
9
|
cuando hay commits Conventional, o manualmente para previsualizar el
|
|
10
10
|
changelog antes de un release.
|
|
11
|
-
version: 1.
|
|
11
|
+
version: 1.1.0
|
|
12
|
+
evolved: true
|
|
13
|
+
evolved-from: "1.0.0"
|
|
14
|
+
evolved-at: "2026-06-11"
|
|
15
|
+
evolved-by: "fase-10-slice-5"
|
|
16
|
+
evolved-note: "v1.1.0: el parser CC tolera el prefijo de trazabilidad [T-NN]/[REQ-NN] de la convención de ejecutar-fase — commits con prefijo de tarea cuentan como conformes (Fase 10)."
|
|
12
17
|
nivelRiesgo: BAJO
|
|
13
18
|
herramientasPermitidas: [Read, Bash]
|
|
14
19
|
skillsInvocables: [release-semver]
|
|
@@ -47,7 +52,9 @@ exclusiones:
|
|
|
47
52
|
2. **Parsea con Conventional Commits 1.0.0**: regex que captura tipo, scope,
|
|
48
53
|
marca `!`, descripción. Soporta tipos extendidos del proyecto SWL:
|
|
49
54
|
`evolucion` (cambios de skills/agentes), además de `feat/fix/perf/refactor/
|
|
50
|
-
docs/style/test/ci/build/chore/revert`.
|
|
55
|
+
docs/style/test/ci/build/chore/revert`. Tolera el prefijo opcional de
|
|
56
|
+
trazabilidad `[T-NN]` / `[REQ-NN]` de la convención de `ejecutar-fase`
|
|
57
|
+
(no altera la semántica CC — el tipo+scope+descripción siguen presentes).
|
|
51
58
|
3. **Detecta breaking changes** por marca `!` después del tipo o trailer
|
|
52
59
|
`BREAKING CHANGE:` en el body. Los breaking siempre van al inicio del
|
|
53
60
|
release, sin importar el tipo original.
|
|
@@ -50,8 +50,18 @@ const { execSync } = require('node:child_process');
|
|
|
50
50
|
* feat!: breaking change inline
|
|
51
51
|
* refactor(hooks/lib): split evolution-tracker
|
|
52
52
|
* chore(release): bump version
|
|
53
|
+
* [T-01] feat(hooks): prefijo de trazabilidad de tarea (ejecutar-fase)
|
|
54
|
+
* [T-07][T-08] refactor(hooks): varios prefijos consecutivos
|
|
55
|
+
* [REQ-08] feat(scripts): prefijo de requisito
|
|
56
|
+
*
|
|
57
|
+
* El prefijo opcional `[T-NN]` / `[REQ-NN]` (uno o más, consecutivos) proviene
|
|
58
|
+
* de la convención de commits de `habilidades/ejecutar-fase/SKILL.md`
|
|
59
|
+
* (trazabilidad de tarea/requisito). No altera la semántica CC: el
|
|
60
|
+
* tipo+scope+descripción siguen presentes después del/los prefijo(s), por lo
|
|
61
|
+
* que el commit cuenta como conforme. Grupo non-capturing para no desplazar
|
|
62
|
+
* los índices [1]=tipo [2]=scope [3]=! [4]=descripcion.
|
|
53
63
|
*/
|
|
54
|
-
const RE_CONVENTIONAL = /^(feat|fix|perf|refactor|docs|style|test|ci|build|chore|revert|evolucion)(?:\(([^)]+)\))?(!)?:\s*(.+)$/;
|
|
64
|
+
const RE_CONVENTIONAL = /^(?:\[(?:T|REQ)-\d+\]\s*)*(feat|fix|perf|refactor|docs|style|test|ci|build|chore|revert|evolucion|evolve)(?:\(([^)]+)\))?(!)?:\s*(.+)$/;
|
|
55
65
|
|
|
56
66
|
/** Mapa tipo CC → categoría Keep a Changelog en es-MX. */
|
|
57
67
|
const CATEGORIAS = Object.freeze({
|
|
@@ -61,6 +71,7 @@ const CATEGORIAS = Object.freeze({
|
|
|
61
71
|
refactor: 'Cambios internos',
|
|
62
72
|
revert: 'Reversiones',
|
|
63
73
|
evolucion: 'Evoluciones de skills/agentes',
|
|
74
|
+
evolve: 'Evoluciones de skills/agentes',
|
|
64
75
|
docs: 'Mantenimiento',
|
|
65
76
|
style: 'Mantenimiento',
|
|
66
77
|
test: 'Mantenimiento',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: checklist-seguridad
|
|
3
3
|
description: Checklist de seguridad basado en OWASP Top 10 + seguridad de agentes autónomos (A11). Cubre inyección, autenticación, exposición de datos, control de acceso, configuración insegura, XSS, deserialización, componentes vulnerables, logging y agencia excesiva de IA. Produce reporte con hallazgos y remediaciones.
|
|
4
|
-
version: "1.
|
|
4
|
+
version: "1.2.0"
|
|
5
5
|
evolved: true
|
|
6
6
|
evolved-from: "1.1.0"
|
|
7
7
|
evolved-at: "2026-05-04"
|
|
@@ -297,6 +297,34 @@ grep -rn "\.env\|credentials\|secret" --include="*.md" agentes/ | head -10
|
|
|
297
297
|
|
|
298
298
|
---
|
|
299
299
|
|
|
300
|
+
## Modo cobertura — STRIDE + score compuesto (auditorías iterativas)
|
|
301
|
+
|
|
302
|
+
Para auditorías en profundidad (no el checklist de un solo PR), complementar
|
|
303
|
+
el barrido OWASP con el modelo **STRIDE** y medir la auditoría con un **score
|
|
304
|
+
compuesto de cobertura** — convierte "auditamos seguridad" en un número
|
|
305
|
+
verificable y permite usar la auditoría como loop iterativo:
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
score = (categorías_OWASP_auditadas / 10) × 50
|
|
309
|
+
+ (categorías_STRIDE_auditadas / 6) × 30
|
|
310
|
+
+ min(hallazgos_únicos, 20)
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Score perfecto = 100 (OWASP completo + STRIDE completo + 20 hallazgos). Cada
|
|
314
|
+
hallazgo se etiqueta con AMBAS taxonomías (`OWASP: A03, STRIDE: T`). Reportar
|
|
315
|
+
la cobertura cada 5 iteraciones:
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
OWASP: [A01✓ A02✓ A03✗ ...] 4/10 | STRIDE: [S✓ T✓ R✗ I✓ D✗ E✗] 3/6 | Score: 48
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Tabla STRIDE→OWASP, qué buscar por categoría, y rotación de personas red-team
|
|
322
|
+
(Adversario, Supply Chain, Insider, Infra — definidas en
|
|
323
|
+
`habilidades/proceso-debate-adversarial/recursos/personas.md`) en
|
|
324
|
+
[recursos/stride-cobertura.md](recursos/stride-cobertura.md). Registrar las
|
|
325
|
+
iteraciones de la auditoría con `hooks/lib/loop-telemetry.js` (tipo
|
|
326
|
+
`seguridad`, direccion `higher_is_better`, métrica = score compuesto).
|
|
327
|
+
|
|
300
328
|
## Gotchas / Errores comunes no obvios
|
|
301
329
|
|
|
302
330
|
**El grep de búsqueda de secrets hardcodeados devuelve cero resultados pero hay credenciales en archivos de configuración YAML**: el patrón de búsqueda usa `password\s*=` (sintaxis Python), pero los archivos YAML usan `password:` (sin signo igual). Causa: las búsquedas de código están optimizadas para un lenguaje y pierden variantes de otro formato. Fix: expandir el patrón de búsqueda a `password[\s=:]+['\"][^'\"]{4,}` para capturar asignaciones en Python, YAML y JSON simultáneamente. Verificar también `docker-compose.yml`, `.env.example` y archivos de configuración de CI.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# STRIDE — modelo de amenazas para el modo cobertura
|
|
2
|
+
|
|
3
|
+
Complemento del checklist OWASP de `SKILL.md`. STRIDE clasifica por **tipo de
|
|
4
|
+
amenaza** (qué quiere lograr el atacante); OWASP por **tipo de debilidad**
|
|
5
|
+
(qué error del código lo permite). Auditar con ambas taxonomías cierra los
|
|
6
|
+
huecos que cada una deja sola: repudio y DoS casi no aparecen en OWASP Top 10;
|
|
7
|
+
componentes desactualizados (A06) no mapean limpio a STRIDE.
|
|
8
|
+
|
|
9
|
+
## Las 6 categorías
|
|
10
|
+
|
|
11
|
+
| Letra | Amenaza | Qué buscar | OWASP relacionadas |
|
|
12
|
+
|-------|---------|-----------|--------------------|
|
|
13
|
+
| **S**poofing | Suplantación de identidad | Auth débil, tokens predecibles, session fixation, falta de MFA | A07 |
|
|
14
|
+
| **T**ampering | Modificación de datos | Input sin validar, falta de checks de integridad, inyección SQL/NoSQL, deserialización insegura | A03, A08 |
|
|
15
|
+
| **R**epudiation | Acciones negables | Audit logs faltantes, transacciones sin firma, logs mutables, cambios de privilegio sin registro | A09 |
|
|
16
|
+
| **I**nformation Disclosure | Fuga de información | Stack traces al cliente, logging verboso con PII, env vars expuestas, mensajes de error que revelan existencia de recursos | A01, A02, A05 |
|
|
17
|
+
| **D**enial of Service | Ataques a disponibilidad | Queries sin cota ni paginación, rate limits faltantes, regex DoS (ReDoS), uploads sin límite de tamaño | A04 |
|
|
18
|
+
| **E**levation of Privilege | Acceso no autorizado | Checks de authz faltantes, IDOR, rutas de escalación admin, confusión autenticación/autorización | A01, A04 |
|
|
19
|
+
|
|
20
|
+
## Protocolo de auditoría iterativa con cobertura
|
|
21
|
+
|
|
22
|
+
1. **Reconocimiento (una vez)**: mapear superficie de ataque — manifest de
|
|
23
|
+
dependencias, `.env.example`, Dockerfile, rutas de API, módulos de auth,
|
|
24
|
+
schemas de BD, configuración de CI/CD. Producir threat model inicial:
|
|
25
|
+
qué activos, qué trust boundaries, qué entry points.
|
|
26
|
+
2. **Por iteración**: elegir el vector MENOS cubierto (OWASP sin auditar →
|
|
27
|
+
STRIDE sin auditar → profundizar en hallazgos existentes). Adoptar la
|
|
28
|
+
persona red-team que corresponde al vector (rotación: Adversario de
|
|
29
|
+
Seguridad → Supply Chain → Insider → Infraestructura — definiciones en
|
|
30
|
+
`habilidades/proceso-debate-adversarial/recursos/personas.md`).
|
|
31
|
+
3. **Validar cada hallazgo**: evidencia archivo:línea + escenario de ataque
|
|
32
|
+
concreto + reproducción. Sin escenario de ataque no es hallazgo, es
|
|
33
|
+
especulación (regla `verificar-citas-normativas.md § Familia 2`).
|
|
34
|
+
4. **Registrar**: fila en la corrida de `loop-telemetry` (columnas sugeridas:
|
|
35
|
+
`iteracion, timestamp, hallazgo, severidad, owasp, stride, archivo_linea`)
|
|
36
|
+
y recalcular el score compuesto.
|
|
37
|
+
5. **Salida**: OWASP 10/10 + STRIDE 6/6 cubiertos, o max iteraciones (default
|
|
38
|
+
15), o plateau de hallazgos (3 iteraciones sin hallazgo nuevo).
|
|
39
|
+
|
|
40
|
+
## Formato de hallazgo (obligatorio, 7 campos)
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
### [Título de una línea]
|
|
44
|
+
- **Severidad**: Crítico | Alto | Medio | Bajo | Informativo
|
|
45
|
+
- **OWASP**: A01-A10
|
|
46
|
+
- **STRIDE**: S | T | R | I | D | E
|
|
47
|
+
- **Evidencia**: archivo:línea + escenario de ataque (sin especulación teórica)
|
|
48
|
+
- **Reproducción**: pasos para disparar el problema
|
|
49
|
+
- **Remediación**: fix concreto para ESTE código
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Severidad — criterios
|
|
53
|
+
|
|
54
|
+
| Severidad | Criterio | Ejemplos |
|
|
55
|
+
|-----------|----------|----------|
|
|
56
|
+
| Crítico | Explotable remoto, sin auth, brecha de datos | RCE, SQL injection, bypass de auth |
|
|
57
|
+
| Alto | Requiere algún acceso, impacto severo | XSS almacenado, IDOR, escalación de privilegios |
|
|
58
|
+
| Medio | Impacto limitado o requiere interacción | CSRF, XSS reflejado, divulgación de info |
|
|
59
|
+
| Bajo | Impacto mínimo | Headers faltantes, errores verbosos |
|
|
60
|
+
| Informativo | Recomendación de hardening | Defensa en profundidad |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: css-moderno
|
|
3
3
|
description: CSS moderno 2024+. Cubre Container Queries, CSS Layers (@layer), Nesting nativo, Custom Properties avanzadas, funciones min/max/clamp/color-mix, propiedades lógicas (block/inline), View Transitions API, animaciones performantes solo-compositor, dark mode patterns y anti-patrones críticos.
|
|
4
|
-
version: "1.
|
|
4
|
+
version: "1.1.0"
|
|
5
5
|
herramientasPermitidas: [Read, Grep]
|
|
6
6
|
exclusiones:
|
|
7
7
|
- "No cargar para Tailwind CSS (clases utilitarias, @theme, cva, responsive) — para Tailwind cargar `tailwind-experto`."
|
|
@@ -164,3 +164,5 @@ Para ejemplos completos de Container Queries, CSS Layers, Nesting, Custom Proper
|
|
|
164
164
|
**`container-type: inline-size` en un elemento con `position: absolute/fixed` puede no funcionar como contenedor de queries en algunos navegadores**: el contenedor crea un nuevo stacking context y en ciertos casos la query no se propaga correctamente a hijos con posicionamiento absoluto en Safari <17. Causa: bug de implementación en Safari relacionado con contenedores posicionados. Fix: en elementos con posicionamiento absoluto dentro de container queries, probar en Safari y usar un wrapper div sin posicionamiento como contenedor si hay problemas.
|
|
165
165
|
|
|
166
166
|
**`clamp()` con `vw` en la función intermedia no escala correctamente en pantallas muy anchas si no se acota con `max()`**: `font-size: clamp(1rem, 2vw, 2rem)` en un monitor de 2560px da `2vw = 51.2px`, que es mayor que el máximo de `2rem = 32px` — el clamp lo atrapa pero el cálculo puede ser confuso al depurar. Causa: el valor de `vw` crece sin límite. Fix: entender que `clamp(min, preferido, max)` garantiza que el resultado siempre está entre min y max — el valor preferido puede ser cualquier expresión, incluso mayor que max, y el clamp simplemente retorna max en ese caso. Verificar los tres valores en los tamaños de viewport objetivo.
|
|
167
|
+
|
|
168
|
+
**`var(--token)` NO resuelve cuando el valor lo consume JavaScript pintando a `<canvas>`**: las librerías que renderizan a canvas (Chart.js, OpenLayers, three.js/WebGL, o `ctx.fillStyle`/`strokeStyle`/`ctx.font` directos) NO reciben el contexto CSS del documento → el color sale negro o invisible **sin error en consola**. Causa: el canvas es un buffer de píxeles fuera del árbol CSS; la cascada y `getComputedStyle` no aplican al contexto 2D/WebGL — `var()` queda como string literal que el motor de canvas no interpreta. La frontera es: un color es `var(--x)` SOLO si lo consume CSS (`.css`/`.module.scss` o `style={{}}` sobre HTML); si lo consume JS pintando a canvas, debe ser hex/rgb concreto. Fix: pasar hex/rgb literal a esos objetos, con comentario anti-recurrencia (`// canvas: NO resuelve var()`). Si el color debe ser theme-aware, resolverlo primero en JS — `getComputedStyle(document.documentElement).getPropertyValue('--color-x').trim()` — y pasar el valor ya resuelto al canvas, re-leyéndolo al cambiar de tema.
|
|
@@ -33,7 +33,7 @@ Basado en architecture-diagram-generator (MIT, Cocoon AI) — adaptado al sistem
|
|
|
33
33
|
- El usuario pide un diagrama de arquitectura del proyecto
|
|
34
34
|
- `arquitecto-swl` necesita visualizar la arquitectura propuesta
|
|
35
35
|
- `documentador-swl` genera documentación visual
|
|
36
|
-
- `/swl:wiki` o `/swl:dashboard` necesitan representación gráfica
|
|
36
|
+
- `/swl:wiki` o `/swl:status dashboard` necesitan representación gráfica
|
|
37
37
|
- Cualquier tarea de RFC, ADR o propuesta arquitectónica
|
|
38
38
|
|
|
39
39
|
## Sistema de diseño
|