diff --git a/src/AcDream.Headless/Configuration/HeadlessCommandLine.cs b/src/AcDream.Headless/Configuration/HeadlessCommandLine.cs
index 66008cf3d..73de50888 100644
--- a/src/AcDream.Headless/Configuration/HeadlessCommandLine.cs
+++ b/src/AcDream.Headless/Configuration/HeadlessCommandLine.cs
@@ -95,6 +95,14 @@ internal sealed record HeadlessCommandLine(
throw new HeadlessCommandLineException(
"Direct credentials are valid only for run mode.");
}
+ // N3: reject rather than silently ignore --console for validate mode
+ // — validate never starts a session, so there is nothing for the
+ // console to attach to.
+ if (console && command != "run")
+ {
+ throw new HeadlessCommandLineException(
+ "--console is valid only for run mode.");
+ }
return new HeadlessCommandLine(
command,
diff --git a/tests/AcDream.Headless.Tests/HeadlessConsoleTests.cs b/tests/AcDream.Headless.Tests/HeadlessConsoleTests.cs
index 9751b16fb..edb722f7c 100644
--- a/tests/AcDream.Headless.Tests/HeadlessConsoleTests.cs
+++ b/tests/AcDream.Headless.Tests/HeadlessConsoleTests.cs
@@ -69,6 +69,19 @@ public sealed class HeadlessConsoleTests
Assert.False(parsed.ConsoleEnabled);
}
+ ///
+ /// N3: validate mode rejects --console outright (rather than
+ /// silently ignoring it) — validate never starts a session, so there is
+ /// nothing for the console to attach to.
+ ///
+ [Fact]
+ public void ValidateModeRejectsTheConsoleFlag()
+ {
+ Assert.Throws(() =>
+ HeadlessCommandLine.Parse(
+ ["validate", "--config", "bot.json", "--console"]));
+ }
+
// ── HeadlessConsoleInputReader: reader-thread/ordering ───────────────
///