While building long-running AI projects, I kept running into a failure that did not look like a memory problem at first.
The model could remember what had been discussed. The conversation history was still there. The problem was that a later session could no longer tell which parts of that history represented the project’s actual state.
That is a different failure.
A system can remember a lot and still be wrong about what the project currently holds.
A simple cross-session failure
Consider a fictional project.
On Friday, the project ends with a clear decision:
Current state: A
On Monday, there is a long follow-up conversation about an alternative, B.
B gets most of the attention. The user asks several questions about it. The model compares B with A, explores consequences, and works through possible reasons to switch.
But no decision is made.
The project still formally holds A.
Then, on Wednesday, a fresh invocation begins. The recent context contains much more discussion of B than A. If the system treats conversational recency as authority, it may answer as though the project has already moved to B.
Nothing important was forgotten.
The system simply failed to distinguish what was discussed from what was adopted.
That is the distinction I now treat explicitly:
Conversation ≠ Current State
Conversation is context. It can contain useful evidence, unfinished thinking, speculation, abandoned options, and old conclusions.
Current state has a narrower job: it tells a later invocation what the project formally holds now.
Why better memory does not solve this by itself
It is tempting to describe this as a memory problem.
Sometimes it is. If the system cannot retrieve earlier information, better memory helps.
But retrieval and authority are different questions.
A memory system asks:
Can I find the information again?
A state system also has to ask:
Which information should govern the next run?
Imagine a system that can retrieve every prior message perfectly.
It remembers that A was accepted.
It remembers that B was discussed.
It remembers ten arguments for B and three objections.
It still needs some way to know that B was never adopted.
More memory can actually make this harder if all retrieved information is presented with roughly the same weight.
The failure is no longer “I cannot remember enough.”
It becomes:
I remember several incompatible things, but I do not know which one has current authority.
What I mean by an explicit Current
I use Current as a narrow semantic role.
It is not a full memory store. It is not a summary of the whole project. It is not a claim that the system knows objective truth.
It answers one operational question:
What does the project formally hold right now?
The implementation can be simple.
A small project might keep a short state file. Another system might use a database record or platform-native storage. The storage mechanism matters less than the responsibility boundary.
The important part is that a later invocation does not have to infer formal state from:
- the most recent message;
- the longest discussion;
- whichever idea appears most often;
- or whatever happens to be near the end of the context window.
If the formal state changes, there should be a reason for that change.
Discussion alone is not enough.
State authority is not the same as truth
There is another subtle point.
Suppose Current says:
Current state: B
That means B is the project’s formal working state.
It does not mean B is guaranteed to still match the outside world.
If the project has been inactive for two weeks, B may be stale.
That creates a separate recovery problem: first restore where the project left off, then check whether reality has changed.
I keep those operations separate because otherwise persistence quietly turns into certainty.
A saved state can be valid as a record of what the project knew and still need revalidation before being treated as fresh reality.
This also changes how I think about persistence
Once Current is explicit, another question becomes easier to ask:
Does this run actually need to change persistent state?
Not every useful conversation does.
The Monday discussion about B may be valuable in the moment and still produce no formal update.
That is fine.
A run can answer questions, explore alternatives, or confirm that nothing material changed.
Persistence should not happen just because something new appeared in the conversation.
This is one reason I no longer treat “save more” as a default improvement.
Selective persistence is often safer than comprehensive persistence.
When you probably do not need this
For many AI tasks, none of this is necessary.
If the task is:
- one-off;
- short-lived;
- contained in one session;
- easy to restart from scratch;
- or not dependent on a stable project state;
then conversation history may be perfectly adequate.
Adding an explicit state model would only create overhead.
The distinction becomes useful when future invocations need to continue from a stable interpretation of the project rather than simply continue the conversation.
That is the threshold I care about.
The broader pattern
Once I started looking at this as a state-authority problem, similar boundaries appeared elsewhere.
Recovering the last saved state is not the same as proving that it still matches current reality.
Learning something during a run is not the same as changing the production rules that govern future runs.
Historical material can remain valuable without belonging in every runtime context.
These are related problems, but I do not think they need to be solved by one giant “memory framework.”
For me, the useful move was smaller: separate responsibilities first, then add mechanisms only when an observed failure justifies them.
Where I am documenting the rest
I have been turning these design decisions into a small set of public notes covering:
- the problem model;
- responsibility boundaries;
- persistence and recovery;
- synthetic worked examples;
- testing long-running behavior.
The repository is here:
Long-Running AI Project Design
The public notes stay at the design level. They do not include production prompts, schemas, state, business logic, or implementation-specific fixtures.
Closing thought
For short AI interactions, “memory” is often a good enough abstraction.
For long-running projects, I have found it too broad.
The system needs to know not only what it can remember, but what that remembered information is allowed to mean.
That is why I now treat project state as a separate design problem from chat history.
Top comments (0)