From c3518e31599d7d734c58837c1ce736ed8576be41 Mon Sep 17 00:00:00 2001 From: anti Date: Sun, 26 Apr 2026 21:31:34 -0400 Subject: [PATCH] feat(workers): surface clusterer, campaign-clusterer, reconciler in panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Workers panel (Config → Workers tab) hardcodes its row list in KNOWN_WORKERS — by design, so a rogue publisher can't inject UI rows. Three heartbeat-emitting workers were missing: * clusterer — behavioral clustering (decnet/clustering/) * campaign-clusterer — campaign assembly (decnet/clustering/campaign/) * reconciler — host-local fleet convergence (added in 430262e) Each already publishes on system..health via run_health_heartbeat, so they show up live the moment they're added to the registry — no frontend or subscriber wiring needed (Config.tsx renders whatever /workers returns). Also added to _PREFERRED_ORDER in start-all so START ALL WORKERS brings them up in dependency-friendly order: data-plane → reconciler → intel → clustering → output → orchestrator. Three deployable units (listener, web, swarmctl) intentionally remain absent from KNOWN_WORKERS — they don't emit heartbeats (CLI / static server / one-shot tooling), so they'd permanently render as UNKNOWN and confuse operators. Adding them is a separate decision that needs a "synthesize installed-but-silent rows" pass on the registry. --- decnet/web/router/workers/api_start_all_workers.py | 3 +++ decnet/web/worker_registry.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/decnet/web/router/workers/api_start_all_workers.py b/decnet/web/router/workers/api_start_all_workers.py index 1f28d733..6db52a1f 100644 --- a/decnet/web/router/workers/api_start_all_workers.py +++ b/decnet/web/router/workers/api_start_all_workers.py @@ -25,8 +25,11 @@ _PREFERRED_ORDER: tuple[str, ...] = ( "sniffer", "prober", "mutator", + "reconciler", "reuse-correlator", "enrich", + "clusterer", + "campaign-clusterer", "webhook", "orchestrator", ) diff --git a/decnet/web/worker_registry.py b/decnet/web/worker_registry.py index 02ae7f21..2db56d5d 100644 --- a/decnet/web/worker_registry.py +++ b/decnet/web/worker_registry.py @@ -38,8 +38,11 @@ KNOWN_WORKERS: tuple[str, ...] = ( "sniffer", "prober", "mutator", + "reconciler", # host-local fleet convergence — JSON ↔ DB ↔ docker "reuse-correlator", # credential-reuse pass — bus-woken on credential.captured "enrich", # threat-intel enrichment — bus-woken on attacker.observed/scored + "clusterer", # behavioral clustering — bus-woken on attacker.scored + "campaign-clusterer", # campaign assembly — bus-woken on identity.formed "webhook", # external SIEM/SOAR egress — bus consumer → HMAC HTTP POSTs "orchestrator", # synthetic life-injection — inter-decky traffic + file ops "agent",