docs(localdb): README + scadaproj index row + design-doc deltas; pack-verified 3 nupkgs @ 0.1.0

Claude-Session: https://claude.ai/code/session_01BL2Vu1ESDQ9SCN4gVKkdts
This commit is contained in:
Joseph Doherty
2026-07-18 01:12:19 -04:00
parent b2345c32d4
commit ac6bcde159
5 changed files with 242 additions and 6 deletions
+13
View File
@@ -86,3 +86,16 @@ dead-letter counters. `ZB.MOM.WW.Configuration` validators on all options.
- More than two nodes / mesh topologies
- Per-table pluggable conflict resolvers (LWW only)
- TTL/eviction (consumer concern via their own SQL)
## Implemented — deltas from this design
Shipped deviations from the design above (all built + tested; see `ZB.MOM.WW.LocalDb/README.md`):
- **Engine:** Microsoft.Data.Sqlite is the default behind an engine seam; libSQL deferred (already noted above).
- **PK-column updates:** fully supported as OLD-pk tombstone + new-row insert (delete+insert), an upgrade from the original per-design limitation.
- **Clock drift:** an over-drift entry is **per-entry dead-lettered** (when `FailClosedOnDrift`) rather than faulting the session — the session never dies from drift.
- **Snapshot trigger:** each node computes its **own** `needs_snapshot` (pruned-horizon / flag); `HandshakeAck.snapshot_required` is now informational, not the decision authority.
- **`onReady` API shape:** `AddZbLocalDb(..., Action<ILocalDb> onReady)` for table creation + `RegisterReplicated`, instead of a registration-builder object.
- **Outbound path:** a single-writer, two-lane design (unbounded control lane preempts a bounded data lane) rather than an undifferentiated write path.
- **Maintenance:** a dedicated `MaintenanceBackgroundService` (both roles) enforces oplog caps + tombstone retention on an interval.
- **Snapshot sender** returns the **as-of oplog seq** it covers, so the pump skips already-covered tail deltas.