nanocoai/nanoclaw · error
Killing container — message claimed then silent
Error message
Killing container — message claimed then silent
What it means
The sweep kills a container because it claimed a message in processing_ack and then went silent longer than the claim tolerance. Unlike the absolute-ceiling kill, the heartbeat may still be fresh but a specific claimed message has made no progress, indicating a wedged agent run rather than a dead container.
Source
Thrown at src/host-sweep.ts:286
containerStartedAtMs: getContainerStartedAtMs(session.id),
containerState: outDb.getContainerState(),
claims: outDb.getProcessingClaims(),
});
if (decision.action === 'ok') return;
if (decision.action === 'kill-ceiling') {
log.warn('Killing container past absolute ceiling', {
sessionId: session.id,
heartbeatAgeMs: decision.heartbeatAgeMs,
ceilingMs: decision.ceilingMs,
});
killContainer(session.id, 'absolute-ceiling');
resetStuckProcessingRows(inDb, outDb, session, 'absolute-ceiling');
return;
}
log.warn('Killing container — message claimed then silent', {
sessionId: session.id,
messageId: decision.messageId,
claimAgeMs: decision.claimAgeMs,
toleranceMs: decision.toleranceMs,
});
killContainer(session.id, 'claim-stuck');
resetStuckProcessingRows(inDb, outDb, session, 'claim-stuck');
}
export function _resetStuckProcessingRowsForTesting(
inDb: InboundMailbox,
outDb: OutboundMailbox,
session: Session,
reason: string,
): void {
resetStuckProcessingRows(inDb, outDb, session, reason);
}
View on GitHub (pinned to 294ef2aee8)
Solutions
- Inspect the session's outbound.db processing_ack and the specific messageId to see which request stalled
- Check provider/API latency or hangs from the container (network, proxy, OneCLI gateway) around the claim time
- Tune the claim tolerance if legitimate long-running turns exceed it
- Confirm the reset row was retried by the respawned container rather than looping into the same stall
Defensive patterns
Strategy: retry
Prevention
- Set provider/API timeouts shorter than the claim tolerance so hung calls fail fast
- Watch processing_ack age as a metric; investigate before the sweep kills
- Tune toleranceMs to comfortably exceed your longest legitimate agent turn
When it happens
Trigger: A processing_ack row exists with claimAgeMs > toleranceMs while the container is running; killContainer(session.id, 'claim-stuck') fires and the claimed row is reset.
Common situations: Agent-runner stuck mid-inference or in a tool loop on one message; provider API hang without timeout; agent process alive (heartbeat touched by a loop) but the message handler deadlocked.
Related errors
- Killing container past absolute ceiling
- Failed to clear orphan processing claims
- Message marked as failed after max retries
AI-assisted analysis of nanocoai/nanoclaw@294ef2aee8 (2026-08-28).
Data as JSON: /api/errors/594b30aad40ac13d.
Report an issue: GitHub.