diff --git a/repeater/packet_router.py b/repeater/packet_router.py index 0b5024e..75e66b7 100644 --- a/repeater/packet_router.py +++ b/repeater/packet_router.py @@ -237,16 +237,15 @@ async def _route_packet(self, packet): # Route to specific handlers for parsing only if payload_type == TraceHandler.payload_type(): - # Locally injected TRACE requests are TX-only and re-enter the router so - # companion delivery can still happen. They are not inbound RF responses, - # so skip TraceHelper parsing to avoid matching pending ping tags against - # zeroed local metadata. - if getattr(packet, "_injected_for_tx", False): - processed_by_injection = True - elif self.daemon.trace_helper: + # Process trace packet for local display (terminal RTT/SNR) + if self.daemon.trace_helper: await self.daemon.trace_helper.process_trace_packet(packet) - # Skip engine processing for trace packets - they're handled by trace helper - processed_by_injection = True + # Allow the engine to record + publish this packet to MQTT/LetsMesh. + # mark_do_not_retransmit prevents RF re-broadcast (same pattern as + # ControlHandler at line 180). The trace request and response have + # different packet hashes, so the response won't be flagged as a + # duplicate of the request by the engine's seen-cache. + packet.mark_do_not_retransmit() # Do not call _record_for_ui: TraceHelper.log_trace_record already persists the # trace path from the payload. record_packet_only would treat packet.path (SNR bytes) # as routing hashes and log bogus duplicate rows.