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

  1. Inspect the session's outbound.db processing_ack and the specific messageId to see which request stalled
  2. Check provider/API latency or hangs from the container (network, proxy, OneCLI gateway) around the claim time
  3. Tune the claim tolerance if legitimate long-running turns exceed it
  4. Confirm the reset row was retried by the respawned container rather than looping into the same stall
Defensive patterns

Strategy: retry

Prevention

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


AI-assisted analysis of nanocoai/nanoclaw@294ef2aee8 (2026-08-28). Data as JSON: /api/errors/594b30aad40ac13d. Report an issue: GitHub.