feat(task): add per-spawn effort ceiling

This commit is contained in:
Wolfgang Schoenberger
2026-07-27 03:39:55 -07:00
parent 02c50eb6f3
commit bd1605e8f5
5 changed files with 80 additions and 7 deletions
@@ -233,6 +233,48 @@ describe("runSubprocess parent-discovery pass-through (issue #2190)", () => {
expect(Object.hasOwn(result, "structuredOutput")).toBe(false);
});
it("caps caller-requested effort at task.maxEffort", async () => {
const model = getBundledModel("openai-codex", "gpt-5.6-sol");
if (!model) throw new Error("Expected gpt-5.6-sol model to exist");
const settings = Settings.isolated({ "task.maxEffort": "low" });
settings.setModelRole("task", `${model.provider}/${model.id}`);
const session = yieldEmittingSession();
const spy = vi.spyOn(sdkModule, "createAgentSession").mockResolvedValue(createSessionResult(session));
const result = await runSubprocess({
...baseOptions,
agent: { ...baseAgent, model: ["@task"] },
id: "subagent-effort-ceiling",
effort: "hi",
settings,
modelRegistry: createModelRegistry(model),
});
expect(result.exitCode).toBe(0);
expect(spy.mock.calls[0]?.[0]?.thinkingLevel).toBe(ThinkingLevel.Low);
});
it("preserves the model's full effort range by default", async () => {
const model = getBundledModel("openai-codex", "gpt-5.6-sol");
if (!model) throw new Error("Expected gpt-5.6-sol model to exist");
const settings = Settings.isolated();
settings.setModelRole("task", `${model.provider}/${model.id}`);
const session = yieldEmittingSession();
const spy = vi.spyOn(sdkModule, "createAgentSession").mockResolvedValue(createSessionResult(session));
const result = await runSubprocess({
...baseOptions,
agent: { ...baseAgent, model: ["@task"] },
id: "subagent-default-effort-ceiling",
effort: "hi",
settings,
modelRegistry: createModelRegistry(model),
});
expect(result.exitCode).toBe(0);
expect(spy.mock.calls[0]?.[0]?.thinkingLevel).toBe(ThinkingLevel.Max);
});
it("resolves an explicit task-role effort suffix over the agent-definition default", async () => {
const model = getBundledModel("anthropic", "claude-sonnet-4-5");
if (!model) throw new Error("Expected claude-sonnet-4-5 model to exist");