Skip to content

web: fix MeshCore ghost nodes (stale contact enrichment discarded)#841

Merged
l5yth merged 2 commits into
mainfrom
l5y-web-ghost-nodes
Jul 6, 2026
Merged

web: fix MeshCore ghost nodes (stale contact enrichment discarded)#841
l5yth merged 2 commits into
mainfrom
l5y-web-ghost-nodes

Conversation

@l5yth

@l5yth l5yth commented Jul 5, 2026

Copy link
Copy Markdown
Owner

A node first heard via a bare MeshCore ADVERTISEMENT is upserted as a placeholder stamped lastHeard = now (receiver wall clock). The follow-up roster contact record carries lastHeard = last_advert — the sender-stamped advert-creation time, always older (seconds for healthy clocks, years for broken ones) — so upsert_node's row-level freshness guard discarded the entire named update, permanently: every contact re-post (auto-update re-fetch, periodic snapshot, restart) is also sender-stamped, while each advertised-position ingest re-bumps the row's last_heard. Result: nameless "ghost" nodes with hex short names, NULL role (displayed as the CLIENT default), and advert-stamped position_time — 22 of 48 meshcore nodes on dweb at the time of diagnosis.

Fix (web-side, protocol-neutral): after the guarded upsert, a non-synthetic record additionally fills identity columns that are still NULL (num, short_name, long_name, macaddr, hw_model, role, public_key, is_unmessagable). Stale records can fill gaps but never overwrite fresher values; synthetic chat placeholders remain barred from real rows; an empty MeshCore adv_name never fills long_name (NULLIF).

@codecov

codecov Bot commented Jul 5, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

@l5yth l5yth merged commit 211ae52 into main Jul 6, 2026
12 checks passed
@l5yth l5yth deleted the l5y-web-ghost-nodes branch July 6, 2026 07:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant