diff --git a/.claude/skills/sister-project-history/otopcua.md b/.claude/skills/sister-project-history/otopcua.md index 25466db..4e80c04 100644 --- a/.claude/skills/sister-project-history/otopcua.md +++ b/.claude/skills/sister-project-history/otopcua.md @@ -221,3 +221,42 @@ AddRoute of the dev Mac (`oee-tagdump-mac`, `10.181.206.245.1.1`) on the two tes - 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. +- **2026-10-12 follow-up batch #674–#678 (OtOpcUa `6d5c1c76`).** #674, #676 and #678 are closed. #675 and #677 stay + open only for live AVEVA checks that need the VPN. New issues: #679 (Gateway `Count`/`Average` mode mapping) and + #680 (pre-existing forward differences from the SDK aggregate calculator). Three docker-dev live gates passed; one + failure (A1) was fixed and re-gated. + - **#674 (HistoryUpdate):** + - **Primary-only:** a non-Primary node returns `BadInvalidState`. The gate stays closed until the node's first + redundancy snapshot. + - **Future skew:** a timestamp beyond `now + ServerHistorian:HistoryUpdateMaxFutureSkew` (default 1 day) is + rejected with `BadOutOfRange`. + - **SqlServer v1 schema:** v1 is accepted again. On v1, modified reads and HistoryUpdate return + `BadHistoryOperationUnsupported`, but historization continues. + - **QuestDB TTL:** confirmed to follow the wall clock, so a far-future row cannot wipe history. The issue's + premise was false. + - **#675 (events):** reverse event HistoryRead pages newest-first on SqlServer and QuestDB. Gateway refuses an + explicit reverse read. An end-only capped read goes backward where the backend supports it and stays forward on + Gateway. + - **#677 (aggregates):** + - ⚠️ Reverse processed reads now follow the SDK / Part 13: anchored at the later time, partial bucket earliest, + later-edge timestamps. Forward reads are unchanged. + - A start-of-data Partial bit is set on forward reads. + - A non-default client `AggregateConfiguration` is rejected with `BadAggregateConfigurationRejected`. + - Gateway `IntegralDivisor` is now 1. + - **#676 (OpcUaClient):** + - Fast recovery: a definitive session loss re-initialises immediately instead of waiting for the ~90 s watchdog. + Definitive means a session status, `BadServerHalted`, a sustained closed secure channel, or a subscription the + server dropped. This is exposed through the new `IDriverConnectionLossSource`. + - Restart recovery went from ~122 s to 12–27 s. Pause blips still recover in place. + - The driver now rewrites the advertised endpoint's host and port. + - A trailing re-read repairs values lost in flight. + - The `ReconnectPeriod` setting is removed. + - **#678 (clients and role overlays):** + - Client.CLI/UI now rewrite the endpoint port, which fixes the rig `:4841` "certificate" error. + - ⚠️ Per-role appsettings overlays never loaded on cluster-role nodes; they now do. Cluster-role nodes therefore + pick up `Security.Ldap.Transport=Ldaps`, so set `Security__Ldap__Transport` explicitly on any plaintext-LDAP + central node. + - **ScadaBridge impact:** + - OpcUaClient-backed tags recover much faster after an upstream restart. + - Only reverse reads change shape (ScadaBridge issues no processed or event history reads). + - HistoryUpdate is refused off-Primary.