Skip to content

Commit a6e9ded

Browse files
recuu-pfegclaude
andcommitted
feat: inject past failures into agent prompts
Fetch relevant failures from API before spawning agent. Failures appear as "Past Failures (avoid repeating these)" section in the agent's system prompt. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 2c85b4e commit a6e9ded

3 files changed

Lines changed: 23 additions & 1 deletion

File tree

src/api-client.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ export interface ApiClient {
101101
fetchApiDocs(agentName: string): Promise<string>;
102102
fetchAgentMemories(agentName: string): Promise<AgentMemory[]>;
103103
putAgentMemory(agentName: string, key: string, data: { type: string; content: string }): Promise<void>;
104+
fetchRelevantFailures(): Promise<Array<{ summary: string; failure_type: string; agent_name: string | null; created_at: string }>>;
104105
}
105106

106107
export function createApiClient(apiUrl: string, apiKey: string): ApiClient {
@@ -319,5 +320,15 @@ export function createApiClient(apiUrl: string, apiKey: string): ApiClient {
319320
// Non-fatal
320321
}
321322
},
323+
324+
async fetchRelevantFailures(): Promise<Array<{ summary: string; failure_type: string; agent_name: string | null; created_at: string }>> {
325+
try {
326+
const res = await fetch(`${apiUrl}/api/v1/failures/relevant?limit=5`, { headers });
327+
if (!res.ok) return [];
328+
return (await res.json()) as Array<{ summary: string; failure_type: string; agent_name: string | null; created_at: string }>;
329+
} catch {
330+
return [];
331+
}
332+
},
322333
};
323334
}

src/cli.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ async function runLoop(cliArgs: CliArgs, runner: AgentRunner): Promise<void> {
234234
const contextNotes = (task as Record<string, unknown>).context_notes as string | undefined;
235235
const fullDescription = [task.description, contextNotes].filter(Boolean).join("\n\n") || undefined;
236236

237+
// Fetch past failures for prompt injection
238+
let pastFailures: Array<{ summary: string; failure_type: string; agent_name: string | null }> = [];
239+
try { pastFailures = await api.fetchRelevantFailures(); } catch { /* non-fatal */ }
240+
237241
const prompt = buildAgentPrompt({
238242
role: agentName, projectName: ctx.workspaceName, projectSpec: ctx.workspaceSpec,
239243
taskId: task.id, taskTitle: task.title,
@@ -244,6 +248,7 @@ async function runLoop(cliArgs: CliArgs, runner: AgentRunner): Promise<void> {
244248
playbookRules: (await ctx.api.fetchPlaybookPrompt(agentName)) || ctx.playbookRules,
245249
targetRepo: task.target_repo ?? undefined,
246250
apiDocs: apiDocs || undefined, engineHint: getEngine(cliArgs.engine).promptHint,
251+
pastFailures: pastFailures.length > 0 ? pastFailures : undefined,
247252
});
248253

249254
try {

src/prompt.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ export interface PromptContext {
4444
apiDocs?: string;
4545
/** Engine-specific prompt hint (e.g. "CLAUDE.md is auto-loaded") */
4646
engineHint?: string;
47+
/** Past failures relevant to this task (from Failure Database) */
48+
pastFailures?: Array<{ summary: string; failure_type: string; agent_name: string | null }>;
4749
}
4850

4951
const ROLE_DESCRIPTIONS: Record<string, string> = {
@@ -183,9 +185,13 @@ export function buildAgentPrompt(ctx: PromptContext): string {
183185

184186
const engineHintLine = ctx.engineHint ? `\n${ctx.engineHint}` : "";
185187

188+
const failuresBlock = ctx.pastFailures?.length
189+
? `\n\n## Past Failures (avoid repeating these)\n${ctx.pastFailures.map((f) => `- [${f.failure_type}] ${f.summary}`).join("\n")}\n`
190+
: "";
191+
186192
return `${roleDesc}${langLine}${projectLine}${specBlock}
187193
${securityRules}${playbookBlock}${repoBlock}${modeHeader}${extraRules}${engineHintLine}
188-
Your task: ${ctx.taskTitle}${priorityLine}${typeLine}${targetRepoLine}${descriptionBlock}
194+
Your task: ${ctx.taskTitle}${priorityLine}${typeLine}${targetRepoLine}${descriptionBlock}${failuresBlock}
189195
${apiDocsBlock}
190196
${completionInstructions}
191197

0 commit comments

Comments
 (0)