What happened
Controller v0.7.0 (macOS) pushing an 18.9 MB file to a Windows agent v0.5.0 (wanctl push -target zyl …, http transport, production relay) failed after 2 m 50 s:
wanctl: remote error: tls: bad record MAC
Controls run right afterwards, same controller, same relay:
- 2 MB to the same Windows agent: OK, 34 s (~60 KB/s, the link was about 5× slower than on 2026-09-07, when the same 18 MB push took 65 s).
- 18.9 MB to a Linux agent v0.7.0: OK, 81 s.
So the failure is tied to a long transfer over a slow link, not to file size alone or to the v0.7.0 controller.
Why it matters
bad record MAC is the peer-to-peer TLS layer detecting a corrupted or reordered record. The relay carries that stream opaquely over http long-poll, so the corruption is in the carrier: a frame duplicated, dropped or reordered somewhere between controller, relay and agent while the transfer straddles several poll cycles (or a reconnect). The transfer should fail loudly, which it does, but a multi-minute push over a slow link should not fail at all.
To look at
- The http transport's sequencing when a poll times out or reconnects mid-stream (does a resent frame get delivered twice?).
- Whether the same happens with
transport=ws.
- A reproduction with a throttled link (e.g.
tc/pfctl at ~60 KB/s) and a ~20 MB push.
Workaround used: have the device download the artifact from the relay's /dl mirror and verify the manifest SHA-256 locally instead of pushing it.
🤖 Generated with Claude Code
https://claude.ai/code/session_01A61DeY4MP88G6M94QrNvZe
What happened
Controller v0.7.0 (macOS) pushing an 18.9 MB file to a Windows agent v0.5.0 (
wanctl push -target zyl …, http transport, production relay) failed after 2 m 50 s:Controls run right afterwards, same controller, same relay:
So the failure is tied to a long transfer over a slow link, not to file size alone or to the v0.7.0 controller.
Why it matters
bad record MACis the peer-to-peer TLS layer detecting a corrupted or reordered record. The relay carries that stream opaquely over http long-poll, so the corruption is in the carrier: a frame duplicated, dropped or reordered somewhere between controller, relay and agent while the transfer straddles several poll cycles (or a reconnect). The transfer should fail loudly, which it does, but a multi-minute push over a slow link should not fail at all.To look at
transport=ws.tc/pfctlat ~60 KB/s) and a ~20 MB push.Workaround used: have the device download the artifact from the relay's
/dlmirror and verify the manifest SHA-256 locally instead of pushing it.🤖 Generated with Claude Code
https://claude.ai/code/session_01A61DeY4MP88G6M94QrNvZe