From 4480a7d755f085e87201fbdbf214203215709d9f Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 21 Jul 2026 04:47:35 -0400 Subject: [PATCH] docs(localdb): record deviations D-6 and D-7 in the phase-2 recon D-6 (payload-hash migrator ids over mig-{node}-{legacyId}) and D-7 (the plan's Host.Tests project does not exist) were captured only in commit messages and the tasks file. They belong with the other deviations, where the next reader looks. Claude-Session: https://claude.ai/code/session_01GASWkNEi68FSCtvr6rLoEW --- docs/plans/2026-07-20-localdb-phase2-recon.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/plans/2026-07-20-localdb-phase2-recon.md b/docs/plans/2026-07-20-localdb-phase2-recon.md index f5714fba..e078a2c7 100644 --- a/docs/plans/2026-07-20-localdb-phase2-recon.md +++ b/docs/plans/2026-07-20-localdb-phase2-recon.md @@ -263,6 +263,30 @@ One genuine change: the drain's `ORDER BY` moves from `RowId ASC` to `enqueued_a a hashed TEXT id carries no insertion order. Round-trip ("O") timestamps sort lexicographically in chronological order, and `id` makes the ordering total; the index covers both. +### D-6 — The migrator keys on the payload hash, not `mig-{node}-{legacyId}` + +**The plan says** deterministic ids of the form `mig-{NodeName}-{legacyId}`, mirroring ScadaBridge. + +**Why that is not enough here.** Node-prefixing does solve the collision the legacy AUTOINCREMENT +key would otherwise cause — node A's `RowId 7` and node B's `RowId 7` are different alarms — but it +*preserves* a duplication that ought to be collapsed. A warm pair's two legacy files **overlap**: +`HistorianAdapterActor` default-writes while its redundancy role is unknown, so both nodes accepted +the same fanned transitions during every boot window they ever had. Prefixed ids would carry every +one of those duplicates into the merged buffer permanently, for the eventual Primary to deliver +twice. + +**The decision.** Reuse D-1's `AlarmSfSchema.DeriveId` (lifted out of the sink so both call sites +share one identity rule). Distinct events cannot collide; identical ones converge. It also removes +the migrator's only need for node identity from configuration, and makes a crash between commit and +rename harmless under `INSERT OR IGNORE` — which the plan's own idempotency requirement wanted +anyway. + +### D-7 — The migrator's tests live in `Host.IntegrationTests` + +The plan names `tests/Server/ZB.MOM.WW.OtOpcUa.Host.Tests`. **That project does not exist.** The +tests sit beside `LocalDbSetupTests` in `Host.IntegrationTests`, which is where every other +LocalDb-facing test already lives. They are offline — a temp file and no external services. + ### D-4 — The live gate needs `MaxAttempts` raised on the rig Not actionable until Task 8, recorded now so it is not rediscovered there. The rig has no