The invariantA finalized assistant message with zero tool-call blocks completes the step. With no pending inbox input, the ordinary turn closes.

Thirty seconds to containment.

  1. Cancel the active turn.Press Esc or Ctrl+C in the running TUI. Send Ctrl+C to a foreground CLI process.
  2. Watch the real meter.Confirm the process and provider usage stop. A frozen screen is not proof.
  3. Copy the trace.Preserve Session events, terminal output, timestamps, and sanitized provider usage.
  4. Do not resume unchanged.Fix the reachable failure or narrow tools, task, and budget before a fresh Session.

First, count the shape.

01 · one streamRepeated text chunks

Generation or adapter boundary. One request is not yet an Agent loop.

02 · many turnsFind every wake

Join each new turn to its user, Goal, plugin, or policy source.

03 · many stepsFind continuation input

Join each step to tool results, next-step input, or a turn-stopping hook.

04 · one durable messageCheck projection

A UI can repeat one message without making another provider request.

Follow the proof chain.

Chunk typeswhat arrived
→
Final blockswhat survived
→
Wake sourcewho continued
→
Ownerwhere to stop
Never do thisDo not parse narration such as “read file” or “edit file” and execute it. That bypasses the tool protocol, schema validation, approval, and call identity.

Bring an event timeline.

Version + source commit:
Profile + model route:
Turn start / cancel / last charge:
Turn / step / message / call / result events:
Source of every continuation message:
Raw chunks and finalized block types:
Sanitized tool result or error:
Request usage + provider curve:
Smallest bounded reproduction:

Stop actionless automation at its owner.

scopeAutomatic sources only

Never block a legitimate user-facing explanation, refusal, or final answer.

countZero finalized calls

Also require zero owned durable transition and no goal completion or question.

keyLifecycle + source + revision

Reset only on proven action or authenticated human input.

thresholdPause the owner

Leave the Agent idle. Never fabricate a tool call to force progress.

Prove the diagnosis with four cases.

  1. Fresh SessionSame route, same tool, short context.
  2. Long contextReconstruct compaction-sized context without private data.
  3. Goal disabledRun the same prompt without automatic Goal rounds.
  4. Control routeUse a known tool-capable model/provider route.

Primary evidence.

Keep the complete event runbook.

The canonical guide adds the failure router, safe circuit-breaker design, controlled reproduction matrix, and fifteen regression gates.

Read and star on GitHub