Parent
Part of #267 — MeshCore Phase 3 traceroute / path parity (passive path track).
MVP tier: Tier 1 from gap analysis — get real #channel traffic showing hash hop chains in Messages → Heard (schematic per feeder). Geographic hop polylines on the map are Tier 2 (hash→node resolution + UI); out of scope here.
Problem (pre-prod confirmed Jun 2026)
TextMessage.original_mc_packet observations for channel_text usually have empty path_hashes even though feeders overhear paths on other frame types.
| Source |
path on wire? |
Uploaded? |
Linked to TextMessage? |
channel_message → channel_text |
Usually no (path_len / path_hash_mode only) |
Yes |
Yes — empty paths |
rx_log_data ADVERT |
Often yes |
Yes (ADVERT only) |
No TextMessage |
rx_log_data TEXT_MSG / PATH |
Often yes in captures |
No (MeshCoreSkipUpload) |
— |
Precursor work (#369, #360, meshflow-bot#119, meshflow-ui#304, meshflow-ui#311) already exposes heard[] when path_hashes exist — no new UI required for Tier 1.
Detail: packet-path-tracing-outstanding.md § Message path data chain, phase-3-outstanding.md.
Design direction (thin bot / fat server)
Prefer server-led ingest per packet-path-tracing-outstanding.md:
- Bot (minimal): Upload additional
rx_log_data typenames (e.g. TEXT_MSG / PATH) as thin envelopes — pass through path, path_hash_size, path_hash_mode, pkt_hash; no bot-side _path_hashes() duplication or message↔packet correlation.
- API: Split
path hex → path_hashes on ingest when present; correlate PATH/TEXT_MSG observations to the channel_text row / TextMessage.original_mc_packet (by pkt_hash, time window, and/or dedup rules — spike in this ticket).
- Optional: If
path later appears on channel_message JSON from meshcore lib, existing bot forward + API path split should work without new bot logic.
Sample fixtures: docs/meshcore_packets/ (channel_message without path; rx_log_data PATH/ADVERT with path).
Cross-repo work
| Repo |
Work |
| meshflow-api |
Ingest + correlation design; unit/integration tests; OpenAPI if contract changes |
| meshflow-bot |
Relax rx_log_data upload filter (TEXT_MSG/PATH or raw pass-through); ensure path / path_hash_* forwarded on uploaded envelopes |
| meshflow-ui |
None for Tier 1 (verify heard dialog only) |
| ops |
Deploy precursor + this slice to pre-prod |
Branch prefix: api-<N>/… in all repos per meshflow-git-workflow.
Out of scope (Tier 2+)
- Hash→node matcher (#373), proactive resolver (#374)
heard[] wired to MeshCorePathSegmentResolution (M1)
- Hop polylines on
HeardPathGeoMap for MeshCore
- Neo4j export, realtime path WS, M7 topology UI (#309)
- Active MeshCore traceroute
Acceptance criteria
Verification checklist
- DB:
MeshCorePacketObservation for message’s original_mc_packet_id has non-null path_hashes.
- API:
heard[0].path_hashes non-empty.
- UI heard dialog:
PathHopChain / MeshCoreHeardPathsPanel show hashes.
- Geo map: feeder markers unchanged; hops still schematic (expected until Tier 2).
References
- Epic #267
- Phase 2 epic #266 (ingest surface)
- M1 subsystem #372 — rollups can use ADVERT paths in parallel; this ticket unblocks message heard
Parent
Part of #267 — MeshCore Phase 3 traceroute / path parity (passive path track).
MVP tier: Tier 1 from gap analysis — get real
#channeltraffic showing hash hop chains in Messages → Heard (schematic per feeder). Geographic hop polylines on the map are Tier 2 (hash→node resolution + UI); out of scope here.Problem (pre-prod confirmed Jun 2026)
TextMessage.original_mc_packetobservations forchannel_textusually have emptypath_hasheseven though feeders overhear paths on other frame types.pathon wire?TextMessage?channel_message→channel_textpath_len/path_hash_modeonly)rx_log_dataADVERTTextMessagerx_log_dataTEXT_MSG / PATHMeshCoreSkipUpload)Precursor work (#369, #360, meshflow-bot#119, meshflow-ui#304, meshflow-ui#311) already exposes
heard[]whenpath_hashesexist — no new UI required for Tier 1.Detail: packet-path-tracing-outstanding.md § Message path data chain, phase-3-outstanding.md.
Design direction (thin bot / fat server)
Prefer server-led ingest per packet-path-tracing-outstanding.md:
rx_log_datatypenames (e.g. TEXT_MSG / PATH) as thin envelopes — pass throughpath,path_hash_size,path_hash_mode,pkt_hash; no bot-side_path_hashes()duplication or message↔packet correlation.pathhex →path_hasheson ingest when present; correlate PATH/TEXT_MSG observations to thechannel_textrow /TextMessage.original_mc_packet(bypkt_hash, time window, and/or dedup rules — spike in this ticket).pathlater appears onchannel_messageJSON from meshcore lib, existing bot forward + API path split should work without new bot logic.Sample fixtures:
docs/meshcore_packets/(channel_message withoutpath; rx_log_data PATH/ADVERT withpath).Cross-repo work
rx_log_dataupload filter (TEXT_MSG/PATH or raw pass-through); ensurepath/path_hash_*forwarded on uploaded envelopesBranch prefix:
api-<N>/…in all repos per meshflow-git-workflow.Out of scope (Tier 2+)
heard[]wired toMeshCorePathSegmentResolution(M1)HeardPathGeoMapfor MeshCoreAcceptance criteria
pkt_hash/ time / dedup) and failure modes (orphan PATH rows, duplicate feeders).TextMessagehasheard[].path_hasheswith length ≥ 1 for at least one feeder observation tied tooriginal_mc_packet.GET /api/messages/text/?protocol=meshcorereturns non-emptypath_hashesonheard[]for that message (v1resolved_pathmay remain allunknown).docs/meshcore_packets/(channel_text + correlated PATH/TEXT_MSG ingest).rx_log_datatypes without new path-splitting logic.Verification checklist
MeshCorePacketObservationfor message’soriginal_mc_packet_idhas non-nullpath_hashes.heard[0].path_hashesnon-empty.PathHopChain/MeshCoreHeardPathsPanelshow hashes.References