← Blog

The Chat Window Is Not the Application

Beyond the Chat Window · Article 1 of 8

The most natural way to use a large language model is also the easiest way to misunderstand what a long-running LLM workflow needs. The product presents a conversation, so the conversation starts to feel like the place where the work lives. For a short task, that intuition is harmless. You ask for a revision, the model sees the preceding paragraph, and the exchange remains small enough that the transcript itself functions as both record and working context.

Project-scale work is different. A project accumulates current decisions, obsolete decisions, constraints, dependencies, intermediate results, unresolved questions, terminology, versions, and artifacts. Some facts are provisional; others have become authoritative. Some changes affect only one local object; others propagate through the whole project. A transcript contains all of this history, but it does not necessarily represent the current state cleanly. The model must reconstruct that state from language each time it matters.

That distinction is the starting point for this series: conversation is an excellent interface for expressing intent, but it need not be the application's state model. Once an LLM has read-write access to files, a different architecture becomes possible. The durable state of the task can be externalized into structured objects, while the chat remains the place where the user changes goals, asks questions, and redirects the work.

This article series was produced that way. The prose you are reading was not planned entirely in the transcript and then emitted in one pass. Before drafting, the project was represented in a persistent JSON object containing the series thesis, article roles, terminology, reader assumptions, target conclusions, dependencies, execution status, and later a more detailed argument model. The articles are derivative artifacts of that state. That makes the series itself a useful example of the method it describes.

Why more context is not the same as better state Suppose a long writing project is managed only through conversation. Early on, the author decides that a section should use a particular example. Twenty turns later, the example is moved. Fifty turns later, the terminology changes.

Somewhere else in the conversation, the author adds an exception that limits the scope of the original rule. The transcript faithfully preserves all of these events, including the superseded ones.

A capable model may still infer the right current interpretation. But it must first solve a reconstruction problem: which statements remain authoritative, which ones have been overridden, which references point to the same object, and which downstream decisions were affected by later changes? A larger context window gives the model access to more of that history, but it does not remove the reconstruction burden. Retained language and represented state are different things.

The difference becomes obvious when we ask simple operational questions. What remains to be done? Which sections depend on a particular assumption? Which name is the current canonical term? Which artifact should be regenerated if one constraint changes? In a transcript-only workflow, these are semantic reading tasks. In a structured workflow, some of them become queries over current state.

For this series, an article object could say that post_3 depends on results from post_1 and post_2, that it introduces the concepts of a manifest and checkpoint, and that its publication status is not yet complete. The exact JSON syntax is not important. What matters is that post_3 has a stable identity and explicit relations. A later operation does not need to rediscover those facts by rereading the history of how Post 3 was discussed.

This is why I would resist calling the external file merely “memory.” Memory suggests retained information. The stronger idea is canonical state: an external representation that subsequent operations treat as the current project model. Notes may describe the project. Canonical state drives the project.

What changes when the state is explicit Once a task has a canonical external representation, the model can operate on addresses rather than impressions. A post has an ID. A claim can have a status. A dependency can be represented as a relation rather than implied by prose.

A decision can supersede another decision explicitly. An open question can remain open without being buried among hundreds of completed turns.

The effect is not simply neatness. It changes what later operations cost. If the task is “draft the second movement of Article 4,” the model can load the article thesis, the relevant argument objects, the terminology it must preserve, the prior results that the article inherits, and the current composition plan. It does not need every historical sentence that produced those objects. The local context becomes a selected projection of the durable project state.

That is a useful way to think about the context window: not as the project's long-term memory, but as working memory assembled for the current operation. The durable representation can be much larger and more heterogeneous than what any one step requires. One turn may need the terminology table and a handful of dependencies; another may need a manifest and a set of unresolved editorial findings. The prompt is no longer the project. It is a temporary view of the project.

This matters because many sophisticated LLM tasks are not difficult merely because they require “more intelligence.” They are difficult because they ask one ephemeral context to play too many roles at once: archive, database, plan, task queue, dependency graph, editorial memory, and output buffer. Externalizing state lets those responsibilities separate.

The process used for this series illustrates that separation. The initial state was simple: five articles, a central thesis, and a rough sequence. I then reframed the series as an instructive argument. That new requirement became additional state: likely reader beliefs, target justified beliefs, and inferential moves. Later, those objects were refined into premises, warrants, objections, and examples. Later still, the first composition strategy was rejected because it produced poor prose; the protocol was changed, and the project resumed from the last trustworthy structural checkpoint. The transcript records all of those events, but the current state tells the workflow what is true now.

A different scaling model This architecture also changes how we think about scale. In ordinary chat, there is a strong temptation to identify a user task with one model response: ask for an essay, receive an essay; ask for a plan, receive a plan. Once the task state is external, that coupling becomes optional. A single user-level task can be decomposed into many bounded operations over persistent state.

I have used this pattern to generate a work of more than 50,000 words. The model did not hold the entire manuscript in active context and did not attempt to emit the whole artifact in one completion. It iterated over external state, produced bounded sections, persisted outputs, updated a manifest, and could resume after interruption. The total artifact was larger than any single response because the user-level task was no longer constrained to the scale of one invocation.

The same principle is operating here on a smaller scale. The final deliverable is a coherent five-part series, but its production has included multiple passes: establish the epistemic goals, formalize the argument, refine the data model, design the composition architecture, draft, critique, revise, check continuity, and finally assemble the publication artifact. At each stage, the state persists beyond the individual call.

That does not make the conversation irrelevant. The opposite is true. Conversation is where the method gets its flexibility. I can introduce a new idea late, reject a mistaken assumption, or change the standard of quality. The key is that once a conversational instruction has durable consequences, those consequences should be reflected in project state rather than left as another sentence the model must remember to honor.

The most important architectural move, then, is not “save some JSON.” It is to separate human interaction from durable task representation. The chat becomes the control surface. The persistent state becomes the project model. The active context becomes a selective working set drawn from that model.

But that separation immediately creates a harder problem. If an LLM is allowed to read and write the project's canonical state, what prevents it from changing that state incoherently? A schema can tell us what fields and objects exist; it cannot, by itself, tell us which mutations are valid, which invariants must survive, or when a change is committed. That is why persistent state needs a protocol.