diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests/MeshClusterClientBoundaryTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests/MeshClusterClientBoundaryTests.cs
new file mode 100644
index 00000000..18592757
--- /dev/null
+++ b/tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests/MeshClusterClientBoundaryTests.cs
@@ -0,0 +1,302 @@
+using System.Collections.Immutable;
+using Akka.Actor;
+using Akka.Cluster;
+using Akka.Cluster.Tools.Client;
+using Akka.Configuration;
+using Shouldly;
+using Xunit;
+using ZB.MOM.WW.OtOpcUa.Commons.Messages.Admin;
+using ZB.MOM.WW.OtOpcUa.Commons.Messages.Deploy;
+using ZB.MOM.WW.OtOpcUa.Commons.Messages.Mesh;
+using ZB.MOM.WW.OtOpcUa.Commons.Types;
+using ZB.MOM.WW.OtOpcUa.ControlPlane.Communication;
+using ZB.MOM.WW.OtOpcUa.Runtime.Communication;
+using AkkaCluster = Akka.Cluster.Cluster;
+
+namespace ZB.MOM.WW.OtOpcUa.Host.IntegrationTests;
+
+///
+/// Drives a real ClusterClient across two genuinely separate s —
+/// the only test in the repo where the mesh boundary carries a message over the wire.
+///
+///
+///
+/// The sister project substitutes an in-process relay that unwraps
+/// and forwards. That tests actor logic and cannot
+/// fail for any transport reason: not a missing receptionist extension, not a service that
+/// was never registered, not a malformed contact path, not a serialization break. Those are
+/// precisely the Phase 2 failure modes, so they are what this test exercises.
+///
+///
+/// Two clusters, one ActorSystem name, joined ONLY by ClusterClient. The shared name
+/// is mandatory — Akka.Remote matches on the full address, so a contact path naming
+/// otopcua cannot reach a system called anything else. Each system seeds itself and
+/// neither lists the other, and
+/// asserts the
+/// separation outright: if they ever gossiped into one mesh, every delivery below could be
+/// plain local messaging and the whole class would be testing nothing.
+///
+///
+/// Scope limit. With exactly one node per side, "registered per node" and "registered
+/// as a cluster singleton" are indistinguishable by construction, so this class does NOT
+/// cover the per-node property whose structural assertions MeshCommActorPathTests
+/// dropped. That property's discriminating coverage is live-gate step 8: stop the OLDEST
+/// central and the survivor's comm actor must still receive a node ack, which a singleton
+/// hosted on the stopped node cannot.
+///
+///
+public sealed class MeshClusterClientBoundaryTests : IAsyncLifetime
+{
+ private const string SharedSystemName = "otopcua";
+ private static readonly TimeSpan Arrival = TimeSpan.FromSeconds(30);
+
+ ///
+ /// How long the falsifiability control waits before concluding nothing arrived. Deliberately
+ /// shorter than but far longer than a successful delivery takes in
+ /// practice, so a pass means "the boundary is shut", not "the clock ran out first".
+ ///
+ private static readonly TimeSpan Silence = TimeSpan.FromSeconds(10);
+
+ ///
+ /// One factory for every client this class creates, because the generation counter that keeps
+ /// client actor names unique is per factory instance. A second factory on the same
+ /// system restarts at generation 1 and collides with the first factory's client — which is
+ /// exactly how this test first failed. Production has one instance per
+ /// CentralCommunicationActor, so the real code path is safe.
+ ///
+ private readonly DefaultMeshClusterClientFactory _clientFactory = new();
+
+ private ActorSystem _central = null!;
+ private ActorSystem _node = null!;
+ private IActorRef _nodeComm = null!;
+ private IActorRef _centralClient = null!;
+ private TaskCompletionSource