@saulwade/swl-ses 2.4.3 → 2.5.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 +194 -241
- package/README.md +600 -597
- package/agentes/_intent-spec.md +73 -73
- package/agentes/_propose-step.md +90 -90
- package/agentes/abogado-diablo-swl.md +145 -0
- package/agentes/accesibilidad-wcag-swl.md +690 -690
- package/agentes/arquitecto-swl.md +267 -267
- package/agentes/auto-evolucion-swl.md +908 -908
- package/agentes/backend-api-swl.md +1 -1
- package/agentes/backend-csharp-swl.md +420 -420
- package/agentes/backend-go-swl.md +390 -390
- package/agentes/backend-java-swl.md +281 -281
- package/agentes/backend-node-swl.md +1 -1
- package/agentes/backend-python-swl.md +1 -1
- package/agentes/backend-rust-swl.md +364 -364
- package/agentes/backend-workers-swl.md +482 -482
- package/agentes/cloud-infra-swl.md +509 -509
- package/agentes/consolidador-swl.md +541 -541
- package/agentes/datos-swl.md +1 -1
- package/agentes/depurador-swl.md +352 -352
- package/agentes/devops-ci-swl.md +400 -400
- package/agentes/disenador-ui-swl.md +569 -569
- package/agentes/documentador-swl.md +345 -345
- package/agentes/frontend-angular-swl.md +621 -621
- package/agentes/frontend-css-swl.md +716 -716
- package/agentes/frontend-react-swl.md +692 -692
- package/agentes/frontend-swl.md +496 -496
- package/agentes/frontend-tailwind-swl.md +826 -826
- package/agentes/gh-fix-ci-swl.md +6 -1
- package/agentes/implementador-swl.md +1 -1
- package/agentes/investigador-swl.md +432 -432
- package/agentes/investigador-ux-swl.md +505 -505
- package/agentes/llm-apps-swl.md +1 -1
- package/agentes/migrador-swl.md +442 -442
- package/agentes/mobile-android-swl.md +511 -511
- package/agentes/mobile-cross-swl.md +541 -541
- package/agentes/mobile-ios-swl.md +502 -502
- package/agentes/mobile-testing-swl.md +302 -302
- package/agentes/nemesis-auditor-swl.md +285 -285
- package/agentes/notificador-swl.md +1 -1
- package/agentes/observabilidad-swl.md +438 -438
- package/agentes/pagos-swl.md +310 -310
- package/agentes/perfilador-usuario-swl.md +321 -321
- package/agentes/planificador-swl.md +399 -399
- package/agentes/producto-prd-swl.md +589 -589
- package/agentes/red-team-swl.md +218 -218
- package/agentes/release-manager-swl.md +590 -590
- package/agentes/rendimiento-swl.md +713 -713
- package/agentes/resolutor-build-swl.md +10 -1
- package/agentes/revisor-angular-swl.md +278 -278
- package/agentes/revisor-codigo-swl.md +1 -1
- package/agentes/revisor-csharp-swl.md +264 -264
- package/agentes/revisor-go-swl.md +259 -259
- package/agentes/revisor-java-swl.md +257 -257
- package/agentes/revisor-kotlin-swl.md +273 -273
- package/agentes/revisor-nextjs-swl.md +281 -281
- package/agentes/revisor-php-swl.md +271 -271
- package/agentes/revisor-react-swl.md +278 -278
- package/agentes/revisor-rust-swl.md +346 -346
- package/agentes/revisor-seguridad-swl.md +399 -399
- package/agentes/revisor-swift-swl.md +268 -268
- package/agentes/revisor-typescript-swl.md +346 -346
- package/agentes/sre-swl.md +1 -1
- package/agentes/tdd-qa-swl.md +393 -393
- package/bin/lib/bot-comandos.js +1 -1
- package/bin/swl-ses.js +6 -0
- package/comandos/swl/adoptar-proyecto.md +14 -2
- package/comandos/swl/configurar-ci.md +8 -1
- package/comandos/swl/deuda-codigo.md +97 -97
- package/comandos/swl/discutir-fase.md +22 -118
- package/comandos/swl/fix.md +118 -0
- package/comandos/swl/nuevo-proyecto.md +54 -3
- package/comandos/swl/predecir.md +32 -2
- package/comandos/swl/seguridad.md +189 -0
- package/comandos/swl/status.md +5 -3
- package/habilidades/aprendizaje-continuo/SKILL.md +3 -1
- package/habilidades/discutir-fase/SKILL.md +84 -81
- package/habilidades/discutir-fase/recursos/plantilla-contexto.md +136 -0
- package/habilidades/doc-sync/SKILL.md +3 -1
- package/habilidades/doubt-driven-review/SKILL.md +15 -1
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
- package/habilidades/estructura-proyecto-claude/SKILL.md +11 -2
- package/habilidades/harness-claude-code/SKILL.md +3 -1
- package/habilidades/instalar-sistema/SKILL.md +3 -1
- package/habilidades/meta-reglas-extendido/SKILL.md +92 -0
- package/habilidades/meta-reglas-extendido/recursos/analisis-previo-tareas-grandes.md +186 -0
- package/habilidades/meta-reglas-extendido/recursos/analizar-directorios-antes-de-escribir.md +235 -0
- package/habilidades/meta-reglas-extendido/recursos/api-diseno.md +413 -0
- package/habilidades/meta-reglas-extendido/recursos/arquitectura.md +491 -0
- package/habilidades/meta-reglas-extendido/recursos/arreglar-al-detectar.md +264 -0
- package/habilidades/meta-reglas-extendido/recursos/debatir-antes-de-aceptar.md +152 -0
- package/habilidades/meta-reglas-extendido/recursos/git-workflow.md +259 -0
- package/habilidades/meta-reglas-extendido/recursos/gobernanza.md +291 -0
- package/habilidades/meta-reglas-extendido/recursos/memoria-consolidada.md +263 -0
- package/habilidades/meta-reglas-extendido/recursos/seguridad-agentes.md +443 -0
- package/habilidades/meta-reglas-extendido/recursos/sesiones-paralelas.md +190 -0
- package/habilidades/meta-reglas-extendido/recursos/sin-duplicacion-reglas-globales.md +179 -0
- package/habilidades/meta-reglas-extendido/recursos/skills-estandar.md +394 -0
- package/habilidades/meta-reglas-extendido/recursos/usar-code-review-graph.md +156 -0
- package/habilidades/meta-reglas-extendido/recursos/usar-context7.md +236 -0
- package/habilidades/meta-reglas-extendido/recursos/usar-sistema-swl.md +253 -0
- package/habilidades/meta-reglas-extendido/recursos/verificar-citas-normativas.md +527 -0
- package/habilidades/meta-skills-estandar/SKILL.md +3 -1
- package/habilidades/nuevo-proyecto/SKILL.md +20 -3
- package/habilidades/php-experto/SKILL.md +10 -3
- package/habilidades/{filament-admin/SKILL.md → php-experto/recursos/filament-admin.md} +23 -39
- package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
- package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
- package/habilidades/proceso-debate-adversarial/recursos/personas.md +5 -4
- package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -0
- package/hooks/check-update.js +19 -10
- package/hooks/contexto-subagente.js +68 -68
- package/hooks/degradacion-instintos.js +1 -1
- package/hooks/extraccion-aprendizajes.js +2 -2
- package/hooks/lib/briefing.js +3 -3
- package/hooks/lib/nudge-tracker.js +1 -1
- package/hooks/lib/otlp-exporter.js +1 -1
- package/hooks/lib/webhook-dedup.js +1 -1
- package/hooks/session-briefing.js +1 -1
- package/llms.txt +6 -6
- package/manifiestos/canonical-hashes.json +713 -52
- package/manifiestos/hooks-config.json +469 -469
- package/manifiestos/invariantes-criticos.json +30 -30
- package/manifiestos/modulos.json +168 -135
- package/manifiestos/perfiles.json +0 -2
- package/manifiestos/skills-lock.json +49 -56
- package/package.json +7 -5
- package/plantillas/github-workflows/README.md +15 -1
- package/plantillas/github-workflows/swl-devsecops.yml +70 -0
- package/plugin.json +5 -5
- package/reglas/analisis-previo-tareas-grandes.md +30 -156
- package/reglas/analizar-directorios-antes-de-escribir.md +30 -211
- package/reglas/api-diseno.md +28 -398
- package/reglas/arquitectura.md +35 -456
- package/reglas/arreglar-al-detectar.md +30 -230
- package/reglas/debatir-antes-de-aceptar.md +30 -143
- package/reglas/docs.md +7 -0
- package/reglas/estilo-codigo.md +9 -0
- package/reglas/fragmentos-compartidos.md +6 -0
- package/reglas/git-workflow.md +44 -240
- package/reglas/gobernanza.md +23 -262
- package/reglas/memoria-consolidada.md +34 -228
- package/reglas/performance.md +8 -0
- package/reglas/pruebas.md +12 -0
- package/reglas/seguridad-agentes.md +37 -418
- package/reglas/seguridad.md +12 -0
- package/reglas/sesiones-paralelas.md +29 -162
- package/reglas/sin-duplicacion-reglas-globales.md +25 -166
- package/reglas/skills-estandar.md +23 -373
- package/reglas/usar-code-review-graph.md +31 -140
- package/reglas/usar-context7.md +30 -208
- package/reglas/usar-sistema-swl.md +47 -242
- package/reglas/verificar-citas-normativas.md +47 -537
- package/scripts/actualizar.js +253 -253
- package/scripts/audit-tools/auditar-relleno-inventario.js +145 -0
- package/scripts/auditar-clases-conocidas.js +106 -0
- package/scripts/bootstrap-instintos.js +2 -2
- package/scripts/canario-hooks.js +166 -0
- package/scripts/cli/configurar-ci.js +2 -1
- package/scripts/evidencia-valor.js +93 -0
- package/scripts/field-report.js +1 -1
- package/scripts/generar-comandos.js +143 -0
- package/scripts/generar-inventario.js +236 -23
- package/scripts/generar-matriz-lenguajes.js +1 -1
- package/scripts/instalador.js +15 -1
- package/scripts/lib/configurar-ci.js +10 -3
- package/scripts/lib/diary-entry.js +3 -1
- package/scripts/lib/drift-detector.js +1 -1
- package/scripts/lib/evidencia-valor.js +189 -0
- package/scripts/lib/expandir-targets.js +71 -71
- package/scripts/lib/frontmatter-md.js +63 -0
- package/scripts/lib/parsear-opciones.js +2 -0
- package/scripts/lib/prune-componentes.js +180 -0
- package/scripts/lib/reglas-globales-conocidas.json +16 -2
- package/scripts/lib/scoring-instintos.js +2 -2
- package/scripts/lib/toml-merge.js +204 -204
- package/scripts/lib/transformadores/claude.js +1 -1
- package/scripts/lib/transformadores/codex.js +1 -1
- package/scripts/lib/transformadores/copilot.js +1 -1
- package/scripts/lib/transformadores/cursor.js +1 -1
- package/scripts/lib/transformadores/gemini.js +22 -2
- package/scripts/lib/transformadores/opencode.js +1 -1
- package/scripts/mcp-server/auth.js +105 -105
- package/scripts/mcp-server/cache.js +106 -106
- package/scripts/prune.js +102 -0
- package/scripts/publicar.js +18 -2
- package/scripts/tui/pantallas/inspect.js +175 -175
- package/scripts/tui/pantallas/uninstall-wizard.js +210 -210
- package/scripts/tui/pantallas/update-wizard.js +234 -234
- package/scripts/tui/pantallas/welcome.js +189 -189
- package/habilidades/paid-media-tracking/SKILL.md +0 -269
- package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +0 -220
- package/habilidades/paid-media-tracking/recursos/google-ads-api.md +0 -215
- package/habilidades/tracking-measurement/SKILL.md +0 -239
- package/habilidades/tracking-measurement/recursos/consent-mode.md +0 -231
- package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +0 -216
- package/habilidades/tracking-measurement/recursos/meta-capi.md +0 -262
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# Detectar → Informar → Arreglar — extendido
|
|
2
|
+
|
|
3
|
+
> Extendido de `reglas/arreglar-al-detectar.md` (Fase D, dieta de contexto). El
|
|
4
|
+
> núcleo instalado es la norma; aquí viven los feedbacks de origen, el detalle
|
|
5
|
+
> completo del patrón Hallazgo A/B/C con su ejemplo validado, los anti-patrones
|
|
6
|
+
> desarrollados y la relación con otras reglas.
|
|
7
|
+
|
|
8
|
+
## Índice
|
|
9
|
+
|
|
10
|
+
- [Los cuatro feedbacks de origen](#los-cuatro-feedbacks-de-origen)
|
|
11
|
+
- [Cómo aplicar — detalle por situación](#cómo-aplicar--detalle-por-situación)
|
|
12
|
+
- [Hallazgos colaterales con blast radius alto — patrón Hallazgo A/B/C](#hallazgos-colaterales-con-blast-radius-alto--patrón-hallazgo-abc)
|
|
13
|
+
- [Excepciones legítimas](#excepciones-legítimas)
|
|
14
|
+
- [Anti-patrones explícitos](#anti-patrones-explícitos)
|
|
15
|
+
- [Relación con otras reglas](#relación-con-otras-reglas)
|
|
16
|
+
- [Origen de esta regla](#origen-de-esta-regla)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Los cuatro feedbacks de origen
|
|
21
|
+
|
|
22
|
+
La regla consolida cuatro feedbacks repetidos en sesiones distintas entre
|
|
23
|
+
2026-04-23 y 2026-05-03 con la misma señal: el usuario rechaza entregas
|
|
24
|
+
parciales, deuda silenciosa y bypass de errores ajenos.
|
|
25
|
+
|
|
26
|
+
- "No me gustan las cosas a medias" — rechazo de entregas parciales (2026-04-23).
|
|
27
|
+
- "Cuando detectes errores, bugs, inconsistencias y demás informes al usuario y
|
|
28
|
+
procedas a solucionar y/o arreglar, además nunca debes dejar pendientes, ni
|
|
29
|
+
diferir" (2026-04-30).
|
|
30
|
+
- "Resuelve los test que fallan, no bypass" — al detectar intento de excluir
|
|
31
|
+
tests del glob para evitar arreglarlos (2026-04-30).
|
|
32
|
+
- "Si el job CI falla, hay que arreglarlo todo" — al ver tests rotos
|
|
33
|
+
presentados como "preexistentes, no críticos" (2026-05-03).
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Cómo aplicar — detalle por situación
|
|
38
|
+
|
|
39
|
+
### Al detectar un problema secundario durante el trabajo principal
|
|
40
|
+
|
|
41
|
+
- Reportarlo brevemente al usuario: qué se detectó, dónde, severidad.
|
|
42
|
+
- Resolverlo en el mismo turno o en commit separado de la misma sesión.
|
|
43
|
+
- NUNCA ofrecer "lo documento como deuda" como primera opción.
|
|
44
|
+
- NUNCA usar frases como "son tests con mocks pre-existentes que ya estaban rotos",
|
|
45
|
+
"esto estaba antes", "no es del scope inmediato" para evitar el trabajo.
|
|
46
|
+
|
|
47
|
+
### Al ejecutar tests, builds, lints, validadores
|
|
48
|
+
|
|
49
|
+
- Si hay failures, listarlos todos y atacarlos todos.
|
|
50
|
+
- No distinguir "bugs reales" vs "tests con mocks mal configurados" como excusa
|
|
51
|
+
para arreglar solo unos. Si están rotos, arreglarlos.
|
|
52
|
+
- Excepción: bugs que requieran decisión arquitectural ambigua del usuario —
|
|
53
|
+
pedir esa decisión explícitamente, no diferir como "tu decisión".
|
|
54
|
+
|
|
55
|
+
### Al modificar código adyacente
|
|
56
|
+
|
|
57
|
+
- Si tocas líneas con problemas adyacentes (None checks faltantes, schemas
|
|
58
|
+
obsoletos, mocks inconsistentes, contadores stale, paths inválidos),
|
|
59
|
+
arreglarlos en el mismo commit o en commit separado de la misma sesión.
|
|
60
|
+
|
|
61
|
+
### Al refactorizar
|
|
62
|
+
|
|
63
|
+
- Si encuentras código adyacente que se quedó obsoleto por un refactor previo,
|
|
64
|
+
actualizarlo. No dejar deuda residual.
|
|
65
|
+
|
|
66
|
+
### Fix de clase, no de instancia (barrido por patrón obligatorio)
|
|
67
|
+
|
|
68
|
+
- Si el bug corregido es un PATRÓN (regex incompleto, umbral mal calibrado,
|
|
69
|
+
construcción de path repetida, gate copy-pasteado) y no un typo puntual,
|
|
70
|
+
el MISMO turno incluye un `grep` de todos los hermanos del patrón en el
|
|
71
|
+
codebase y su corrección — o el registro explícito de por qué no aplica.
|
|
72
|
+
- Arreglar solo la instancia que falló deja a los gemelos esperando el peor
|
|
73
|
+
momento para reventar. Evidencia doble (2026-07-03, swl-ses): se corrigió
|
|
74
|
+
el gate de reloj de un test sin barrer la clase → su gemelo tumbó el
|
|
75
|
+
`npm publish` de v2.4.0 horas después (bump de coordinación innecesario);
|
|
76
|
+
se corrigió el scope fantasma en el doctor sin barrer → quedaron 7 sitios
|
|
77
|
+
más con el mismo patrón, incluido un uninstall-wizard que ofrecía borrar
|
|
78
|
+
la instalación global de Claude Code.
|
|
79
|
+
- Es la aplicación a FIXES del "sweep por patrón" que
|
|
80
|
+
`verificar-citas-normativas.md § Familia 2` ya exige para reportes.
|
|
81
|
+
|
|
82
|
+
### Al detectar un error ajeno al trabajo actual
|
|
83
|
+
|
|
84
|
+
- NO bypassear (excluir tests del glob, comentar checks, `|| true`,
|
|
85
|
+
downgradear a warning, ignorar).
|
|
86
|
+
- Resolver de raíz o, si requiere decisión, abrir explícitamente la decisión
|
|
87
|
+
con el usuario antes de bypassear.
|
|
88
|
+
- El default es resolver, no esquivar.
|
|
89
|
+
|
|
90
|
+
### Al presentar planes con sub-tareas
|
|
91
|
+
|
|
92
|
+
- Dar primero la opción "todo completo" con esfuerzo estimado.
|
|
93
|
+
- Si por capacity hay que partir el trabajo, hacerlo explícito con razón
|
|
94
|
+
concreta: "esta sesión cubre 3.1 a 3.4; la 3.5 va en commit separado por
|
|
95
|
+
X razón concreta", no por preferencia genérica.
|
|
96
|
+
|
|
97
|
+
### Al recomendar diferir un patrón o feature
|
|
98
|
+
|
|
99
|
+
- Redactar **simultáneamente** el ítem de deuda formal con criterio de disparo
|
|
100
|
+
verificable. La oferta "lo dejo apuntado" sin entrada formal no es aceptable.
|
|
101
|
+
- Distinción de categorías:
|
|
102
|
+
- **DT (deuda técnica)** con plan de cierre.
|
|
103
|
+
- **DA (decisión arquitectural)** con trigger verificable.
|
|
104
|
+
- **OP (pendiente operacional)** con responsable.
|
|
105
|
+
- "Mediano plazo / Q3 / cuando aparezca demanda" sin trigger verificable es
|
|
106
|
+
deuda silenciosa. Convertir a DA formal en mismo commit.
|
|
107
|
+
- Trigger verificable significa condición observable: "≥2 clientes distintos
|
|
108
|
+
reportan", "p95 > 60s en producción documentado", "uso > N veces/mes",
|
|
109
|
+
no "cuando sea relevante" o "más adelante".
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Hallazgos colaterales con blast radius alto — patrón Hallazgo A/B/C
|
|
114
|
+
|
|
115
|
+
Durante el trabajo principal puedes detectar un problema secundario cuyo fix
|
|
116
|
+
**no cabe** en la regla general "detectar → informar → arreglar en mismo
|
|
117
|
+
turno" porque su blast radius es alto: toca infra compartida, requiere
|
|
118
|
+
downtime, modifica contratos públicos, exige decisión arquitectural, o su
|
|
119
|
+
remediación dura más que el trabajo principal en curso.
|
|
120
|
+
|
|
121
|
+
Aplicar el catálogo de tres opciones explícitas — NUNCA mezclar el fix con
|
|
122
|
+
el trabajo principal sin etiquetarlo y NUNCA dejarlo como deuda silenciosa.
|
|
123
|
+
|
|
124
|
+
### Definición operacional
|
|
125
|
+
|
|
126
|
+
Un hallazgo colateral cumple **al menos uno** de estos atributos:
|
|
127
|
+
|
|
128
|
+
- Su fix toca archivos fuera del scope del trabajo principal (>3 archivos
|
|
129
|
+
no relacionados con la tarea actual).
|
|
130
|
+
- Requiere operación destructiva (`git filter-branch`, `git filter-repo`,
|
|
131
|
+
drop de tabla, rotación de credencial productiva).
|
|
132
|
+
- Modifica configuración de infra compartida (CI/CD, branch protection,
|
|
133
|
+
permisos de repo, secrets de organización).
|
|
134
|
+
- Exige decisión arquitectural ambigua que el agente no puede tomar solo.
|
|
135
|
+
- Su remediación dura más que el commit actual del trabajo principal.
|
|
136
|
+
|
|
137
|
+
Si NO cumple ninguno de estos atributos, NO es Hallazgo A/B/C — aplicar la
|
|
138
|
+
regla general (arreglar en mismo turno).
|
|
139
|
+
|
|
140
|
+
### Las tres opciones explícitas
|
|
141
|
+
|
|
142
|
+
| Opción | Cuándo | Acción |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| **Hallazgo A — Resolver ahora** | Fix < 30 min, reversible con `git revert`, sin blast radius en infra compartida, sin decisión arquitectural | Pausar trabajo principal, fix en commit separado etiquetado, retomar |
|
|
145
|
+
| **Hallazgo B — DT formal con trigger verificable** | Fix con blast radius alto pero NO bloqueante para el trabajo principal. Tiene criterio observable que define cuándo cerrarlo | Redactar entry en `.planning/DEUDA-TECNICA.md` con ID, trigger verificable, plan de cierre paso a paso. Continuar trabajo principal |
|
|
146
|
+
| **Hallazgo C — Escalar al usuario** | Fix excede autorización del agente: requiere decisión arquitectural, operación destructiva irreversible, o modifica contratos productivos | Pausar trabajo principal, reportar al usuario con 3 opciones concretas y recomendación, esperar decisión explícita |
|
|
147
|
+
|
|
148
|
+
### Reglas duras
|
|
149
|
+
|
|
150
|
+
- **Reportar siempre, independientemente de la opción elegida**: el usuario
|
|
151
|
+
ve el hallazgo en el mismo turno, no se entera en el commit posterior.
|
|
152
|
+
- **DT formal NO es "lo apunto y veremos"**: requiere ID (`DT-NOMBRE-X`),
|
|
153
|
+
trigger verificable observable, plan de cierre con pasos concretos, y
|
|
154
|
+
entry visible en `.planning/DEUDA-TECNICA.md` commiteada en mismo turno.
|
|
155
|
+
- **NUNCA degradar Hallazgo C a Hallazgo B sin pedirlo**: una decisión
|
|
156
|
+
arquitectural disfrazada de DT es deuda silenciosa con cara de proceso.
|
|
157
|
+
- **NUNCA "arreglar como parte del trabajo principal" un Hallazgo B/C
|
|
158
|
+
sin etiquetarlo**: aunque el fix sea pequeño, si su blast radius es alto
|
|
159
|
+
el commit debe ser separado con mensaje explícito ("colateral: cierra
|
|
160
|
+
DT-X" o "colateral: aplica fix urgente fuera de scope original").
|
|
161
|
+
|
|
162
|
+
### Ejemplo validado (SIGAF, sesión 2026-05-20)
|
|
163
|
+
|
|
164
|
+
Durante implementación de pipeline DevSecOps (gates gitleaks + SAST + deps
|
|
165
|
+
+ containers), el agente detectó tres hallazgos colaterales:
|
|
166
|
+
|
|
167
|
+
- **Hallazgo A — Validator JWT con frozenset + regex**: bug detectado en
|
|
168
|
+
`backend/app/core/config.py` donde `_CENTINELA` hardcodeado divergía del
|
|
169
|
+
`.env.example` real. Fix < 30 min, reversible, alcance acotado a
|
|
170
|
+
validators. Aplicado en commit separado mismo turno + 8 tests de regresión.
|
|
171
|
+
|
|
172
|
+
- **Hallazgo B — DT-GHAS-HABILITAR**: detectado que repo PRIVATE en
|
|
173
|
+
organización sin GitHub Advanced Security responde 403 al upload SARIF.
|
|
174
|
+
Mitigación inmediata con `continue-on-error: true` en step de upload.
|
|
175
|
+
DT formal con trigger verificable: "equipo crece >2 personas, auditoría
|
|
176
|
+
externa, o licencia GHAS adquirida". Entry en `.planning/DEUDA-TECNICA.md`
|
|
177
|
+
con plan de cierre (eliminar `continue-on-error` cuando GHAS activo).
|
|
178
|
+
|
|
179
|
+
- **Hallazgo C — DT-HISTORIAL-ENV**: detectado que commit `203a603` en
|
|
180
|
+
historial git contenía `ADMIN_PASSWORD=Admin2026!` (ya rotado, ya en
|
|
181
|
+
`.gitignore`, pero presente en `git log -p`). Fix requiere `git
|
|
182
|
+
filter-branch` o `git filter-repo` (destructivo, irreversible para
|
|
183
|
+
colaboradores con clones locales). El agente escaló al usuario; usuario
|
|
184
|
+
respondió "estamos en desarrollo y etapa de pruebas" → degradado a DT
|
|
185
|
+
formal con trigger "antes del primer deploy productivo, repo público
|
|
186
|
+
o colaborador externo".
|
|
187
|
+
|
|
188
|
+
Los tres hallazgos quedaron visibles, etiquetados y con trigger observable.
|
|
189
|
+
Ninguno se mezcló silenciosamente con el trabajo principal del pipeline.
|
|
190
|
+
|
|
191
|
+
### Anti-patrones específicos del patrón A/B/C
|
|
192
|
+
|
|
193
|
+
- **"Lo arreglo de paso porque ya estoy aquí"**: si el fix tiene blast
|
|
194
|
+
radius alto, NO va de paso. Va etiquetado o no va.
|
|
195
|
+
- **DT sin trigger verificable**: "cuando sea posible", "más adelante",
|
|
196
|
+
"cuando tengamos tiempo" — viola la regla general. Trigger debe
|
|
197
|
+
ser condición observable.
|
|
198
|
+
- **Reportar Hallazgo C como informativo sin pedir decisión**: si la
|
|
199
|
+
decisión requiere autorización del usuario, la respuesta NO es
|
|
200
|
+
"documentado para tu consideración" — es "elige A, B o C".
|
|
201
|
+
- **Aplicar Hallazgo A descubriendo en medio que era Hallazgo C**: si al
|
|
202
|
+
empezar el fix detectas que tiene blast radius mayor del estimado,
|
|
203
|
+
detente, revierte el WIP, y re-clasifica. NO terminar "porque ya
|
|
204
|
+
empezamos".
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Excepciones legítimas
|
|
209
|
+
|
|
210
|
+
NO aplicar la regla al pie de la letra cuando:
|
|
211
|
+
|
|
212
|
+
1. **El fix es ambiguo** — varias opciones razonables sin criterio claro para
|
|
213
|
+
elegir. Presentar opciones concretas con la recomendación y esperar
|
|
214
|
+
decisión rápida.
|
|
215
|
+
2. **El fix es destructivo** — `rm -rf`, `git reset --hard`, `git push --force`,
|
|
216
|
+
eliminar tablas de BD. Esos siguen requiriendo confirmación explícita por
|
|
217
|
+
separado, sin importar que el problema esté detectado.
|
|
218
|
+
3. **El fix tiene blast radius alto** — modifica configuración de CI, infra
|
|
219
|
+
compartida, contratos públicos de API. Presentar plan, pedir confirmación.
|
|
220
|
+
4. **El bug requiere decisión de producto** — comportamiento esperado ambiguo,
|
|
221
|
+
breaking change. Explícito al usuario y esperar.
|
|
222
|
+
|
|
223
|
+
En todos los casos: presentar la opción y la recomendación, NO dejar el
|
|
224
|
+
problema sin reportar.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Anti-patrones explícitos
|
|
229
|
+
|
|
230
|
+
- "Lo dejo como deuda residual" — sin DT/DA formal con criterio de disparo.
|
|
231
|
+
- "Esos tests ya estaban rotos antes" — usado para evitar arreglarlos.
|
|
232
|
+
- "No es parte del scope inmediato" — para esquivar un fix obvio.
|
|
233
|
+
- "Lo documento y tú decides" — para diferir trabajo claro al usuario.
|
|
234
|
+
- "Mediano plazo" sin trigger verificable.
|
|
235
|
+
- Excluir tests del glob, comentar checks, `|| true`, downgradear severidad de
|
|
236
|
+
un linter — para que el CI deje de fallar sin arreglar la causa.
|
|
237
|
+
- Mover archivos a `legacy/` o `deprecated/` sin plan de eliminación con
|
|
238
|
+
criterio de disparo.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Relación con otras reglas
|
|
243
|
+
|
|
244
|
+
- `seguridad-agentes.md` — sección "Anti-fallback silencioso y anti-degradación"
|
|
245
|
+
cubre el mismo principio aplicado a agentes autónomos. Esta regla lo extiende
|
|
246
|
+
al trabajo del usuario.
|
|
247
|
+
- `git-workflow.md` — los commits siguen siendo atómicos; arreglar un problema
|
|
248
|
+
detectado puede requerir varios commits, no uno solo gigante.
|
|
249
|
+
- `pruebas.md` — los tests rotos son violaciones a esta regla. No se mergea
|
|
250
|
+
con tests rotos (excepción: tests rotos por decisión de producto en proceso).
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Origen de esta regla
|
|
255
|
+
|
|
256
|
+
Consolidada el 2026-05-04 a partir de cuatro feedbacks repetidos del usuario en
|
|
257
|
+
memorias nativas de Claude Code de los proyectos sigm, swl-ses y emaia
|
|
258
|
+
(2026-04-23 a 2026-05-03). Antes vivía duplicada en 4 archivos de feedback
|
|
259
|
+
distintos en 2 de los 3 proyectos. Promovida a regla global para eliminar
|
|
260
|
+
duplicación y aplicar uniformemente a todo proyecto del usuario.
|
|
261
|
+
|
|
262
|
+
Memoria nativa local correspondiente: redundante tras esta regla; mantener solo
|
|
263
|
+
una mención mínima en MEMORY.md de cada proyecto si se desea preservar el rastro
|
|
264
|
+
histórico, pero el contenido operativo vive aquí.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Debatir antes de aceptar — extendido
|
|
2
|
+
|
|
3
|
+
> Extendido de `reglas/debatir-antes-de-aceptar.md` (Fase D, dieta de contexto).
|
|
4
|
+
> El núcleo instalado es la norma; aquí viven el protocolo desarrollado, los
|
|
5
|
+
> anti-patrones completos, el ejemplo positivo del VBO y el caso de origen.
|
|
6
|
+
|
|
7
|
+
## Índice
|
|
8
|
+
|
|
9
|
+
- [Cuándo aplicar](#cuándo-aplicar)
|
|
10
|
+
- [Cómo aplicar](#cómo-aplicar)
|
|
11
|
+
- [Excepciones legítimas](#excepciones-legítimas)
|
|
12
|
+
- [Anti-patrones explícitos](#anti-patrones-explícitos)
|
|
13
|
+
- [Ejemplo positivo](#ejemplo-positivo)
|
|
14
|
+
- [Origen de esta regla](#origen-de-esta-regla)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Cuándo aplicar
|
|
19
|
+
|
|
20
|
+
Cuando la decisión del usuario:
|
|
21
|
+
|
|
22
|
+
- Contradice una regla global de `~/.claude/rules/*.md` (especialmente
|
|
23
|
+
`seguridad-agentes.md`, `arquitectura.md`, `gobernanza.md`, `seguridad.md`).
|
|
24
|
+
- Contradice una regla de `CLAUDE.md` del proyecto o un ADR vigente.
|
|
25
|
+
- Rompe una invariante del dominio (integridad referencial, auditoría
|
|
26
|
+
inmutable, trazabilidad regulatoria, separación de responsabilidades).
|
|
27
|
+
- Introduce una "puerta trasera" para un rol privilegiado que erosiona una
|
|
28
|
+
garantía formal del sistema (ej: ADMIN bypassa una invariante de
|
|
29
|
+
integridad — distinto de bypassar una restricción jerárquica).
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Cómo aplicar
|
|
34
|
+
|
|
35
|
+
### Paso 1 — Contrastar la decisión con las reglas
|
|
36
|
+
|
|
37
|
+
Antes de implementar, ejecuta mentalmente este check:
|
|
38
|
+
|
|
39
|
+
- ¿Existe una regla en `~/.claude/rules/` que aplique?
|
|
40
|
+
- ¿El proyecto tiene `CLAUDE.md` o ADRs que cubran este territorio?
|
|
41
|
+
- ¿La decisión rompe una invariante visible del dominio (audit trail,
|
|
42
|
+
consistencia de estados, integridad referencial)?
|
|
43
|
+
- ¿Hay un ejemplo histórico en el proyecto donde una decisión similar
|
|
44
|
+
causó un incidente?
|
|
45
|
+
|
|
46
|
+
### Paso 2 — Si hay choque: responder con tres bloques
|
|
47
|
+
|
|
48
|
+
NO implementes en silencio. Responde explícitamente con:
|
|
49
|
+
|
|
50
|
+
1. **Por qué la decisión es problemática**: cita la regla concreta o la
|
|
51
|
+
invariante violada. Evita generalidades — referencia el archivo y la
|
|
52
|
+
sección.
|
|
53
|
+
|
|
54
|
+
2. **Cuál es el riesgo real**: descríbelo de forma observable, no abstracta.
|
|
55
|
+
Mal: "puede causar problemas de integridad". Bien: "el chip 'Aprobado por
|
|
56
|
+
X' seguirá visible cuando el contenido haya cambiado, y un auditor
|
|
57
|
+
externo no tendrá forma de saber que se editó después — eso vulnera la
|
|
58
|
+
trazabilidad regulatoria del OIC".
|
|
59
|
+
|
|
60
|
+
3. **Alternativa concreta** que satisfaga la intención del usuario sin
|
|
61
|
+
romper la regla. Idealmente con costo acotado en pasos.
|
|
62
|
+
|
|
63
|
+
### Paso 3 — Esperar confirmación informada
|
|
64
|
+
|
|
65
|
+
Tras presentar el análisis, espera. Si el usuario insiste tras conocer el
|
|
66
|
+
costo, implementa — pero ahí queda registrado que es decisión informada,
|
|
67
|
+
no inercia.
|
|
68
|
+
|
|
69
|
+
Si el usuario contradice tu análisis con argumentos válidos (la regla no
|
|
70
|
+
aplica al caso, el riesgo no existe en este contexto), corrige y procede.
|
|
71
|
+
La regla es debatir, no obstinarse.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Excepciones legítimas
|
|
76
|
+
|
|
77
|
+
NO aplicar cuando:
|
|
78
|
+
|
|
79
|
+
1. **Decisiones de preferencia personal sin impacto técnico**: color,
|
|
80
|
+
naming, estilo de prosa, formato de mensajes. Esas se obedecen sin
|
|
81
|
+
debate.
|
|
82
|
+
2. **Decisiones donde el usuario ya consideró la regla y la sobrescribió
|
|
83
|
+
intencionalmente** en una sesión previa, en `discutir-fase`, o en un
|
|
84
|
+
ADR documentado.
|
|
85
|
+
3. **El usuario pide explícitamente "no debates, ejecuta"** para una
|
|
86
|
+
tarea acotada y reversible. Respeta la instrucción explícita; NO
|
|
87
|
+
añadas debate por reflejo.
|
|
88
|
+
4. **Fix urgente de producción** con incidente activo y blast radius
|
|
89
|
+
acotado. Aplica el fix; el debate puede esperar al post-mortem.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Anti-patrones explícitos
|
|
94
|
+
|
|
95
|
+
- **Aceptar por reflejo**: responder "listo, implemento" a una decisión
|
|
96
|
+
que viola una regla, y solo detectar el problema cuando el usuario pide
|
|
97
|
+
análisis crítico explícito.
|
|
98
|
+
- **Endulzar el análisis**: presentar la objeción como tradeoff opcional
|
|
99
|
+
cuando la regla es absoluta. "Aunque hay tradeoffs, tu enfoque es
|
|
100
|
+
válido si…" cuando en realidad la decisión rompe una invariante del
|
|
101
|
+
sistema.
|
|
102
|
+
- **Soluciones intermedias que vacían la regla**: ofrecer "agregar un
|
|
103
|
+
log warning" cuando el problema real es romper una invariante. Eso es
|
|
104
|
+
fallback silencioso disfrazado — la solución correcta es no romper la
|
|
105
|
+
invariante, no agregar un log invisible al usuario.
|
|
106
|
+
- **Confundir conveniencia con jerarquía**: que el usuario sea el dueño
|
|
107
|
+
del proyecto no significa que toda preferencia suya esté libre de costo
|
|
108
|
+
técnico. El rol del agente es señalar el costo; el del usuario es
|
|
109
|
+
decidir si lo asume.
|
|
110
|
+
- **Implementar primero, debatir después**: si la decisión genera daño
|
|
111
|
+
acumulable (commits que rompen invariantes), revertir es más caro que
|
|
112
|
+
haber debatido al inicio.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Ejemplo positivo
|
|
117
|
+
|
|
118
|
+
> Usuario: "Implementa que ADMIN pueda editar el contenido de un papel
|
|
119
|
+
> de trabajo bajo VBO aprobado, sin tener que revocar primero."
|
|
120
|
+
>
|
|
121
|
+
> Respuesta correcta:
|
|
122
|
+
>
|
|
123
|
+
> Análisis: la regla `seguridad-agentes.md § Anti-fallback silencioso`
|
|
124
|
+
> establece que ningún cambio de garantía puede suceder sin alerta
|
|
125
|
+
> visible al usuario. Permitir esa edición rompe la integridad
|
|
126
|
+
> semántica del VBO: el chip "Aprobado por Juan Pérez — fecha" seguirá
|
|
127
|
+
> visible aunque el contenido cambie, y el auditor externo no podrá
|
|
128
|
+
> distinguir el contenido aprobado del editado después. En un OIC
|
|
129
|
+
> regulado por LGIPE eso compromete la trazabilidad legal.
|
|
130
|
+
>
|
|
131
|
+
> Riesgo observable: cualquier auditoría posterior verá el VBO aprobado
|
|
132
|
+
> y asumirá que ese contenido fue revisado. Si el contenido cambió por
|
|
133
|
+
> override administrativo, la auditoría está mintiendo.
|
|
134
|
+
>
|
|
135
|
+
> Alternativa: el flujo correcto ya existe y no es burocrático. ADMIN
|
|
136
|
+
> puede revocar el VBO desde el panel (1 click, deja registro inmutable
|
|
137
|
+
> en `vbo_historial` con motivo obligatorio), editar, y re-aprobar. Tres
|
|
138
|
+
> acciones, todas trazables. ¿Procedo con este flujo?
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Origen de esta regla
|
|
143
|
+
|
|
144
|
+
Sesión 2026-05-08, proyecto SIGAF. Ante la petición de implementar
|
|
145
|
+
"ADMIN puede editar título/contenido de papel de trabajo bajo estatus
|
|
146
|
+
REVISADO sin revocar el VBO primero", el agente aceptó sin debate
|
|
147
|
+
inicial. La implementación rompió la integridad semántica del Visto
|
|
148
|
+
Bueno (VBO aprobado contra contenido que ya no existe) y fue revertida
|
|
149
|
+
en commit `6aaf05c` tras análisis crítico explícito pedido por el
|
|
150
|
+
usuario. Memoria nativa registrada en
|
|
151
|
+
`feedback_no_dar_razon_automatica.md`; promovida a regla global porque
|
|
152
|
+
el patrón se repetiría en cualquier proyecto del usuario.
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# Git Workflow — extendido
|
|
2
|
+
|
|
3
|
+
> Extendido de `reglas/git-workflow.md` (Fase D, dieta de contexto). El núcleo
|
|
4
|
+
> instalado es la norma; aquí viven templates, ejemplos, el flujo completo y
|
|
5
|
+
> las reglas operativas desarrolladas.
|
|
6
|
+
|
|
7
|
+
## Índice
|
|
8
|
+
|
|
9
|
+
- [Commits atómicos — 1 cambio lógico = 1 commit](#commits-atómicos--1-cambio-lógico--1-commit)
|
|
10
|
+
- [Mensajes de commit — formato imperativo, <72 chars](#mensajes-de-commit--formato-imperativo-72-chars)
|
|
11
|
+
- [Branches descriptivas](#branches-descriptivas)
|
|
12
|
+
- [No force-push a main / develop](#no-force-push-a-main--develop)
|
|
13
|
+
- [PRs — descripción y test plan obligatorios](#prs--descripción-y-test-plan-obligatorios)
|
|
14
|
+
- [Squash antes de merge](#squash-antes-de-merge)
|
|
15
|
+
- [Flujo completo de trabajo](#flujo-completo-de-trabajo)
|
|
16
|
+
- [Reglas de emergencia (hotfixes)](#reglas-de-emergencia-hotfixes)
|
|
17
|
+
- [Sincronización de versiones antes de release](#sincronización-de-versiones-antes-de-release)
|
|
18
|
+
- [Reglas de oro CI/CD (cuando se adopta swl-configurar-ci)](#reglas-de-oro-cicd-cuando-se-adopta-swl-configurar-ci)
|
|
19
|
+
- [Checklist antes de abrir un PR](#checklist-antes-de-abrir-un-pr)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Commits atómicos — 1 cambio lógico = 1 commit
|
|
24
|
+
|
|
25
|
+
- Un commit contiene exactamente un cambio lógico autocontenido.
|
|
26
|
+
Se puede entender, revertir y aplicar de forma independiente.
|
|
27
|
+
- Un commit NO mezcla: refactor + nueva feature, bugfix + limpieza de código,
|
|
28
|
+
cambio de deps + lógica de negocio.
|
|
29
|
+
- Si al escribir el mensaje de commit se necesita usar "y" o "también":
|
|
30
|
+
es señal de que son dos commits.
|
|
31
|
+
- Commits de trabajo en progreso (`WIP`, `temp`, `fix typo`) están permitidos
|
|
32
|
+
en ramas de feature, pero se squashean antes del merge.
|
|
33
|
+
- Commits con solo cambios de formato/whitespace: nunca mezclar con cambios
|
|
34
|
+
de lógica. Hacer un commit dedicado de formateo si es necesario.
|
|
35
|
+
- Tamaño razonable: si un PR tiene un solo commit con 50 archivos modificados,
|
|
36
|
+
el commit no es atómico — dividir en pasos lógicos.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Mensajes de commit — formato imperativo, <72 chars
|
|
41
|
+
|
|
42
|
+
Formato estándar:
|
|
43
|
+
```
|
|
44
|
+
<tipo>(<scope>): <descripción en imperativo>
|
|
45
|
+
|
|
46
|
+
[cuerpo opcional — explicar POR QUÉ, no qué hace el diff]
|
|
47
|
+
|
|
48
|
+
[footer opcional — refs a tickets, breaking changes]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Tipos permitidos:
|
|
52
|
+
- `feat`: nueva funcionalidad
|
|
53
|
+
- `fix`: corrección de bug
|
|
54
|
+
- `refactor`: cambio que no agrega funcionalidad ni corrige bug
|
|
55
|
+
- `test`: agregar o corregir tests
|
|
56
|
+
- `docs`: cambios en documentación
|
|
57
|
+
- `chore`: actualización de deps, configuración, tooling
|
|
58
|
+
- `perf`: mejora de rendimiento
|
|
59
|
+
- `style`: cambios de formato (espacios, punto y coma, etc.)
|
|
60
|
+
- `ci`: cambios en pipelines de CI/CD
|
|
61
|
+
|
|
62
|
+
Reglas del mensaje:
|
|
63
|
+
- Primera línea: imperativo, presente, sin punto al final, <72 caracteres.
|
|
64
|
+
- Mal: `Se agregó validación al formulario.`
|
|
65
|
+
- Mal: `Agrega validación al formulario de registro de usuario con múltiples campos`
|
|
66
|
+
- Bien: `feat(auth): agregar validación de formato de email en registro`
|
|
67
|
+
- El cuerpo explica el contexto y la razón del cambio, no repite el diff.
|
|
68
|
+
- Referenciar tickets: `Closes #123`, `Refs #456` en el footer.
|
|
69
|
+
- Breaking changes: `BREAKING CHANGE: descripción` en el footer.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Branches descriptivas
|
|
74
|
+
|
|
75
|
+
Formato: `<tipo>/<descripcion-en-kebab-case>`
|
|
76
|
+
|
|
77
|
+
Tipos de branch:
|
|
78
|
+
- `feat/` — nueva feature
|
|
79
|
+
- `fix/` — corrección de bug
|
|
80
|
+
- `refactor/` — refactoring sin cambio funcional
|
|
81
|
+
- `hotfix/` — corrección urgente de producción
|
|
82
|
+
- `chore/` — mantenimiento, actualizaciones de deps
|
|
83
|
+
- `docs/` — solo documentación
|
|
84
|
+
|
|
85
|
+
Ejemplos:
|
|
86
|
+
- `feat/modulo-facturacion-electronica`
|
|
87
|
+
- `fix/error-calculo-impuesto-ieps`
|
|
88
|
+
- `hotfix/sql-injection-endpoint-productos`
|
|
89
|
+
- `refactor/migrar-callbacks-a-promises`
|
|
90
|
+
|
|
91
|
+
Reglas:
|
|
92
|
+
- Nombre describe el trabajo, no la persona ni el ticket.
|
|
93
|
+
- Mal: `branch-juan`, `feat-123`, `nueva-rama`
|
|
94
|
+
- Bien: `feat/exportacion-reporte-pdf`
|
|
95
|
+
- Vida corta: las ramas de feature no duran más de 2 semanas sin mergearse.
|
|
96
|
+
Ramas largas generan conflictos masivos.
|
|
97
|
+
- Eliminar la rama después del merge al branch base.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## No force-push a main / develop
|
|
102
|
+
|
|
103
|
+
- `git push --force` y `git push --force-with-lease` están prohibidos en
|
|
104
|
+
`main`, `master` y `develop`.
|
|
105
|
+
- Estas ramas deben tener protección de branch habilitada en el repositorio.
|
|
106
|
+
- Si se requiere reescribir historial de main: escalar a decisión del equipo,
|
|
107
|
+
con plan de comunicación y ventana de mantenimiento.
|
|
108
|
+
- En ramas de feature propias: `--force-with-lease` está permitido para rebase
|
|
109
|
+
interactivo antes del PR, con precaución.
|
|
110
|
+
- Rebase en ramas compartidas (más de un colaborador): siempre coordinar antes.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## PRs — descripción y test plan obligatorios
|
|
115
|
+
|
|
116
|
+
Todo Pull Request debe incluir:
|
|
117
|
+
|
|
118
|
+
**Título**: sigue el mismo formato que el mensaje de commit.
|
|
119
|
+
|
|
120
|
+
**Descripción mínima**:
|
|
121
|
+
```markdown
|
|
122
|
+
## Resumen
|
|
123
|
+
- Qué cambió y por qué (1-3 bullets)
|
|
124
|
+
|
|
125
|
+
## Cambios principales
|
|
126
|
+
- Lista de los cambios técnicos relevantes
|
|
127
|
+
|
|
128
|
+
## Test plan
|
|
129
|
+
- [ ] Paso 1 para verificar manualmente
|
|
130
|
+
- [ ] Paso 2 para verificar el caso edge
|
|
131
|
+
- [ ] Caso de error verificado
|
|
132
|
+
|
|
133
|
+
## Screenshots (si hay cambios de UI)
|
|
134
|
+
|
|
135
|
+
## Notas para el reviewer
|
|
136
|
+
- Contexto adicional, decisiones tomadas, alternativas descartadas
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Reglas adicionales:
|
|
140
|
+
- PRs de más de 500 líneas cambiadas: justificar o dividir en PRs menores.
|
|
141
|
+
- Asignar reviewer antes de solicitar revisión.
|
|
142
|
+
- No mergear el propio PR sin revisión (excepto hotfixes urgentes documentados).
|
|
143
|
+
- Resolver todos los comentarios antes de mergear (o marcar como `wontfix` con justificación).
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Squash antes de merge
|
|
148
|
+
|
|
149
|
+
- Commits WIP, de typos y de fix de review se squashean antes del merge.
|
|
150
|
+
- El historial de main muestra solo commits semánticos y atómicos.
|
|
151
|
+
- Estrategia recomendada: `Squash and merge` desde la UI de GitHub/GitLab,
|
|
152
|
+
o `rebase interactivo` antes del merge.
|
|
153
|
+
- El mensaje del squash debe ser descriptivo del cambio completo, no solo
|
|
154
|
+
el primer mensaje de la rama.
|
|
155
|
+
- Ramas con múltiples commits lógicos independientes: usar `rebase` en lugar
|
|
156
|
+
de `squash` para preservar la granularidad.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Flujo completo de trabajo
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
main ─────────────────────────────────────────► main
|
|
164
|
+
│ ▲
|
|
165
|
+
└─ feat/nombre ──[commits]──[squash]─┘
|
|
166
|
+
│
|
|
167
|
+
└─ [PR] ──[review] ──[CI pass] ──[merge]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
1. Crear branch desde `main` (o `develop` si existe).
|
|
171
|
+
2. Hacer commits atómicos en la branch.
|
|
172
|
+
3. Mantener la branch actualizada con `git rebase main` (no merge).
|
|
173
|
+
4. Abrir PR con descripción completa.
|
|
174
|
+
5. Pasar CI (linter, tests, type-check).
|
|
175
|
+
6. Obtener aprobación de al menos 1 reviewer.
|
|
176
|
+
7. Squash y merge.
|
|
177
|
+
8. Eliminar la branch.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Reglas de emergencia (hotfixes)
|
|
182
|
+
|
|
183
|
+
- Un hotfix de producción puede saltarse el proceso completo de review si hay
|
|
184
|
+
indisponibilidad activa, con las siguientes condiciones:
|
|
185
|
+
- Notificar al equipo en el canal de incidencias antes de mergear.
|
|
186
|
+
- El fix más pequeño posible — solo lo que resuelve el incidente.
|
|
187
|
+
- PR de follow-up con tests dentro de 24 horas.
|
|
188
|
+
- Post-mortem si el incidente duró más de 30 minutos.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Sincronización de versiones antes de release
|
|
193
|
+
|
|
194
|
+
Cuando se modifican componentes del sistema SWL (agentes, skills, reglas, hooks,
|
|
195
|
+
comandos, schemas o manifiestos), la versión debe actualizarse en TODOS los
|
|
196
|
+
archivos que la declaran antes de hacer commit y publicar:
|
|
197
|
+
|
|
198
|
+
| Archivo | Campo | Ejemplo |
|
|
199
|
+
|---------|-------|---------|
|
|
200
|
+
| `package.json` | `"version"` | `"5.0.3"` |
|
|
201
|
+
| `plugin.json` | `"version"` | `"5.0.3"` |
|
|
202
|
+
| `SALUD.md` | `Versión del sistema` | `5.0.3` (todas las ocurrencias) |
|
|
203
|
+
| `.claude/.swl-install-state.json` | `"versionSistema"` | `"5.0.3"` (local, gitignored) |
|
|
204
|
+
|
|
205
|
+
El tipo de bump sigue SemVer:
|
|
206
|
+
- **PATCH** (5.0.X): correcciones de bugs, mejoras de redacción, ajustes de patrones
|
|
207
|
+
- **MINOR** (5.X.0): agente nuevo, skill nuevo, comando nuevo, regla nueva
|
|
208
|
+
- **MAJOR** (X.0.0): cambio breaking en schemas, reglas obligatorias nuevas, restructuración
|
|
209
|
+
|
|
210
|
+
Verificación rápida de consistencia:
|
|
211
|
+
```bash
|
|
212
|
+
node -e "const p=require('./package.json'),l=require('./plugin.json');console.log(p.version===l.version?'OK: '+p.version:'INCONSISTENTE: pkg='+p.version+' plugin='+l.version)"
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Reglas de oro CI/CD (cuando se adopta swl-configurar-ci)
|
|
218
|
+
|
|
219
|
+
Cuando un proyecto activa el flujo CI/CD distribuido por swl-ses (vía
|
|
220
|
+
`/swl:configurar-ci init`), aplican las siguientes reglas:
|
|
221
|
+
|
|
222
|
+
- **Toda feature entra vía Pull Request a main**. Nunca se hace push directo
|
|
223
|
+
a main — incluso para hotfixes urgentes (excepción documentada explícita).
|
|
224
|
+
- **Branch protection en main es obligatorio**: aplicar via
|
|
225
|
+
`node scripts/configurar-branch-protection.js` o vía GitHub Settings →
|
|
226
|
+
Branches.
|
|
227
|
+
- **Todo PR ejecuta automáticamente**: lint, validaciones de aislamiento,
|
|
228
|
+
tests, security review con Claude. Si algo falla, el merge queda bloqueado.
|
|
229
|
+
- **main siempre lista para producción**. Cualquier commit en main debe
|
|
230
|
+
pasar el gate de CI antes de mergearse.
|
|
231
|
+
- **Secrets en GitHub Secrets, nunca en código ni en .env del repo**: la
|
|
232
|
+
`CLAUDE_API_KEY` requerida por el security workflow vive en
|
|
233
|
+
Settings → Secrets and variables → Actions.
|
|
234
|
+
- **Permisos mínimos en workflows**: `permissions:` declara solo lo
|
|
235
|
+
estrictamente necesario (`contents: read`, `pull-requests: write`).
|
|
236
|
+
Nunca `permissions: write-all`.
|
|
237
|
+
- **Workflows desde fork PRs no reciben secrets**: la security review
|
|
238
|
+
con Claude no puede correr en PRs desde forks externos sin configuración
|
|
239
|
+
adicional. Esta limitación es de GitHub por diseño — documentarla en el
|
|
240
|
+
proyecto.
|
|
241
|
+
|
|
242
|
+
Estas reglas aplican solo cuando swl-configurar-ci está activo. Proyectos
|
|
243
|
+
sin CI/CD pueden mantener flujos directos a main bajo responsabilidad
|
|
244
|
+
del owner.
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Checklist antes de abrir un PR
|
|
249
|
+
|
|
250
|
+
- [ ] Commits son atómicos y tienen mensajes descriptivos
|
|
251
|
+
- [ ] Branch actualizada con `rebase` desde main (sin conflictos)
|
|
252
|
+
- [ ] Tests pasan localmente
|
|
253
|
+
- [ ] Linter y type-checker pasan
|
|
254
|
+
- [ ] PR tiene descripción, cambios principales y test plan
|
|
255
|
+
- [ ] No se fuerza push a main
|
|
256
|
+
- [ ] Commits WIP squasheados
|
|
257
|
+
- [ ] Si se modificaron componentes del sistema (agentes, skills, reglas, hooks):
|
|
258
|
+
versión actualizada en package.json, plugin.json y SALUD.md
|
|
259
|
+
- [ ] Si el proyecto usa `swl-configurar-ci`, este PR pasa todos los gates de CI
|