fix(worker): translate max_turns failure text to English

TaskRunner.BuildFailureMarkdown returned a hardcoded German string for
TerminalReason == "max_turns", the only worker-generated string not in
English. Surfaced as the outcome/roadblock card for one of the most likely
first failures, looking broken to non-German users.
This commit is contained in:
mika kuns
2026-09-10 13:22:30 +02:00
parent 1177463a82
commit 0fcfe7c524
2 changed files with 7 additions and 7 deletions
+4 -4
View File
@@ -791,10 +791,10 @@ public sealed class TaskRunner
switch (result.TerminalReason) switch (result.TerminalReason)
{ {
case "max_turns": case "max_turns":
var ofConfigured = configuredMaxTurns is int m ? $" von {m}" : ""; var ofConfigured = configuredMaxTurns is int m ? $" of {m}" : "";
return $"Turn-Budget erschöpft ({result.TurnCount}{ofConfigured} Turns). " return $"Turn budget exhausted ({result.TurnCount}{ofConfigured} turns). "
+ "Erhöhe `maxTurns` am Task (`set_task_config`) und stelle den Task erneut in die Queue " + "Raise `maxTurns` on the task (`set_task_config`) and re-queue it "
+ "– der Worktree bleibt erhalten."; + "- the worktree is kept.";
case "api_error": case "api_error":
if (!string.IsNullOrWhiteSpace(result.ResultMarkdown)) return result.ResultMarkdown; if (!string.IsNullOrWhiteSpace(result.ResultMarkdown)) return result.ResultMarkdown;
@@ -23,7 +23,7 @@ public class FailureDiagnosisTests
Assert.Contains("55", message); Assert.Contains("55", message);
Assert.Contains("60", message); Assert.Contains("60", message);
Assert.Contains("maxTurns", message); Assert.Contains("maxTurns", message);
Assert.Contains("Queue", message); Assert.Contains("re-queue", message);
Assert.DoesNotContain(ClaudeProcess.NoResultPrefix, message); Assert.DoesNotContain(ClaudeProcess.NoResultPrefix, message);
} }
@@ -174,12 +174,12 @@ public sealed class FailureDiagnosisEndToEndTests : IDisposable
using var verify = _db.CreateContext(); using var verify = _db.CreateContext();
var task = await new TaskRepository(verify).GetByIdAsync("t1"); var task = await new TaskRepository(verify).GetByIdAsync("t1");
Assert.Equal(TaskStatus.Failed, task!.Status); Assert.Equal(TaskStatus.Failed, task!.Status);
Assert.Contains("Turn-Budget", task.Result); Assert.Contains("Turn budget", task.Result);
Assert.Contains("60", task.Result); Assert.Contains("60", task.Result);
Assert.DoesNotContain(ClaudeProcess.NoResultPrefix, task.Result); Assert.DoesNotContain(ClaudeProcess.NoResultPrefix, task.Result);
var run = await new TaskRunRepository(verify).GetLatestByTaskIdAsync("t1"); var run = await new TaskRunRepository(verify).GetLatestByTaskIdAsync("t1");
Assert.Contains("Turn-Budget", run!.ErrorMarkdown); Assert.Contains("Turn budget", run!.ErrorMarkdown);
} }
[Fact] [Fact]