diff --git a/docs/plans/2026-06-27-otopcua-historian-followups.md b/docs/plans/2026-06-27-otopcua-historian-followups.md index 0d296367..4e2a1672 100644 --- a/docs/plans/2026-06-27-otopcua-historian-followups.md +++ b/docs/plans/2026-06-27-otopcua-historian-followups.md @@ -139,9 +139,13 @@ window anchored on the write time. ### FU-3 — Continuous-historization `HistorianTagname` override edge case — ✅ DONE (2026-06-27, commit `111adc92`) > **Outcome:** implemented the "carry both identifiers" fix below. A new `HistorizedTagRef(MuxRef, > HistorianName)` record threads through `IHistorizedTagSubscriptionSink` → the recorder; the recorder keeps -> a muxRef→historianName map, registers/filters mux interest by `MuxRef` (= driver `FullName`) but writes -> under `HistorianName` (override-or-FullName). The applier resolves both. Divergent-override + override- -> rename-no-churn recorder tests added; applier feed tests assert the full pairs. +> a **muxRef → SET-of-historian-names** map, registers/filters mux interest by `MuxRef` (= driver `FullName`) +> but writes under every `HistorianName` (override-or-FullName) sharing that ref. The applier resolves both. +> The set (not a single name) closes a code-review **Critical**: one driver ref can back several historized +> equipment tags via aliasing (identical machines sharing a register), each with its own override — a single +> fan must write ALL of them, not silently drop all but one. Tests: divergent-override, aliased-refs-each- +> get-the-value, remove-one-alias-keeps-the-ref, override-rename updates the write target without mux churn; +> applier feed tests assert the full pairs. Commits `111adc92` + `60695179` (review fix). The `ContinuousHistorizationRecorder` registers `DependencyMuxActor` interest **by the resolved historian name** (`HistorianTagname` override else `FullName`) — the same key the EnsureTags hook and