From 0adfb244b28815d5d29770ecde82c857f191a8ff Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sun, 11 Oct 2026 10:18:36 -0400 Subject: [PATCH] docs(index): OtOpcUa batch #667-#673 (retention, Part 11 modified values, event CPs, OpcUaClient session loss, time-weighted aggregates, unreachable-Primary capture) --- .../skills/sister-project-history/otopcua.md | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/.claude/skills/sister-project-history/otopcua.md b/.claude/skills/sister-project-history/otopcua.md index b954605..25466db 100644 --- a/.claude/skills/sister-project-history/otopcua.md +++ b/.claude/skills/sister-project-history/otopcua.md @@ -192,3 +192,32 @@ AddRoute of the dev Mac (`oee-tagdump-mac`, `10.181.206.245.1.1`) on the two tes about 30 s with no historization, because #537 Primary-gated capture waits for Akka downing. It is backend-independent; clean failovers are gap-free. **ScadaBridge impact: none by default**; the same as SqlServer when selected. +- **2026-10-11 batch #667–#673 (all closed; OtOpcUa `bc03adb1`).** Four docker-dev live gates passed (one R2 failure + fixed and re-gated). Follow-ups are #674–#678. + - **#667:** opt-in SqlServer retention, `ServerHistorian:SqlServer:RetentionDays`. Old samples and events are purged + in batches. The purge is Primary-gated, with one purger per database via `sp_getapplock`. + - **#668:** Part 11 modified-value history. + - Both SQL backends keep an audit trail of every HistoryUpdate, recording the API-key principal and the prior value. + - SqlServer schema is v2: `hist.SampleModified`, written in the same statement as the change. QuestDB uses an + append-only `sample_modified` table. + - `IsReadModified=true` reads support continuation points. Gateway returns `BadHistoryOperationUnsupported`. + - ⚠️ With `AutoCreateSchema=false`, apply `002_sample_modified.sql` before upgrading, or every historian call + fails. + - **#669:** event HistoryRead now uses continuation points. Open-ended reads follow Part 11: start-only reads + forward, end-only raw reads backward. + - **#670:** OpcUaClient now goes `Degraded` on upstream session loss. + - It publishes one `BadNoCommunication` per tag per outage, and the #527 watchdog does the recovery. + - The SDK `SessionReconnectHandler` is deleted. + - A post-recovery replay guard stops late, older notifications from regressing values. + - **#671:** Part 13 time-weighted aggregates on both SQL backends: TimeAverage, TimeAverage2, Total, Total2 and + Interpolative. ⚠️ `Total` is now the time-weighted integral, no longer `SUM`. A window over + `MaxTimeWeightedRawRows` returns `BadTooManyOperations`. + - **#672:** a standby starts capturing as soon as its recording Primary is unreachable, controlled by + `CaptureWhilePrimaryUnreachable`, default true. The crash-failover gap drops from about 31 s to about 13 s. + - **#673:** FOCAS test flake fixed. + - **ScadaBridge impact:** + - Tags backed by an OpcUaClient driver now go Bad (`BadNoCommunication`, value retained server-side) while their + upstream is lost, where they used to stay Good. This is the quality contract working. + - On SqlServer/QuestDB nodes, `Total` aggregate values change meaning. + - Event HistoryRead may now return continuation points, which a client must follow. + - Otherwise none by default.