# Open-format K1 Chat State 0.6.1
`ActorState` adds provider-free scheduling to Chatend's open `ChatBox` format. It reexports `ChatBox`, `BoxId`, `DispatchedToolCall`, `ProviderCall`, `RecoveryError`, `ToolCallId`, and `TransitionError`, plus Chatend's nine public open-string conventions. 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; hidden data is ordinary data and is only omitted by default model projection elsewhere.
```rust
let mut state = ActorState::new(false);
state.accept_user("hello".into())?;
let start = state.begin_inference()?.unwrap();
state.append_stage(start.job, "thinking".into(), vec![])?;
state.complete_inference(start.job, "answer".into())?;
# Ok::<(), StateError>(())
```
`accept_box` accepts any four-field box value and preserves unknown types and hidden data through active FIFO flush, completion, and recovery. `accept_system`, `accept_user`, and `accept_attachment` are convenience constructors; attachments produce `User Attachment` boxes and require real visible and hidden fields. Tool returns use Chatend's non-exhaustive tool convention.
`begin_inference` opens a provider round 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` validates the job and returns canonical dispatchable tool calls. `flush_active_arrivals` validates the active job, appends one finite FIFO snapshot while retaining the round, and returns it. A nonempty flush consumes its pending follow-up; later arrivals create exactly one new follow-up. `complete_inference` finishes the round. Idle arrivals schedule immediately; active arrivals coalesce after completion. Call-only stages do not schedule.
`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, events, serde, runtime, provider, filesystem, or dispatch execution is included.