From 0fcfe7c52482549ce30e63a3fd2f9ffc46e8eeb7 Mon Sep 17 00:00:00 2001 From: mika kuns Date: Thu, 10 Sep 2026 13:22:30 +0200 Subject: [PATCH] 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. --- src/ClaudeDo.Worker/Runner/TaskRunner.cs | 8 ++++---- .../ClaudeDo.Worker.Tests/Runner/FailureDiagnosisTests.cs | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ClaudeDo.Worker/Runner/TaskRunner.cs b/src/ClaudeDo.Worker/Runner/TaskRunner.cs index ce6dd541..0033485a 100644 --- a/src/ClaudeDo.Worker/Runner/TaskRunner.cs +++ b/src/ClaudeDo.Worker/Runner/TaskRunner.cs @@ -791,10 +791,10 @@ public sealed class TaskRunner switch (result.TerminalReason) { case "max_turns": - var ofConfigured = configuredMaxTurns is int m ? $" von {m}" : ""; - return $"Turn-Budget erschöpft ({result.TurnCount}{ofConfigured} Turns). " - + "Erhöhe `maxTurns` am Task (`set_task_config`) und stelle den Task erneut in die Queue " - + "– der Worktree bleibt erhalten."; + var ofConfigured = configuredMaxTurns is int m ? $" of {m}" : ""; + return $"Turn budget exhausted ({result.TurnCount}{ofConfigured} turns). " + + "Raise `maxTurns` on the task (`set_task_config`) and re-queue it " + + "- the worktree is kept."; case "api_error": if (!string.IsNullOrWhiteSpace(result.ResultMarkdown)) return result.ResultMarkdown; diff --git a/tests/ClaudeDo.Worker.Tests/Runner/FailureDiagnosisTests.cs b/tests/ClaudeDo.Worker.Tests/Runner/FailureDiagnosisTests.cs index 20ee3913..39835e78 100644 --- a/tests/ClaudeDo.Worker.Tests/Runner/FailureDiagnosisTests.cs +++ b/tests/ClaudeDo.Worker.Tests/Runner/FailureDiagnosisTests.cs @@ -23,7 +23,7 @@ public class FailureDiagnosisTests Assert.Contains("55", message); Assert.Contains("60", message); Assert.Contains("maxTurns", message); - Assert.Contains("Queue", message); + Assert.Contains("re-queue", message); Assert.DoesNotContain(ClaudeProcess.NoResultPrefix, message); } @@ -174,12 +174,12 @@ public sealed class FailureDiagnosisEndToEndTests : IDisposable using var verify = _db.CreateContext(); var task = await new TaskRepository(verify).GetByIdAsync("t1"); Assert.Equal(TaskStatus.Failed, task!.Status); - Assert.Contains("Turn-Budget", task.Result); + Assert.Contains("Turn budget", task.Result); Assert.Contains("60", task.Result); Assert.DoesNotContain(ClaudeProcess.NoResultPrefix, task.Result); var run = await new TaskRunRepository(verify).GetLatestByTaskIdAsync("t1"); - Assert.Contains("Turn-Budget", run!.ErrorMarkdown); + Assert.Contains("Turn budget", run!.ErrorMarkdown); } [Fact]