diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 8690c9aeb..ce13f0ae9 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed subagent frontmatter `thinkingLevel` being overridden by `modelRoles.task` model suffixes. ([#3915](https://github.com/can1357/oh-my-pi/issues/3915)) + ## [16.2.9] - 2026-06-30 ### Breaking Changes diff --git a/packages/coding-agent/src/task/executor.ts b/packages/coding-agent/src/task/executor.ts index d0f718f00..220e2ef3e 100644 --- a/packages/coding-agent/src/task/executor.ts +++ b/packages/coding-agent/src/task/executor.ts @@ -2053,9 +2053,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise {}, + getAvailable: () => [model], + getApiKey: async () => "test-key", + } as unknown as ModelRegistry; +} + describe("runSubprocess parent-discovery pass-through (issue #2190)", () => { afterEach(() => { vi.restoreAllMocks(); @@ -152,4 +164,26 @@ describe("runSubprocess parent-discovery pass-through (issue #2190)", () => { expect(forwarded?.agentId).toBe("ChildAgent"); expect(forwarded?.parentTaskPrefix).toBe("ChildAgent"); }); + + it("lets agent frontmatter thinkingLevel override a task role suffix", async () => { + const model = getBundledModel("anthropic", "claude-sonnet-4-5"); + if (!model) throw new Error("Expected claude-sonnet-4-5 model to exist"); + const settings = Settings.isolated(); + settings.setModelRole("task", `${model.provider}/${model.id}:high`); + const session = yieldEmittingSession(); + const spy = vi.spyOn(sdkModule, "createAgentSession").mockResolvedValue(createSessionResult(session)); + + const result = await runSubprocess({ + ...baseOptions, + agent: { ...baseAgent, model: ["pi/task"] }, + id: "subagent-thinking-precedence", + settings, + modelRegistry: createModelRegistry(model), + thinkingLevel: ThinkingLevel.Low, + }); + + expect(result.exitCode).toBe(0); + const forwarded = spy.mock.calls[0]?.[0]; + expect(forwarded?.thinkingLevel).toBe(ThinkingLevel.Low); + }); });