Bug Report
OpenClaw version: 2026.4.2
Matrix plugin version: @openclaw/matrix v2026.4.1-beta.1
Synapse version: v1.123.0 (local Docker, OrbStack)
Platform: macOS 26.3.1 (arm64), Mac Mini M-series
Summary
The Matrix plugin enters an infinite crash-restart loop when connecting to a local Synapse homeserver. All three agent accounts crash with:
fetch failed | read ECONNRESET
The plugin hard-exits on ECONNRESET instead of treating it as a transient network error and reconnecting gracefully.
Configuration
{
"channels": {
"matrix": {
"homeserver": "http://localhost:8008",
"allowPrivateNetwork": true,
"accounts": {
"nova": { "userId": "@nova:localhost", ... },
"page": { "userId": "@page:localhost", ... },
"junior": { "userId": "@junior:localhost", ... }
}
}
}
}
What works
- Direct
curl sync requests to Synapse succeed perfectly (both IPv4 and IPv6)
allowPrivateNetwork: true is set
- Tokens and deviceIds are valid (verified via curl)
- Login via Element Web works fine manually
- Synapse health check passes
What fails
Gateway logs show all three accounts in constant restart loop:
[matrix] [nova] channel exited: fetch failed | read ECONNRESET
[matrix] [nova] auto-restart attempt 4/10 in 44s
[matrix] [page] channel exited: fetch failed | read ECONNRESET
[matrix] [page] auto-restart attempt 4/10 in 43s
[matrix] [junior] channel exited: fetch failed | read ECONNRESET
[matrix] [junior] auto-restart attempt 4/10 in 42s
Root cause analysis
This appears to be a 30s keep-alive race condition: Synapse closes idle long-poll sync connections (timeout=30000ms) and Node.js/undici treats the TCP close as ECONNRESET. The plugin then hard-exits rather than reconnecting.
From the plugin source (matrix-runtime-surface-BQb_BOSl.js):
- Line ~3421:
throw err — the plugin exits on transient network errors rather than catching and reconnecting
- Line ~3148:
throw new Error(exit ${code}) — hard exit path triggered by ECONNRESET
Things tried
- Updated tokens (fresh login tokens confirmed valid via curl)
- Cleared credentials and matrix account storage
- Pointed homeserver at nginx proxy (port 8009) to handle keep-alive
- Added
rc_login rate limit config to Synapse
- Restarted gateway multiple times
Expected behaviour
The plugin should catch ECONNRESET as a transient network error and reconnect, not crash-exit.
Question
Is there a workaround available? Related issues #42234 and #7474 suggest this was known. Happy to test a fix or beta build.
Bug Report
OpenClaw version: 2026.4.2
Matrix plugin version: @openclaw/matrix v2026.4.1-beta.1
Synapse version: v1.123.0 (local Docker, OrbStack)
Platform: macOS 26.3.1 (arm64), Mac Mini M-series
Summary
The Matrix plugin enters an infinite crash-restart loop when connecting to a local Synapse homeserver. All three agent accounts crash with:
The plugin hard-exits on ECONNRESET instead of treating it as a transient network error and reconnecting gracefully.
Configuration
{ "channels": { "matrix": { "homeserver": "http://localhost:8008", "allowPrivateNetwork": true, "accounts": { "nova": { "userId": "@nova:localhost", ... }, "page": { "userId": "@page:localhost", ... }, "junior": { "userId": "@junior:localhost", ... } } } } }What works
curlsync requests to Synapse succeed perfectly (both IPv4 and IPv6)allowPrivateNetwork: trueis setWhat fails
Gateway logs show all three accounts in constant restart loop:
Root cause analysis
This appears to be a 30s keep-alive race condition: Synapse closes idle long-poll sync connections (timeout=30000ms) and Node.js/undici treats the TCP close as ECONNRESET. The plugin then hard-exits rather than reconnecting.
From the plugin source (
matrix-runtime-surface-BQb_BOSl.js):throw err— the plugin exits on transient network errors rather than catching and reconnectingthrow new Error(exit ${code})— hard exit path triggered by ECONNRESETThings tried
rc_loginrate limit config to SynapseExpected behaviour
The plugin should catch ECONNRESET as a transient network error and reconnect, not crash-exit.
Question
Is there a workaround available? Related issues #42234 and #7474 suggest this was known. Happy to test a fix or beta build.