diff --git a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Cluster/CliRunner.Helpers.cs b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Cluster/CliRunner.Helpers.cs
index b5ad5ed2..1c732205 100644
--- a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Cluster/CliRunner.Helpers.cs
+++ b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Cluster/CliRunner.Helpers.cs
@@ -194,6 +194,15 @@ public static partial class CliRunner
/// swallows any failure.
///
/// Area id.
+ ///
+ /// This method intentionally does NOT delegate to
+ /// even though the behaviour is identical. models
+ /// two-word commands (<group> <verb>), whereas
+ /// site area delete is a three-word command; extracting it would require
+ /// changing 's signature or adding an overload.
+ /// The inline try/catch is kept here deliberately — if you need to fix teardown
+ /// logic, update both this method and any other three-word deletes together.
+ ///
public static async Task DeleteAreaAsync(int id)
{
try
@@ -267,6 +276,16 @@ public static partial class CliRunner
string outputPath, int templateId, string passphrase, string sourceEnvironment)
{
var templateName = await ResolveTemplateNameAsync(templateId);
+
+ // The CLI's --templates flag is comma-separated, so a name that itself
+ // contains a comma would silently split into multiple selectors and scope
+ // the export to the wrong set of templates.
+ if (templateName.Contains(','))
+ {
+ throw new InvalidOperationException(
+ $"Template name '{templateName}' contains a comma and cannot be used with '--templates'.");
+ }
+
await RunAsync(
"bundle", "export",
"--output", outputPath,