Forced retains returned early with an empty incremental slice when no new
messages arrived since the last successful auto-retain, so a user-visible
/memory enqueue rebuild sent nothing and could not recover a deleted or
unmaterialized upstream document. Also removed the public modifier from the
test fake per the root AGENTS.md class-privacy rule and added a forced-retain
resend test.
Validate the full-session retention cache with a rolling hash over the entire retained prefix instead of only the boundary message: a branch rewrite that leaves the boundary message unchanged (e.g. in-place edit of earlier messages) now also triggers a full rebuild. Regression test covers the boundary-unchanged prefix rewrite.
Self-healing boundary guard for the full-session retention cache: fingerprint the last retained message; on branch shrink (rewind) or prefix rewrite (branch switch/compaction), rebuild the full transcript instead of retaining stale content or silently retaining nothing. Regression tests cover append, shrink, and rewrite.