fix(model-fallback): respect user model override for sisyphus-junior category sessions (#2941)

When users configure agents.sisyphus-junior.model, category sessions
should use that model without falling back to hardcoded
AGENT_MODEL_REQUIREMENTS. Two leaks existed:

1. Launch-time: category-resolver.ts did not check overrideModel when
   deciding whether to use the hardcoded fallbackChain. Fixed by adding
   overrideModel to the suppression condition.

2. Runtime retry: model-fallback hook.ts treated undefined fallbackChain
   (from setSessionFallbackChain(id, undefined)) as 'no override' and
   fell through to AGENT_MODEL_REQUIREMENTS on session.error/status
   retry. Fixed by storing explicit empty array and checking .has()
   instead of truthiness.

Tests added:
- hook.test.ts: explicit empty session fallback suppresses agent chain
- event.model-fallback-2941.test.ts: session.error does not arm retry
- category-resolver.test.ts: overrideModel suppresses fallbackChain
- tools.test.ts: sisyphusJuniorModel override assertion
This commit is contained in:
YeonGyu-Kim
2026-04-07 11:20:42 +09:00
parent 12106ffccc
commit 889294a5fd
6 changed files with 222 additions and 4 deletions
@@ -484,4 +484,32 @@ describe("resolveCategoryExecution", () => {
})
expect(result.fallbackChain).toBeUndefined()
})
test("does not inherit hardcoded fallbackChain when sisyphus-junior model override is set [regression #2941]", async () => {
//#given
const args = {
category: "quick",
prompt: "test prompt",
description: "Test task",
run_in_background: false,
load_skills: [],
blockedBy: undefined,
enableSkillTools: false,
}
const executorCtx = createMockExecutorContext()
executorCtx.sisyphusJuniorModel = "anthropic/claude-sonnet-4-6"
//#when
const result = await resolveCategoryExecution(args, executorCtx, undefined, "anthropic/claude-sonnet-4-6")
//#then
expect(result.error).toBeUndefined()
expect(result.actualModel).toBe("anthropic/claude-sonnet-4-6")
expect(result.categoryModel).toEqual({
providerID: "anthropic",
modelID: "claude-sonnet-4-6",
variant: undefined,
})
expect(result.fallbackChain).toBeUndefined()
})
})