Finding
connect_and_handshake populates self.node_db with every node the radio reports during the config dump, and at runtime the NodeInfo arm of process_packet inserts further nodes into self.node_db. But the PacketProcessor that owns the topology graph and emits GeoSignals is constructed with a brand-new, empty NodeDb::new() that is never reconciled with self.node_db. Runtime NodeInfo frames are routed only to self.node_db, never to the processor. The processor therefore only ever knows the subset of nodes that appear in raw mesh packets it processes.
Evidence
crates/kerykeion/src/collector.rs:362 passes NodeDb::new(), into PacketProcessor::new, while handshake-discovered nodes were written to self.node_db (handshake::handshake_with_config(&mut conn, &mut db, ...) at line 213) and runtime NodeInfo is inserted via self.node_db.lock().await.insert(...) at line 145 — neither reaches the processor.
Why this matters
If the topology/GeoSignal emission relies on node identity, position, or user info (which NodeInfo carries: lat/lon, hw model, names), those are absent from the processor's view, producing incomplete or incorrect topology and signal attribution that mislead the operator. This contradicts the apparent intent that the processor owns signal emission; confirm against the documented design.
Desired correction
Seed the processor with the handshake known_nodes and route runtime NodeInfo updates to the processor's NodeDb (or share one Arc<Mutex<NodeDb>>). Done when: a node learned only via NodeInfo (no subsequent mesh packet) is visible to the PacketProcessor's topology, verified by a test.
Finding
connect_and_handshakepopulatesself.node_dbwith every node the radio reports during the config dump, and at runtime theNodeInfoarm ofprocess_packetinserts further nodes intoself.node_db. But thePacketProcessorthat owns the topology graph and emitsGeoSignals is constructed with a brand-new, emptyNodeDb::new()that is never reconciled withself.node_db. RuntimeNodeInfoframes are routed only toself.node_db, never to the processor. The processor therefore only ever knows the subset of nodes that appear in raw mesh packets it processes.Evidence
crates/kerykeion/src/collector.rs:362passesNodeDb::new(),intoPacketProcessor::new, while handshake-discovered nodes were written toself.node_db(handshake::handshake_with_config(&mut conn, &mut db, ...)at line 213) and runtimeNodeInfois inserted viaself.node_db.lock().await.insert(...)at line 145 — neither reaches the processor.Why this matters
If the topology/GeoSignal emission relies on node identity, position, or user info (which
NodeInfocarries: lat/lon, hw model, names), those are absent from the processor's view, producing incomplete or incorrect topology and signal attribution that mislead the operator. This contradicts the apparent intent that the processor owns signal emission; confirm against the documented design.Desired correction
Seed the processor with the handshake
known_nodesand route runtimeNodeInfoupdates to the processor's NodeDb (or share oneArc<Mutex<NodeDb>>). Done when: a node learned only viaNodeInfo(no subsequent mesh packet) is visible to thePacketProcessor's topology, verified by a test.