diff --git a/docs/settings-reference.md b/docs/settings-reference.md index 991528236..15f60d5e1 100644 --- a/docs/settings-reference.md +++ b/docs/settings-reference.md @@ -243,6 +243,12 @@ Defaults from `DEFAULT_PROJECT_SETTINGS`; key scope from `PROJECT_SETTINGS_KEYS` | `insightExtractionEnabled` | `boolean` | `false` | Enable scheduled memory insight extraction. | | `insightExtractionSchedule` | `string` | `"0 2 * * *"` | Insight extraction cron schedule. | | `insightExtractionMinIntervalMs` | `number` | `86400000` | Minimum interval between extractions (24h). | +| `taskEvaluationEnabled` | `boolean` | `false` | Enable scheduled completed-task evaluation batches. | +| `taskEvaluationSchedule` | `string` | `"0 5 * * *"` | Cron schedule for the scheduled task-evaluation batch automation. | +| `taskEvaluationProvider` | `string` | `undefined` | Optional provider override used by scheduled task-evaluation runs. | +| `taskEvaluationModelId` | `string` | `undefined` | Optional model ID override paired with `taskEvaluationProvider`. | +| `taskEvaluationFollowUpPolicy` | `"off" \| "suggest" \| "create"` | `"off"` | Follow-up handling policy for scheduled task-evaluation outcomes. | +| `taskEvaluationRetention` | `number` | `undefined` | Optional retention window (days) for scheduled task-evaluation history. | | `memoryEnabled` | `boolean` | `true` | Enable project memory integration. | | `memoryBackendType` | `string` | `"qmd"` | Memory backend type. Built-ins include `qmd` (Quantized Memory Distillation, default), `file`, and `readonly`; custom backends can also be registered. | | `memoryAutoSummarizeEnabled` | `boolean` | `false` | Enable automatic memory summarization when memory exceeds threshold. | diff --git a/packages/core/src/__tests__/eval-automation.test.ts b/packages/core/src/__tests__/eval-automation.test.ts index 5aefca295..92dfeabc0 100644 --- a/packages/core/src/__tests__/eval-automation.test.ts +++ b/packages/core/src/__tests__/eval-automation.test.ts @@ -26,7 +26,26 @@ describe("eval-automation", () => { const resolved = resolveTaskEvaluationSettings({}); expect(resolved.taskEvaluationEnabled).toBe(false); expect(resolved.taskEvaluationSchedule).toBe(DEFAULT_TASK_EVALUATION_SCHEDULE); + expect(resolved.taskEvaluationProvider).toBeUndefined(); + expect(resolved.taskEvaluationModelId).toBeUndefined(); expect(resolved.taskEvaluationFollowUpPolicy).toBe("off"); + expect(resolved.taskEvaluationRetention).toBeUndefined(); + }); + + it("resolves task evaluation provider/model/retention overrides", () => { + const resolved = resolveTaskEvaluationSettings({ + taskEvaluationEnabled: true, + taskEvaluationProvider: "anthropic", + taskEvaluationModelId: "claude-sonnet-4-5", + taskEvaluationFollowUpPolicy: "create", + taskEvaluationRetention: 30, + }); + + expect(resolved.taskEvaluationEnabled).toBe(true); + expect(resolved.taskEvaluationProvider).toBe("anthropic"); + expect(resolved.taskEvaluationModelId).toBe("claude-sonnet-4-5"); + expect(resolved.taskEvaluationFollowUpPolicy).toBe("create"); + expect(resolved.taskEvaluationRetention).toBe(30); }); it("creates scheduled eval automation", () => { diff --git a/packages/core/src/__tests__/settings-parity.test.ts b/packages/core/src/__tests__/settings-parity.test.ts index 1f32192bc..03b98a288 100644 --- a/packages/core/src/__tests__/settings-parity.test.ts +++ b/packages/core/src/__tests__/settings-parity.test.ts @@ -121,6 +121,26 @@ describe("research global key parity regression (FN-3313)", () => { // ── Model Lane Key Parity Regression Tests (FN-1729) ──────────────────────── +describe("task evaluation key parity regression (FN-3514)", () => { + const taskEvaluationDefaults = { + taskEvaluationEnabled: false, + taskEvaluationSchedule: "0 5 * * *", + taskEvaluationProvider: undefined, + taskEvaluationModelId: undefined, + taskEvaluationFollowUpPolicy: "off", + taskEvaluationRetention: undefined, + } as const; + + it.each(Object.entries(taskEvaluationDefaults))( + "%s is project-scoped with expected default", + (key, expectedDefault) => { + expect(isProjectSettingsKey(key)).toBe(true); + expect(isGlobalSettingsKey(key)).toBe(false); + expect((DEFAULT_PROJECT_SETTINGS as Record)[key]).toBe(expectedDefault); + }, + ); +}); + describe("model lane key parity regression (FN-1729)", () => { // All model lane provider/modelId pairs that should exist const allModelLanePairs = [