Summary
An agent turn (embedded_run) can reach a "completed" state where the final assistant payload is empty. When that happens the reply is never delivered to the channel and no error surfaces — the lane just goes silent. This is distinct from a frozen run: the native stuck-session auto-heal (diagnostics.stuckSessionAbortMs) only aborts runs that hang, not a run that completes-empty, because from the runtime's view the turn finished normally.
Impact
- On an unattended/overnight autonomous run, a single empty-completion stalls the whole run with no signal — effectively dead until a human notices hours later.
- No log-level error, no retry, no delivery. Silent failure is the worst mode for long autonomous work.
Expected
Either (a) an empty final payload is treated as a failed turn and retried / surfaced as an error, or (b) the runtime emits a delivery-failed / empty-completion signal the supervisor layer can react to.
Actual
Turn is marked complete, empty payload is dropped, channel gets nothing, no error.
Environment
- openclaw gateway, Discord lanes, Claude Code (claude-cli) backend, model claude-opus-4-8.
- Linux WSL2 (6.18.x), node v22.
Local mitigation (not a fix)
Dead-man watchdog on a 5-min cron: checks an active-run flag + rolling-log staleness >15 min and sends one nudge (15-min cooldown). Catches the symptom; the empty-completion path itself is still upstream.
Summary
An agent turn (embedded_run) can reach a "completed" state where the final assistant payload is empty. When that happens the reply is never delivered to the channel and no error surfaces — the lane just goes silent. This is distinct from a frozen run: the native stuck-session auto-heal (
diagnostics.stuckSessionAbortMs) only aborts runs that hang, not a run that completes-empty, because from the runtime's view the turn finished normally.Impact
Expected
Either (a) an empty final payload is treated as a failed turn and retried / surfaced as an error, or (b) the runtime emits a delivery-failed / empty-completion signal the supervisor layer can react to.
Actual
Turn is marked complete, empty payload is dropped, channel gets nothing, no error.
Environment
Local mitigation (not a fix)
Dead-man watchdog on a 5-min cron: checks an active-run flag + rolling-log staleness >15 min and sends one nudge (15-min cooldown). Catches the symptom; the empty-completion path itself is still upstream.