fix: periodic health broadcast missing pillars — add full score payload + validity gate

The periodic health_update in main.py only sent score/tier/totals but
no pillars dict. Dashboard setHealth() replaced the full REST response
with this incomplete object, causing all pillar bars to drop to 0.0.

Now sends the complete payload matching mesh_routes.py and ws.py
(pillars, util_percent, flagged_nodes, battery_warnings, recommendations)
and gates on composite > 0 + infra_total > 0 to skip partial state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Matt Johnson (via Claude) 2026-06-10 06:04:56 +00:00
commit 6989a49f64

View file

@ -126,16 +126,30 @@ class MeshAI:
if self.broadcaster and self.health_engine.mesh_health: if self.broadcaster and self.health_engine.mesh_health:
try: try:
mh = self.health_engine.mesh_health mh = self.health_engine.mesh_health
health_dict = { sc = mh.score
"score": round(mh.score.composite, 1), if sc.composite > 0 and sc.infra_total > 0:
"tier": mh.score.tier, health_dict = {
"total_nodes": mh.total_nodes, "score": round(sc.composite, 1),
"total_regions": mh.total_regions, "tier": sc.tier,
"infra_online": mh.score.infra_online, "pillars": {
"infra_total": mh.score.infra_total, "infrastructure": round(sc.infrastructure, 1),
"last_computed": mh.last_computed, "utilization": round(sc.utilization, 1),
} "coverage": round(sc.coverage, 1),
await self.broadcaster.broadcast("health_update", health_dict) "behavior": round(sc.behavior, 1),
"power": round(sc.power, 1),
},
"infra_online": sc.infra_online,
"infra_total": sc.infra_total,
"util_percent": round(sc.util_percent, 1),
"flagged_nodes": sc.flagged_nodes,
"battery_warnings": sc.battery_warnings,
"total_nodes": mh.total_nodes,
"total_regions": mh.total_regions,
"unlocated_count": getattr(mh, "unlocated_count", 0),
"last_computed": mh.last_computed,
"recommendations": getattr(mh, "recommendations", []),
}
await self.broadcaster.broadcast("health_update", health_dict)
except Exception as e: except Exception as e:
logger.debug("Dashboard broadcast error: %s", e) logger.debug("Dashboard broadcast error: %s", e)