Review remediation: Lane H2 — Historian remainder (opus; review opus) #746
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
From the 2026-10-21 Fable system review. Findings
R0x:IDrefer todocs/reviews/2026-10-21/0x-*.md(location, evidence, failure scenario, fix recipe). Plan:docs/superpowers/plans/2026-10-22-review-remediation.md.Lane H2 — Historian remainder (opus; review opus)
Owns:
src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Historian.*/**(minus H1's files),Runtime/Historian/**(recorder + adapter),docs/Historian.md, the AdminUI historian backend picker.R08:1.2,2.5).TimeAverage/TotalbehindServerHistorian:Gateway:EnableNativeTimeWeighted=falseuntil historiangw#27 (2.1).2.2).ProbeAsynchealth timer (2.4).4.1).LiveWritePreparer(4.2).IHistorianValueWriter.FlushAsyncpass-end hook, QuestDB WAL wait once per pass with exponential poll (3.1).OUTPUT; QuestDb multi-row; Gateway bounded pipelining until a batch RPC (3.2).3.3).3.4).3.5).DeleteRaw(4.3).appliedmarker + DEDUP key (4.4).CommitMode=Periodic(100 ms)default + off-mailbox append with an in-flight cap + mailbox-depth metric (R02:P3); timeouts onGetStatus(R02:H3).HistorianAdapterActorbounded channel + delete the senderless receive (R02:H4,U3).R08:1.3).Lane gate:
Historian.Conformancegreen on all backends. The Wave 4 AVEVA live gate (userGate, existing recipe in.claude/rules/historian.md) checks events paging and thatTimeAverageis refused.Lane B2 — HistoryReadEvents full projection — folded into Lane H2 as its LAST task (opus; review fable)
This runs inside H2 because it shares the backends' event read paths with H2's Gateway events-drain fix. It runs after H2's other tasks, and
OtOpcUaNodeManager.csis free by then because B merged in Wave 1.Adds to H2's ownership: the
HistoricalEventcontract in Core.Abstractions and the HistoryReadEvents projection inOtOpcUaNodeManager.cs.EventType/ConditionName, mapSourceNodewhen resolvable, and honour anOfTypewhere-clause (R01:U1).historyread --eventswith a select clause including EventType returns non-null values.