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:
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user