diff --git a/src/features/team-mode/team-runtime/resolve-member.test.ts b/src/features/team-mode/team-runtime/resolve-member.test.ts index 09daeda61..f991d9435 100644 --- a/src/features/team-mode/team-runtime/resolve-member.test.ts +++ b/src/features/team-mode/team-runtime/resolve-member.test.ts @@ -75,6 +75,36 @@ describe("resolveMember", () => { expect(result.systemContent).toBe("resolved-system-content") }) + test("strips sisyphusJuniorModel before resolving category members so each declared category keeps its own model", async () => { + // given + const member = { + backendType: "in-process", + isActive: true, + kind: "category", + name: "architect", + category: "ultrabrain", + prompt: "design X", + } satisfies Member + const ctxWithJuniorOverride: ExecutorContext = { + ...createExecutorContext(), + sisyphusJuniorModel: "anthropic/claude-sonnet-4-6", + } + resolveCategoryExecutionMock.mockResolvedValue({ + agentToUse: "sisyphus-junior", + categoryModel: { providerID: "openai", modelID: "gpt-5.5", variant: "xhigh" }, + categoryPromptAppend: "appendix", + maxPromptTokens: 256, + fallbackChain: [], + }) + + // when + await resolveMember(member, ctxWithJuniorOverride, "ultrabrain, deep") + + // then + const [, executorCtxArg] = resolveCategoryExecutionMock.mock.calls[0] + expect(executorCtxArg.sisyphusJuniorModel).toBeUndefined() + }) + test("routes subagent members through resolveSubagentExecution", async () => { // given const member = { diff --git a/src/features/team-mode/team-runtime/resolve-member.ts b/src/features/team-mode/team-runtime/resolve-member.ts index dde6e1a2c..5df673618 100644 --- a/src/features/team-mode/team-runtime/resolve-member.ts +++ b/src/features/team-mode/team-runtime/resolve-member.ts @@ -51,6 +51,14 @@ function resolveSystemContent(input: { }) ?? "" } +// Strip global `agents.sisyphus-junior.model` override at the team-mode boundary — +// `resolveCategoryExecution` ranks it above category defaults (correct for plain +// `task(category=…)`, wrong here) and would collapse every team member to the same model. +function withoutSisyphusJuniorOverride(ctx: ExecutorContext): ExecutorContext { + if (ctx.sisyphusJuniorModel === undefined) return ctx + return { ...ctx, sisyphusJuniorModel: undefined } +} + export async function resolveMember( member: Member, ctx: ExecutorContext, @@ -65,7 +73,7 @@ export async function resolveMember( category: member.category, subagent_type: "sisyphus-junior", }, - ctx, + withoutSisyphusJuniorOverride(ctx), undefined, undefined, )