2 Commits
Author SHA1 Message Date
MarekWoandClaude Fable 5.1 0c94bf0ee5 feat(chat): show the region of a channel message and shorten its route line
The meta line under an incoming channel message used to print the first
route inline ("Route (3): 142C→1122→271C→EE6C"), which with 2- or 3-byte
hashes and a few hops crowded everything else off a phone screen. It now
names only the per-hop hash size ("Route (3): 2 bytes") and stays the tap
target for the routes popup, which lists every route as before.

The line also ends with "Region: <name>" when the packet was flood-scoped
to a region this instance knows. The region name never travels: a
TRANSPORT_FLOOD packet carries a 16-bit transport code (HMAC of the scope
key over the payload) that _on_rx_log_data used to discard. Echoes now
keep those 4 header bytes in a new echoes.transport_codes column, and the
API recomputes the code for every configured region (Settings → Channels)
to find the one that reproduces it; own messages fall back to their
raw_packet snapshot. calc_transport_code() is shared with the raw-resend
packet builder, so both sides derive the stamp from one place.

Verified against on-air packets from the test server on #mcwebui: pl,
pl-ma and pl-kra each resolved to exactly one configured region.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 16:58:01 +02:00
MarekWoandClaude Opus 5 c1703abcd9 fix(echo): track every recent send, not one at a time
A sent channel message learns its pkt_payload — and therefore its route
badge, repeater list and Analyzer link — only by hearing its own echo come
back. Correlation kept a single _pending_echo slot, so any second send or
resend overwrote it and the first message's echo was filed as foreign
traffic. Proven on prod: msg #71179 lost its badge because a resend of
#71177 fired 33 ms before its echo arrived. 16 of 471 own messages over 30
days had no payload; 3 of those were correlation failures (this bug, plus
echoes arriving 62 s and 200 s after the send, past the 60 s expiry).

- _pending_echoes: one entry per message, capped at 32, so concurrent sends
  no longer evict each other
- exact-payload matching stays valid for 5 min (repeats do arrive minutes
  late); the loose channel-hash fallback keeps its 60 s window because it
  can grab a foreign message on the same channel
- resend re-arms from _payload_from_raw_packet() when the message has no
  pkt_payload yet — previously it re-armed only when a payload already
  existed, which is precisely the case that never needs repairing

Verified live against the test device: reproducing the exact prod sequence
(send, then resend an older message 0.4 s later) now correlates both, and
resending a badge-less message recovers its badge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 15:13:36 +02:00