# Open-format K1 Chat State 0.9.2
`kcode-k1-chat-state` 0.9.2 owns the Agent Response scheduling line over exact `kcode-k1-chat-chatend = "=0.8.1"`. Immutable 0.8.0 is the prior Chatend 0.7.0 line.
`ActorState` adds provider-free scheduling to Chatend's open `ChatBox` format. It reexports `ChatBox`, `BoxId`, `DispatchedToolCall`, `ProviderCall`, `ProviderGenerated`, `RecoveryError`, `ToolCallId`, and `TransitionError`, plus Chatend's public open-string conventions including `Agent Response`. A `ChatBox` has a consecutive one-based ID and accessible `box_type`, `contents`, `hidden_type`, and `hidden_contents` accessors. Types and hidden conventions are open strings, not enums.
`accept_box` preserves arbitrary four-field boxes. `accept_system`, `accept_user`, and `accept_attachment` create canonical triggering arrivals. Tool returns use Chatend's correlated, non-exhaustive conventions.
`accept_tool_message` creates a canonical Tool Message but never schedules inference or a follow-up. `accept_async_return` creates a Tool Result v1, and `accept_async_return_v2` creates a metadata-bearing Tool Result v2; both result methods trigger scheduling identically. An idle Tool Message therefore leaves `begin_inference` unready, while an idle Tool Result makes it ready.
During an active round, arrivals retain FIFO order. Tool Messages alone do not create a follow-up, including when they arrive after a flush. A Tool Result creates one coalesced follow-up unless a nonempty active-arrival flush consumes it. Generic boxes and system, user, and attachment arrivals remain triggering.
`begin_inference` opens a provider round and promises the next `Agent Response` ID without adding a box. Job IDs are process-local and monotonic; `frontier` is the previous last box and `attempt` is shared with the active state. `append_stage` accepts ordered `ProviderGenerated` values, appends the stage's `Agent Response` first even when empty, preserves explicit Agent Messages and Tool Calls in provider order, and returns only dispatchable Tool Calls. `flush_active_arrivals` validates the active job, appends one finite FIFO snapshot, promises the next response boundary, and retains the round. `complete_inference` appends the promised `Agent Response` before queued arrivals and finishes the round.
`stall_inference` leaves the round open. `restart` makes that round ready under a fresh job without another start and retains its frontier. `halt` is first-write until taken. `recover` validates recognized Chatend conventions, accepts unknown values unchanged, returns idle state with fresh job numbering, and preserves BoxId continuity.
No persistence, KTO, submitted-frontier, synthetic provider-input rendering, actor runtime, provider, Codex, native tool registration, filesystem, or dispatch execution is included.