Designing · Chat that updates working state
Structured conversation becomes state
Each conversational turn should update working state, context, or proposed knowledge, not append a transcript line alone. Show the state diff after one message.
9 min read
Cover for Structured conversation becomes stateA household says: "Tuesday got harder this week, both of us are working late." If the Meal Companion only replies "got it" and adds a line to chat history, nothing durable changed. Next run, Tuesday may still be treated as a normal evening.
If instead the message updates context, Tuesday flagged busy, adjusts working state, replan trigger for Tuesday's meal, and shows a diff, Tuesday's meal swapped, other days preserved, conversation has become state.
Helpful context: Conversation over configuration is the experience principle. Working state versus transcript and memory are the architectural forms this note connects to.
State diff after one user message
Before the utterance, Tuesday equals stir-fry with forty-five minutes active. Context marks Tuesday as normal. After "Tuesday got harder," context marks Tuesday evening as busy this run, the plan shows quick pasta at most twenty-five minutes, other days stay unchanged, and the trigger is replan single day, not full week. That table is what engineers and PMs design toward, not a longer chat reply.
| Field | Change |
|---|---|
| Context: Tuesday evening | busy this run |
| Plan: Tuesday meal | quick pasta at most twenty-five minutes |
| Other days | unchanged |
| Trigger | replan single day, not full week |
Backend teams treat utterance handlers as state writers, not text appenders. Product teams treat empty diff as a bug. If a household says "Tuesday got harder" and nothing changes in working state, the conversation bridge is broken regardless of how friendly the acknowledgment sounds.
Diff views belong in UX, and also in logs. Households see what changed when Tuesday got harder rather than inferring from a new meal name alone. The same diff the household sees appears in logs for engineering diagnosis. Advanced products expose a state inspector for support and power users.
Scope is the common failure
A one-run exception written as standing policy is a governance failure. A standing preference hidden only in chat is an editability failure. "Avoid pasta this week" maps to context only. "We generally avoid pasta" maps to proposed endorsement and requires approval.
Scope confirmation is how conversation stays honest. Without it, households cannot tell whether Tuesday's exception became household law. The process behind every utterance follows a consistent pattern: parse intent into typed fields the product can store and display, confirm scope as this run, this project, or standing preference, write to an editable store with origin and time, and inject settled preferences as deterministic inputs where they belong rather than re-reasoned vibes each turn.
Some decisions still deserve explicit visibility for privacy, security, and compliance. Settings handle decisions that need permanence and deliberate control. Conversation produces state everywhere else. See preference store versus chat memory for the full distinction.
Thoughtware: Designing in the Intelligence Age · Ch. 8An utterance becomes a config object, so conversation produces inspectable state.
How this connects to working state
Working state holds the provisional plan version, accepted meals, gaps, and loop budget. Conversation that becomes state updates those fields explicitly. Transcript-only chat leaves working state stale while the UI sounds responsive.
The Meal Companion loop depends on accurate working state. CritiquePlan reads it. RecommendMealSubstitution patches it. Deterministic code versions it. Conversation is an input channel to that object, not a parallel reality. When direction stops at the chat layer, CritiquePlan runs on stale context and RecommendMealSubstitution proposes against outdated constraints. The product sounds responsive while behaving amnesiac.
Each state write increments the plan version. Diff shows version bump. Deterministic code reads version for shopping list and audit. Versioning connects the conversation bridge to downstream code. Settled preferences inject as typed fields on the next judgment run, not as re-reasoned paraphrase inside a prompt. Monday vegetarian endorsed means GenerateCandidates reads a boolean, not a chat summary that might drift. Engineering teams treat injection lists as part of the contract for each cognitive unit, and missing injection is a bug equal to wrong chat reply.
Engineering the bridge
Parsing intent into fields with types, confirming scope before write, persisting with provenance, and injecting settled fields into the next judgment run deterministically form the engineering bridge between conversation and state. Skipping any step means conversation reverts to transcript theatre.
Conflict resolution matters when two utterances arrive in the same session: "avoid pasta this week" and "add pasta Friday." The parser detects conflict, asks a scope question, and writes context flags that compose honestly. The state writer handles conflict, not silent last-write-wins.
Batch utterance handling also requires care. A user sends two constraints in one message: "Tuesday busy and no pasta this week." The parser emits two writes in one transaction with combined diff. Batch handling reduces partial application bugs. Before apply, a preview diff appears. The household confirms. Previewing reduces wrong-scope writes, especially for shared accounts and enterprise queues.
Enterprise workflows follow the same bridge. A clerk says "vendor confirmed partial shipment." The exception queue updates status, assigned owner, and next action. The transcript records the utterance. The queue object is what downstream automation reads. Chat-only recording would lose the workflow.
Provenance, failure modes, and measurement
Provenance matters when two adults share an account. Who said "avoid pasta this week?" State objects carry speaker and timestamp. Promotion flows ask a confirming member when scope is general. Shared accounts amplify scope failures: a week exception promoted to household law without confirmation destroys trust between members and toward the product. Logging every state write for engineering replay, utterance in, parsed fields, scope confirmation, write result, and diff out, supports eval and incident response. Conversation becomes state is partly an observability requirement.
The failure modes follow a predictable pattern: chat line only with no state change, wrong scope promotion where a week exception becomes a forever rule, missing provenance where no one can trace who said what, and full replan when single day should patch. Each failure erodes trust faster than a wrong recipe suggestion because the household cannot contest what they cannot see. Monitoring empty diff rate in production catches utterance handlers that append chat without writing state. Rising empty diff rates are product bugs, not model issues. Regression tests per utterance class, "Tuesday got harder," "avoid pasta this week," "Mondays vegetarian," "use spinach by Wednesday," each get state assertion tests. CI guards the conversation bridge. QA scenarios include scope mistakes on purpose to verify confirmation flows work.
Tracking the percent of utterances that produce inspectable state diffs and the contest rate on written objects reveals whether conversation is producing state or remaining theatre. Low conversion means conversation is still a chat experience dressed as direction. Households trust diffs more than fluent acknowledgment. "Tuesday got harder" produces visible field changes before conversational reply. Empty diff with friendly copy is transcript theatre. Support diagnostics show the same diff the household sees, reducing disputes when state disagrees with memory, and faster resolution follows when a user says "I said Tuesday was busy and nothing changed."
What to do next
The state diff after one message is the test that separates conversation as architecture from conversation as chat. Picking one utterance the product handles today and documenting what state objects it creates or updates reveals whether the bridge exists. Implementing the diff view before improving the chat reply ensures that the architectural connection is real. The next question is what the system knows for this run: context is a feature describes how curated context prevents both re-asking settled facts and treating rumour as knowledge.
See preference store versus chat memory and working state versus transcript.
Read next: Context is a feature.