A trace is a fold, not a second file
A session keeps one durable record. The operational trace that stood beside
it, transcript.jsonl, is deleted outright rather than retired to a filtered
projection of the log: an operational view is a fold of record.jsonl like
every other durable artifact, and a fact the log’s vocabulary has no home for is
named a loss rather than kept alive by a second file. This pays in full the
two-record debt recording-follows-the-event
booked and one-seam-one-log paid by half.
Why the second record could not be folded
one-seam-one-log unified the durable half — the model view and the resumed
scrollback became folds of record.jsonl — and left the trace an independently
written file, fed at the bus emit seam outside that change’s boundary. That is
still two authorities for one session, which is the shape 260623’s debt names;
retiring the trace to a projection would have kept the file and only changed
who wrote it. The question a decision has to answer is not where the second
record is written but whether the session has anything left that only it holds.
It has three facts, and each has a truer home in the one log:
- A per-line clock becomes the log line’s own
Entry.at_unix_ms(exarch/src/record.rs).Entryis private to the log module — a fold sees a bareRecord— so the clock is a property of the line, not of the vocabulary, and no projection can come to depend on it. - A child’s
born/diedare its ownProtocol::SessionStartedandProtocol::SessionEndedbookends in its own log, where a child’s lifetime was always recorded. stop_reasonalready ridesProtocol::AssistantMessage; the trace held a copy.
The accepted loss
/resources’ pressure figures. No session keeps a pressure history, so the
figures the trace could answer from are not answerable from the log — this is
named a loss, not deferred to a fold that cannot exist. Restoring them means
recording pressure as a fact, which is a decision this one does not make.
What this does not decide
The same change moved Kind’s variants into four homes. Where code lives is
map/, not a decision — nothing here rests on that move, and it needs no page
of its own.