diff --git a/docs/requirements/Component-ManagementService.md b/docs/requirements/Component-ManagementService.md
index 3931eecc..59c3b572 100644
--- a/docs/requirements/Component-ManagementService.md
+++ b/docs/requirements/Component-ManagementService.md
@@ -190,6 +190,8 @@ The two-person authorization workflow for writes through the MxAccess Gateway. B
- **ListDatabaseConnections** / **GetDatabaseConnection**: Query database connection definitions.
- **CreateDatabaseConnection** / **UpdateDatabaseConnection** / **DeleteDatabaseConnection**: Manage database connections.
+> **Secret elision (arch-review C3).** The ADO.NET `ConnectionString` can embed the SQL password. List/Get responses are projected through `DatabaseConnectionPublicShape` (`{ id, name, hasConnectionString }`) — the connection string itself is never emitted. `UpdateDatabaseConnectionDefCommand.ConnectionString` is nullable and preserve-if-null: an omitted (`null`) value leaves the stored connection string intact, so a round-trip of the elided shape does not wipe the secret.
+
### Inbound API Methods
- **ListApiMethods** / **GetApiMethod**: Query inbound API method definitions.
diff --git a/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/DatabaseConnectionDefCommands.cs b/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/DatabaseConnectionDefCommands.cs
index 16599a97..edfb3d59 100644
--- a/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/DatabaseConnectionDefCommands.cs
+++ b/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/DatabaseConnectionDefCommands.cs
@@ -3,5 +3,8 @@ namespace ZB.MOM.WW.ScadaBridge.Commons.Messages.Management;
public record ListDatabaseConnectionsCommand;
public record GetDatabaseConnectionCommand(int DatabaseConnectionId);
public record CreateDatabaseConnectionDefCommand(string Name, string ConnectionString);
-public record UpdateDatabaseConnectionDefCommand(int DatabaseConnectionId, string Name, string ConnectionString);
+// ConnectionString is nullable (arch-review C3): an omitted (null) value preserves
+// the stored secret rather than wiping it — the connection string is elided from
+// List/Get responses, so a round-trip must not require re-sending it.
+public record UpdateDatabaseConnectionDefCommand(int DatabaseConnectionId, string Name, string? ConnectionString);
public record DeleteDatabaseConnectionDefCommand(int DatabaseConnectionId);
diff --git a/src/ZB.MOM.WW.ScadaBridge.ManagementService/ManagementActor.cs b/src/ZB.MOM.WW.ScadaBridge.ManagementService/ManagementActor.cs
index 239c6ed2..ae49d023 100644
--- a/src/ZB.MOM.WW.ScadaBridge.ManagementService/ManagementActor.cs
+++ b/src/ZB.MOM.WW.ScadaBridge.ManagementService/ManagementActor.cs
@@ -2637,16 +2637,30 @@ public class ManagementActor : ReceiveActor
// Database Connection Definition handlers
// ========================================================================
+ ///
+ /// Secret-elided DatabaseConnectionDefinition projection (arch-review C3): the
+ /// ADO.NET ConnectionString can embed the SQL password and must never
+ /// leave this boundary via List/Get responses. Presence is surfaced as
+ /// HasConnectionString. Mirrors .
+ ///
+ private static object DatabaseConnectionPublicShape(DatabaseConnectionDefinition d) => new
+ {
+ d.Id,
+ d.Name,
+ HasConnectionString = !string.IsNullOrEmpty(d.ConnectionString),
+ };
+
private static async Task