The continuity ledger
Before choosing an operation, name the state you want to change.
“Reset my session” is too vague. It might mean stopping a response, dropping conversation context, starting a different identity, discarding provider-facing handles, or deleting local history. Those are different requests.
The seven boundaries
| Layer | What it means | What it is not |
|---|---|---|
| Live and model context | The messages currently held by the agent, plus the transformations used to prepare model context. | Every entry ever retained in the journal, or an exact captured HTTP request. |
| Durable journal | The saved JSONL conversation record, including messages and metadata. It can retain older and alternative paths. | A directory snapshot or a complete record of every unfinished streaming token. |
| Persistent session identity | The identity in the session header, exposed by SessionManager.getSessionId(). | Necessarily the same value as a provider-facing session ID. |
| Provider-facing state | Request identity, local transport/session handles, and possibly a separate prompt-cache key. | A guarantee about remote retention, remote deletion, or cache behavior. |
| Cwd and project scope | The active working directory, recorded header cwd, and any additional workspace roots. These can differ during fallback or failure. | A copy of the project at the time the conversation began. |
| Workspace files | The files that exist now in the project. | Files restored merely because an old conversation was reopened. |
| Artifacts and outputs | Session-adjacent artifacts and nested journals, generated HTML, temporary dump sidecars, and copied text. | One automatically synchronized, automatically deleted privacy boundary. |
The rendered transcript is another view of these layers. It may collapse older context or hide some content. A shorter display does not establish a shorter journal.
A journal’s entries have their own IDs and parent relationships. The active leaf selects a conversation path for context rebuilding. You do not need to learn the entire tree implementation here; you do need to remember that all stored entries and the active conversation path are not the same thing.
Milestone: Identify yesterday before opening anything
Need. Maya wants yesterday’s Lantern Board discussion.
Obstacle. Yesterday’s conversation says “Ready for pickup,” but today’s workspace file says “Packed and waiting.” Both statements can be present without OMP having lost anything.
Read the public fixtures first:
Terminal shell — read-only inspection, from extracted examples/:
jq -s 'map(select(.type == "session") | {id, cwd, title})' return-desk/yesterday.jsonl
jq -s 'map(select(.type == "message" and .message.role == "user") | .message.content)' return-desk/yesterday.jsonl
cat return-desk/today.txt
Structured example output — derived from the public header, not a new terminal capture:
[
{
"id": "11111111-1111-4111-8111-111111111111",
"cwd": "/fictional/lantern-board",
"title": "Lantern Board: yesterday's labels"
}
]
The fixture’s user message is:
For our fictional Lantern Board, use the label Ready for pickup. We will revisit it tomorrow.
The workspace file identifies its current label as:
Current label: Packed and waiting
What changes? These inspection commands change neither the fixture nor an OMP session.
What stays separate? The full session identity, the header’s recorded cwd, the conversation text, and today’s file contents are four different observations. The short entry ID of a message is not the persistent session identity.
Recorded check. identity-journal-cwd-workspace reopened a real SessionManager journal and retained its identity, location, entries, and cwd while the fictional workspace bytes remained unchanged.
Failure and recovery. If jq cannot read or parse the fixture, fix the working directory or restore a clean downloaded copy. Do not substitute a personal journal. The /fictional/lantern-board path and fictional-offline-model label are fixture data, not a project or provider to configure.
Self-check. After resuming yesterday, which label should today.txt contain?
Answer: “Packed and waiting.” Resuming history does not reverse the file change represented by the fixture.
A path is not proof of persistence
The current manager can allocate a session ID and transcript path before materializing the file. New-session persistence is lazy until assistant output or another explicit persistence reason makes the file necessary.
That means:
- An assigned filename does not prove that a resumable file exists.
- An empty new conversation can still have model or thinking metadata in memory.
- A session created with
--no-sessionnormally has no journal file, but a dump can still create a temporary sidecar. - Completed entries and in-flight streaming text have different durability boundaries.
The supplied SessionManager comments describe completed-entry writes reaching the operating system without fsync: software-crash durability is not a power-loss backup guarantee.
Source anchors: packages/coding-agent/src/session/session-manager.ts — SessionManager, getSessionId, getSessionFile, isSessionOnDisk, buildSessionContext; packages/coding-agent/src/session/session-context.ts — buildSessionContext; packages/coding-agent/src/session/session-entries.ts — SessionHeader, ResetBoundaryEntry.
Sessions, resets, and reviewable history · Source chapter: continuity/the-continuity-ledger. Original evidence remains scoped to its recorded snapshot.