daedalus-cli 3.63.2 → 3.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -3
- package/dist/agents/orchestrator.d.ts +3 -6
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +39 -843
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/agents/subagent-runner.d.ts +18 -0
- package/dist/agents/subagent-runner.d.ts.map +1 -0
- package/dist/agents/subagent-runner.js +231 -0
- package/dist/agents/subagent-runner.js.map +1 -0
- package/dist/agents/subagent-runner.test.d.ts +2 -0
- package/dist/agents/subagent-runner.test.d.ts.map +1 -0
- package/dist/agents/subagent-runner.test.js +74 -0
- package/dist/agents/subagent-runner.test.js.map +1 -0
- package/dist/agents/task-delegator.d.ts +28 -0
- package/dist/agents/task-delegator.d.ts.map +1 -0
- package/dist/agents/task-delegator.js +542 -0
- package/dist/agents/task-delegator.js.map +1 -0
- package/dist/agents/task-delegator.test.d.ts +2 -0
- package/dist/agents/task-delegator.test.d.ts.map +1 -0
- package/dist/agents/task-delegator.test.js +83 -0
- package/dist/agents/task-delegator.test.js.map +1 -0
- package/dist/agents/turn-guards.d.ts +41 -0
- package/dist/agents/turn-guards.d.ts.map +1 -0
- package/dist/agents/turn-guards.js +325 -0
- package/dist/agents/turn-guards.js.map +1 -0
- package/dist/agents/turn-guards.test.d.ts +2 -0
- package/dist/agents/turn-guards.test.d.ts.map +1 -0
- package/dist/agents/turn-guards.test.js +123 -0
- package/dist/agents/turn-guards.test.js.map +1 -0
- package/dist/commands/agents.d.ts +5 -28
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +11 -1021
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/autopilot.d.ts +30 -0
- package/dist/commands/autopilot.d.ts.map +1 -0
- package/dist/commands/autopilot.js +372 -0
- package/dist/commands/autopilot.js.map +1 -0
- package/dist/commands/hunt.d.ts +3 -0
- package/dist/commands/hunt.d.ts.map +1 -0
- package/dist/commands/hunt.js +181 -0
- package/dist/commands/hunt.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +339 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/onboard.d.ts +3 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +109 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -7
- package/dist/config/index.js.map +1 -1
- package/dist/indexing/indexer.d.ts +1 -1
- package/dist/indexing/indexer.d.ts.map +1 -1
- package/dist/indexing/indexer.js +112 -89
- package/dist/indexing/indexer.js.map +1 -1
- package/dist/indexing/indexer.test.js +58 -2
- package/dist/indexing/indexer.test.js.map +1 -1
- package/dist/indexing/watcher.js +1 -1
- package/dist/indexing/watcher.js.map +1 -1
- package/dist/indexing/watcher.test.js +53 -16
- package/dist/indexing/watcher.test.js.map +1 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +32 -426
- package/dist/model.js.map +1 -1
- package/dist/router/fallback.test.js +67 -0
- package/dist/router/fallback.test.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +23 -2
- package/dist/router/index.js.map +1 -1
- package/dist/session/manager.d.ts +2 -2
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +9 -6
- package/dist/session/manager.js.map +1 -1
- package/dist/session/manager.test.js +5 -0
- package/dist/session/manager.test.js.map +1 -1
- package/dist/session/sqlite.d.ts +4 -0
- package/dist/session/sqlite.d.ts.map +1 -1
- package/dist/session/sqlite.js +17 -0
- package/dist/session/sqlite.js.map +1 -1
- package/dist/session/sqlite.test.js +10 -1
- package/dist/session/sqlite.test.js.map +1 -1
- package/dist/types.d.ts +17 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.test.js +19 -0
- package/dist/types.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-delegator.test.d.ts","sourceRoot":"","sources":["../../src/agents/task-delegator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { TaskDelegator } from './task-delegator.js';
|
|
3
|
+
// Global mock for child_process exec
|
|
4
|
+
const mockExec = vi.fn((cmd, opts, cb) => {
|
|
5
|
+
const callback = typeof cb === 'function' ? cb : opts;
|
|
6
|
+
if (typeof callback === 'function') {
|
|
7
|
+
callback(null, 'build success', '');
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
vi.mock('child_process', () => ({
|
|
11
|
+
exec: (cmd, opts, cb) => mockExec(cmd, opts, cb),
|
|
12
|
+
}));
|
|
13
|
+
const createMockRouter = (responses) => {
|
|
14
|
+
const chatMock = vi.fn();
|
|
15
|
+
responses.forEach((content) => {
|
|
16
|
+
chatMock.mockImplementationOnce(() => Promise.resolve({
|
|
17
|
+
choices: [{ message: { content, tool_calls: null } }],
|
|
18
|
+
}));
|
|
19
|
+
});
|
|
20
|
+
const router = {
|
|
21
|
+
chat: { completions: { create: chatMock } },
|
|
22
|
+
chatStream: vi.fn(),
|
|
23
|
+
chatCompletion: chatMock,
|
|
24
|
+
getModels: vi.fn().mockReturnValue([{ name: 'test', model: 'test' }]),
|
|
25
|
+
};
|
|
26
|
+
return { router, chatMock };
|
|
27
|
+
};
|
|
28
|
+
const baseContext = () => ({
|
|
29
|
+
sessionId: 'test',
|
|
30
|
+
projectRoot: process.cwd(),
|
|
31
|
+
projectHash: 'test',
|
|
32
|
+
activeFiles: new Map(),
|
|
33
|
+
agentRole: 'coder',
|
|
34
|
+
abortSignal: new AbortController().signal,
|
|
35
|
+
patchHistory: [],
|
|
36
|
+
});
|
|
37
|
+
describe('TaskDelegator', () => {
|
|
38
|
+
let toolContext;
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
toolContext = baseContext();
|
|
41
|
+
});
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
vi.restoreAllMocks();
|
|
44
|
+
});
|
|
45
|
+
it('instantiates cleanly with dependencies', () => {
|
|
46
|
+
const { router } = createMockRouter(['Done']);
|
|
47
|
+
const delegator = new TaskDelegator(router, toolContext);
|
|
48
|
+
expect(delegator).toBeInstanceOf(TaskDelegator);
|
|
49
|
+
});
|
|
50
|
+
it('picks appropriate memory categories based on task role and keywords', () => {
|
|
51
|
+
const { router } = createMockRouter(['Done']);
|
|
52
|
+
const delegator = new TaskDelegator(router, toolContext);
|
|
53
|
+
expect(delegator.pickMemoryCategory({ goal: 'fix build error', context: '', role: 'debugger' })).toBe('fix_resolution');
|
|
54
|
+
expect(delegator.pickMemoryCategory({ goal: 'verify test suite', context: '', role: 'reviewer' })).toBe('build_rule');
|
|
55
|
+
expect(delegator.pickMemoryCategory({ goal: 'create spec interface', context: '', role: 'planner' })).toBe('schema_contract');
|
|
56
|
+
expect(delegator.pickMemoryCategory({ goal: 'implement new button component', context: '', role: 'coder' })).toBe('code_pattern');
|
|
57
|
+
});
|
|
58
|
+
it('records successful task execution in results array when patch artifacts exist', async () => {
|
|
59
|
+
const chatMock = vi.fn().mockImplementationOnce(() => {
|
|
60
|
+
toolContext.patchHistory?.push({
|
|
61
|
+
filePath: '/tmp/cli.ts',
|
|
62
|
+
oldContent: '',
|
|
63
|
+
newContent: '',
|
|
64
|
+
timestamp: Date.now(),
|
|
65
|
+
description: 'wrote file',
|
|
66
|
+
});
|
|
67
|
+
return Promise.resolve({
|
|
68
|
+
choices: [{ message: { content: 'Updated the CLI entrypoint.', tool_calls: null } }],
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
const localRouter = {
|
|
72
|
+
chat: { completions: { create: chatMock } },
|
|
73
|
+
chatStream: vi.fn(),
|
|
74
|
+
chatCompletion: chatMock,
|
|
75
|
+
getModels: vi.fn().mockReturnValue([{ name: 'test', model: 'test' }]),
|
|
76
|
+
};
|
|
77
|
+
const delegator = new TaskDelegator(localRouter, toolContext);
|
|
78
|
+
await delegator.delegateTask({ goal: 'implement a tiny CLI utility', context: '', role: 'coder' });
|
|
79
|
+
expect(chatMock).toHaveBeenCalledTimes(1);
|
|
80
|
+
expect(delegator.results.at(-1)?.success).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=task-delegator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-delegator.test.js","sourceRoot":"","sources":["../../src/agents/task-delegator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ClaimLedger } from './completion-guard.js';
|
|
2
|
+
import { ReadStallDetector, DivergenceDetector } from './loop-guards.js';
|
|
3
|
+
import type { ToolContext, ChatMessage } from '../types.js';
|
|
4
|
+
import type { LocalRouter } from '../router/index.js';
|
|
5
|
+
import type { DaedalusConfig } from '../config/index.js';
|
|
6
|
+
export interface TurnGuardContext {
|
|
7
|
+
cleanContent: string;
|
|
8
|
+
fullContent: string;
|
|
9
|
+
userTask: string;
|
|
10
|
+
messages: ChatMessage[];
|
|
11
|
+
toolContext: ToolContext;
|
|
12
|
+
router: LocalRouter;
|
|
13
|
+
config: DaedalusConfig;
|
|
14
|
+
claimLedger: ClaimLedger;
|
|
15
|
+
readStall: ReadStallDetector;
|
|
16
|
+
divergence: DivergenceDetector;
|
|
17
|
+
readLines: (file: string, fromLine: number, toLine: number) => string[] | null;
|
|
18
|
+
fileExists: (file: string) => boolean;
|
|
19
|
+
verifyBreakerTrippedThisTurn: boolean;
|
|
20
|
+
verifyBreakerTrippedLastTurn: boolean;
|
|
21
|
+
currentComplexity?: string;
|
|
22
|
+
taskComplexity?: string;
|
|
23
|
+
totalCompletionTokens: number;
|
|
24
|
+
turnUsageOut?: number;
|
|
25
|
+
escalationCount: number;
|
|
26
|
+
}
|
|
27
|
+
export type GuardResult = {
|
|
28
|
+
status: 'continue';
|
|
29
|
+
addedTokens?: number;
|
|
30
|
+
updateVerifyBreaker?: boolean;
|
|
31
|
+
} | {
|
|
32
|
+
status: 'halt';
|
|
33
|
+
content: string;
|
|
34
|
+
maxTurnsCause: string;
|
|
35
|
+
updateVerifyBreaker?: boolean;
|
|
36
|
+
} | {
|
|
37
|
+
status: 'pass';
|
|
38
|
+
updateVerifyBreaker?: boolean;
|
|
39
|
+
};
|
|
40
|
+
export declare function checkTurnCompletionGuards(ctx: TurnGuardContext): Promise<GuardResult>;
|
|
41
|
+
//# sourceMappingURL=turn-guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-guards.d.ts","sourceRoot":"","sources":["../../src/agents/turn-guards.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,WAAW,EA2BZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EAGjB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,4BAA4B,EAAE,OAAO,CAAC;IACtC,4BAA4B,EAAE,OAAO,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,GACzF;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtD,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CA4W3F"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { detectFalseCompletion, falseCompletionWarning, detectFalseCompletionOnDisk, isScopeOverstatedSummary, scopeOverstatementWarning, isUnsubstantiatedProgressReport, unsubstantiatedProgressWarning, countAchievementItems, detectUngroundedClaim, ungroundedClaimWarning, isGreenStateClaim, greenStateWarning, isUngroundedProjectClaim, ungroundedProjectClaimWarning, isNegativeExistenceClaim, negativeExistenceWarning, isReviewTask, isReviewDeliverable, isReviewWithoutSourceInspection, reviewWithoutSourceInspectionWarning, claimedTestCountWithoutRun, claimedTestCountWithoutRunWarning, detectUngroundedWorksClaim, ungroundedWorksWarning, isUncitedArchClaim, uncitedArchClaimWarning, validateCitations, citationValidationWarning, collectCitationClaims, buildJudgePrompt, parseJudgeResponse, judgeClaimWarning, validateProseReferences, proseRefWarning, } from './completion-guard.js';
|
|
2
|
+
import { isGreenBuildTestClaim, fabricatedTestCountCorrection, } from './loop-guards.js';
|
|
3
|
+
import { getSessionTodos } from '../tools/builtin/todo.js';
|
|
4
|
+
import { parseTextToolCalls } from '../formatting.js';
|
|
5
|
+
import { messageText } from '../types.js';
|
|
6
|
+
import { dim } from '../ui/theme.js';
|
|
7
|
+
export async function checkTurnCompletionGuards(ctx) {
|
|
8
|
+
const { cleanContent, fullContent, userTask, messages, toolContext, router, config, claimLedger, readStall, divergence, readLines, fileExists, verifyBreakerTrippedThisTurn, verifyBreakerTrippedLastTurn, currentComplexity, taskComplexity, totalCompletionTokens, turnUsageOut, escalationCount, } = ctx;
|
|
9
|
+
const hasRecentGuardWarning = messages.slice(-6).some((m) => typeof m.content === 'string' &&
|
|
10
|
+
(m.content.startsWith('[SYSTEM WARNING]') || m.content.startsWith('[FILE-MISSING]') || m.content.startsWith('[CHECK]')));
|
|
11
|
+
const isReviewContent = isReviewDeliverable(cleanContent);
|
|
12
|
+
if (!hasRecentGuardWarning && !isReviewContent && divergence.register(cleanContent)) {
|
|
13
|
+
const repeats = divergence.consecutiveRepeats;
|
|
14
|
+
if (repeats >= 2) {
|
|
15
|
+
console.log(dim(`\n [STOP] Runaway loop: same output re-emitted ${repeats} times with no progress. Closing turn.`));
|
|
16
|
+
return {
|
|
17
|
+
status: 'halt',
|
|
18
|
+
content: `${cleanContent}\n\n[SELF-CORRECT] I repeated the same output ${repeats} times without making progress. I am stopping this turn rather than looping.`,
|
|
19
|
+
maxTurnsCause: 'repeated identical output without progress (repetition guard tripped) — the agent emitted the same response multiple times',
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
console.log(dim(`\n [CHECK] Detected near-duplicate of prior output — not making progress.`));
|
|
23
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
24
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
25
|
+
messages.push({
|
|
26
|
+
role: 'user',
|
|
27
|
+
content: `[SYSTEM WARNING] This response is nearly identical to output you already produced this turn. You are looping on repeated text instead of making progress. Do NOT re-state completed work. Either (1) take a concrete next action (read the failing test, fix the code, verify), or (2) if you are blocked, report the blocker concisely and stop.`,
|
|
28
|
+
});
|
|
29
|
+
return { status: 'continue' };
|
|
30
|
+
}
|
|
31
|
+
const ungrounded = detectUngroundedClaim(cleanContent, claimLedger);
|
|
32
|
+
if (ungrounded) {
|
|
33
|
+
const key = `claim:${ungrounded}`;
|
|
34
|
+
if (!toolContext.firedCompletionGuards?.has(key)) {
|
|
35
|
+
(toolContext.firedCompletionGuards ??= new Set()).add(key);
|
|
36
|
+
console.log(dim(`\n [CHECK] Claim about ${ungrounded} is ungrounded (no inspection this session).`));
|
|
37
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
38
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
39
|
+
messages.push({
|
|
40
|
+
role: 'user',
|
|
41
|
+
content: ungroundedClaimWarning(ungrounded),
|
|
42
|
+
});
|
|
43
|
+
return { status: 'continue' };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const projClaim = isUngroundedProjectClaim(cleanContent, claimLedger);
|
|
47
|
+
if (projClaim) {
|
|
48
|
+
const key = `proj:${projClaim}`;
|
|
49
|
+
if (!toolContext.firedCompletionGuards?.has(key)) {
|
|
50
|
+
(toolContext.firedCompletionGuards ??= new Set()).add(key);
|
|
51
|
+
console.log(dim(`\n [CHECK] Project claim about "${projClaim}" is ungrounded (never observed this session).`));
|
|
52
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
53
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
54
|
+
messages.push({
|
|
55
|
+
role: 'user',
|
|
56
|
+
content: ungroundedProjectClaimWarning(projClaim),
|
|
57
|
+
});
|
|
58
|
+
return { status: 'continue' };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const negClaim = isNegativeExistenceClaim(cleanContent, claimLedger);
|
|
62
|
+
if (negClaim) {
|
|
63
|
+
const key = `neg:${negClaim}`;
|
|
64
|
+
if (!toolContext.firedCompletionGuards?.has(key)) {
|
|
65
|
+
(toolContext.firedCompletionGuards ??= new Set()).add(key);
|
|
66
|
+
console.log(dim(`\n [CHECK] Claim that "${negClaim}" is missing is ungrounded (no search/list run this session).`));
|
|
67
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
68
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
69
|
+
messages.push({
|
|
70
|
+
role: 'user',
|
|
71
|
+
content: negativeExistenceWarning(negClaim),
|
|
72
|
+
});
|
|
73
|
+
return { status: 'continue' };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const narratedToolCalls = parseTextToolCalls(fullContent);
|
|
77
|
+
if (narratedToolCalls.length >= 1) {
|
|
78
|
+
console.log(dim(`\n [RETRY] Model planned tools but emitted no valid JSON. Re-issuing the request.`));
|
|
79
|
+
messages.push({
|
|
80
|
+
role: 'user',
|
|
81
|
+
content: `[SYSTEM WARNING] You emitted a <tool_call> block but it was not valid JSON. Please output the proper JSON array of tool calls now.`,
|
|
82
|
+
});
|
|
83
|
+
return { status: 'continue', addedTokens: turnUsageOut ?? 0 };
|
|
84
|
+
}
|
|
85
|
+
if (currentComplexity && process.env.DAEDALUS_DEBUG === 'true') {
|
|
86
|
+
console.log(dim(` [ROUTE] Task summary: start ${taskComplexity ?? 'n/a'} → end ${currentComplexity} | ${totalCompletionTokens + (turnUsageOut ?? 0)} output tokens | ${escalationCount} escalation(s)`));
|
|
87
|
+
}
|
|
88
|
+
const closingTodos = getSessionTodos(toolContext.sessionId);
|
|
89
|
+
if (closingTodos.length > 0 && detectFalseCompletion(cleanContent, closingTodos)) {
|
|
90
|
+
const remaining = closingTodos.filter((t) => t.status !== 'completed').length;
|
|
91
|
+
console.log(dim(`\n [CHECK] Verifying completion claim — ${remaining} todo(s) still open.`));
|
|
92
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
93
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
94
|
+
messages.push({
|
|
95
|
+
role: 'user',
|
|
96
|
+
content: falseCompletionWarning(remaining),
|
|
97
|
+
});
|
|
98
|
+
return { status: 'continue' };
|
|
99
|
+
}
|
|
100
|
+
const falselyClaimed = detectFalseCompletionOnDisk(cleanContent, toolContext);
|
|
101
|
+
if (falselyClaimed) {
|
|
102
|
+
console.log(dim(`\n [CHECK] Verifying completion claim — no successful patch to ${falselyClaimed} this session (only reverts).`));
|
|
103
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
104
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
105
|
+
messages.push({
|
|
106
|
+
role: 'user',
|
|
107
|
+
content: `[SYSTEM WARNING] You claimed a fix/completion involving ${falselyClaimed}, but this session has NO successful patch to that file — only patches the syntax guard reverted. Reconcile with disk reality: either (1) actually apply and verify the change (run build/test and confirm it on disk), or (2) report the blocker honestly instead of claiming it is done. Do NOT report completion for changes that were not written.`,
|
|
108
|
+
});
|
|
109
|
+
return { status: 'continue' };
|
|
110
|
+
}
|
|
111
|
+
const scopeTodos = getSessionTodos(toolContext.sessionId);
|
|
112
|
+
if (scopeTodos.length > 0 && isScopeOverstatedSummary(cleanContent, scopeTodos)) {
|
|
113
|
+
const remaining = scopeTodos.filter((t) => t.status !== 'completed').length;
|
|
114
|
+
console.log(dim(`\n [CHECK] Verifying completion claim — summary enumerates tasks as done but ${remaining} todo(s) still open.`));
|
|
115
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
116
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
117
|
+
messages.push({
|
|
118
|
+
role: 'user',
|
|
119
|
+
content: scopeOverstatementWarning(remaining),
|
|
120
|
+
});
|
|
121
|
+
return { status: 'continue' };
|
|
122
|
+
}
|
|
123
|
+
if (isUnsubstantiatedProgressReport(cleanContent)) {
|
|
124
|
+
const key = 'unsubstantiated-progress';
|
|
125
|
+
if (!toolContext.firedCompletionGuards?.has(key)) {
|
|
126
|
+
(toolContext.firedCompletionGuards ??= new Set()).add(key);
|
|
127
|
+
const itemCount = countAchievementItems(cleanContent);
|
|
128
|
+
console.log(dim(`\n [CHECK] Verifying completion claim — ${itemCount} deliverables enumerated as done without a reconciling task list or per-item verification.`));
|
|
129
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
130
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
131
|
+
messages.push({
|
|
132
|
+
role: 'user',
|
|
133
|
+
content: unsubstantiatedProgressWarning(itemCount),
|
|
134
|
+
});
|
|
135
|
+
return { status: 'continue' };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (isReviewTask(userTask) && isReviewDeliverable(cleanContent) && claimLedger.totalObservations === 0) {
|
|
139
|
+
console.log(dim(`\n [STOP] Review produced with zero file inspections this session — halting.`));
|
|
140
|
+
return {
|
|
141
|
+
status: 'halt',
|
|
142
|
+
content: `${cleanContent}\n\n[SELF-CORRECT] I described the project's architecture/features but have not inspected a single file this session. I am stopping rather than fabricating a review. I should read the code before reviewing.`,
|
|
143
|
+
maxTurnsCause: 'produced a review deliverable with zero file inspections this session (review-without-inspection guard)',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (isReviewTask(userTask) && isReviewWithoutSourceInspection(cleanContent, claimLedger)) {
|
|
147
|
+
const srcCount = claimLedger.sourceFileObservations;
|
|
148
|
+
console.log(dim(`\n [CHECK] Review deliverable produced after reading only ${srcCount} source file(s) — insufficient inspection.`));
|
|
149
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
150
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
151
|
+
messages.push({
|
|
152
|
+
role: 'user',
|
|
153
|
+
content: reviewWithoutSourceInspectionWarning(srcCount),
|
|
154
|
+
});
|
|
155
|
+
return { status: 'continue' };
|
|
156
|
+
}
|
|
157
|
+
if (isReviewTask(userTask) || isReviewDeliverable(cleanContent)) {
|
|
158
|
+
const archTerm = isUncitedArchClaim(cleanContent);
|
|
159
|
+
if (archTerm) {
|
|
160
|
+
if ((toolContext.archGuardHits ?? 0) >= 3) {
|
|
161
|
+
toolContext.maxTurnsCause = 'repeated uncited architectural claims despite 3 citation warnings (audit guard)';
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
toolContext.archGuardHits = (toolContext.archGuardHits ?? 0) + 1;
|
|
165
|
+
console.log(dim(`\n [CHECK] Review makes uncited structural claim "${archTerm}" (no file:line).`));
|
|
166
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
167
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
168
|
+
messages.push({
|
|
169
|
+
role: 'user',
|
|
170
|
+
content: uncitedArchClaimWarning(archTerm),
|
|
171
|
+
});
|
|
172
|
+
return { status: 'continue' };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const citationFails = validateCitations(cleanContent, { readLines });
|
|
176
|
+
if (citationFails.length > 0) {
|
|
177
|
+
const key = 'citation-validation';
|
|
178
|
+
if (!toolContext.firedCompletionGuards?.has(key)) {
|
|
179
|
+
(toolContext.firedCompletionGuards ??= new Set()).add(key);
|
|
180
|
+
console.log(dim(`\n [CHECK] Review cites ${citationFails.length} source location(s) that do not check out against the codebase.`));
|
|
181
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
182
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
183
|
+
messages.push({
|
|
184
|
+
role: 'user',
|
|
185
|
+
content: citationValidationWarning(citationFails),
|
|
186
|
+
});
|
|
187
|
+
return { status: 'continue' };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const proseFails = validateProseReferences(cleanContent, { readLines, fileExists });
|
|
191
|
+
if (proseFails.length > 0) {
|
|
192
|
+
const key = 'prose-ref-validation';
|
|
193
|
+
if (!toolContext.firedCompletionGuards?.has(key)) {
|
|
194
|
+
(toolContext.firedCompletionGuards ??= new Set()).add(key);
|
|
195
|
+
console.log(dim(`\n [CHECK] Review references ${proseFails.length} file(s) whose existence does not check out against the codebase.`));
|
|
196
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
197
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
198
|
+
messages.push({
|
|
199
|
+
role: 'user',
|
|
200
|
+
content: proseRefWarning(proseFails),
|
|
201
|
+
});
|
|
202
|
+
return { status: 'continue' };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if ((toolContext.judgeGuardHits ?? 0) < 3) {
|
|
206
|
+
const claims = collectCitationClaims(cleanContent, { readLines }, 8);
|
|
207
|
+
if (claims.length > 0) {
|
|
208
|
+
try {
|
|
209
|
+
const judgePrompt = buildJudgePrompt(claims);
|
|
210
|
+
const jr = await router.chat.completions.create({
|
|
211
|
+
model: config.modelOverride || 'auto',
|
|
212
|
+
messages: [{ role: 'user', content: judgePrompt }],
|
|
213
|
+
temperature: 0,
|
|
214
|
+
max_tokens: 1024,
|
|
215
|
+
});
|
|
216
|
+
const judgeRaw = messageText(jr.choices?.[0]?.message?.content ?? '');
|
|
217
|
+
const verdicts = parseJudgeResponse(judgeRaw, claims);
|
|
218
|
+
const unsupported = verdicts.filter((v) => !v.supported);
|
|
219
|
+
if (unsupported.length > 0) {
|
|
220
|
+
toolContext.judgeGuardHits = (toolContext.judgeGuardHits ?? 0) + 1;
|
|
221
|
+
console.log(dim(`\n [CHECK] Semantic judge found ${unsupported.length} claim(s) not supported by cited code.`));
|
|
222
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
223
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
224
|
+
messages.push({
|
|
225
|
+
role: 'user',
|
|
226
|
+
content: judgeClaimWarning(unsupported),
|
|
227
|
+
});
|
|
228
|
+
return { status: 'continue' };
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (judgeErr) {
|
|
232
|
+
if (process.env.DAEDALUS_DEBUG === 'true') {
|
|
233
|
+
console.log(dim(` [judge] Layer-2 verification skipped (${String(judgeErr)}).`));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const noRunClaimed = claimedTestCountWithoutRun(cleanContent, toolContext.lastVerifyPassCount);
|
|
240
|
+
if (noRunClaimed) {
|
|
241
|
+
console.log(dim(`\n [CHECK] Test-count claim ("${noRunClaimed} passing") made with no real npm test run this session.`));
|
|
242
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
243
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
244
|
+
messages.push({
|
|
245
|
+
role: 'user',
|
|
246
|
+
content: claimedTestCountWithoutRunWarning(noRunClaimed),
|
|
247
|
+
});
|
|
248
|
+
return { status: 'continue' };
|
|
249
|
+
}
|
|
250
|
+
if (detectUngroundedWorksClaim(cleanContent, claimLedger)) {
|
|
251
|
+
const worksKey = 'works-claim';
|
|
252
|
+
if (!toolContext.firedCompletionGuards?.has(worksKey)) {
|
|
253
|
+
(toolContext.firedCompletionGuards ??= new Set()).add(worksKey);
|
|
254
|
+
console.log(dim(`\n [CHECK] "Works/verified" claim made with no live runtime probe (curl/HTTP/integration test) this session.`));
|
|
255
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
256
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
257
|
+
messages.push({
|
|
258
|
+
role: 'user',
|
|
259
|
+
content: ungroundedWorksWarning(),
|
|
260
|
+
});
|
|
261
|
+
return { status: 'continue' };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (toolContext.lastRuntimeFailure && (detectUngroundedWorksClaim(cleanContent, claimLedger) || isGreenBuildTestClaim(cleanContent))) {
|
|
265
|
+
const rfKey = 'runtime-failure';
|
|
266
|
+
if (!toolContext.firedCompletionGuards?.has(rfKey)) {
|
|
267
|
+
(toolContext.firedCompletionGuards ??= new Set()).add(rfKey);
|
|
268
|
+
const rf = toolContext.lastRuntimeFailure;
|
|
269
|
+
console.log(dim(`\n [CHECK] Completion claim conflicts with a FAILED run this session — \`${rf.command}\` exited non-zero.`));
|
|
270
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
271
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
272
|
+
messages.push({
|
|
273
|
+
role: 'user',
|
|
274
|
+
content: `[SYSTEM WARNING] You reported the project works / the CLI ran / build+tests pass, but a terminal run you executed THIS session FAILED: ` +
|
|
275
|
+
`\`${rf.command}\` exited non-zero with: ${rf.error}. A failed run cannot be reported as a success. ` +
|
|
276
|
+
`Either (1) actually re-run the command and confirm a clean exit (code 0) before claiming it works, ` +
|
|
277
|
+
`or (2) report the blocker honestly (paste the error). Do NOT claim green/working from a run that errored.`,
|
|
278
|
+
});
|
|
279
|
+
return { status: 'continue' };
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (readStall.stalled) {
|
|
283
|
+
console.log(dim(`\n [DONE] Idle re-read stall: same file read ${readStall.readCount} times consecutively with no edit. Closing turn.`));
|
|
284
|
+
return {
|
|
285
|
+
status: 'halt',
|
|
286
|
+
content: `${cleanContent}\n\n[SELF-CORRECT] I re-read the same file ${readStall.readCount} times without making changes — the change is likely already present on disk. Report the actual on-disk state to the user rather than continuing to read.`,
|
|
287
|
+
maxTurnsCause: `stuck re-reading the same file without making changes (idle re-read guard, ${readStall.readCount} reads)`,
|
|
288
|
+
updateVerifyBreaker: true,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
if (isGreenBuildTestClaim(cleanContent) && (verifyBreakerTrippedThisTurn || verifyBreakerTrippedLastTurn)) {
|
|
292
|
+
console.log(dim(`\n [CHECK] Verifying completion claim — build/test command tripped the circuit breaker; no fresh successful run observed.`));
|
|
293
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
294
|
+
toolContext.verifyBreakerTrippedLastTurn = true;
|
|
295
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
296
|
+
messages.push({
|
|
297
|
+
role: 'user',
|
|
298
|
+
content: `[SYSTEM WARNING] You reported the build/tests pass, but the verify command tripped the circuit breaker this session (no progress) and no fresh successful run was observed. Do NOT claim green without re-running the command and seeing a real pass. Either (1) run \`npm run build && npm run test\` again and confirm real output, or (2) report the blocker honestly (e.g. the command hung / was blocked).`,
|
|
299
|
+
});
|
|
300
|
+
return { status: 'continue', updateVerifyBreaker: true };
|
|
301
|
+
}
|
|
302
|
+
const testCorrection = fabricatedTestCountCorrection(cleanContent, toolContext.lastVerifyPassCount);
|
|
303
|
+
if (testCorrection) {
|
|
304
|
+
console.log(dim(`\n [CHECK] Verifying test-count claim — summary count disagrees with last real test run.`));
|
|
305
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
306
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
307
|
+
messages.push({
|
|
308
|
+
role: 'user',
|
|
309
|
+
content: testCorrection,
|
|
310
|
+
});
|
|
311
|
+
return { status: 'continue', updateVerifyBreaker: true };
|
|
312
|
+
}
|
|
313
|
+
if (isGreenStateClaim(cleanContent) && toolContext.lastVerifyPassed === false) {
|
|
314
|
+
console.log(dim(`\n [CHECK] Verifying green-state claim — last real verify run this session FAILED.`));
|
|
315
|
+
toolContext.selfCorrectionCount = (toolContext.selfCorrectionCount ?? 0) + 1;
|
|
316
|
+
messages.push({ role: 'assistant', content: cleanContent });
|
|
317
|
+
messages.push({
|
|
318
|
+
role: 'user',
|
|
319
|
+
content: greenStateWarning(),
|
|
320
|
+
});
|
|
321
|
+
return { status: 'continue', updateVerifyBreaker: true };
|
|
322
|
+
}
|
|
323
|
+
return { status: 'pass', updateVerifyBreaker: true };
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=turn-guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-guards.js","sourceRoot":"","sources":["../../src/agents/turn-guards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-guards.test.d.ts","sourceRoot":"","sources":["../../src/agents/turn-guards.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { checkTurnCompletionGuards } from './turn-guards.js';
|
|
3
|
+
import { ClaimLedger } from './completion-guard.js';
|
|
4
|
+
import { ReadStallDetector, DivergenceDetector } from './loop-guards.js';
|
|
5
|
+
function createMockContext(overrides = {}) {
|
|
6
|
+
const toolContext = {
|
|
7
|
+
sessionId: 'test_session',
|
|
8
|
+
projectRoot: '/test/project',
|
|
9
|
+
projectHash: 'hash123',
|
|
10
|
+
activeFiles: new Map(),
|
|
11
|
+
agentRole: 'orchestrator',
|
|
12
|
+
abortSignal: new AbortController().signal,
|
|
13
|
+
firedCompletionGuards: new Set(),
|
|
14
|
+
};
|
|
15
|
+
const defaultCtx = {
|
|
16
|
+
cleanContent: 'Everything looks great and all functions work properly.',
|
|
17
|
+
fullContent: 'Everything looks great and all functions work properly.',
|
|
18
|
+
userTask: 'implement feature X',
|
|
19
|
+
messages: [],
|
|
20
|
+
toolContext,
|
|
21
|
+
router: {
|
|
22
|
+
chat: {
|
|
23
|
+
completions: {
|
|
24
|
+
create: vi.fn(),
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
config: {},
|
|
29
|
+
claimLedger: new ClaimLedger(),
|
|
30
|
+
readStall: new ReadStallDetector(),
|
|
31
|
+
divergence: new DivergenceDetector(),
|
|
32
|
+
readLines: vi.fn().mockReturnValue(['line1', 'line2']),
|
|
33
|
+
fileExists: vi.fn().mockReturnValue(true),
|
|
34
|
+
verifyBreakerTrippedThisTurn: false,
|
|
35
|
+
verifyBreakerTrippedLastTurn: false,
|
|
36
|
+
totalCompletionTokens: 100,
|
|
37
|
+
escalationCount: 0,
|
|
38
|
+
...overrides,
|
|
39
|
+
};
|
|
40
|
+
return defaultCtx;
|
|
41
|
+
}
|
|
42
|
+
describe('checkTurnCompletionGuards', () => {
|
|
43
|
+
it('passes when response has no claims or violations', async () => {
|
|
44
|
+
const ctx = createMockContext({
|
|
45
|
+
cleanContent: 'Here is an explanation of how JavaScript event loop works.',
|
|
46
|
+
fullContent: 'Here is an explanation of how JavaScript event loop works.',
|
|
47
|
+
});
|
|
48
|
+
const result = await checkTurnCompletionGuards(ctx);
|
|
49
|
+
expect(result.status).toBe('pass');
|
|
50
|
+
});
|
|
51
|
+
it('triggers divergence check when assistant emits duplicate output', async () => {
|
|
52
|
+
const divergence = new DivergenceDetector();
|
|
53
|
+
const cleanContent = 'This is a long assistant response that provides detailed explanations of how the subsystem works in practice. This text is long enough to exceed 40 characters.';
|
|
54
|
+
divergence.register(cleanContent); // 1st
|
|
55
|
+
divergence.register(cleanContent); // 2nd repeat
|
|
56
|
+
const ctx = createMockContext({
|
|
57
|
+
cleanContent,
|
|
58
|
+
fullContent: cleanContent,
|
|
59
|
+
divergence,
|
|
60
|
+
});
|
|
61
|
+
const result = await checkTurnCompletionGuards(ctx);
|
|
62
|
+
expect(result.status).toBe('halt');
|
|
63
|
+
if (result.status === 'halt') {
|
|
64
|
+
expect(result.content).toContain('[SELF-CORRECT]');
|
|
65
|
+
expect(result.maxTurnsCause).toContain('repetition guard tripped');
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
it('flags ungrounded claim when agent makes claims about uninspected file', async () => {
|
|
69
|
+
const claimLedger = new ClaimLedger();
|
|
70
|
+
const cleanContent = 'I checked src/uninspected.ts and found that path is unused.';
|
|
71
|
+
const messages = [];
|
|
72
|
+
const ctx = createMockContext({
|
|
73
|
+
cleanContent,
|
|
74
|
+
fullContent: cleanContent,
|
|
75
|
+
claimLedger,
|
|
76
|
+
messages,
|
|
77
|
+
});
|
|
78
|
+
const result = await checkTurnCompletionGuards(ctx);
|
|
79
|
+
expect(result.status).toBe('continue');
|
|
80
|
+
expect(messages.some((m) => typeof m.content === 'string' && m.content.includes('[SYSTEM WARNING]'))).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('flags fabricated test count when test count is asserted without test run', async () => {
|
|
83
|
+
const messages = [];
|
|
84
|
+
const cleanContent = 'All tests passed: 42 tests passing.';
|
|
85
|
+
const ctx = createMockContext({
|
|
86
|
+
cleanContent,
|
|
87
|
+
fullContent: cleanContent,
|
|
88
|
+
messages,
|
|
89
|
+
});
|
|
90
|
+
ctx.toolContext.lastVerifyPassCount = undefined;
|
|
91
|
+
const result = await checkTurnCompletionGuards(ctx);
|
|
92
|
+
expect(result.status).toBe('continue');
|
|
93
|
+
expect(messages.some((m) => typeof m.content === 'string' && m.content.includes('npm test'))).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
it('halts when review is produced with zero file observations', async () => {
|
|
96
|
+
const claimLedger = new ClaimLedger();
|
|
97
|
+
const cleanContent = `## Executive Summary of the Architecture and Tech Stack
|
|
98
|
+
1. The project uses Clean Architecture and modular boundaries.
|
|
99
|
+
2. The codebase implements solid separation of concerns across multiple layers.
|
|
100
|
+
|
|
101
|
+
### Key Features & Project Structure
|
|
102
|
+
- Subsystem coordination and multi-agent loops are present.
|
|
103
|
+
- Memory management persistence engine with SQLite backend.
|
|
104
|
+
|
|
105
|
+
### Top Recommendations
|
|
106
|
+
- Add additional end-to-end integration tests for error boundaries.
|
|
107
|
+
- Ensure all modules have comprehensive documentation and type annotations.
|
|
108
|
+
This review covers all the main parts of the system thoroughly.`;
|
|
109
|
+
const ctx = createMockContext({
|
|
110
|
+
userTask: 'review this codebase',
|
|
111
|
+
cleanContent,
|
|
112
|
+
fullContent: cleanContent,
|
|
113
|
+
claimLedger,
|
|
114
|
+
});
|
|
115
|
+
const result = await checkTurnCompletionGuards(ctx);
|
|
116
|
+
expect(result.status).toBe('halt');
|
|
117
|
+
if (result.status === 'halt') {
|
|
118
|
+
expect(result.content).toContain('[SELF-CORRECT]');
|
|
119
|
+
expect(result.maxTurnsCause).toContain('review-without-inspection guard');
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=turn-guards.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-guards.test.js","sourceRoot":"","sources":["../../src/agents/turn-guards.test.ts"],"names":[],"mappings":"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"}
|