docs(series4): RESOLVED -- FTDI cable AND a cold boot; modems bridge one session

The cable swap alone did not fix it.  A probe immediately after fitting a genuine
FTDI cable (lsusb 0403:6001, FT232) returned the same "connected, no reply".

A COLD BOOT of the unit was also required -- power button held five seconds
through the two-stage battery-disconnect prompt, powered back up with the cable
already attached.  THOR connected the moment it finished booting, and an
independent probe returned UM12947, idle, over cellular.

So the Micromate's USB host does not rescan on hot-swap: it enumerates that port
at boot and, having once failed to identify a device, does not try again.
Changing the cable is a power-cycle operation -- and anyone swapping one in the
field who probes immediately will conclude the new cable is faulty too.  Full
chain: an FTDI or CDC-ACM cable, AND a cold boot with it attached.

SEPARATELY CONFIRMED, by accident: these modems bridge ONE TCP session to serial
at a time.  With THOR connected, the probe got "TCP ok, NO REPLY"; with THOR
disconnected and nothing else changed, the same probe returned the serial number.
The PAD accepts a second connection and then never forwards it -- it does not
refuse and does not close.

That makes "connected but no reply" ambiguous between a broken serial path and
somebody else already holding the unit, and mm_probe reported only the former --
which would push a diagnosis in exactly the wrong direction, on the very fault we
spent two days chasing.  Its verdict now names both causes, tells you to
eliminate contention first, and includes the cable-chipset and cold-boot steps.

Recorded as an SFM design constraint: our receiver and THOR cannot both hold a
unit, and during any migration both will exist.  "Another client holds this unit"
has to be a distinct visible state.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ru8Lg9HkkYvX9VWWo65SmL
This commit is contained in:
2026-09-26 18:11:16 -04:00
co-authored by Claude Opus 5
parent 8a1d1c3f17
commit a7631a8179
2 changed files with 69 additions and 10 deletions
+46
View File
@@ -2162,6 +2162,52 @@ unit.** No USB-to-serial adapter anywhere in the path, so there is no chipset t
get wrong. That workaround has been quietly routing around this exact failure
mode.
### ✅ RESOLVED (2026-09-26) — and it took a cold boot as well as the cable
Swapping to a genuine FTDI cable (`lsusb`: `0403:6001`, FT232) **did not work on
its own.** A probe immediately after the swap returned the same *connected, no
reply*.
**A cold boot of the unit was also required.** Holding the power button for five
seconds — through the two-stage prompt that disconnects the internal battery —
and powering back up **with the cable already attached**, brought it straight up.
THOR at the office connected the moment it finished booting, and an independent
probe returned `UM12947, idle` over cellular.
⚠ **The USB host does not rescan on hot-swap.** The Micromate enumerates its
USB-A host port at boot; once it has failed to identify a device there it does
not appear to try again. Changing that cable is a power-cycle operation, and
anyone swapping one in the field who probes immediately will conclude the new
cable is faulty too.
So the full chain for a Micromate on a modem is:
1. an **FTDI** or CDC-ACM cable — a Prolific PL2303 gives the unit no serial port
2. a **cold boot** with that cable attached
### ✅ These modems bridge ONE session at a time — confirmed
Long suspected, never demonstrated. Demonstrated now, by accident:
| | probe result |
|---|---|
| THOR connected to the unit | `TCP connect ok` … **`NO REPLY`** |
| THOR disconnected, nothing else changed | `reply 68 B`, **`UM12947`**, idle |
The PAD **accepts** a second TCP connection and then does not forward it. It
does not refuse, and it does not close — it simply never bridges.
⚠ **This means "connected but no reply" has two causes that are indistinguishable
from the client side:** a genuinely broken serial path, and *somebody else
already has the unit*. `bridges/mm_probe.py` originally reported only the first,
which would send a diagnosis in exactly the wrong direction; its verdict now
names both and tells you to eliminate contention first.
**For SFM this is a design constraint, not a footnote.** Our receiver and THOR
cannot both hold a unit, and during any migration both will exist. "Another
client holds this unit" needs to be a distinct, visible state — not folded into
a failure, and certainly not into a green tick.
### How this was isolated — the method is reusable
A Micromate on an RX55 was unreachable from THOR. Rather than guess, each layer