# Open-format K1 Chat State 0.9.3
`kcode-k1-chat-state` owns the Agent Response scheduling line over exact `kcode-k1-chat-chatend = "=0.8.2"`.
`ActorState` adds provider-free scheduling to Chatend's open `ChatBox` format. It reexports `ChatBox`, `BoxId`, `DispatchedToolCall`, `PreflightGenerated`, `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.
`append_preflight` is the sole nonscheduling idle batch operation. It appends ordered System Messages and Tool Calls and returns their canonical call correlations without making inference ready. It does not execute tools or own blocking policy.
`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.