@saulwade/swl-ses 2.3.0 → 2.3.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 +47 -6
- package/README.md +1 -1
- 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 +472 -472
- 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 +479 -479
- package/agentes/backend-python-swl.md +605 -605
- 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 +605 -605
- 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 +2 -2
- package/agentes/implementador-swl.md +328 -328
- package/agentes/investigador-swl.md +432 -432
- package/agentes/investigador-ux-swl.md +505 -505
- package/agentes/llm-apps-swl.md +278 -278
- 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 +918 -918
- package/agentes/observabilidad-swl.md +438 -438
- package/agentes/orquestador-swl.md +1026 -1026
- 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 +1 -1
- package/agentes/release-manager-swl.md +590 -590
- package/agentes/rendimiento-swl.md +713 -713
- package/agentes/resolutor-build-swl.md +245 -245
- package/agentes/revisor-angular-swl.md +278 -278
- package/agentes/revisor-codigo-swl.md +505 -505
- 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 +291 -291
- package/agentes/tdd-qa-swl.md +393 -393
- package/comandos/swl/briefing.md +119 -119
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/predecir.md +139 -139
- package/comandos/swl/sesiones.md +1 -1
- package/gateway/agent-executor.js +1 -1
- package/gateway/lib/event-channel.js +191 -191
- package/habilidades/agent-deep-links/SKILL.md +148 -148
- package/habilidades/agentes-como-servicio/SKILL.md +2 -2
- package/habilidades/angular-moderno/SKILL.md +20 -1
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
- package/habilidades/backend-async-postgres-testing/SKILL.md +215 -215
- package/habilidades/backend-error-design/SKILL.md +221 -221
- package/habilidades/backend-production-resilience/SKILL.md +288 -288
- package/habilidades/benchmark-memoria/SKILL.md +186 -186
- package/habilidades/calidad-anti-patrones-universales/SKILL.md +368 -368
- package/habilidades/calidad-contract-testing/SKILL.md +165 -165
- package/habilidades/calidad-mutation-testing/SKILL.md +170 -170
- package/habilidades/changelog-generator/scripts/parse-commits.js +367 -367
- package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
- package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
- package/habilidades/drift-detection/SKILL.md +179 -179
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +1 -1
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
- package/habilidades/eval-framework/SKILL.md +212 -212
- package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
- package/habilidades/harness-claude-code/recursos/disciplina-harness-regla.md +252 -252
- package/habilidades/legacy-code-rescue/SKILL.md +267 -267
- package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
- package/habilidades/perfil-usuario/SKILL.md +200 -200
- package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -255
- package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
- package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -105
- package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
- package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -138
- package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
- package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
- package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
- package/habilidades/proceso-modular-split/SKILL.md +256 -256
- package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +2 -2
- package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
- package/habilidades/structured-outputs/SKILL.md +2 -2
- package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
- package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
- package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
- package/habilidades/swl-dashboard/SKILL.md +2 -2
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
- package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +1 -1
- package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +1 -1
- package/hooks/ciclo-evolucion-subagente.js +26 -26
- package/hooks/ciclo-evolucion.js +26 -26
- package/hooks/claudemd-bloat-detector.js +161 -161
- package/hooks/claudemd-duplicacion-detector.js +170 -170
- package/hooks/contexto-iteracion.js +144 -144
- package/hooks/guardrail-modelo.js +1 -1
- package/hooks/lib/agent-routing.js +107 -107
- package/hooks/lib/auto-consolidator.js +335 -335
- package/hooks/lib/autonomia.js +208 -208
- package/hooks/lib/ciclo-evolucion.js +47 -47
- package/hooks/lib/deep-links.js +185 -185
- package/hooks/lib/error-classifier.js +308 -308
- package/hooks/lib/etapa-auto-evolucion.js +701 -701
- package/hooks/lib/etapa-metricas.js +388 -388
- package/hooks/lib/etapa-perfil-usuario.js +376 -376
- package/hooks/lib/loop-telemetry.js +321 -321
- package/hooks/lib/merkle-audit.js +96 -96
- package/hooks/lib/model-router.js +2 -2
- package/hooks/lib/propose-step.js +358 -358
- package/hooks/lib/provenance-tracker.js +191 -191
- package/hooks/lib/rate-limit-tracker.js +253 -253
- package/hooks/lib/resource-quota.js +122 -122
- package/hooks/lib/retry-jitter.js +165 -165
- package/hooks/lib/security-net.js +201 -201
- package/hooks/lib/skill-auditor.js +588 -588
- package/hooks/lib/sync-status.js +228 -228
- package/hooks/lib/taint-tracker.js +107 -107
- package/hooks/lib/text-similarity.js +241 -241
- package/hooks/lib/token-estimator.js +1 -0
- package/hooks/lib/toon-compressor.js +245 -245
- package/hooks/lib/usage-model.js +1 -1
- package/hooks/linea-estado.js +2 -0
- package/hooks/registro-turnos.js +209 -209
- package/hooks/session-briefing.js +98 -98
- package/hooks/spec-gate.js +211 -211
- package/hooks/sugerir-regenerar-inventario.js +170 -170
- package/hooks/tdd-gate.js +241 -241
- package/hooks/telemetria-skill-routing.js +100 -100
- package/hooks/validar-formato-post-subagente.js +140 -140
- package/hooks/validar-intent-spec.js +242 -242
- package/hooks/validar-memoria-hook.js +218 -218
- package/hooks/validar-planning-paths.js +134 -134
- package/instintos/autonomia.yaml +27 -27
- package/instintos/prompt-appendices.yaml +57 -57
- package/llms.txt +29 -29
- package/manifiestos/agent-output-schemas.json +57 -57
- package/manifiestos/canonical-hashes.json +2291 -1964
- package/manifiestos/planning-paths.json +44 -44
- package/manifiestos/skills-lock.json +1282 -1282
- package/package.json +1 -1
- package/plantillas/auditor-veto-template.md +105 -105
- package/plantillas/github-workflows/README.md +47 -47
- package/plantillas/github-workflows/release-please.yml +44 -44
- package/plantillas/github-workflows/swl-ci.yml +107 -107
- package/plantillas/github-workflows/swl-security.yml +51 -51
- package/plugin.json +1 -1
- package/reglas/accesibilidad.md +10 -10
- package/reglas/analisis-previo-tareas-grandes.md +172 -172
- package/reglas/api-diseno.md +9 -9
- package/reglas/arreglar-al-detectar.md +240 -240
- package/reglas/auditorias-documentales-estructurales.md +7 -7
- package/reglas/cloud-infra.md +8 -8
- package/reglas/consultar-vault-primero.md +195 -195
- package/reglas/debatir-antes-de-aceptar.md +158 -158
- package/reglas/fragmentos-compartidos.md +183 -183
- package/reglas/hooks.md +6 -6
- package/reglas/intent-engineering.md +218 -218
- package/reglas/markitdown.md +8 -8
- package/reglas/monitor-ci.md +309 -309
- package/reglas/patrones.md +6 -6
- package/reglas/sesiones-paralelas.md +180 -180
- package/reglas/sin-duplicacion-reglas-globales.md +182 -182
- package/reglas/skills-estandar.md +6 -6
- package/reglas/testing.md +7 -7
- package/reglas/tests-cleanup.md +224 -224
- package/reglas/usar-code-review-graph.md +155 -155
- package/reglas/usar-context7.md +226 -226
- package/reglas/verificar-citas-normativas.md +548 -548
- package/schemas/agent-frontmatter.schema.json +3 -3
- package/schemas/agent-message.schema.json +73 -73
- package/schemas/agent-output-implementacion.schema.json +114 -114
- package/schemas/agent-output-planificacion.schema.json +150 -150
- package/schemas/agent-output-review.schema.json +98 -98
- package/schemas/diary-entry.schema.json +112 -112
- package/schemas/hook-profiles.schema.json +54 -54
- package/schemas/hooks-config.schema.json +89 -89
- package/schemas/modulos.schema.json +38 -38
- package/schemas/perfiles.schema.json +36 -36
- package/schemas/plugin.schema.json +77 -77
- package/schemas/skill-evals.schema.json +119 -119
- package/schemas/skill-frontmatter.schema.json +245 -245
- package/scripts/audit-tools/audit-history.js +330 -330
- package/scripts/audit-tools/bundle-tracker.js +290 -290
- package/scripts/audit-tools/canary-monitor.js +352 -352
- package/scripts/audit-tools/code-profiler.js +605 -605
- package/scripts/audit-tools/dep-doctor.js +320 -320
- package/scripts/audit-tools/env-validator.js +206 -206
- package/scripts/audit-tools/lib/fs-walk.js +48 -48
- package/scripts/audit-tools/lib/output.js +23 -23
- package/scripts/audit-tools/migration-checker.js +392 -392
- package/scripts/audit-tools/pentest-scanner.js +1436 -1436
- package/scripts/benchmark-memoria.js +167 -167
- package/scripts/cli/aprobar-plan.js +73 -73
- package/scripts/cli/briefing.js +23 -23
- package/scripts/cli/ciclo-evolucion.js +26 -26
- package/scripts/cli/configurar-ci.js +40 -40
- package/scripts/cli/derivar-feature-list.js +25 -25
- package/scripts/cli/detectar-host.js +27 -27
- package/scripts/cli/diary-entry.js +69 -69
- package/scripts/cli/execution-state.js +18 -18
- package/scripts/cli/gateway-notify.js +41 -41
- package/scripts/cli/liberar-fase.js +42 -42
- package/scripts/cli/loop-telemetry.js +125 -125
- package/scripts/cli/mark-evolved.js +56 -56
- package/scripts/cli/metricas-dora.js +26 -26
- package/scripts/cli/near-duplicate.js +55 -55
- package/scripts/cli/notificaciones.js +123 -123
- package/scripts/cli/propose-step.js +29 -29
- package/scripts/cli/schedule-parse.js +19 -19
- package/scripts/cli/sugerir-modelo.js +20 -20
- package/scripts/cli/verificar-plan.js +36 -36
- package/scripts/cli/verificar-trazabilidad.js +35 -35
- package/scripts/configurar-branch-protection.js +418 -418
- package/scripts/detectar-aprendizajes-duplicados.js +151 -151
- package/scripts/field-report.js +199 -199
- package/scripts/generar-checklists-consolidados.js +273 -273
- package/scripts/generar-matriz-lenguajes.js +271 -271
- package/scripts/lib/artefactos-python.js +43 -43
- package/scripts/lib/auditar-invocaciones-comandos.js +104 -104
- package/scripts/lib/benchmark-metrics.js +160 -160
- package/scripts/lib/budget-enforcer.js +252 -252
- package/scripts/lib/ci-reader.js +193 -193
- package/scripts/lib/claude-sessions.js +1 -0
- package/scripts/lib/configurar-ci.js +380 -380
- package/scripts/lib/contadores-inventario.js +217 -217
- package/scripts/lib/detectar-host-swl.js +175 -175
- package/scripts/lib/detectar-stack-detallado.js +307 -307
- package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
- package/scripts/lib/detector-reglas-duplicadas.js +220 -220
- package/scripts/lib/diary-entry.js +234 -234
- package/scripts/lib/eval-metrics-store.js +218 -218
- package/scripts/lib/eval-quality.js +171 -171
- package/scripts/lib/eval-schemas.js +144 -144
- package/scripts/lib/eval-self-correct.js +106 -106
- package/scripts/lib/eval-validator.js +185 -185
- package/scripts/lib/evidencia-release.js +322 -322
- package/scripts/lib/expandir-targets.js +71 -71
- package/scripts/lib/gate-hooks-requires.js +249 -249
- package/scripts/lib/gate-licencias.js +212 -212
- package/scripts/lib/git-metricas.js +257 -257
- package/scripts/lib/jaccard-similarity.js +98 -98
- package/scripts/lib/longmemeval-runner.js +125 -125
- package/scripts/lib/metricas-dora.js +204 -204
- package/scripts/lib/npm-version.js +261 -261
- package/scripts/lib/paquetes-conocidos.js +50 -50
- package/scripts/lib/plan-lock.js +275 -275
- package/scripts/lib/pr-analyzer.js +399 -399
- package/scripts/lib/prompt-builder.js +264 -264
- package/scripts/lib/reglas-globales-conocidas.json +180 -180
- package/scripts/lib/resolver-plan-fase.js +37 -37
- package/scripts/lib/rrf-fusion.js +175 -175
- package/scripts/lib/schema-version.js +164 -164
- package/scripts/lib/scoring-instintos.js +277 -277
- package/scripts/lib/semantic-search.js +252 -252
- package/scripts/lib/toml-merge.js +204 -204
- package/scripts/lib/tool-cost-analyzer.js +1 -0
- package/scripts/limpiar-artefactos-python.js +131 -131
- package/scripts/mcp-server/auth.js +105 -105
- package/scripts/mcp-server/cache.js +106 -106
- package/scripts/migrar-csv-a-array.js +168 -168
- package/scripts/migrar-fase-dominio.js +200 -200
- package/scripts/publicar.js +497 -497
- package/scripts/run-eval.js +141 -141
- package/scripts/tui/componentes/selector-multi.js +189 -189
- package/scripts/tui/componentes/selector-unico.js +158 -158
- package/scripts/tui/ejecutores.js +375 -375
- package/scripts/tui/index.js +162 -162
- package/scripts/tui/lib/colores.js +129 -129
- package/scripts/tui/lib/render.js +264 -264
- package/scripts/tui/lib/teclas.js +113 -113
- package/scripts/tui/pantallas/inspect.js +173 -173
- package/scripts/tui/pantallas/install-wizard.js +334 -334
- package/scripts/tui/pantallas/menu-principal.js +52 -52
- package/scripts/tui/pantallas/progreso.js +274 -274
- package/scripts/tui/pantallas/resumen.js +132 -132
- package/scripts/tui/pantallas/uninstall-wizard.js +208 -208
- package/scripts/tui/pantallas/update-wizard.js +232 -232
- package/scripts/tui/pantallas/welcome.js +187 -187
- package/scripts/validar-userland-vacio.js +110 -110
package/reglas/monitor-ci.md
CHANGED
|
@@ -1,309 +1,309 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/.github/workflows/**"
|
|
4
|
-
---
|
|
5
|
-
# Regla: Monitor de CI tras push
|
|
6
|
-
|
|
7
|
-
Esta regla es OBLIGATORIA para todo proyecto del usuario que use GitHub
|
|
8
|
-
Actions (presencia de `.github/workflows/`). Aplica tras cada `git push` a la
|
|
9
|
-
rama principal o a una rama con CI activo.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Principio
|
|
14
|
-
|
|
15
|
-
> Tras cualquier push que dispare workflows de CI, **arma un Monitor que
|
|
16
|
-
> emita una notificación cuando cada workflow termine** (success o failure)
|
|
17
|
-
> en lugar de pollear con `sleep` o esperar que el usuario pregunte.
|
|
18
|
-
|
|
19
|
-
El Monitor de Claude Code permite reaccionar inmediatamente a fallos sin
|
|
20
|
-
bloquear la conversación: si un workflow falla, el monitor lo emite como
|
|
21
|
-
evento y Claude diagnostica/arregla sin esperar input. Si todo pasa, Claude
|
|
22
|
-
puede continuar trabajando en paralelo.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Cuándo armar el Monitor
|
|
27
|
-
|
|
28
|
-
OBLIGATORIO armarlo:
|
|
29
|
-
|
|
30
|
-
- Tras `git push` a rama con workflows activos.
|
|
31
|
-
- Tras crear un PR con CI requerido (cuando GitHub corre los checks).
|
|
32
|
-
- Tras `gh workflow run` manual.
|
|
33
|
-
- Cuando el usuario pide "verifica el CI" sin más detalle.
|
|
34
|
-
|
|
35
|
-
NO armarlo cuando:
|
|
36
|
-
|
|
37
|
-
- El push fue a una rama sin workflows activos para esa rama.
|
|
38
|
-
- Es un push de solo documentación que no dispara workflows (verificar el
|
|
39
|
-
filtro `paths:` del workflow primero).
|
|
40
|
-
- El usuario explícitamente dijo "no monitorees" o "termina aquí".
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## Patrón estándar del comando
|
|
45
|
-
|
|
46
|
-
Plantilla para la herramienta `Monitor` de Claude Code. **Usa el `--jq`
|
|
47
|
-
integrado de `gh` (NO `| jq`)** para evitar dependencia externa — `jq` no
|
|
48
|
-
viene preinstalado en Windows + Git Bash, y `gh --jq` funciona idéntico
|
|
49
|
-
sin requerir instalación adicional. Tampoco usa `2>/dev/null` para que
|
|
50
|
-
errores reales del shell (PATH, `cd` fallido) se vean en stdout y aborten
|
|
51
|
-
el monitor en lugar de hacerlo expirar silenciosamente.
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
prev=""
|
|
55
|
-
while true; do
|
|
56
|
-
cur=$(cd PROJECT_PATH && gh run list --branch BRANCH --limit N \
|
|
57
|
-
--json status,conclusion,name,headSha \
|
|
58
|
-
--jq '.[] | "\(.headSha[0:7]) | \(.name): \(.status)/\(.conclusion // "pending")"' \
|
|
59
|
-
| sort)
|
|
60
|
-
comm -13 <(echo "$prev") <(echo "$cur")
|
|
61
|
-
prev=$cur
|
|
62
|
-
if cd PROJECT_PATH && gh run list --branch BRANCH --limit N \
|
|
63
|
-
--json status \
|
|
64
|
-
--jq 'all(.[]; .status == "completed")' | grep -q true; then
|
|
65
|
-
break
|
|
66
|
-
fi
|
|
67
|
-
sleep 25
|
|
68
|
-
done
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**Variables a sustituir:**
|
|
72
|
-
|
|
73
|
-
| Variable | Valor |
|
|
74
|
-
|----------|-------|
|
|
75
|
-
| `PROJECT_PATH` | Working directory del proyecto (ej: `D:/Python/sigm`) |
|
|
76
|
-
| `BRANCH` | Rama del push (`main`, feature branch, etc.) |
|
|
77
|
-
| `N` | Cantidad de workflows que dispara ese push (3 si son frontend+backend+security; 4 si incluye database; etc.) |
|
|
78
|
-
|
|
79
|
-
**Argumentos típicos para `Monitor`:**
|
|
80
|
-
|
|
81
|
-
```jsonc
|
|
82
|
-
{
|
|
83
|
-
"description": "CI commit <hash-corto> (<contexto>) — sale cuando los N workflows finalizan",
|
|
84
|
-
"timeout_ms": 600000, // 10 min — suficiente para la mayoría de CIs
|
|
85
|
-
"persistent": false, // false = sale al completar todos
|
|
86
|
-
"command": "<plantilla arriba>"
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Para CIs largos (>10 min), subir `timeout_ms` a 1200000 (20 min) o
|
|
91
|
-
1800000 (30 min). Máximo soportado: 3600000 (60 min).
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## Cómo funciona
|
|
96
|
-
|
|
97
|
-
- `gh run list --branch BRANCH --limit N` devuelve los N runs más recientes
|
|
98
|
-
de esa rama (los recién disparados por tu push aparecen en orden).
|
|
99
|
-
- `--jq '...'` (integrado en `gh`, NO el binario `jq` externo) formatea
|
|
100
|
-
`sha-corto | name: status/conclusion` por línea. Equivalente a `| jq`
|
|
101
|
-
pero sin dependencia externa.
|
|
102
|
-
- `comm -13` emite solo las líneas NUEVAS respecto a la iteración anterior
|
|
103
|
-
(cada vez que un workflow cambia de estado, sale como notificación).
|
|
104
|
-
- El segundo bloque verifica con `--jq 'all(.[]; .status == "completed")'`
|
|
105
|
-
+ `grep -q true` si todos los workflows terminaron — sale del loop.
|
|
106
|
-
- El loop sale cuando todos los workflows están en estado `completed`.
|
|
107
|
-
|
|
108
|
-
Cada cambio de estado genera **una notificación al chat**, así que recibes
|
|
109
|
-
eventos como:
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
ee6e03e | Frontend CI: in_progress/pending
|
|
113
|
-
ee6e03e | Backend CI: completed/success
|
|
114
|
-
ee6e03e | Security: completed/success
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
cuando el primer workflow se mueve de `pending` a `in_progress`, otro a
|
|
118
|
-
`success`, etc.
|
|
119
|
-
|
|
120
|
-
### Por qué `gh --jq` y no `jq` externo
|
|
121
|
-
|
|
122
|
-
El comando original usaba `| jq` y expiraba silenciosamente en sistemas
|
|
123
|
-
Windows sin `jq` instalado: el pipe a `jq` (que no existe) hacía que `$cur`
|
|
124
|
-
quedara vacío, `comm -13` no emitía deltas y el check de "todos completed"
|
|
125
|
-
siempre fallaba → loop dormía hasta timeout sin notificar nada. Caso real
|
|
126
|
-
(SIGM, 2026-05-12): dos monitores consecutivos expiraron sin un solo evento;
|
|
127
|
-
diagnóstico reveló `jq: command not found` en Git Bash de Windows.
|
|
128
|
-
|
|
129
|
-
`gh --jq` está embebido en el binario de `gh` (que ya es requisito), aplica
|
|
130
|
-
la misma sintaxis y funciona idéntico en Windows, macOS y Linux sin
|
|
131
|
-
instalaciones adicionales. **Esta es la forma recomendada — usa el flag
|
|
132
|
-
integrado siempre, salvo que tengas razón fuerte para depender de `jq`
|
|
133
|
-
externo (filtros muy complejos que solo cubre el binario completo).**
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## Acciones tras evento del Monitor
|
|
138
|
-
|
|
139
|
-
1. **Si todos terminan en `success`**: continuar con el siguiente paso del
|
|
140
|
-
plan (commit nuevo, fase nueva, etc.). No pedir confirmación al usuario
|
|
141
|
-
para cosas obvias.
|
|
142
|
-
2. **Si alguno termina en `failure`**: descargar log con
|
|
143
|
-
`gh run view <run-id> --log-failed` y diagnosticar inmediatamente.
|
|
144
|
-
Aplicar la regla `arreglar-al-detectar.md`: detectar → informar →
|
|
145
|
-
arreglar en mismo turno.
|
|
146
|
-
|
|
147
|
-
En proyectos con swl-ses instalado (presencia de `agentes/gh-fix-ci-swl.md`),
|
|
148
|
-
el camino canónico para cerrar el ciclo failure → fix → re-push → green
|
|
149
|
-
es invocar el agente **`gh-fix-ci-swl`** (HITL approval obligatorio antes
|
|
150
|
-
de aplicar el fix; max 3 iteraciones; `maxTurnos: 12`). El agente carga
|
|
151
|
-
el `Skill("build-errors-<lang>")` correspondiente automáticamente. Si el
|
|
152
|
-
error es del workflow YAML mismo (secret, action, syntax), delega a
|
|
153
|
-
`devops-ci-swl`. Si el error es local (no específico de CI), prefiere
|
|
154
|
-
`resolutor-build-swl`. Origen: ADR-0029 (swl-ses).
|
|
155
|
-
|
|
156
|
-
3. **Si el monitor expira (`timeout_ms`)**: re-armar con timeout mayor o
|
|
157
|
-
verificar manualmente con `gh run list`.
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
## Anti-patrones a evitar
|
|
162
|
-
|
|
163
|
-
- `sleep N && gh run list` — bloquea la conversación, no recibe eventos.
|
|
164
|
-
- Polling manual con múltiples `Bash` calls separadas.
|
|
165
|
-
- Arrancar el siguiente trabajo sin saber si el CI pasó (riesgo de
|
|
166
|
-
acumular commits sobre código roto).
|
|
167
|
-
- Olvidar el monitor tras un push y que el usuario tenga que recordártelo.
|
|
168
|
-
|
|
169
|
-
---
|
|
170
|
-
|
|
171
|
-
## Antes de declarar "CI verde" — verificación obligatoria por SHA
|
|
172
|
-
|
|
173
|
-
Esta sección formaliza la regla post-mortem (L-124, SIGM Sub-fase 5c, 2026-05-11):
|
|
174
|
-
reportar al usuario "CI verde" sin verificar cada workflow individualmente es
|
|
175
|
-
**falsificación de estado**. Un monitor expirado, un commit donde un workflow
|
|
176
|
-
no se disparó, o asumir "verde por default" llevan a declarar saludable un
|
|
177
|
-
sistema que está roto.
|
|
178
|
-
|
|
179
|
-
### Checklist obligatorio antes de afirmar "CI verde"
|
|
180
|
-
|
|
181
|
-
1. **Listar todos los workflows del SHA específico**:
|
|
182
|
-
```bash
|
|
183
|
-
# Forma recomendada — gh --jq integrado, sin jq ni python externos:
|
|
184
|
-
gh run list --branch main --limit 8 \
|
|
185
|
-
--json status,conclusion,name,headSha \
|
|
186
|
-
--jq '.[] | "\(.headSha[0:7]) | \(.name): \(.status)/\(.conclusion // "pending")"'
|
|
187
|
-
|
|
188
|
-
# Fallback con Python si necesitas filtrar/agrupar por SHA en cliente:
|
|
189
|
-
gh run list --branch main --limit 20 --json status,conclusion,name,headSha \
|
|
190
|
-
| python -c "import sys,json; runs=json.load(sys.stdin); sha='ee6e03e'; \
|
|
191
|
-
[print(f'{r[\"name\"]}: {r[\"status\"]}/{r.get(\"conclusion\") or \"pending\"}') \
|
|
192
|
-
for r in runs if r['headSha'].startswith(sha)]"
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
2. **Confirmar `conclusion=success` para cada workflow aplicable**:
|
|
196
|
-
- Cada workflow tiene `paths:` distintos en `on:`. Si el commit solo toca
|
|
197
|
-
`frontend/`, **NO** se dispara Backend CI — eso es comportamiento correcto,
|
|
198
|
-
no fallo. Pero un workflow que SÍ debió dispararse y NO aparece en la
|
|
199
|
-
lista por el SHA es señal de mala configuración: investigar.
|
|
200
|
-
- **NUNCA** asumir verde por ausencia. La ausencia significa "no se ejecutó",
|
|
201
|
-
no "pasó".
|
|
202
|
-
|
|
203
|
-
3. **NO interpretar Monitor expirado como verde**:
|
|
204
|
-
- El Monitor de Claude Code emite `[Monitor timed out — re-arm if needed.]`
|
|
205
|
-
cuando el timeout vence antes de que todos los workflows finalicen.
|
|
206
|
-
- **Timeout ≠ success**. Equivale a "estado desconocido al momento del corte".
|
|
207
|
-
- Re-armar el Monitor con timeout mayor, O verificar manualmente con
|
|
208
|
-
`gh run list --commit <sha>`.
|
|
209
|
-
|
|
210
|
-
4. **Si algún workflow está en `failure` o `cancelled`**:
|
|
211
|
-
- Bajar el log con `gh run view <run-id> --log-failed` y diagnosticar.
|
|
212
|
-
- NO declarar verde hasta que el workflow fallido tenga su propio
|
|
213
|
-
`conclusion=success` en un commit posterior que lo arregle.
|
|
214
|
-
|
|
215
|
-
5. **Reportar al usuario el estado exacto por workflow**:
|
|
216
|
-
|
|
217
|
-
```
|
|
218
|
-
CI verde confirmado para commit <sha-corto>:
|
|
219
|
-
- Backend CI: success ✓
|
|
220
|
-
- Frontend CI: success ✓
|
|
221
|
-
- Security: success ✓
|
|
222
|
-
- E2E Smoke: success ✓
|
|
223
|
-
(Database CI no se disparó — el commit solo modificó frontend/, comportamiento correcto)
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
NO usar afirmaciones genéricas como "todo verde" sin enumerar.
|
|
227
|
-
|
|
228
|
-
### Anti-patrones explícitos
|
|
229
|
-
|
|
230
|
-
- **Reportar "CI verde" tras `git push` sin esperar finalización**: push retorna
|
|
231
|
-
exit 0 cuando GitHub aceptó el push, NO cuando los workflows pasaron.
|
|
232
|
-
Push exitoso ≠ CI verde.
|
|
233
|
-
|
|
234
|
-
- **Reportar "CI verde" porque el Monitor anterior dijo `success`**: si el
|
|
235
|
-
Monitor cubre commits A-B pero el último push es C, los workflows de C aún
|
|
236
|
-
no se evaluaron. Re-armar Monitor o verificar.
|
|
237
|
-
|
|
238
|
-
- **Reportar "CI verde" para un workflow NUEVO en su primer push**: un workflow
|
|
239
|
-
nuevo (ej: `e2e.yml`) tiene alta probabilidad de fallar en el primer run
|
|
240
|
-
porque no se validó localmente. Probar localmente Docker + servicios + tests
|
|
241
|
-
antes de reportar verde.
|
|
242
|
-
|
|
243
|
-
- **Asumir Frontend CI siempre verde porque "solo cambié docs"**: si modificas
|
|
244
|
-
un `.md` dentro de `frontend/`, Frontend CI se dispara igual por el matcher
|
|
245
|
-
`paths: ['frontend/**']`. Verificar.
|
|
246
|
-
|
|
247
|
-
- **"CI verde formal" (0 failed) ≠ "tests ejecutaron"**. Un run con 94 passed +
|
|
248
|
-
5 skipped + 0 failed es verde formal pero zero cobertura de los 5 saltados.
|
|
249
|
-
Tests con `if (!precondicion) test.skip()` aumentan silenciosamente el conteo
|
|
250
|
-
de skipped cuando la precondición falla. Comparar el conteo `skipped` entre
|
|
251
|
-
commits: si aumenta sin causa documentada (tests intencionalmente skipped en
|
|
252
|
-
el spec), es **regresión silenciosa**, no éxito. Reportar al usuario con cifras:
|
|
253
|
-
*"verde con N skipped (antes M)"*, no solo "verde". Origen: sesión SIGAF
|
|
254
|
-
2026-05-13, 7 commits con TC036-TC041 saltando por `actoId=null` antes de
|
|
255
|
-
detectar el patrón.
|
|
256
|
-
|
|
257
|
-
- **Fix de seed/fixture roto puede destapar tests "verde por suerte"**. Tests
|
|
258
|
-
que dependen de datos seedeados saltan por null check cuando el seed falla;
|
|
259
|
-
el CI los marca skipped y queda verde formal. Al arreglar el seed, los tests
|
|
260
|
-
vuelven a ejecutar y exponen fallas latentes que estaban camufladas. **Al
|
|
261
|
-
publicar un fix de seed/fixture, comparar el delta de skipped antes/después**
|
|
262
|
-
y revisar cada test que pase de SKIPPED a EJECUTANDO — pueden fallar por
|
|
263
|
-
otras razones acumuladas. Patrón observado en SIGAF 2026-05-13: fix
|
|
264
|
-
`e6d3f63` (seed grupo20 con `hallazgo.tipo_id`) destapó TC036-TC041 que
|
|
265
|
-
llevaban meses skipped por falta de actos en BD.
|
|
266
|
-
|
|
267
|
-
### Origen
|
|
268
|
-
|
|
269
|
-
Aprendizaje L-124 documentado en SIGM (`.planning/APRENDIZAJES.md`) tras
|
|
270
|
-
Sub-fase 5c (2026-05-11): se reportó "CI verde en cada push" en 7 commits
|
|
271
|
-
seguidos cuando Frontend CI estaba en `failure` desde el commit 4. El usuario
|
|
272
|
-
detectó la inconsistencia al pedir validación adicional ("no podemos avanzar
|
|
273
|
-
de fase hasta no probar que todo esté perfecto"). El Monitor que expiró fue
|
|
274
|
-
interpretado como verde por defecto — equivocadamente.
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
|
-
## Excepciones documentadas
|
|
279
|
-
|
|
280
|
-
- **Repos sin GitHub Actions**: usar el sistema de CI nativo del repo
|
|
281
|
-
(GitLab CI, CircleCI). Adaptar el comando.
|
|
282
|
-
- **Workflows en forks**: los workflows desde fork PRs no reciben secrets
|
|
283
|
-
por diseño de GitHub. El monitor sirve igual, pero algunos jobs pueden
|
|
284
|
-
saltarse.
|
|
285
|
-
- **Rama protegida con auto-merge**: si el repo tiene auto-merge tras CI,
|
|
286
|
-
el monitor sale al `success` y el merge ocurre automáticamente — no es
|
|
287
|
-
necesario push adicional.
|
|
288
|
-
|
|
289
|
-
---
|
|
290
|
-
|
|
291
|
-
## Origen de esta regla
|
|
292
|
-
|
|
293
|
-
Promovida a regla global el 2026-05-09 a petición del usuario tras observar
|
|
294
|
-
que el patrón Monitor con `gh run list` + `jq` + `comm -13` se repetía
|
|
295
|
-
con éxito en cada push del proyecto SIGM (~10 invocaciones en sesión 2026-05-09)
|
|
296
|
-
y que ahorraba 5-10 minutos por iteración vs polling manual.
|
|
297
|
-
|
|
298
|
-
Reemplaza el patrón anterior de "esperar que el usuario reporte el log
|
|
299
|
-
fallido y reaccionar reactivamente" por proactividad.
|
|
300
|
-
|
|
301
|
-
**Revisión 2026-05-12** (SIGM): migrado de `| jq` a `gh --jq` integrado
|
|
302
|
-
para eliminar dependencia de binario externo. Causa: dos monitores
|
|
303
|
-
consecutivos expiraron silenciosamente en Windows + Git Bash por
|
|
304
|
-
`jq: command not found`, sin emitir un solo evento. Lección: las
|
|
305
|
-
herramientas del Monitor tool corren en sub-shell sin `2>&1` visible —
|
|
306
|
-
cualquier comando faltante hace que el monitor dure hasta timeout sin
|
|
307
|
-
señal de fallo. Diagnóstico: `which jq` antes de armar (debería
|
|
308
|
-
devolver path, no exit 1). `gh --jq` no tiene esta dependencia porque
|
|
309
|
-
está embebido en `gh` (ya requisito previo).
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/.github/workflows/**"
|
|
4
|
+
---
|
|
5
|
+
# Regla: Monitor de CI tras push
|
|
6
|
+
|
|
7
|
+
Esta regla es OBLIGATORIA para todo proyecto del usuario que use GitHub
|
|
8
|
+
Actions (presencia de `.github/workflows/`). Aplica tras cada `git push` a la
|
|
9
|
+
rama principal o a una rama con CI activo.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Principio
|
|
14
|
+
|
|
15
|
+
> Tras cualquier push que dispare workflows de CI, **arma un Monitor que
|
|
16
|
+
> emita una notificación cuando cada workflow termine** (success o failure)
|
|
17
|
+
> en lugar de pollear con `sleep` o esperar que el usuario pregunte.
|
|
18
|
+
|
|
19
|
+
El Monitor de Claude Code permite reaccionar inmediatamente a fallos sin
|
|
20
|
+
bloquear la conversación: si un workflow falla, el monitor lo emite como
|
|
21
|
+
evento y Claude diagnostica/arregla sin esperar input. Si todo pasa, Claude
|
|
22
|
+
puede continuar trabajando en paralelo.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Cuándo armar el Monitor
|
|
27
|
+
|
|
28
|
+
OBLIGATORIO armarlo:
|
|
29
|
+
|
|
30
|
+
- Tras `git push` a rama con workflows activos.
|
|
31
|
+
- Tras crear un PR con CI requerido (cuando GitHub corre los checks).
|
|
32
|
+
- Tras `gh workflow run` manual.
|
|
33
|
+
- Cuando el usuario pide "verifica el CI" sin más detalle.
|
|
34
|
+
|
|
35
|
+
NO armarlo cuando:
|
|
36
|
+
|
|
37
|
+
- El push fue a una rama sin workflows activos para esa rama.
|
|
38
|
+
- Es un push de solo documentación que no dispara workflows (verificar el
|
|
39
|
+
filtro `paths:` del workflow primero).
|
|
40
|
+
- El usuario explícitamente dijo "no monitorees" o "termina aquí".
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Patrón estándar del comando
|
|
45
|
+
|
|
46
|
+
Plantilla para la herramienta `Monitor` de Claude Code. **Usa el `--jq`
|
|
47
|
+
integrado de `gh` (NO `| jq`)** para evitar dependencia externa — `jq` no
|
|
48
|
+
viene preinstalado en Windows + Git Bash, y `gh --jq` funciona idéntico
|
|
49
|
+
sin requerir instalación adicional. Tampoco usa `2>/dev/null` para que
|
|
50
|
+
errores reales del shell (PATH, `cd` fallido) se vean en stdout y aborten
|
|
51
|
+
el monitor en lugar de hacerlo expirar silenciosamente.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
prev=""
|
|
55
|
+
while true; do
|
|
56
|
+
cur=$(cd PROJECT_PATH && gh run list --branch BRANCH --limit N \
|
|
57
|
+
--json status,conclusion,name,headSha \
|
|
58
|
+
--jq '.[] | "\(.headSha[0:7]) | \(.name): \(.status)/\(.conclusion // "pending")"' \
|
|
59
|
+
| sort)
|
|
60
|
+
comm -13 <(echo "$prev") <(echo "$cur")
|
|
61
|
+
prev=$cur
|
|
62
|
+
if cd PROJECT_PATH && gh run list --branch BRANCH --limit N \
|
|
63
|
+
--json status \
|
|
64
|
+
--jq 'all(.[]; .status == "completed")' | grep -q true; then
|
|
65
|
+
break
|
|
66
|
+
fi
|
|
67
|
+
sleep 25
|
|
68
|
+
done
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Variables a sustituir:**
|
|
72
|
+
|
|
73
|
+
| Variable | Valor |
|
|
74
|
+
|----------|-------|
|
|
75
|
+
| `PROJECT_PATH` | Working directory del proyecto (ej: `D:/Python/sigm`) |
|
|
76
|
+
| `BRANCH` | Rama del push (`main`, feature branch, etc.) |
|
|
77
|
+
| `N` | Cantidad de workflows que dispara ese push (3 si son frontend+backend+security; 4 si incluye database; etc.) |
|
|
78
|
+
|
|
79
|
+
**Argumentos típicos para `Monitor`:**
|
|
80
|
+
|
|
81
|
+
```jsonc
|
|
82
|
+
{
|
|
83
|
+
"description": "CI commit <hash-corto> (<contexto>) — sale cuando los N workflows finalizan",
|
|
84
|
+
"timeout_ms": 600000, // 10 min — suficiente para la mayoría de CIs
|
|
85
|
+
"persistent": false, // false = sale al completar todos
|
|
86
|
+
"command": "<plantilla arriba>"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Para CIs largos (>10 min), subir `timeout_ms` a 1200000 (20 min) o
|
|
91
|
+
1800000 (30 min). Máximo soportado: 3600000 (60 min).
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Cómo funciona
|
|
96
|
+
|
|
97
|
+
- `gh run list --branch BRANCH --limit N` devuelve los N runs más recientes
|
|
98
|
+
de esa rama (los recién disparados por tu push aparecen en orden).
|
|
99
|
+
- `--jq '...'` (integrado en `gh`, NO el binario `jq` externo) formatea
|
|
100
|
+
`sha-corto | name: status/conclusion` por línea. Equivalente a `| jq`
|
|
101
|
+
pero sin dependencia externa.
|
|
102
|
+
- `comm -13` emite solo las líneas NUEVAS respecto a la iteración anterior
|
|
103
|
+
(cada vez que un workflow cambia de estado, sale como notificación).
|
|
104
|
+
- El segundo bloque verifica con `--jq 'all(.[]; .status == "completed")'`
|
|
105
|
+
+ `grep -q true` si todos los workflows terminaron — sale del loop.
|
|
106
|
+
- El loop sale cuando todos los workflows están en estado `completed`.
|
|
107
|
+
|
|
108
|
+
Cada cambio de estado genera **una notificación al chat**, así que recibes
|
|
109
|
+
eventos como:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
ee6e03e | Frontend CI: in_progress/pending
|
|
113
|
+
ee6e03e | Backend CI: completed/success
|
|
114
|
+
ee6e03e | Security: completed/success
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
cuando el primer workflow se mueve de `pending` a `in_progress`, otro a
|
|
118
|
+
`success`, etc.
|
|
119
|
+
|
|
120
|
+
### Por qué `gh --jq` y no `jq` externo
|
|
121
|
+
|
|
122
|
+
El comando original usaba `| jq` y expiraba silenciosamente en sistemas
|
|
123
|
+
Windows sin `jq` instalado: el pipe a `jq` (que no existe) hacía que `$cur`
|
|
124
|
+
quedara vacío, `comm -13` no emitía deltas y el check de "todos completed"
|
|
125
|
+
siempre fallaba → loop dormía hasta timeout sin notificar nada. Caso real
|
|
126
|
+
(SIGM, 2026-05-12): dos monitores consecutivos expiraron sin un solo evento;
|
|
127
|
+
diagnóstico reveló `jq: command not found` en Git Bash de Windows.
|
|
128
|
+
|
|
129
|
+
`gh --jq` está embebido en el binario de `gh` (que ya es requisito), aplica
|
|
130
|
+
la misma sintaxis y funciona idéntico en Windows, macOS y Linux sin
|
|
131
|
+
instalaciones adicionales. **Esta es la forma recomendada — usa el flag
|
|
132
|
+
integrado siempre, salvo que tengas razón fuerte para depender de `jq`
|
|
133
|
+
externo (filtros muy complejos que solo cubre el binario completo).**
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Acciones tras evento del Monitor
|
|
138
|
+
|
|
139
|
+
1. **Si todos terminan en `success`**: continuar con el siguiente paso del
|
|
140
|
+
plan (commit nuevo, fase nueva, etc.). No pedir confirmación al usuario
|
|
141
|
+
para cosas obvias.
|
|
142
|
+
2. **Si alguno termina en `failure`**: descargar log con
|
|
143
|
+
`gh run view <run-id> --log-failed` y diagnosticar inmediatamente.
|
|
144
|
+
Aplicar la regla `arreglar-al-detectar.md`: detectar → informar →
|
|
145
|
+
arreglar en mismo turno.
|
|
146
|
+
|
|
147
|
+
En proyectos con swl-ses instalado (presencia de `agentes/gh-fix-ci-swl.md`),
|
|
148
|
+
el camino canónico para cerrar el ciclo failure → fix → re-push → green
|
|
149
|
+
es invocar el agente **`gh-fix-ci-swl`** (HITL approval obligatorio antes
|
|
150
|
+
de aplicar el fix; max 3 iteraciones; `maxTurnos: 12`). El agente carga
|
|
151
|
+
el `Skill("build-errors-<lang>")` correspondiente automáticamente. Si el
|
|
152
|
+
error es del workflow YAML mismo (secret, action, syntax), delega a
|
|
153
|
+
`devops-ci-swl`. Si el error es local (no específico de CI), prefiere
|
|
154
|
+
`resolutor-build-swl`. Origen: ADR-0029 (swl-ses).
|
|
155
|
+
|
|
156
|
+
3. **Si el monitor expira (`timeout_ms`)**: re-armar con timeout mayor o
|
|
157
|
+
verificar manualmente con `gh run list`.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Anti-patrones a evitar
|
|
162
|
+
|
|
163
|
+
- `sleep N && gh run list` — bloquea la conversación, no recibe eventos.
|
|
164
|
+
- Polling manual con múltiples `Bash` calls separadas.
|
|
165
|
+
- Arrancar el siguiente trabajo sin saber si el CI pasó (riesgo de
|
|
166
|
+
acumular commits sobre código roto).
|
|
167
|
+
- Olvidar el monitor tras un push y que el usuario tenga que recordártelo.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Antes de declarar "CI verde" — verificación obligatoria por SHA
|
|
172
|
+
|
|
173
|
+
Esta sección formaliza la regla post-mortem (L-124, SIGM Sub-fase 5c, 2026-05-11):
|
|
174
|
+
reportar al usuario "CI verde" sin verificar cada workflow individualmente es
|
|
175
|
+
**falsificación de estado**. Un monitor expirado, un commit donde un workflow
|
|
176
|
+
no se disparó, o asumir "verde por default" llevan a declarar saludable un
|
|
177
|
+
sistema que está roto.
|
|
178
|
+
|
|
179
|
+
### Checklist obligatorio antes de afirmar "CI verde"
|
|
180
|
+
|
|
181
|
+
1. **Listar todos los workflows del SHA específico**:
|
|
182
|
+
```bash
|
|
183
|
+
# Forma recomendada — gh --jq integrado, sin jq ni python externos:
|
|
184
|
+
gh run list --branch main --limit 8 \
|
|
185
|
+
--json status,conclusion,name,headSha \
|
|
186
|
+
--jq '.[] | "\(.headSha[0:7]) | \(.name): \(.status)/\(.conclusion // "pending")"'
|
|
187
|
+
|
|
188
|
+
# Fallback con Python si necesitas filtrar/agrupar por SHA en cliente:
|
|
189
|
+
gh run list --branch main --limit 20 --json status,conclusion,name,headSha \
|
|
190
|
+
| python -c "import sys,json; runs=json.load(sys.stdin); sha='ee6e03e'; \
|
|
191
|
+
[print(f'{r[\"name\"]}: {r[\"status\"]}/{r.get(\"conclusion\") or \"pending\"}') \
|
|
192
|
+
for r in runs if r['headSha'].startswith(sha)]"
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
2. **Confirmar `conclusion=success` para cada workflow aplicable**:
|
|
196
|
+
- Cada workflow tiene `paths:` distintos en `on:`. Si el commit solo toca
|
|
197
|
+
`frontend/`, **NO** se dispara Backend CI — eso es comportamiento correcto,
|
|
198
|
+
no fallo. Pero un workflow que SÍ debió dispararse y NO aparece en la
|
|
199
|
+
lista por el SHA es señal de mala configuración: investigar.
|
|
200
|
+
- **NUNCA** asumir verde por ausencia. La ausencia significa "no se ejecutó",
|
|
201
|
+
no "pasó".
|
|
202
|
+
|
|
203
|
+
3. **NO interpretar Monitor expirado como verde**:
|
|
204
|
+
- El Monitor de Claude Code emite `[Monitor timed out — re-arm if needed.]`
|
|
205
|
+
cuando el timeout vence antes de que todos los workflows finalicen.
|
|
206
|
+
- **Timeout ≠ success**. Equivale a "estado desconocido al momento del corte".
|
|
207
|
+
- Re-armar el Monitor con timeout mayor, O verificar manualmente con
|
|
208
|
+
`gh run list --commit <sha>`.
|
|
209
|
+
|
|
210
|
+
4. **Si algún workflow está en `failure` o `cancelled`**:
|
|
211
|
+
- Bajar el log con `gh run view <run-id> --log-failed` y diagnosticar.
|
|
212
|
+
- NO declarar verde hasta que el workflow fallido tenga su propio
|
|
213
|
+
`conclusion=success` en un commit posterior que lo arregle.
|
|
214
|
+
|
|
215
|
+
5. **Reportar al usuario el estado exacto por workflow**:
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
CI verde confirmado para commit <sha-corto>:
|
|
219
|
+
- Backend CI: success ✓
|
|
220
|
+
- Frontend CI: success ✓
|
|
221
|
+
- Security: success ✓
|
|
222
|
+
- E2E Smoke: success ✓
|
|
223
|
+
(Database CI no se disparó — el commit solo modificó frontend/, comportamiento correcto)
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
NO usar afirmaciones genéricas como "todo verde" sin enumerar.
|
|
227
|
+
|
|
228
|
+
### Anti-patrones explícitos
|
|
229
|
+
|
|
230
|
+
- **Reportar "CI verde" tras `git push` sin esperar finalización**: push retorna
|
|
231
|
+
exit 0 cuando GitHub aceptó el push, NO cuando los workflows pasaron.
|
|
232
|
+
Push exitoso ≠ CI verde.
|
|
233
|
+
|
|
234
|
+
- **Reportar "CI verde" porque el Monitor anterior dijo `success`**: si el
|
|
235
|
+
Monitor cubre commits A-B pero el último push es C, los workflows de C aún
|
|
236
|
+
no se evaluaron. Re-armar Monitor o verificar.
|
|
237
|
+
|
|
238
|
+
- **Reportar "CI verde" para un workflow NUEVO en su primer push**: un workflow
|
|
239
|
+
nuevo (ej: `e2e.yml`) tiene alta probabilidad de fallar en el primer run
|
|
240
|
+
porque no se validó localmente. Probar localmente Docker + servicios + tests
|
|
241
|
+
antes de reportar verde.
|
|
242
|
+
|
|
243
|
+
- **Asumir Frontend CI siempre verde porque "solo cambié docs"**: si modificas
|
|
244
|
+
un `.md` dentro de `frontend/`, Frontend CI se dispara igual por el matcher
|
|
245
|
+
`paths: ['frontend/**']`. Verificar.
|
|
246
|
+
|
|
247
|
+
- **"CI verde formal" (0 failed) ≠ "tests ejecutaron"**. Un run con 94 passed +
|
|
248
|
+
5 skipped + 0 failed es verde formal pero zero cobertura de los 5 saltados.
|
|
249
|
+
Tests con `if (!precondicion) test.skip()` aumentan silenciosamente el conteo
|
|
250
|
+
de skipped cuando la precondición falla. Comparar el conteo `skipped` entre
|
|
251
|
+
commits: si aumenta sin causa documentada (tests intencionalmente skipped en
|
|
252
|
+
el spec), es **regresión silenciosa**, no éxito. Reportar al usuario con cifras:
|
|
253
|
+
*"verde con N skipped (antes M)"*, no solo "verde". Origen: sesión SIGAF
|
|
254
|
+
2026-05-13, 7 commits con TC036-TC041 saltando por `actoId=null` antes de
|
|
255
|
+
detectar el patrón.
|
|
256
|
+
|
|
257
|
+
- **Fix de seed/fixture roto puede destapar tests "verde por suerte"**. Tests
|
|
258
|
+
que dependen de datos seedeados saltan por null check cuando el seed falla;
|
|
259
|
+
el CI los marca skipped y queda verde formal. Al arreglar el seed, los tests
|
|
260
|
+
vuelven a ejecutar y exponen fallas latentes que estaban camufladas. **Al
|
|
261
|
+
publicar un fix de seed/fixture, comparar el delta de skipped antes/después**
|
|
262
|
+
y revisar cada test que pase de SKIPPED a EJECUTANDO — pueden fallar por
|
|
263
|
+
otras razones acumuladas. Patrón observado en SIGAF 2026-05-13: fix
|
|
264
|
+
`e6d3f63` (seed grupo20 con `hallazgo.tipo_id`) destapó TC036-TC041 que
|
|
265
|
+
llevaban meses skipped por falta de actos en BD.
|
|
266
|
+
|
|
267
|
+
### Origen
|
|
268
|
+
|
|
269
|
+
Aprendizaje L-124 documentado en SIGM (`.planning/APRENDIZAJES.md`) tras
|
|
270
|
+
Sub-fase 5c (2026-05-11): se reportó "CI verde en cada push" en 7 commits
|
|
271
|
+
seguidos cuando Frontend CI estaba en `failure` desde el commit 4. El usuario
|
|
272
|
+
detectó la inconsistencia al pedir validación adicional ("no podemos avanzar
|
|
273
|
+
de fase hasta no probar que todo esté perfecto"). El Monitor que expiró fue
|
|
274
|
+
interpretado como verde por defecto — equivocadamente.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Excepciones documentadas
|
|
279
|
+
|
|
280
|
+
- **Repos sin GitHub Actions**: usar el sistema de CI nativo del repo
|
|
281
|
+
(GitLab CI, CircleCI). Adaptar el comando.
|
|
282
|
+
- **Workflows en forks**: los workflows desde fork PRs no reciben secrets
|
|
283
|
+
por diseño de GitHub. El monitor sirve igual, pero algunos jobs pueden
|
|
284
|
+
saltarse.
|
|
285
|
+
- **Rama protegida con auto-merge**: si el repo tiene auto-merge tras CI,
|
|
286
|
+
el monitor sale al `success` y el merge ocurre automáticamente — no es
|
|
287
|
+
necesario push adicional.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Origen de esta regla
|
|
292
|
+
|
|
293
|
+
Promovida a regla global el 2026-05-09 a petición del usuario tras observar
|
|
294
|
+
que el patrón Monitor con `gh run list` + `jq` + `comm -13` se repetía
|
|
295
|
+
con éxito en cada push del proyecto SIGM (~10 invocaciones en sesión 2026-05-09)
|
|
296
|
+
y que ahorraba 5-10 minutos por iteración vs polling manual.
|
|
297
|
+
|
|
298
|
+
Reemplaza el patrón anterior de "esperar que el usuario reporte el log
|
|
299
|
+
fallido y reaccionar reactivamente" por proactividad.
|
|
300
|
+
|
|
301
|
+
**Revisión 2026-05-12** (SIGM): migrado de `| jq` a `gh --jq` integrado
|
|
302
|
+
para eliminar dependencia de binario externo. Causa: dos monitores
|
|
303
|
+
consecutivos expiraron silenciosamente en Windows + Git Bash por
|
|
304
|
+
`jq: command not found`, sin emitir un solo evento. Lección: las
|
|
305
|
+
herramientas del Monitor tool corren en sub-shell sin `2>&1` visible —
|
|
306
|
+
cualquier comando faltante hace que el monitor dure hasta timeout sin
|
|
307
|
+
señal de fallo. Diagnóstico: `which jq` antes de armar (debería
|
|
308
|
+
devolver path, no exit 1). `gh --jq` no tiene esta dependencia porque
|
|
309
|
+
está embebido en `gh` (ya requisito previo).
|
package/reglas/patrones.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/*.tsx"
|
|
4
|
-
- "**/*.jsx"
|
|
5
|
-
- "**/next.config.{js,mjs,ts}"
|
|
6
|
-
---
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.tsx"
|
|
4
|
+
- "**/*.jsx"
|
|
5
|
+
- "**/next.config.{js,mjs,ts}"
|
|
6
|
+
---
|
|
7
7
|
# Regla: Patrones de Arquitectura — Next.js (App Router)
|
|
8
8
|
|
|
9
9
|
El App Router de Next.js cambia fundamentalmente dónde y cómo se cargan datos.
|