TrainItems::from_corpus and EncoderOffer::for_round become pub(crate). RunStores
(run.rs) creates a run over three stores, records their canonical paths and
FNV-1a 64 digests plus the prompt and lowerer source digests in run.cc, and
reopens only from that record, refusing on drift. RunRecord and RoundRecord are
published CultCache types. tests/context.rs and the context.rs doctests move to
RunStores; the two mutated-clone gate cases become a unit test.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
EncoderOffer<'cp> borrows its Checkpoint so a Test offer cannot be encoded
after the reading spends it. tests/checkpoint_door.rs scans split.rs for any
public minting item under any name. The split.rs doc says operator tools read
corpus text and the guarded invariant is the round path.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
for_checkpoint takes &mut Checkpoint and refuses a repeated key
(OfferedAtCheckpoint) after the gate; TrainItems::held replaces holds and block
prints the matched Train item's text; the text-key fold is pinned against the
store's own S6 refusal.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Checkpoint::declare becomes cfg(test) for_test; Checkpoint-using tests move
into src unit tests over split::fixture; Prompt::mint and encode lose the
instructions parameter (MINT_INSTRUCTIONS, ENCODE_INSTRUCTIONS in context.rs).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>