Skip to content

daemon: rx-watchdog also detects the partial (outbound-dial) wedge#387

Merged
TeoSlayer merged 1 commit into
mainfrom
fix/watchdog-partial-wedge
Jul 15, 2026
Merged

daemon: rx-watchdog also detects the partial (outbound-dial) wedge#387
TeoSlayer merged 1 commit into
mainfrom
fix/watchdog-partial-wedge

Conversation

@TeoSlayer

Copy link
Copy Markdown
Collaborator

The v1.12.5 watchdog catches the full inbound wedge (production-proven — 2 days of auto-recoveries). But today the overlay went dark in a way it missed: pilot-director + list-agents both dial-timed-out while PktsRecv kept trickling from peer keepalives, so the rx-silence timer reset every tick and the watchdog never fired — only a manual restart cleared it.

This adds an outbound signal: DialConnection records success (resets) or a full direct+relay timeout (increments consecutiveDialTimeouts). The watchdog now treats 4 back-to-back dial timeouts with zero successes as a wedge even while rx trickles, and runs the same soft-recovery → guarded hard-exit escalation. Regression tests for both the soft-recover and hard-exit paths included; race-clean.

🤖 Generated with Claude Code

The v1.12.5 watchdog catches a FULL inbound wedge (PktsRecv fully stalls)
and is production-proven. But 2026-07-15 the overlay went dark in a way it
missed: pilot-director and list-agents both failed with dial timeouts while
PktsRecv kept *trickling* forward from a couple of peer keepalives — so the
rx-silence timer reset every tick and the watchdog stayed quiet. Only a
manual daemon restart cleared it (its re-registration re-punched the NAT
mapping).

Add an outbound signal: DialConnection records a success (clears the
counter) or a full-budget timeout (increments consecutiveDialTimeouts). The
watchdog now treats dialTimeouts >= dialWedgeThreshold (4 back-to-back dial
failures, zero successes between — implausible unless our own send path is
dead) as a wedge, even while rx trickles: rx progress no longer counts as
healthy in that state. It runs the same soft-recovery (beacon + registry
re-register) and, if it persists, the same guarded hard-exit → supervisor
respawn. The soft path resets the dial counter so the next real dial
re-tests, avoiding a stale-counter false exit when no dials have happened.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@TeoSlayer TeoSlayer merged commit 03c1189 into main Jul 15, 2026
13 checks passed
@TeoSlayer TeoSlayer deleted the fix/watchdog-partial-wedge branch July 15, 2026 09:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants