a73x

7acef27e

docs: mux hosts' sum-of-timeouts cost gets a decisions.md entry and a measured date

a73x   2026-08-28 19:53

Commit message
docs: mux hosts' sum-of-timeouts cost gets a decisions.md entry and a measured date

README.md
Old New
@@ -381,8 +381,9 @@ box [unreachable]
381 listing dials the hosts one at a time and waits up to two seconds for each, 381 listing dials the hosts one at a time and waits up to two seconds for each,
382 so the cost is the SUM and not the slowest: two silent hosts is four 382 so the cost is the SUM and not the slowest: two silent hosts is four
383 seconds. Only a host that accepts the dial and then says nothing costs the 383 seconds. Only a host that accepts the dial and then says nothing costs the
384 full wait — a socket with nothing behind it is refused instantly (measured: 384 full wait — a socket with nothing behind it is refused instantly (measured
385 2002 ms for one silent daemon, 4002 ms for two, ~1 ms for any number of 385 2026-08-28, `docs/decisions.md`: 2002 ms for one silent daemon, 4002 ms for
386 two, ~1 ms for any number of
386 absent sockets). `mux hosts rm` reads the file verbatim too, so a line 387 absent sockets). `mux hosts rm` reads the file verbatim too, so a line
387 you hand-edited into something no longer legal can be typed back byte for 388 you hand-edited into something no longer legal can be typed back byte for
388 byte and removed instead of wedging every command that touches the wall. 389 byte and removed instead of wedging every command that touches the wall.
docs/decisions.md
Old New
@@ -7383,3 +7383,16 @@ the link, so no reconnect can restart a box someone stopped. The local
7383 7383
7384 The break: an OLD client on a new remote gets no daemon from a cold `mux 7384 The break: an OLD client on a new remote gets no daemon from a cold `mux
7385 HOST` — `ssh HOST 'muxd start'`, as README said. No xversion probe covers it. 7385 HOST` — `ssh HOST 'muxd start'`, as README said. No xversion probe covers it.
7386
7387 ## 2026-08-28 — `mux hosts` costs the SUM of its hosts' timeouts
7388
7389 `hostsList` dials each line in a plain sequential loop with a 2000 ms budget
7390 (`hosts_list_ms`), and the budget starts AFTER `Transport.open` returns, so
7391 it bounds the daemon's reply and not the dial. Measured, Debug build, an
7392 isolated `XDG_STATE_HOME` and a python listener that accepts and then never
7393 answers the `sessions_req`: one silent daemon 2002/2002/2001 ms, two
7394 4002/4001/4002 ms — the sum, not the slowest. A `--sock` path with nothing
7395 bound is refused by `connect(2)`: 1 ms for one and 1 ms for four, so absent
7396 sockets are free at any count. What this does NOT bound is a blackholed
7397 HOST, where ssh sits in the kernel's TCP retry schedule; `handoff.sshLine`'s
7398 batch recipe carries `ConnectTimeout=5` for that.