@pleach/replay changelog
Release history for @pleach/replay — site-docs entries that materially touched the @pleach/replay surface, newest-first. Canonical runtime history lives upstream.
This page collects the site-content changelog entries that
materially touched the @pleach/replay docs
surface or named a @pleach/replay symbol. It is not the runtime
changelog — the canonical record of @pleach/replay runtime
behavior lives in the upstream package
CHANGELOG.md and on
npmjs.org/package/@pleach/replay.
See the combined site changelog at
/docs/changelog/combined for the
chronological unified view across every SKU.
Unreleased
Fixed
- Replay no longer promises byte-identical output. A live model
can't guarantee it. Eval and replay renames
"Verifying byte-identical replay" to "Checking a replay for
divergence", and
deterministic: truenow reads as "no step diverged in this check". The glossary, FAQ, and comparison tables say what ships: replay re-serves the recorded stream and drift raisesReplayDivergenceError. - Audit-record claims now match what the code enforces. The
homepage pillar,
components/session-manifest-diagram.tsx,content/docs/security.mdx,replay.mdx,ci-enforcement.mdx,audit-ledger.mdx, andcompliance/gdpr-erasure.mdxsaid rows are "written once and never edited or deleted" or "immutable". The ledger API has no update or delete primitive, but that does not stop a writer with direct database access. The pages now say so, and say what the hash chain adds: edits, deletions, and reordering become detectable after the fact.
Fixed
-
Region-pinned agent replay snippet corrected to the shipped
ReplayRuntimeshapes (devharness FINDING 100–102).createReplayRuntimetakessessionRuntime, notliveRuntime(ReplayRuntimeConfig={ tenantId (required), sessionRuntime?, cacheReadMode?, clock?, eventSource? },replay/src/runtime/types.ts:499).replayTurninput is{ chatId, tenantId, messageId }—turnId→messageId,modeis not a field, andtenantIdis required (ReplayRuntime.ts:521;ReplayTurnInput,types.ts:95). Its output is{ chatId, tenantId, messageId, state, sequenceNumberRange }(ReplayRuntime.ts:573) — there is no.difffield, so the cross-family parity read was rewritten to compare the returnedstateyourself, with a pointer to the hash-chainverifyIntegrityverdict ({ valid, brokenAt? }) for tamper-evidence. -
@pleach/replayeval-coupling snippet corrected (devharness FINDING 89). The DI example constructednew EvalSuite({ replay }), butEvalSuiteOptions(eval/src/index.ts) has noreplayfield and requiressuiteId; the real cross-wire issuite.setReplayClient(client). Corrected tonew EvalSuite({ suiteId, runtime })+suite.setReplayClient(replay)(the source doc comment atreplay/src/index.tswas likewise corrected).
Added
- Replay Cache adapters section.
Documents
createDiskCacheProvider,createRedisCacheProvider, andcreateS3CacheProvider(@pleach/replay/cache/adapters/*) — the backing stores forcreateCacheMiddleware. /docs/replay—createStrictHandleReplaydeterminism gate. New@pleach/replay/strictexport (re-exported at the root) that walks N independent handles over the same(chatId, tenantId, window)and byte-compares the folded per-step state, returning{ deterministic, steps, firstDivergenceAt? }. Documented in the Status section, a new "Determinism gate" subsection, and the Roadmap. Sibling ofcreateStrictReplay(which gates theReplayRuntime.replayTurnsurface)./docs/replay—cacheKeyreplay slot.@pleach/core'stool.completed/turn.completedevents gained an optionalcacheKeypayload field; theReplayHandleconsults a wiredcacheBackendfor rows that carry it (percacheReadMode). The "What's NOT" list notes core does not populate it (thecore → replayboundary forbids importingderiveContentHashKey) — host- /createCacheMiddleware- populated.
Changed
/docs/replay—ReplayHandlestepper documented as wired.step()/seek()/replayTurn()no longer throwNotImplementedError; they walk the event log viaruntime.events.iterateand fold throughhydrateFromEvents. Updated the Status section, theReplayHandlemember table (all six members Live), thestep()/seek()/replayTurn()behavior section, the determinism contract (one shared reducer →seek(N)== N steps == a full fold), the error-hierarchy note onNotImplementedError, and the "What's NOT in this package" list (now: noStrictReplaydiff over the handle, no automatic cache-key derivation from rows). Mirrored the one-line status flip on/docs/eval-and-replay.
Added
<StatusBadge>reference adoption —/docs/replayadopts<StatusBadge status="in-flight">Phase A + Phase B</StatusBadge>under its Status heading as the reference adoption of the new first-party enterprise-shape component.
Changed
/docs/replayerror hierarchy diagram — the ASCII tree renderingReplayError/ReplayDivergenceError/ReplayCacheMissError/ReplayUnknownEventError/NotImplementedErroris now a mermaidclassDiagramwith inheritance arrows and per-class fields. Matches the established mermaid idiom used on/docs/overviewand elsewhere.- Cross-docs status-flip pass —
@pleach/replay'sReplayRuntimeinvokes the@pleach/core/eventLoghash-chain verifier (verifyChainForChat/generateProoflive in@pleach/core/eventLog), with writer-side stamping in@pleach/core/eventLogbehindc9PhaseBEnabled. Touched the Replay and Hash chain pages.
2026-06-08
Changed
- Packages table corrected to real published
version —
@pleach/replay 0.7.0(was largely stale "Reserved · placeholder" framing). - @pleach/replay Phase B note now distinguishes
the landed
replayTurnbody from the still-throwingfromSnapshot/fork/multiTenantAggregate.
@pleach/recipes changelog
Release history for @pleach/recipes — site-docs entries that materially touched the recipes surface, newest-first. Canonical runtime history lives upstream.
@pleach/sandbox changelog
Release history for @pleach/sandbox — site-docs entries that materially touched the @pleach/sandbox surface, newest-first. Canonical runtime history lives upstream.