From aa7093b53b6f72767a50b827bc8269c7cc90dbfe Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 12 Oct 2026 08:38:50 -0400 Subject: [PATCH] =?UTF-8?q?docs(index):=20OtOpcUa=20batch=20#679=E2=80=93#?= =?UTF-8?q?680=20=E2=80=94=20historian=20aggregate=20parity,=20Gateway=20A?= =?UTF-8?q?verage/Count=20refused?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skills/sister-project-history/otopcua.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.claude/skills/sister-project-history/otopcua.md b/.claude/skills/sister-project-history/otopcua.md index 4e80c04..fa923ea 100644 --- a/.claude/skills/sister-project-history/otopcua.md +++ b/.claude/skills/sister-project-history/otopcua.md @@ -260,3 +260,21 @@ AddRoute of the dev Mac (`oee-tagdump-mac`, `10.181.206.245.1.1`) on the two tes - 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. +- **2026-10-12 batch #679–#680 (both closed; OtOpcUa `8ebee2ac`).** Historian processed reads. Live gate 8 passed on + docker-dev (SqlServer + QuestDb, central-1/2); it found one defect introduced by #680, fixed before push. + - **#679 (Gateway backend):** ⚠️ `Average` and `Count` now return `BadAggregateNotSupported` — AVEVA has no arithmetic + mean or sample count (they used to return AVEVA's time-weighted average and rollover-counter increase). + `TimeAverage` → `TimeWeightedAverage` is served instead. Magnitude unverified live (VPN). + - **#680 (SqlServer/QuestDb), aligned to Part 13 / the SDK `AggregateCalculator`:** + - ⚠️ TimeAverage/Total go Uncertain when any part is Uncertain / bridged across Bad / extrapolated / not covered — + a live tag's latest interval is now Uncertain. Total integrates only the covered part. + - ⚠️ PercentGood/PercentBad are duration-based (were sample counts) and row-capped by `MaxTimeWeightedRawRows`. + - ⚠️ TimeAverage2/Total2 no longer extrapolate past the last sample (Partial, then `BadNoData`). + - ⚠️ Count counts Good samples only; an empty interval inside the data range is `0`/Good. Start/End return the raw + sample (own time/status, null if Bad). End-of-data Partial on the interval holding the last sample. + - Report-by-exception tags read `BadNoData`/Uncertain in trailing intervals until their next sample arrives. + - **Gate defect:** QuestDB opens a separate table reader per CTE reference, so the new Start/End query raced + concurrent writes (~1 in 17k–90k reads failed the node). Now one scan; readers tolerate a missing pick. + - **Follow-ups:** #681 (Gateway per-sample aggregates from raw), #682 (advertise per-backend aggregates), #683 + (QuestDB data-range lookup cost), #684 (Average/Min/Max include Uncertain). + - **ScadaBridge impact:** none — it issues no processed history reads.