pub struct Transcript {
pub meta: SessionMeta,
pub convo: Conversation,
pub configs: Vec<RunConfig>,
pub config_positions: Vec<usize>,
pub episode: Option<RunStats>,
pub taint_timeline: TaintTimeline,
}Expand description
A transcript read once: see Session::read.
Fields§
§meta: SessionMeta§convo: Conversation§configs: Vec<RunConfig>Every RunConfig recorded, in order. The first is the run the session
began under; a /model switch appends another.
config_positions: Vec<usize>How many messages preceded each entry of configs in the loaded
list — parallel to it, and what Transcript::config_covering reads.
A front-end writes a Config at run start, before the run’s own
messages, so the config in effect at message i is the last one with
a position at or below i. A summarising Rewrite clamps every
earlier position to zero: the rewritten head’s original indices are
claims about a list that no longer exists, and the config in flight
at the rewrite — the last of the clamped ones — is the honest answer
for it (messages the rewrite kept from earlier attaches were
genuinely recorded under older configs, but those turns are exactly
the “not comparable” case run_configs’s own doc names, and the
replay fidelity caveat is the place that says so). A truncating
rewrite — the failed-turn rollback, whose new list is a strict prefix
of the one in hand — rewrites nothing, so its positions stay exact;
see the Rewrite arm in Session::read.
episode: Option<RunStats>Every recorded outcome, folded into the episode the session describes.
taint_timeline: TaintTimelineThe taint checkpoints, positioned against the loaded messages — the
same structure Session::taint_timeline builds from a second full
read, carried here because this pass already walked every record.
mecha distill paid four complete read-and-parse passes per session
(load, taint_timeline, then for_session’s own read and
taint_timeline) for questions this one walk answers together.
Implementations§
Source§impl Transcript
impl Transcript
Sourcepub fn config_covering(&self, message_index: usize) -> Option<&RunConfig>
pub fn config_covering(&self, message_index: usize) -> Option<&RunConfig>
The run config in effect at message message_index of the loaded
list, or None for a transcript recorded before configs were kept.
This is what a replay driver should ask, not configs.first():
resuming under different flags is a normal thing to do, and replaying
a later attach’s turns under the first attach’s system prompt and
tool list diverges for reasons that say nothing about those turns —
which a counterfactual reader then mistakes for evidence.