feat(prompts): retry prompt from file, append only real captured errors

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-06-04 14:03:32 +02:00
parent 883dbc6af7
commit edc9f77357
4 changed files with 46 additions and 3 deletions

View File

@@ -6,6 +6,8 @@ namespace ClaudeDo.Worker.Runner;
public sealed class ClaudeProcess : IClaudeProcess
{
public const string NoResultPrefix = "Claude exited with code";
private readonly WorkerConfig _cfg;
private readonly ILogger<ClaudeProcess> _logger;
@@ -100,7 +102,7 @@ public sealed class ClaudeProcess : IClaudeProcess
var error = lastStderr.Length > 0
? lastStderr.ToString().Trim()
: $"Claude exited with code {exitCode} and no result.";
: $"{NoResultPrefix} {exitCode} and no result.";
return new RunResult
{

View File

@@ -104,7 +104,7 @@ public sealed class TaskRunner
{
_logger.LogInformation("Auto-retrying task {TaskId} with session {SessionId}", task.Id, result.SessionId);
var retryConfig = resolvedConfig with { ResumeSessionId = result.SessionId };
var retryPrompt = $"The previous attempt failed with:\n\n{result.ErrorMarkdown}\n\nTry again and fix the issues.";
var retryPrompt = BuildRetryPrompt(result.ErrorMarkdown);
var retryResult = await RunOnceAsync(task.Id, task.Title, slot, runDir, retryConfig, 2, true, retryPrompt, ct);
@@ -403,4 +403,14 @@ public sealed class TaskRunner
.Select(p => p!.Trim());
return string.Join("\n\n", trimmed);
}
public static string BuildRetryPrompt(string? capturedError)
{
var basePrompt = PromptFiles.ReadOrDefault(PromptKind.Retry);
var isReal = !string.IsNullOrWhiteSpace(capturedError)
&& !capturedError!.StartsWith(ClaudeProcess.NoResultPrefix, StringComparison.Ordinal);
return isReal
? $"{basePrompt}\n\nCaptured error from the failed run:\n\n{capturedError!.Trim()}"
: basePrompt;
}
}