Long design sessions have no persistence checkpoint, because the model cannot see the thread end
The architectural discussions I have with Claude Code are comparable to the whiteboard discussions I had (architect,
previous life) with my lead developer.
Sessions invariably ended with taking a phone photo of the final state of the whiteboard before
wiping the whiteboard (company policy) and leaving the meeting room. Here the "photo" involves updating various
relevant artifacts (which is better), but I am missing an automation trigger equivalent to "leaving the room" ;-)
The kind of usage this is about
Not "fix this bug" and not "implement this feature on your own". These are multi-hour sessions spent
working out software architecture details: what a data model should hold, whether two features are one feature,
which of two conventions to adopt, why an approach was rejected. The output is mostly decisions and
their reasoning, and only sometimes code.
For this, we use GitHub issues as the project memory. Designs, rationale and rejected alternatives go
into tickets rather than into local notes, so a conversation can be thrown away without losing what was
concluded in it. And gives visibility to other contributors. Just our way of working.
Claude Code is very good at this: it writes the tickets, keeps them accurate, edits
them in place when something turns out wrong, and cross-references them sensibly.
The problem
Persistence happens reliably when the conversation is already about the thing being persisted. A
discussion about one feature produces an edit to that feature's ticket and/or artifact, with no separate decision
required.
It happens unreliably for everything else. A cross-cutting principle, a rejected alternative,
a defect noticed in passing, background info about user needs, a decision about method — none of these has an
obvious home, so recording them is a deliberate act that can be deferred. But deferred means lost.
The tell is that when the user asks "is all of this persisted?", it reliably flushes a few such points in
a reasonable wording in defendable locations.
So Claude Code _can_ already do the saving. But the saving needs triggering, and currently has to be supplied by the user
remembering to ask, at the end of a long session (who is tired after midnight ;-).
Why the natural trigger is invisible
There is no reliable trigger for it.
An obvious checkpoint would be the end of a thread. But a session cannot observe its own ending: the user
may start a new conversation, and by definition that happens somewhere the previous session cannot see.
Or the user simply stops typing, and nothing marks that as an ending rather than a pause.
This interacts badly with a second thing: Resuming a long conversation after the prompt cache has
expired costs a substantial slice (e.g. 20% for full context window) of a 5 hour usage block,
so for this kind of work the right move for the user can be persist > new thread -
unless you are really in the middle of something unresolved.
That makes an unflushed thread worse rather than better: in addition to the risk of losing conclusions the
user has already paid for, returning to the original thread to save them costs significantly more tokens,
because the cache is gone.
What might help
Fire on eviction, not on departure. A session's context does not vanish when the user walks away:
it survives long enough to switch between two threads and come back. The system knows when it is about
to discard that context, and the session - and user - does not. That event could serve as the __trigger__.
A final turn there, along the lines of "this context is about to be discarded, persist anything
outstanding", costs one small request and has everything still loaded. The analogy is an iOS app being
warned before termination so it can save state: the app cannot know, the system can, so the system
tells it.
This is why the obvious alternatives do not work. Reviving a thread afterwards to flush it costs the
same reload that made starting fresh attractive in the first place. And signaling the new thread is
useless, since it holds none of the previous one's conclusions.
Probably wants to be opt-in, per project or per session. Most sessions have nothing worth recording,
and a flush turn on every eviction would spend tokens to establish that. At the very least a /save-like command would
help because it makes users aware and provides a simple way of manually controlling this.
I currently type "anything in this conversation that needs persisting?" and Claude does the rest.
An even weaker alternative, if the above is impractical: some way to mark a specific piece of reasoning as "belongs in
durable storage" as it is produced, so persisting stops being a separate act performed afterwards.
Why this may not be visible in aggregate
This use is probably a small fraction of sessions, and it fails quietly. Nothing errors, nothing is
reported, and the user does not notice until weeks later when a decision has to be re-derived. The
symptom is the absence of a ticket comment that nobody knew to expect.