fix(mesh): native E2E DM for archy↔archy text + software radio-reboot

- send_message now sends archy↔archy plain text as a native TEXT_MESSAGE_APP
  DM (firmware PKC-encrypts E2E), not wrapped in the binary typed envelope
  that silently broke archy↔archy LoRa delivery. Archy peers' Sent rows are
  marked encrypted so the E2E pill shows; rich typed msgs still use the
  typed-wire path.
- Add a software radio-reboot to recover a wedged/RX-deaf radio without
  physical access (and for the Device-tab settings panel): driver reboot()
  via AdminMessage reboot_seconds=97 (verified vs meshtastic/protobufs),
  MeshCommand::RebootRadio, MeshService::reboot_radio, RPC mesh.reboot-radio.
- Handoff doc: docs/SESSION-1.8.0-OTA-PROGRESS.md "RESUME HERE" — RF link is
  the proven blocker (radios not hearing each other); modem_preset mismatch
  is the prime suspect; on-device Meshtastic-app check + fix plan documented.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-06-30 10:39:34 -04:00
co-authored by Claude Opus 4.8
parent b4531bb4fc
commit fbfeeeb0f5
8 changed files with 312 additions and 67 deletions
+29 -15
View File
@@ -979,20 +979,34 @@ this match.
- Reference: the existing `package-install-prune-check` dependency descriptor (dependencies.rs:208)
is the seam to make data-driven.
## 10d. Mesh — Meshtastic MeshCore-parity (in the fleet binary; one open bug) (2026-06-26)
## 10d. Mesh — Meshtastic MeshCore-parity (active blocker: stock 3ccc LoRa text) (2026-06-30)
**Status: shipped as commit `8fdb45e8` and now riding in the rolled fleet binary** (built into the
#9 deploy from HEAD, sha `0060dcd6…`). The Meshtastic driver auto-provisions LoRa **region (EU_868)**
and a shared **channel "archipelago"** via the official admin API (`set_config`=field34,
`set_channel`=field33) — discovery, bidirectional RF, and **sending** are all verified on **.116 + .228**.
Detail + history: [[project_meshtastic_parity]].
**Current deployed canary:** `.116` is running commit `b4531bb4` with backend sha
`4ab53e539d89679ef664401a9a57996267772fed02327abc2912c3e77543acbf` and frontend bundle
`index-YOAeJF7w.js` / `Mesh-BSAo88jN.js`. `main` was pushed to `gitea-vps2`.
**Open work (slot after WS-F #911, before/with multinode):**
- **RECEIVED-message surfacing bug** — the running driver does **not** surface received messages
(`mesh.messages` stays `[]`) even though the radio physically receives them. An instrumentation
build was in flight to locate where the inbound packet is dropped between the radio serial/BLE read
and the `mesh.messages` store. This is the one blocker to closing MeshCore parity.
- **.198 radio is bad** — won't persist config (needs a reflash) so it's not a usable mesh test node;
use .116/.228 for mesh verification.
- Definition of done: a message sent from a MeshCore/Meshtastic peer on channel "archipelago" appears
in `mesh.messages` on the receiving archipelago node, end-to-end, on ≥2 LAN nodes.
**What is fixed in this deployed canary:**
- Public stock Meshtastic interop is intentional: slot 0 PRIMARY is the public default LongFast
channel (`name=""`, default PSK); slot 1 SECONDARY is `archipelago`.
- Outgoing Meshtastic messages to stock peer `3ccc` are recorded with real 2026 timestamps and
`transport:"lora"` in RPC. The Mesh UI label maps `lora` to **LoRa**, not "Mesh".
- Post-send message refresh now polls briefly so FIPS/Tor/LoRa pills do not require a manual browser
refresh.
- Off-grid mode now blocks the mesh-chat federation fallback path as well as the generic transport
router: when enabled it forces LoRa-only sends and the UI banner reads
`Tor/FIPS disabled - LoRa only`.
- Empty mesh-chat placeholder opacity was reduced.
**Still broken / resume here:**
- Stock Meshtastic peer `3ccc` -> `.116` LoRa text still does **not** surface in `mesh.messages`.
- Live `.116` logs prove bytes arrive from 3ccc, but the custom Meshtastic protobuf parser rejects
the packet before it becomes an inbound frame:
`Meshtastic FromRadio.packet did not parse into a decoded MeshPacket len=73 head=0dcc3c3e43153ca5b5432a16df56cbed`.
- 3ccc NodeInfo is discovered and PKC-capable:
`Meshtastic peer is PKC-capable (NodeInfo public_key) node=1128152268 key_len=32`.
- Other received packets are decoded and intentionally ignored as non-text (`portnum=3/4/5`), so
the serial reader is alive; the remaining blocker is the exact `MeshPacket` shape for stock
Meshtastic text.
- Definition of done: a new text sent from stock Meshtastic `3ccc` appears in `.116`
`mesh.messages` as an incoming LoRa message without a browser refresh, and `.116` -> `3ccc`
visibly arrives in the Meshtastic app.