# Public API
`ActionSink` receives action events through the caller's existing actor queue. `start_tool_batch` starts every supplied tool without awaiting another call, combines caller-supplied worker/start-error replies with tool replies in original call-index order, and applies one shared deadline exactly two seconds after the batch begins. Fast results ready by that boundary are immediate; unresolved or configured queued tools emit their queued text and continue without cancellation. Later terminal results retain the same `ActionId` and original start instant.
`redrive_tool` restarts one recovered tool with the same action identity and exact request, suppresses its queued acknowledgement, and delivers only the fresh terminal result. Every tool receives `Updates` bound to that stable action identity. Prepared semantic and activity updates become `ActionEvent::Update`; the parent actor remains responsible for job lookup and deduplication.
`Immediate` and `ImmediateKind` are the narrow ordered-reply values. `ActionEvent` contains only update, ordered tool-reply, and terminal-tool outcomes. The package owns no actor state, provider continuation, worker, compaction, persistence, timestamp, cost interpretation, event stream, KTO, or second parent queue. Tool tasks hold no caller state lock, are never retried, and have no wall-clock bound beyond the two-second immediate-reply arbitration boundary.