- remove() drops the session's slot once the file is gone: a session that comes
back with the same id (reboot restore) starts afresh instead of answering
`removed` until the next restart. A run in flight stays on its own slot's store,
and the routes start a sync in the same tick as their session check, so a
deletion right after it still stops that sync. A store that is not loaded is
deleted without being parsed (deleteStore).
- A new conversation (/clear, resume) first reads the previous transcript, next
to the new one, to its end with its subagents, so edits it got after the last
read are not lost with its cursors. "Load older" reads the stored conversation
while the switch is pending.
- At most MAX_LOADED_STORES (3) stores stay in memory; the least recently used one
without a run is written if it changed (settle) and loads again on demand.
- Tmp files are named per process start, so a reused pid (a container's pid 1)
no longer keeps a stale one through the startup sweep.
- load() keeps only a plain transcript id (the previous transcript's path is built
from it) and no cursors without one; a pending Bash call with an id, cwd or
agent id over 4,096 characters is not kept at parse time either.
- nextRange() is gone: production reads forward through the reader. The store
tests mirror the reader's range choice, and a new end-to-end test runs the
real reader, sync and store (/clear cases, 40 seeded random transcripts).
- The wiring guard scans all of src for holders of the sync.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>