From 0a679f2c2adb7fd913ca278adfe32f68dbda78b5 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Wed, 3 Jun 2026 15:51:15 -0400 Subject: [PATCH] =?UTF-8?q?docs(audit):=20VirtualTags.md=20=E2=80=94=20cor?= =?UTF-8?q?rect=20write-reject=20mechanism=20(review=20fix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/VirtualTags.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/VirtualTags.md b/docs/VirtualTags.md index 738d0040..e4e4867c 100644 --- a/docs/VirtualTags.md +++ b/docs/VirtualTags.md @@ -103,7 +103,7 @@ Per [ADR-002](v2/implementation/adr-002-driver-vs-virtual-dispatch.md) Option B, - `ReadAsync` fans each path through `engine.Read(...)`. - `SubscribeAsync` calls `engine.Subscribe` per path and forwards each engine observer callback as an `OnDataChange` event; emits an initial-data callback per OPC UA convention. - `UnsubscribeAsync` disposes every per-path engine subscription it holds. -- **`IWritable` is deliberately not implemented.** `GenericDriverNodeManager` rejects OPC UA client writes to virtual nodes with `BadUserAccessDenied` before any dispatch — scripts are the only write path via `ctx.SetVirtualTag`. +- **`IWritable` is deliberately not implemented.** Virtual-tag nodes are not client-writable because `OtOpcUaNodeManager.EnsureVariable` materialises every SDK variable with `AccessLevel = AccessLevels.CurrentRead`; the SDK base `CustomNodeManager2.Write` returns `BadNotWritable` for read-only nodes and v2 has no client-write dispatch path. Scripts are the only write path via `ctx.SetVirtualTag`. `NodeSourceKind` on each `DriverAttributeInfo` (set by `EquipmentNodeWalker` at address-space build time) drives which backend handles a read. See [ReadWriteOperations.md](ReadWriteOperations.md) and [v1/Subscriptions.md](v1/Subscriptions.md) for the broader dispatch framing.