Review remediation: Lane B — OPC UA address space (fable; review fable) #732
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 B — OPC UA address space (fable; review fable)
Owns:
src/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer/**, exceptHistoryPaging.cs/RawPageLimit.cs(H1) and the HistoryReadEvents projection (B2)Runtime/OpcUa/OpcUaPublishActor.csTests:
OpcUaServer.Tests,OpcUaServer.IntegrationTestsR01:L1,L4,H2):WriteValueLockedis non-creating (unknown key ⇒ skipped, counted, Debug-logged).WriteAlarmConditionunknown id ⇒ logged no-op.RemovedConditionStatewrite.(realm,id)collision guard inEnsureFolder/EnsureVariable/MaterialiseAlarmCondition.R01:L2).RemoveVariableNode,RemoveAlarmConditionNode,RemoveEquipmentSubtree): queueBadNodeIdUnknownto the node's items,MonitoredNodes.Remove(nodeId), and drop_liveItems/_eventItems.Handle.Node.BadNodeIdUnknown.R01:P1).RemoveEquipmentSubtree(P2).LowerAllEventsMonitoringfor the surgical removal sites (P3).P5).OnEquipmentTagWriteobservest.Exceptionand wraps a synchronous throw (R01:L3,H5).TimeProvider(H4).TransportQuotasconfigurable viaOpcUa:Quotas:*with the current defaults (P6).MaxConcurrentHistoryReadBatcheson small nodes, and use anIAsyncNodeManageroverride if the SDK line exposesHistoryReadAsync; otherwise document it (P4).R01:U2): the composer'sEquipmentTags, applierMaterialiseEquipmentTags, the surgicalChangedEquipmentTagsloop, and the classifierTagDeltaIsSurgicalEligible. KeepIsEmptysemantics; the full OpcUaServer suite stays green.R02:P5).DeploymentArtifact.Open+ParseComposition+AddressSpacePlanner.Computerun viaPipeTo; only sink materialisation runs on the pinned thread.LoadArtifactSQL branch.R01:U3). Re-evaluate event-notifier/HistoryWrite bits whenHistorianDataSource/Updateris set after the first apply, so a late assignment no longer needs a full rebuild.R01:U4(native Confirm/shelve, by design) andR01:L5(bounded). Note both in the issue.Lane gate: both suites green. Wave 4 docker-dev gate: a ScadaBridge-style subscription survives a surgical add, and a re-created item after a rebuild receives data (Client.CLI
subscribe).