- SnapshotApplier now takes LocalDbMetrics (wired by SyncSessionFactory) and
adds every row it dead-letters - poison, drift reject, FK orphan, retry
failure, cap spill - to localdb.sync.dead_lettered. Before, only the delta
path recorded the metric.
- New ReplicationOptions.MaxSnapshotDeferredRows (default 100,000, validated
> 0) bounds the rows held for a missing FK parent; past it the oldest get
one more apply with deferral off and are dead-lettered if still orphaned.
An older name-ordered sender could otherwise defer a whole child table.
Unit + 2-node (SyncSessionFactory) tests fail pre-fix. No wire change.
(scadaproj#50)
Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV