CreaRack-SL

Detección de equipos parados en el LED del widget HARNESS (staleness detection)

Contexto del problema

El widget HARNESS del dashboard mostraba el LED de cada perfil de acuerdo al último status publicado, sin considerar la antigüedad del dato. El estado se escribe por push cuando cada perfil ejecuta method-doctor (aproximadamente a diario en operación normal); sin embargo, un veredicto verde quedaba congelado para siempre aunque la máquina llevara días apagada.

Caso real: el PC de Txell llevaba parado desde el viernes pero su LED seguía verde. El dato ya no era fiable.

Solución implementada

Backend: /api/harness-leds (endpoint CF Workers)

La lógica de “staleness” se implementa directamente en el endpoint usando SQL:

SELECT profile, status, updated_at,
  CAST((julianday('now') - julianday(updated_at)) AS REAL) AS age_days
FROM harness_status

Nueva constante:

const STALE_DAYS = 3;

Transformación de la respuesta: cada registro ahora incluye:

  • age_days: antigüedad en días (redondeada a entero)
  • stale: booleano que indica si age_days > STALE_DAYS

Justificación del umbral:

  • STALE_DAYS = 3 tolera un fin de semana normal (~2,5 días) sin generar falsos positivos
  • Si aparecen puentes o fiestas largas, es sencillo subir a 4-5
  • Los sesiones activas publican casi a diario en operación normal

Frontend: HarnessLeds.tsx (componente React)

Nuevo estado visual: el LED adopta 3 colores + 1 apagado:

  • 🟢 Verde = status green (al 100%) — equipo sano
  • 🟠 Naranja = status drift (desajustes) — equipo con problemas
  • ⚫ Gris apagado (sin halo) = stale: equipos parados — status no fiable
  • 🔴 Rojo = nunca ha reportado — nunca publicó status

Cambios CSS:

  • El LED stale pierde su halo (boxShadow: none), claramente distinguible del ambar de drift
  • Color: var(--fg-dim) (gris del esquema)

Tooltip mejorado:

  • Normal: "Txell: al 100% · 2026-07-12 15:30:42"
  • Stale: "Txell: sin publicar desde hace 3d (posible equipo parado)"

Verificación

El cambio fue verificado visualmente tras el deploy:

  • CF Access restringe el acceso a /api/harness-leds al staff
  • Edu confirmó en su sesión pasando el ratón sobre el LED de Txell, observando el tooltip y la ausencia de halo

Archivos modificados

  • functions/api/harness-leds/index.ts: cálculo de age_days y bandera stale
  • src/components/widgets/HarnessLeds.tsx: lógica de color y tooltip

Véase también

  • [[feature—harness—engineering]]
  • [[feature—harness—osv-security-deps-freshness]]
  • [[concept—general—como-se-propagan-las-global-skills-de-claude-metho]]