---
name: swl:evolucion-estado
description: Dashboard del ciclo de auto-evolución del sistema SWL. Muestra health_score compuesto, tasa de acción de nudges, densidad de instintos, fallos de agentes, evoluciones aplicadas/revertidas y alertas persistentes. Responde en una pantalla a "¿SWL está aprendiendo esta semana?".
argument-hint: [--json | --dias=N | --regenerar]
allowed_tools: ["Read", "Bash"]
user-invocable: true
version: "1.0.0"
---

# /swl:evolucion-estado — Dashboard del ciclo de evolución

Emite un reporte compacto del estado de auto-evolución del sistema SWL en la
ventana reciente (default 14 días). Su propósito: responder a la pregunta
**"¿el sistema está aprendiendo?"** con datos, no impresiones.

## Flags

- `--json` → emite el JSON crudo de `metricas.json` (útil para pipes).
- `--dias=N` → regenera métricas con ventana de N días (default 14).
- `--regenerar` → fuerza recomputo ejecutando el hook `metricas-evolucion.js`.
  Útil cuando no se ha disparado Stop recientemente.

## Paso 0 — Asegurar métricas frescas

Si se pasó `--regenerar` o `metricas.json` tiene > 24h:

```bash
PATH="/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH" echo '{}' | node hooks/metricas-evolucion.js
```

## Paso 1 — Cargar métricas

```bash
cat .planning/evolucion/metricas.json
```

Si el archivo no existe: ejecutar el regenerado del Paso 0. Si sigue sin
existir: reportar "el ciclo de evolución no ha corrido aún; ejecuta cualquier
tarea para poblar métricas iniciales".

## Paso 1.5 — Cargar contexto del kernel (gobernanza)

Para el bloque **KERNEL** del dashboard, recolectar:

```bash
# 1. Conteo de agentes evolvable=false vs total
TOTAL=$(ls agentes/*.md | grep -v "^agentes/_" | wc -l)
EVOL_FALSE=$(grep -l '^evolvable: false' agentes/*.md | wc -l)

# 2. Último ADR del repo madre — el más reciente por fecha en frontmatter
ULTIMO_ADR=$(ls .planning/adrs/[0-9]*.md | sort -r | head -1)
TITULO=$(head -1 "$ULTIMO_ADR" | sed 's/^# //')
FECHA=$(grep -m1 '^\*\*Fecha\*\*:' "$ULTIMO_ADR" | sed 's/.*\*\*Fecha\*\*:\s*//')

echo "ADR_KERNEL_LINEA=\"$TITULO — $FECHA\""
echo "RATIO=\"$EVOL_FALSE/$TOTAL\""
```

Estos valores alimentan la sección KERNEL del template.

Si `.planning/evolucion/politica-evolvable.md` no existe, reportar como
hallazgo crítico: el kernel SIN política documentada es violación de
`reglas/gobernanza.md`.

## Paso 2 — Emitir el dashboard (formato humano)

Template de salida:

```
═══════════════════════════════════════════════════════════════
  SWL — Estado del ciclo de evolución
  Ventana: últimos N días  ·  Generado: <ts>
═══════════════════════════════════════════════════════════════

  Health score:  <N>/100   <badge>

  NUDGES
    Emitidos .............. <total>
    Accionados ............ <n>   (<tasa>%)
    Pendientes ............ <n>
    Por tipo:
      perfil-usuario      <a>/<t>  (<%>)
      auto-evolucion      <a>/<t>  (<%>)
      consolidacion       <a>/<t>  (<%>)

  INSTINTOS
    Proyecto .............. <n>
    Global ................ <n>
    Perfil-usuario ........ <n>
    Aprendizajes totales .. <n>

  AGENTES (14d)
    Runs totales .......... <n>
    Fallos ................ <n>
    Tasa de éxito ......... <%>

  EVOLUCIONES (30d)
    Aplicadas ............. <n>
    Revertidas ............ <n>
    Neta .................. <n>
    Rollback ratio ........ <%>   (N/A si aplicadas == 0)

  CALIDAD CONDUCTUAL (14d)
    Fallos por tipo:
      bad_output_format   <n>
      tool_error          <n>
      timeout             <n>
      schema_violation    <n>
      task_incomplete     <n>
      unknown             <n>
    Reintentos consecutivos
      Total ............... <n>   (mismo agente, misma task, ≤30 min)
      Top agente .......... <agente>: <n>
    Latencia top agente
      Mediana ............. <ms>
      p95 ................. <ms>
    Sin instrumentación todavía:
      • precision_routing_fase_dominio
      • utilidad_memoria_recuperada
      • violaciones_formato_post_ejecucion

  ALERTAS PERSISTENTES
    <si alertasActivas.length === 0>
      Sin alertas.
    <sino>
      [!] kind=X target=Y count=Z (primera: fecha)
      ...

  KERNEL (gobernanza)
    Política evolvable .... .planning/evolucion/politica-evolvable.md
    Último ADR kernel ..... <ADR-NNNN — título — fecha>
    Agentes evolvable=false <n>/<total>

═══════════════════════════════════════════════════════════════
```

## Paso 3 — Calcular badge del health_score

| Rango | Badge | Interpretación |
|-------|-------|----------------|
| ≥ 90 | 🏆 Óptimo | ciclo completo, cerrado y saludable |
| ≥ 75 | 🥇 Saludable | funcionando con pequeñas mejoras pendientes |
| ≥ 60 | 🥈 Parcial | hay piezas sin activar; revisar recomendaciones |
| ≥ 40 | 🥉 Esqueleto | infraestructura existe pero poco uso real |
| < 40 | ⚠️ Dormido | el ciclo no está corriendo |

## Paso 4 — Recomendaciones contextuales

Al final del dashboard, sugerir acciones según las métricas:

- Si `instintos.proyecto === 0` y `aprendizajes_totales > 10`:
  → `npx -y @saulwade/swl-ses@latest bootstrap-instincts` (pobla desde APRENDIZAJES.md)

- Si `nudges.tasaAccion < 0.3` y `nudges.total > 5`:
  → "Muchos nudges ignorados. Revisa `.planning/evolucion/alertas-persistentes.json`"

- Si `alertasActivas.length > 0`:
  → listar cada alerta con `/swl:evolucionar <target>` o cmd correspondiente

- Si `agentes.tasaExito < 70` y `totalRuns > 5`:
  → "Agentes con tasa de éxito baja. Candidatos a `/swl:evolucionar`:
     <top 3 de porAgente con más fallos>"

- Si `evoluciones.revertidas > evoluciones.aplicadas / 2`:
  → "Muchas evoluciones revertidas — revisar si el gate de regresión
     está siendo demasiado laxo o si los evals son inconsistentes"

- Si `health_score >= 90`:
  → "Sistema en óptimo. Posible candidato a habilitar modo autónomo
     de `auto-evolucion-swl`. Ver `agentes/auto-evolucion-swl.md` —
     sección 'Autonomía condicional'"

- Si `health_score < 95`:
  → "Para subir el score, consultar `.planning/ROADMAP-EVOLUCION.md` —
     documenta los 5 hitos por fase y cuánto aporta cada uno. Sin uso
     operacional real (nudges accionados, runs reales, evoluciones), el
     score no sube por infraestructura sola."

## Anti-substitution guardrails

- Archivo de métricas: **siempre** `.planning/evolucion/metricas.json` (nunca `.planning/metricas.json`, `evolucion.json`, `estado-evolucion.json`).
- Hook que regenera: **siempre** `hooks/metricas-evolucion.js` (nunca `metrics.js`, `evolucion-metricas.js`, `evolution-metrics.js`).
- Para forzar regen: pipe `echo '{}' | node ...`, nunca invocar `require()` directo.

## Response Discipline

Si el usuario pasa `--json`: respuesta = **contenido crudo del archivo**,
sin prosa ni comentarios.

Si no: dashboard formateado con las 5 secciones. Las recomendaciones del
Paso 4 van al final, máximo 3 items priorizados. Sin repetir datos del dashboard.
