docs(comments): correct 7 stale 'later task/milestone' comments (stillpending §9)

This commit is contained in:
Joseph Doherty
2026-06-15 09:47:08 -04:00
parent 68a0f759f0
commit b4af9e7f37
8 changed files with 31 additions and 26 deletions
@@ -4,9 +4,9 @@ namespace ZB.MOM.WW.OtOpcUa.Core.Scripting;
/// <summary> /// <summary>
/// Abstraction over the mechanism that publishes <see cref="ScriptLogEntry"/> records /// Abstraction over the mechanism that publishes <see cref="ScriptLogEntry"/> records
/// to a downstream consumer (e.g. an Akka DPS <c>script-logs</c> topic). Implemented by /// to a downstream consumer (e.g. an Akka DPS <c>script-logs</c> topic). The concrete
/// the concrete DPS publisher in a later task; the sink depends only on this interface /// implementation is <c>DpsScriptLogPublisher</c> (Runtime project), wired via DI; the
/// so the Core.Scripting layer has no Akka dependency. /// sink depends only on this interface so the Core.Scripting layer has no Akka dependency.
/// </summary> /// </summary>
public interface IScriptLogPublisher public interface IScriptLogPublisher
{ {
@@ -7,7 +7,7 @@ namespace ZB.MOM.WW.OtOpcUa.Core.Scripting;
/// <summary> /// <summary>
/// Serilog sink that converts each script <see cref="LogEvent"/> into a /// Serilog sink that converts each script <see cref="LogEvent"/> into a
/// <see cref="ScriptLogEntry"/> and forwards it to an <see cref="IScriptLogPublisher"/>. /// <see cref="ScriptLogEntry"/> and forwards it to an <see cref="IScriptLogPublisher"/>.
/// The publisher implementation (supplied by a later task) routes the entry onto the /// The production publisher (<c>DpsScriptLogPublisher</c>) routes the entry onto the
/// Akka DPS <c>script-logs</c> topic so the live Script-log Admin UI page can display it. /// Akka DPS <c>script-logs</c> topic so the live Script-log Admin UI page can display it.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
@@ -17,9 +17,9 @@ namespace ZB.MOM.WW.OtOpcUa.Driver.Galaxy.Browse;
/// <item>Folder per gobject; variables placed inside their owner folder.</item> /// <item>Folder per gobject; variables placed inside their owner folder.</item>
/// <item>Variable's full reference = <c>tag_name.attribute_name</c> — the format MXAccess /// <item>Variable's full reference = <c>tag_name.attribute_name</c> — the format MXAccess
/// expects for read/write addressing (translated from the contained-name browse path).</item> /// expects for read/write addressing (translated from the contained-name browse path).</item>
/// <item>Hierarchy is rendered flat (one folder per gobject under the driver root) for /// <item>Hierarchy is rendered flat (one folder per gobject under the driver root).
/// this PR. PR 4.W's address-space wiring revisits whether to nest under /// Nesting under <c>parent_gobject_id</c> for a true tree shape is not implemented;
/// <c>parent_gobject_id</c> for a true tree shape.</item> /// the flat layout is the current shipping behaviour.</item>
/// </list> /// </list>
/// </remarks> /// </remarks>
public sealed class GalaxyDiscoverer public sealed class GalaxyDiscoverer
@@ -863,12 +863,12 @@ public sealed class GalaxyDriver
if (_dataWriter is null) if (_dataWriter is null)
{ {
// Mirror the IReadable fallback: production write path runs on top of // Mirror the IReadable fallback: production write path runs on top of
// GalaxyMxSession (PR 4.2 skeleton; PR 4.4 wires the live session). Until // GatewayGalaxyDataWriter, which is wired by InitializeAsync when the gRPC session
// that lands, deployments selecting Galaxy:Backend=mxgateway can't write. // connects. This guard fires only if the driver is called before initialization completes.
throw new NotSupportedException( throw new NotSupportedException(
"GalaxyDriver.WriteAsync requires GatewayGalaxyDataWriter wired against a connected " + "GalaxyDriver.WriteAsync requires GatewayGalaxyDataWriter wired against a connected " +
"GalaxyMxSession (PR 4.4). Until that lands, route writes through the legacy-host " + "GalaxyMxSession. Call InitializeAsync and wait for a successful connection before " +
"backend (Galaxy:Backend=legacy-host)."); "issuing writes.");
} }
return _dataWriter.WriteAsync(writes, ResolveSecurity, cancellationToken); return _dataWriter.WriteAsync(writes, ResolveSecurity, cancellationToken);
@@ -887,7 +887,7 @@ public sealed class GalaxyDriver
{ {
throw new NotSupportedException( throw new NotSupportedException(
"GalaxyDriver.SubscribeAsync requires a connected GalaxyMxSession + GatewayGalaxySubscriber. " + "GalaxyDriver.SubscribeAsync requires a connected GalaxyMxSession + GatewayGalaxySubscriber. " +
"PR 4.W wires the production session; until then route subscriptions through the legacy-host backend."); "Call InitializeAsync and wait for a successful connection before subscribing.");
} }
var pump = EnsureEventPumpStarted(); var pump = EnsureEventPumpStarted();
@@ -1103,7 +1103,7 @@ public sealed class GalaxyDriver
{ {
throw new NotSupportedException( throw new NotSupportedException(
"GalaxyDriver.AcknowledgeAsync requires GatewayGalaxyAlarmAcknowledger wired against a connected " + "GalaxyDriver.AcknowledgeAsync requires GatewayGalaxyAlarmAcknowledger wired against a connected " +
"GalaxyMxSession (PR B.2). InitializeAsync must run before alarm acknowledgements can flow."); "GalaxyMxSession. InitializeAsync must complete successfully before alarm acknowledgements can flow.");
} }
// Acks are issued one-by-one — the gateway RPC accepts a single alarm // Acks are issued one-by-one — the gateway RPC accepts a single alarm
@@ -18,9 +18,10 @@ namespace ZB.MOM.WW.OtOpcUa.AdminUI.ScriptAnalysis;
/// <see cref="VirtualTagContext"/> context. /// <see cref="VirtualTagContext"/> context.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Public methods are placeholders returning empty results — later tasks fill in each /// All capabilities are fully implemented: Diagnose, Complete, Hover, SignatureHelp, and Format
/// capability via TDD. The shared <see cref="Analyze"/> seam + the offset helpers are /// are wired and backed by the real Roslyn document/analysis pipeline. Only InlayHints is
/// the load-bearing part every later capability reuses; keep them even while unused. /// intentionally a no-op (empty list) — the endpoint exists for future use but the feature is
/// not implemented.
/// </remarks> /// </remarks>
public sealed class ScriptAnalysisService public sealed class ScriptAnalysisService
{ {
@@ -41,8 +41,10 @@ namespace ZB.MOM.WW.OtOpcUa.Runtime.Drivers;
/// <item><c>Stale</c> — ConfigDb unreachable on bootstrap. Background reconnect loop tries to advance.</item> /// <item><c>Stale</c> — ConfigDb unreachable on bootstrap. Background reconnect loop tries to advance.</item>
/// </list> /// </list>
/// ///
/// Children (DriverInstance/VirtualTag/etc.) are spawned in Phase 6 follow-up tasks (41-44). /// Children (DriverInstance/VirtualTag/etc.) are fully wired: <c>DispatchDeployment</c> drives
/// For now the dispatch handler treats the apply as a no-op and writes the ACK back. /// <see cref="PushDesiredSubscriptions"/> which runs the spawn-plan via <see cref="IDriverFactory"/>,
/// maintains the <c>FullName→NodeId</c> live-value routing map, and forwards results to the
/// OPC UA publish actor via <c>ForwardToMux</c>.
/// </summary> /// </summary>
public sealed class DriverHostActor : ReceiveActor, IWithTimers public sealed class DriverHostActor : ReceiveActor, IWithTimers
{ {
@@ -243,13 +243,14 @@ public sealed class OpcUaPublishActor : ReceiveActor
_applier.MaterialiseScriptedAlarms(composition); _applier.MaterialiseScriptedAlarms(composition);
// Equipment-namespace tags get their own pass: ensures each signal's Variable (and any // Equipment-namespace tags get their own pass: ensures each signal's Variable (and any
// FolderPath sub-folder) exists under its already-materialised equipment folder so // FolderPath sub-folder) exists under its already-materialised equipment folder so
// clients can browse them. Live values arrive in a later milestone; until then the // clients can browse them. Live values are pushed by DriverHostActor.ForwardToMux after
// variables show BadWaitingForInitialData. // each subscription cycle; variables show BadWaitingForInitialData only until the first
// publish interval fires.
_applier.MaterialiseEquipmentTags(composition); _applier.MaterialiseEquipmentTags(composition);
// Equipment-namespace VirtualTags get their own pass right after the equipment tags: // Equipment-namespace VirtualTags get their own pass right after the equipment tags:
// ensures each computed signal's Variable (and any FolderPath sub-folder) exists under its // ensures each computed signal's Variable (and any FolderPath sub-folder) exists under its
// equipment folder with a folder-scoped NodeId. The VirtualTagActor fills live values in a // equipment folder with a folder-scoped NodeId. VirtualTagHostActor.OnResult pushes live
// later milestone; until then the variables show BadWaitingForInitialData (same as tags). // values once the first dependency update arrives; until then variables show BadWaitingForInitialData.
_applier.MaterialiseEquipmentVirtualTags(composition); _applier.MaterialiseEquipmentVirtualTags(composition);
OtOpcUaTelemetry.OpcUaSinkWrite.Add(1, new KeyValuePair<string, object?>("kind", "rebuild")); OtOpcUaTelemetry.OpcUaSinkWrite.Add(1, new KeyValuePair<string, object?>("kind", "rebuild"));
@@ -62,10 +62,11 @@ public static class ServiceCollectionExtensions
// driver path) ends up with exactly one descriptor regardless of registration order. // driver path) ends up with exactly one descriptor regardless of registration order.
services.TryAddSingleton<ILdapAuthService, OtOpcUaLdapAuthService>(); services.TryAddSingleton<ILdapAuthService, OtOpcUaLdapAuthService>();
// Shared ZB.MOM.WW.Auth group→role mapper seam (Task 1.1, additive). Wraps the existing // Shared ZB.MOM.WW.Auth group→role mapper seam. Wraps the existing RoleMapper.Map +
// RoleMapper.Map + RoleMapper.Merge logic; the login flow is rewired to consume it in a // RoleMapper.Merge logic; consumed by AuthEndpoints.cs (/auth/login) and by
// later task. Scoped to match ILdapGroupRoleMappingService (DbContext-backed, registered // LdapOpcUaUserAuthenticator (OPC UA UserName session auth). Scoped to match
// Scoped) — a singleton here would capture the scoped DB service. // ILdapGroupRoleMappingService (DbContext-backed, registered Scoped) — a singleton here
// would capture the scoped DB service.
services.TryAddScoped<IGroupRoleMapper<string>, OtOpcUaGroupRoleMapper>(); services.TryAddScoped<IGroupRoleMapper<string>, OtOpcUaGroupRoleMapper>();
services.AddDataProtection() services.AddDataProtection()