RFC BH splits stop-the-turn from stop-the-run. POST /v1/runs/{run_id}/cancel {reason?} stops the current turn of an interactive run (the in-flight model generation plus the tool calls it started) and parks it at awaiting_input with the session, transcript, and context intact — instead of throwing the session away like whole-run cancel did. The loop keeps the partial output and synthesizes cancelled-by-operator tool_results for any in-flight tool_use so the next turn's history stays valid. Run-cancel vs. turn-cancel is double-guarded on ctx.Err() plus the ErrTurnCancelled cause. A new turn_cancelled SSE frame distinct from the run-level cancelled. Interruption decline: a pending Question can be resolved with disposition:"declined" so the agent proceeds without an answer. Cross-replica routing by runs.replica_id (new internal/turncancel registry + coord.TurnCancelCoordinator). Every transport: gRPC CancelTurn + ResolveInterrupt RPCs, @loomcycle/client cancelTurn / cancelInterrupt, Python cancel_turn / resolve_interrupt / cancel_interrupt; HTTP + gRPC share extracted connector cores. LoomBoard's Esc key was the front-end driver. Also folded in: RFC BG P1 model_pattern for auto-tracking a model family (claude-haiku-*), and bundled chat agents gaining the HTTP tool.
The History tool: past chats become a primitive (v1.20.0)