diff --git a/packages/engine/src/__tests__/mcp-pr-response-forwarding.test.ts b/packages/engine/src/__tests__/mcp-pr-response-forwarding.test.ts index 927bec2a5c..92134e7bec 100644 --- a/packages/engine/src/__tests__/mcp-pr-response-forwarding.test.ts +++ b/packages/engine/src/__tests__/mcp-pr-response-forwarding.test.ts @@ -16,6 +16,12 @@ vi.mock("../agent-session-helpers.js", () => ({ provider: settings.defaultProvider, modelId: settings.defaultModelId, })), + // FNXC:EngineTestDrift 2026-07-11-22:30: + // pr-response-run-ops resolves the merger lane thinking level via + // resolveMergerThinkingLevel (Settings-ThinkingLevel precedence, 2026-07-10). + // The mock must surface it or every PR-response run throws on the missing + // export. Neutral undefined return — no test asserts on thinking level. + resolveMergerThinkingLevel: vi.fn(() => undefined), })); vi.mock("../pi.js", () => ({ diff --git a/packages/engine/src/__tests__/restart.integration.test.ts b/packages/engine/src/__tests__/restart.integration.test.ts index 285891d266..8692a8714f 100644 --- a/packages/engine/src/__tests__/restart.integration.test.ts +++ b/packages/engine/src/__tests__/restart.integration.test.ts @@ -132,6 +132,20 @@ vi.mock("../agent-session-helpers.js", async () => { } return { provider: undefined, modelId: undefined }; }, + // FNXC:EngineTestDrift 2026-07-11-22:30: + // agent-session-helpers gained phase/lane thinking-level + fallback resolvers + // (Settings-ThinkingLevel precedence, 2026-07-10) and an implicit planning + // fallback model resolver. The exercised executor + triage paths import them; + // surface the full set so the next export doesn't re-break this mock. + resolveExecutorThinkingLevel: vi.fn(() => undefined), + resolveExecutorFallbackThinkingLevel: vi.fn(() => undefined), + resolvePlanningThinkingLevel: vi.fn(() => undefined), + resolvePlanningFallbackThinkingLevel: vi.fn(() => undefined), + resolveValidatorThinkingLevel: vi.fn(() => undefined), + resolveValidatorFallbackThinkingLevel: vi.fn(() => undefined), + resolveMergerThinkingLevel: vi.fn(() => undefined), + resolveMergerFallbackThinkingLevel: vi.fn(() => undefined), + resolveImplicitPlanningFallbackModel: vi.fn(() => ({ provider: undefined, modelId: undefined })), }; }); vi.mock("node:child_process", () => { diff --git a/packages/engine/src/__tests__/triage-soft-delete-write-abort.test.ts b/packages/engine/src/__tests__/triage-soft-delete-write-abort.test.ts index ce8ff347dd..f604eed124 100644 --- a/packages/engine/src/__tests__/triage-soft-delete-write-abort.test.ts +++ b/packages/engine/src/__tests__/triage-soft-delete-write-abort.test.ts @@ -16,6 +16,20 @@ vi.mock("../agent-session-helpers.js", () => ({ createResolvedAgentSession: mockCreateResolvedAgentSession, extractRuntimeHint: vi.fn(), resolvePlanningSessionModel: vi.fn().mockReturnValue({ provider: "mock", modelId: "mock-model" }), + // FNXC:EngineTestDrift 2026-07-11-22:30: + // triage.ts planning imports resolvePlanningThinkingLevel + + // resolveImplicitPlanningFallbackModel (Settings-ThinkingLevel precedence + + // implicit fallback model, 2026-07-10). Surface the full resolver set so the + // next export doesn't re-break specifyTask on a missing mock member. + resolveExecutorThinkingLevel: vi.fn(() => undefined), + resolveExecutorFallbackThinkingLevel: vi.fn(() => undefined), + resolvePlanningThinkingLevel: vi.fn(() => undefined), + resolvePlanningFallbackThinkingLevel: vi.fn(() => undefined), + resolveValidatorThinkingLevel: vi.fn(() => undefined), + resolveValidatorFallbackThinkingLevel: vi.fn(() => undefined), + resolveMergerThinkingLevel: vi.fn(() => undefined), + resolveMergerFallbackThinkingLevel: vi.fn(() => undefined), + resolveImplicitPlanningFallbackModel: vi.fn(() => ({ provider: undefined, modelId: undefined })), })); vi.mock("../pi.js", () => { diff --git a/packages/engine/src/__tests__/triage-stuck-requeue-preserve-draft.test.ts b/packages/engine/src/__tests__/triage-stuck-requeue-preserve-draft.test.ts index 01dd324758..01892d1a5b 100644 --- a/packages/engine/src/__tests__/triage-stuck-requeue-preserve-draft.test.ts +++ b/packages/engine/src/__tests__/triage-stuck-requeue-preserve-draft.test.ts @@ -15,19 +15,41 @@ vi.mock("../agent-session-helpers.js", () => ({ createResolvedAgentSession: mockCreateResolvedAgentSession, extractRuntimeHint: vi.fn(), resolvePlanningSessionModel: vi.fn().mockReturnValue({ provider: "mock", modelId: "mock-model" }), + // FNXC:EngineTestDrift 2026-07-11-22:30: + // triage.ts planning imports resolvePlanningThinkingLevel + + // resolveImplicitPlanningFallbackModel (Settings-ThinkingLevel precedence + + // implicit fallback model, 2026-07-10). Surface the full resolver set so the + // next export doesn't re-break specifyTask on a missing mock member. + resolveExecutorThinkingLevel: vi.fn(() => undefined), + resolveExecutorFallbackThinkingLevel: vi.fn(() => undefined), + resolvePlanningThinkingLevel: vi.fn(() => undefined), + resolvePlanningFallbackThinkingLevel: vi.fn(() => undefined), + resolveValidatorThinkingLevel: vi.fn(() => undefined), + resolveValidatorFallbackThinkingLevel: vi.fn(() => undefined), + resolveMergerThinkingLevel: vi.fn(() => undefined), + resolveMergerFallbackThinkingLevel: vi.fn(() => undefined), + resolveImplicitPlanningFallbackModel: vi.fn(() => ({ provider: undefined, modelId: undefined })), })); -vi.mock("../pi.js", () => ({ - describeModel: vi.fn().mockReturnValue("mock-model"), - promptWithFallback: mockPromptWithFallback, - // FNXC:TriageTests 2026-07-02-07:40: - // triage.ts specifyTask now calls formatModelMarkerDetails (from pi.js) to - // build the model-marker log line after the agent session resolves. The mock - // must expose the export so the stuck-requeue planning path can reach - // finalization (moveTask todo / needs-replan) instead of throwing on a - // missing mock member. - formatModelMarkerDetails: vi.fn((model: string) => model), -})); +vi.mock("../pi.js", () => { + // FNXC:EngineTestDrift 2026-07-11-22:30: + // triage.ts specifyTask catch guards `err instanceof ModelFallbackExhaustedError` + // (FN-7559). The pi mock must expose the class so the stuck-requeue planning + // path can finalize instead of throwing on a missing mock member. + class ModelFallbackExhaustedError extends Error {} + return { + describeModel: vi.fn().mockReturnValue("mock-model"), + promptWithFallback: mockPromptWithFallback, + // FNXC:TriageTests 2026-07-02-07:40: + // triage.ts specifyTask now calls formatModelMarkerDetails (from pi.js) to + // build the model-marker log line after the agent session resolves. The mock + // must expose the export so the stuck-requeue planning path can reach + // finalization (moveTask todo / needs-replan) instead of throwing on a + // missing mock member. + formatModelMarkerDetails: vi.fn((model: string) => model), + ModelFallbackExhaustedError, + }; +}); function createTask(overrides: Partial = {}): Task { return {