From 9f982d18e53d9fb7b820932b0473f30d8162bd6d Mon Sep 17 00:00:00 2001 From: robert Date: Sun, 11 Oct 2026 21:39:05 +1000 Subject: [PATCH 1/3] Default the Claude Code injection check to Claude Haiku 5.5 Raises the default max tokens so thinking tokens don't truncate the verdict. --- .../InjectionCheck/InjectionCheckOptions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/InjectionCheckOptions.cs b/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/InjectionCheckOptions.cs index ed2e833f9..c7d55d451 100644 --- a/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/InjectionCheckOptions.cs +++ b/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/InjectionCheckOptions.cs @@ -8,8 +8,8 @@ namespace Calamari.AiAgent.ClaudeCodeBehaviour.InjectionCheck; // promoted to step configuration later by setting the matching Octopus.Action.Claude.* variable. public class InjectionCheckOptions { - const string DefaultModel = "claude-haiku-4-5"; - const int DefaultMaxTokens = 1024; + const string DefaultModel = "claude-haiku-5-5"; + const int DefaultMaxTokens = 2048; const int DefaultMaxInputCharacters = 200_000; public bool Enabled { get; init; } From 4a7e7bd8258e395b4650846a0e9c3a60b8be0108 Mon Sep 17 00:00:00 2001 From: robert Date: Sun, 11 Oct 2026 22:16:33 +1000 Subject: [PATCH 2/3] Log the prompt-injection check's token usage Also report a clear error when the check runs out of output tokens. --- .../InjectionCheck/AnthropicInjectionCheckClient.cs | 3 +++ .../ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs | 1 + 2 files changed, 4 insertions(+) diff --git a/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/AnthropicInjectionCheckClient.cs b/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/AnthropicInjectionCheckClient.cs index 637fc1f68..5cb3bdea8 100644 --- a/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/AnthropicInjectionCheckClient.cs +++ b/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/AnthropicInjectionCheckClient.cs @@ -63,6 +63,9 @@ public async Task AnalyzeAsync(string systemPrompt, string if (string.Equals(message.StopReason, "refusal", StringComparison.OrdinalIgnoreCase)) throw new InjectionCheckException("The injection-check model refused the request."); + if (string.Equals(message.StopReason, "max_tokens", StringComparison.OrdinalIgnoreCase)) + throw new InjectionCheckException($"The injection-check model ran out of output tokens after {message.Usage?.OutputTokens?.ToString() ?? "unknown"} tokens (max tokens is {options.MaxTokens})."); + var verdictJson = message.Content?.FirstOrDefault(b => b.Type == "text")?.Text; if (string.IsNullOrWhiteSpace(verdictJson)) throw new InjectionCheckException("The injection-check model returned no verdict content."); diff --git a/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs b/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs index 8678ea48a..0511e1ae4 100644 --- a/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs +++ b/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs @@ -74,6 +74,7 @@ public async Task CheckAsync(string workingDir, string prompt, string apiToken, void ReportUsage(InjectionCheckResult result) { + log.Info($"Prompt-injection check used {result.InputTokens?.ToString() ?? "unknown"} input tokens and {result.OutputTokens?.ToString() ?? "unknown"} output tokens (model '{result.Model}')."); usageReporter.AddModelUsage(new[] { new ClaudeCodeModelUsage From 017a65d84fc4869f5767536b9f51c68f5bfdad7c Mon Sep 17 00:00:00 2001 From: robert Date: Sun, 11 Oct 2026 22:22:01 +1000 Subject: [PATCH 3/3] Log the injection check's token usage at verbose level --- .../ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs b/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs index 0511e1ae4..74486274c 100644 --- a/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs +++ b/source/Calamari/AiAgent/ClaudeCodeBehaviour/InjectionCheck/PromptInjectionGuard.cs @@ -74,7 +74,7 @@ public async Task CheckAsync(string workingDir, string prompt, string apiToken, void ReportUsage(InjectionCheckResult result) { - log.Info($"Prompt-injection check used {result.InputTokens?.ToString() ?? "unknown"} input tokens and {result.OutputTokens?.ToString() ?? "unknown"} output tokens (model '{result.Model}')."); + log.Verbose($"Prompt-injection check used {result.InputTokens?.ToString() ?? "unknown"} input tokens and {result.OutputTokens?.ToString() ?? "unknown"} output tokens (model '{result.Model}')."); usageReporter.AddModelUsage(new[] { new ClaudeCodeModelUsage