Skip to content

Afinado y auditoría con cuatro agentes — 19 octubre 2026

Ramon pidió seguir afinando y analizar el homelab con muchos agentes. Se han distribuido capacidad/estabilidad, copias/recuperación, servicios/acceso, red, automatismos y consola de mantenimiento. Cuatro agentes distintos, con un máximo de tres simultáneos, y revisión/integración por el coordinador. Observaciones aproximadamente 23:02–23:10 CEST, con la hora propia de cada informe.

Aplicado y comprobado

Consola de mantenimiento

Fuente ~/Dev/homelab-maint, runtime CT212. La API exigía el nivel solo a las transiciones; una tarea ordinaria declarada L2 podía solicitarse desde L0. Ahora exige el mínimo declarado, valida niveles conocidos y conserva el origen exacto de las transiciones. No permite cambiar manualmente nivel/estado mientras hay una ejecución. La UI deshabilita acciones incompatibles.

Publicado 763ef72. Once pruebas aisladas correctas; despliegue selectivo con rollback, running=[] antes y después, nivel L0 conservado. En vivo, solicitar nas-reboot sin confirmación devuelve 409 por nivel L2; un nivel inexistente devuelve 422. No se ejecutó esa tarea ni ninguna transición de mantenimiento.

Segunda corrección publicada 60a85d5: excepciones de proceso/log/persistencia y abortos antes/durante la creación del proceso ya liberan la exclusión y registran fallo parcial. El doble aborto es idempotente. Suite final de 17 pruebas correctas, desplegada y comprobada con nivel L0, running=[] y sin transición. Hash vivo app.py: <REDACTED>.

Esto no certifica L2–L4: la auditoría adicional reproduce errores ocultos por pipelines/echo en sus comandos y admisión de operaciones tras reiniciar con una transición huérfana. Antes de emplear esos niveles hay que reconciliar inventario, propagar errores críticos y tratar el estado interrumpido.

Monitorización de memoria y CPU

HighMemoryUsage y LowMemoryAvailable ya no suman todo el ARC a MemAvailable. Conservan umbrales, nombres y tiempos. Añadidas dos reglas sobre métricas que ya existían: temperatura CPU >=85 °C y limitación de CPU >6 eventos/min, ambas sostenidas durante 10 minutos. Solo consideran el job de nodos físicos.

Reconciliadas ocho reglas ARR/rutas que existían en producción pero faltaban en la plantilla, y corregidos cuatro escapes Jinja que impedían renderizarla. Comparación semántica: ninguna regla eliminada, solo las dos de memoria modificadas y las dos térmicas añadidas. Validación: 83 reglas y seis escenarios promtool correctos, incluyendo ARC grande con memoria disponible baja.

CT217: escritura en el mismo inode y recarga HUP, sin reiniciar Prometheus. Un primer control demasiado temprano recibió reglas aún sin evaluar y revirtió automáticamente. Se repitió esperando la evaluación real: 83 reglas cargadas, todas saludables, reloadConfigSuccess=true, último reload 21:07:02 UTC. Hash final <REDACTED>. Rollback final: /home/monxas/appdata/prometheus/alerts.yml.before-thermal-20261019T230702. Se preservaron los canales y la política de notificación existentes.

Diagnóstico de tareas RunWisp

La tarea AudioMuse ocultaba stdout/stderr y falla al consultar el Navidrome antiguo de VM208. Eliminada únicamente esa redirección, tanto en fuente Ansible como en el TOML vivo. Horario, solapamiento y política catch-up conservados; no se ejecutó el limpiador ni se trasladó su DELETE a otra BD.

Se descubrió además que reload --socket de RunWisp 0.14 devuelve código cero y «No daemon is running» si faltan sus variables de directorio. Corregido el role para pasar RUNWISP_CONFIG/RUNWISP_DATA y rechazar ese falso éxito. La recarga real, con ambas variables, confirmó exclusivamente changed audiomuse_dedup_cleanup (command). Daemon healthy, 19 tareas y config_stale=false. No se reinició ni relanzó un job. El cambio del role queda como fuente para futuras ejecuciones; no se ejecutó el role completo. Backup: media-208:/home/monxas/runwisp/runwisp.toml.before-audiomuse-log-20261019T230808. Sintaxis del playbook Ansible correcta.

Fuentes publicadas en homelab-infra commit 68a75f8; consola publicada hasta 60a85d5. Ambos árboles quedaron limpios. Los dos servicios ansible-pull habían terminado con Result=success/ExecMainStatus=0 y ambos timers seguían activos al cierre; esa lectura no acredita un pull posterior al commit nuevo.

El push señaló una alerta Dependabot alta abierta, número 146: braces <=3.0.3 en services/wp-pulse-server/web/pnpm-lock.yaml, sin versión parcheada declarada en la API al consultar. No se ha demostrado alcance en producción ni aplicado un override o una actualización de sitios de clientes por esta auditoría. Queda registrada para el propietario de ese proyecto, fuera de las mutaciones operativas del homelab realizadas aquí.

Orden de trabajo que deja esta revisión

  1. Térmica de pmx51 y estabilidad de pmx50. pmx51 estuvo a 78–81 °C y acumuló 363 eventos de limitación en 36 s. Tiene thermal.off=1 persistente desde agosto, sin antecedente localizado; eso desactiva control ACPI, no demuestra anulación de protecciones de hardware. Revisar disipación y antecedente antes de cambiar arranque. pmx50 sigue con watchdog como causa de reinicio registrada, sin volcado que identifique el origen.
  2. Terminar originales y recuperar Immich en aislamiento. Photos avanza, pics espera. Los 31.621 registros apuntan a esos dos grupos; /data está vacío. El dump real más reciente es del 19 octubre 00:00 UTC y pasó CRC. Todavía no hay un punto coherente dump/generaciones ni restore completo.
  3. Reparar AudioMuse con guardas de datos. Navidrome activo está en CT218; redirigir el limpiador sin rechazar listas vacías, proveedor equivocado y borrados excesivos puede eliminar mappings válidos. Primero estimación y transacción con límites; no ocultar ahora su error. En paralelo, cerrar los dos riesgos de transición pendientes de la consola antes de usar L2–L4 para intervenir almacenamiento o parar aplicaciones.
  4. Recuperar actualizaciones nocturnas. Tres días fallando por timeout/429 de LSCR. Aplicaciones actuales saludables; preparar reintentos acotados con backoff, sin lanzar actualizaciones masivas como prueba.
  5. TRMNL y editor Soularr. TRMNL sigue colisionando con Mylar3 en 8090 y su app está sin redes. Hay diff parcial al puerto 8094; requiere reconciliar runtime, labels, rutas y reposo preservando volúmenes. Soularr permite editor anónimo en LAN; por WAN exige Cloudflare Access. Endurecer identidad del editor tras inventariar consumidores; no romper Caddy remoto con un bind localhost ni inventar /forward-auth de Pocket ID.

N-1 mantiene solo +828 MiB tras reserva de 2 GiB en la muestra: no recortar más RAM ni presentar máximos simultáneos como acreditados. DNS primario/secundario coinciden en las consultas UDP/TCP; ambos Caddy activos y VIP única. Todos los 44 targets de Prometheus respondían. Los 29 pendientes de contratos se descomponen en evidencias funcionales/acceso/imagen/restore, no 29 averías.

SAI/Meross conserva las barreras previas: faltan herramientas HA permitidas y autonomía/presupuesto de parada acreditados. No se realizaron cortes, reinicios, migraciones, stress, scrub, poda, descargas ni despertares de servicios para demostrar esta revisión. No se afirma auditoría exhaustiva de cada aplicación.

Informes de evidencia