From beae2d639d458456a14bd117ffe27fbda8a410fb Mon Sep 17 00:00:00 2001 From: mika kuns Date: Thu, 4 Jun 2026 12:20:35 +0200 Subject: [PATCH] feat(worker): resolve max-turns from task then list then global default Co-Authored-By: Claude Sonnet 4.6 --- src/ClaudeDo.Worker/Runner/TaskRunner.cs | 5 ++++- .../Runner/MaxTurnsResolutionTests.cs | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/ClaudeDo.Worker.Tests/Runner/MaxTurnsResolutionTests.cs diff --git a/src/ClaudeDo.Worker/Runner/TaskRunner.cs b/src/ClaudeDo.Worker/Runner/TaskRunner.cs index 6646e31..c4ba07e 100644 --- a/src/ClaudeDo.Worker/Runner/TaskRunner.cs +++ b/src/ClaudeDo.Worker/Runner/TaskRunner.cs @@ -390,10 +390,13 @@ public sealed class TaskRunner SystemPrompt: string.IsNullOrWhiteSpace(instructions) ? null : instructions, AgentPath: task.AgentPath ?? listConfig?.AgentPath, ResumeSessionId: resumeSessionId, - MaxTurns: global.DefaultMaxTurns, + MaxTurns: ResolveMaxTurns(task.MaxTurns, listConfig?.MaxTurns, global.DefaultMaxTurns), PermissionMode: global.DefaultPermissionMode); } + internal static int? ResolveMaxTurns(int? taskTurns, int? listTurns, int globalDefault) + => taskTurns ?? listTurns ?? globalDefault; + public static string MergeInstructions(params string?[] parts) { var trimmed = parts diff --git a/tests/ClaudeDo.Worker.Tests/Runner/MaxTurnsResolutionTests.cs b/tests/ClaudeDo.Worker.Tests/Runner/MaxTurnsResolutionTests.cs new file mode 100644 index 0000000..20c8ccb --- /dev/null +++ b/tests/ClaudeDo.Worker.Tests/Runner/MaxTurnsResolutionTests.cs @@ -0,0 +1,19 @@ +using ClaudeDo.Worker.Runner; +using Xunit; + +namespace ClaudeDo.Worker.Tests.Runner; + +public class MaxTurnsResolutionTests +{ + [Fact] + public void Task_override_wins() + => Assert.Equal(5, TaskRunner.ResolveMaxTurns(taskTurns: 5, listTurns: 20, globalDefault: 100)); + + [Fact] + public void List_override_used_when_no_task_override() + => Assert.Equal(20, TaskRunner.ResolveMaxTurns(taskTurns: null, listTurns: 20, globalDefault: 100)); + + [Fact] + public void Falls_back_to_global_default() + => Assert.Equal(100, TaskRunner.ResolveMaxTurns(taskTurns: null, listTurns: null, globalDefault: 100)); +}