From 1c768529571221bfae9554c0091cfb0539cdb36e Mon Sep 17 00:00:00 2001 From: mika kuns Date: Thu, 10 Sep 2026 13:13:16 +0200 Subject: [PATCH] fix(worker): route WeekReportService permission-mode through PermissionModeResolver Closes the last unrouted --permission-mode call site: haiku default models were hardcoding raw "auto", which the CLI silently downgrades to interactive "default" and hangs the report generation. Also drops the author's personal C:\Private default exclude in favor of an empty default (config stays via ReportExcludedPaths). --- .../Report/WeekReportService.cs | 4 +-- .../Report/WeekReportServiceTests.cs | 29 ++++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/ClaudeDo.Worker/Report/WeekReportService.cs b/src/ClaudeDo.Worker/Report/WeekReportService.cs index 77c41e5a..489d67e6 100644 --- a/src/ClaudeDo.Worker/Report/WeekReportService.cs +++ b/src/ClaudeDo.Worker/Report/WeekReportService.cs @@ -10,7 +10,7 @@ namespace ClaudeDo.Worker.Report; public sealed class WeekReportService { - private static readonly string[] DefaultExcludes = { @"C:\Private" }; + private static readonly string[] DefaultExcludes = Array.Empty(); private const string NoActivity = "_No activity in this period._"; private readonly IClaudeHistoryReader _reader; @@ -72,7 +72,7 @@ public sealed class WeekReportService IReadOnlyList args = [ "-p", "--output-format", "stream-json", "--verbose", - "--permission-mode", "auto", + "--permission-mode", PermissionModeResolver.Resolve(safeModel, "auto"), "--model", safeModel, ]; var result = await _claude.RunAsync(args, prompt, Path.GetTempPath(), _ => Task.CompletedTask, ct); diff --git a/tests/ClaudeDo.Worker.Tests/Report/WeekReportServiceTests.cs b/tests/ClaudeDo.Worker.Tests/Report/WeekReportServiceTests.cs index df6370a5..f01ddc6a 100644 --- a/tests/ClaudeDo.Worker.Tests/Report/WeekReportServiceTests.cs +++ b/tests/ClaudeDo.Worker.Tests/Report/WeekReportServiceTests.cs @@ -26,9 +26,10 @@ public class WeekReportServiceTests : IDisposable private sealed class FakeClaude : IClaudeProcess { public int Calls; + public IReadOnlyList? LastArgs; public RunResult Next = new() { ExitCode = 0, ResultMarkdown = "## Bericht" }; public Task RunAsync(IReadOnlyList args, string prompt, string wd, Func onLine, CancellationToken ct) - { Calls++; return Task.FromResult(Next); } + { Calls++; LastArgs = args; return Task.FromResult(Next); } } private WeekReportService Make(FakeReader reader, FakeClaude claude) => @@ -65,6 +66,32 @@ public class WeekReportServiceTests : IDisposable Assert.Equal(md, await svc.GetStoredAsync(Start, End)); } + [Fact] + public async Task HaikuDefaultModel_RoutesPermissionModeThroughResolver() + { + using (var ctx = _db.CreateContext()) + { + var repo = new AppSettingsRepository(ctx); + var settings = await repo.GetAsync(); + settings.DefaultModel = "haiku"; + await repo.UpdateAsync(settings); + } + + var activityRepo = new RepoActivity { RepoPath = @"C:\Dev\App" }; + var day = new DayActivity { Date = new DateOnly(2026, 6, 1) }; + day.Prompts.Add("x"); + activityRepo.Days.Add(day); + var claude = new FakeClaude(); + var svc = Make(new FakeReader { Result = new[] { activityRepo } }, claude); + + await svc.GenerateAsync(Start, End); + + Assert.NotNull(claude.LastArgs); + var modeIndex = claude.LastArgs!.ToList().IndexOf("--permission-mode") + 1; + Assert.Equal(PermissionModeResolver.Resolve("haiku", "auto"), claude.LastArgs[modeIndex]); + Assert.NotEqual("auto", claude.LastArgs[modeIndex]); + } + [Fact] public async Task ClaudeFailure_Throws_AndDoesNotStore() {