diff --git a/packages/context/src/ingest/tools/tool-transcript-summary.test.ts b/packages/context/src/ingest/tools/tool-transcript-summary.test.ts index 5b4d81cc..9ca01626 100644 --- a/packages/context/src/ingest/tools/tool-transcript-summary.test.ts +++ b/packages/context/src/ingest/tools/tool-transcript-summary.test.ts @@ -92,6 +92,30 @@ describe('tool transcript summaries', () => { expect(summary.fatalErrorCount).toBe(0); }); + it('treats explicit unmapped fallback as recovery for guarded SL write failures', () => { + const summary = createMutableToolTranscriptSummary('wu-1', '/tmp/wu-1.jsonl'); + + recordToolTranscriptEntry( + summary, + entry({ + toolName: 'sl_write_source', + input: { connectionId: 'dbt-main', sourceName: 'stg_accounts' }, + output: { structured: { success: false, sourceName: 'stg_accounts' } }, + }), + ); + recordToolTranscriptEntry( + summary, + entry({ + toolName: 'emit_unmapped_fallback', + input: { rawPath: 'models/schema.yml', reason: 'no_physical_table', fallback: 'wiki_only' }, + output: 'recorded unmapped fallback for models/schema.yml (wiki_only)', + }), + ); + + expect(summary.errorCount).toBe(1); + expect(summary.fatalErrorCount).toBe(0); + }); + it('keeps thrown tool errors fatal even after a successful write', () => { const summary = createMutableToolTranscriptSummary('wu-1', '/tmp/wu-1.jsonl'); diff --git a/packages/context/src/ingest/tools/tool-transcript-summary.ts b/packages/context/src/ingest/tools/tool-transcript-summary.ts index 5e8c2628..2c2593d2 100644 --- a/packages/context/src/ingest/tools/tool-transcript-summary.ts +++ b/packages/context/src/ingest/tools/tool-transcript-summary.ts @@ -50,6 +50,13 @@ export function recordToolTranscriptEntry(summary: MutableToolTranscriptSummary, if (recoveryKey) { summary.recoverableFailureCounts.delete(recoveryKey); } + if (entry.toolName === 'emit_unmapped_fallback') { + for (const key of [...summary.recoverableFailureCounts.keys()]) { + if (key.startsWith('sl:')) { + summary.recoverableFailureCounts.delete(key); + } + } + } refreshFatalErrorCount(summary); }