44b99a9939
Accumulated fast-follows from the Task 1-11 reviews. No behaviour change on the value path. - Strengthen OpcUaPublishActorBatchTests.Sink_throw_is_swallowed_and_logged. The survival assertion alone did NOT prove the catch exists: Akka's default supervision RESTARTS a throwing actor and the restart preserves the mailbox, so the follow-up message landed either way and the test passed against a build with no catch at all. It now asserts via EventFilter that the exception NEVER reaches supervision (Expect(0) on the InvalidOperationException) and that the handler's own Warning IS logged, keeping the survival assertion. Everything that must have happened goes inside the Expect(0) action — it counts matches at the end of the action, so an assertion left outside would race the actor and pass vacuously. Verified falsifiable: deleting the catch turns the test red. - MapKey(NodeId): the non-string identifier branch collapsed to a string.Empty key silently. Such a key cannot match anything the manager stored, so the caller sees an unexplained miss rather than an error. It now logs a Utils.LogWarning naming the seam. Every current call site is provably string-only, so this should never fire. - The two WireAlarmNotifiers Utils.LogInfo sites interpolated the RealmKey struct, rendering a raw struct dump. Interpolate .Id and .Realm as separate placeholders so log-grep patterns stay consistent with the file's other sites. - Stale comments: the _eventNotifierSources key is a RealmKey now, not a namespace-qualified NodeId string; and three comments still named DriverHostActor.ForwardToMux, which Task 8 replaced with ForwardBatchToMux.