From 8cb713b3b12f2df6ec374419f9607bd138071c34 Mon Sep 17 00:00:00 2001 From: Stan Grams Date: Sun, 15 Mar 2026 16:53:46 +0100 Subject: [PATCH] [fix](trx-frontend-http): require bidirectional decodes for map QSO contact paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A QSO requires both parties to hear each other. Previously the map drew contact paths whenever A sent a directed message to B and B's locator was known from any message. Now paths only appear when both A→B and B→A directed messages are present in the decoded history. Co-Authored-By: Claude Sonnet 4.6 Signed-off-by: Stan Grams --- .../trx-frontend/trx-frontend-http/assets/web/app.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js index b4ee328..d2607f1 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js @@ -6319,7 +6319,11 @@ function rebuildDecodeContactPaths() { } } } + // Index directed messages by "SOURCE::TARGET" for QSO (bidirectional) check + const directedPairs = new Set(directedMessages.map((m) => `${m.source}::${m.target}`)); for (const msg of directedMessages) { + // A true QSO requires both A→B and B→A directed messages + if (!directedPairs.has(`${msg.target}::${msg.source}`)) continue; const targetLocator = stationLocators.get(msg.target); if (!targetLocator) continue; if (msg.sourceGrid === targetLocator.grid) continue;