diff --git a/ui/src/components/IssueProperties.test.tsx b/ui/src/components/IssueProperties.test.tsx index 497250de9c..6a346577c2 100644 --- a/ui/src/components/IssueProperties.test.tsx +++ b/ui/src/components/IssueProperties.test.tsx @@ -1631,7 +1631,7 @@ describe("IssueProperties", () => { await flush(); await flush(); - expect(container.textContent).toContain("Custom · gpt-5.4 · high"); + expect(container.textContent).toContain("Override · gpt-5.4 · high"); expect(container.textContent).toContain("Model lane"); // Wait for the adapter-models query to resolve so the model options render. diff --git a/ui/src/components/issue-properties/IssueProperties.tsx b/ui/src/components/issue-properties/IssueProperties.tsx index 911228a24b..49e199b2af 100644 --- a/ui/src/components/issue-properties/IssueProperties.tsx +++ b/ui/src/components/issue-properties/IssueProperties.tsx @@ -512,9 +512,13 @@ export function IssueProperties({ assigneeOverrideThinkingEffort, assigneeOverrideChrome ? "Chrome" : "", ].filter(Boolean); + const summary = details.length > 0 ? `Override · ${details.join(" · ")}` : "Override · adapter options"; return ( - 0 ? `Custom · ${details.join(" · ")}` : "Custom adapter options"}> - Custom{details.length > 0 ? ` · ${details.join(" · ")}` : " adapter options"} + 0 ? ` (${details.join(" · ")})` : ""}`} + > + {summary} ); } @@ -537,7 +541,7 @@ export function IssueProperties({ )} onClick={() => setAssigneeOverrideLane(lane)} > - {lane === "primary" ? "Primary" : lane === "cheap" ? "Cheap" : "Custom"} + {lane === "primary" ? "Primary" : lane === "cheap" ? "Cheap" : "Override"} ))} @@ -551,6 +555,11 @@ export function IssueProperties({ : <>· falls back to the primary model if no cheap profile is configured>}
) : null} + {assigneeOverrideLane === "custom" ? ( ++ Task-level model override — replaces the agent's primary model for this issue. +
+ ) : null} {assigneeOverrideLane === "custom" ? ( <> diff --git a/ui/storybook/stories/issue-management.stories.tsx b/ui/storybook/stories/issue-management.stories.tsx index ed021a4c56..20ba434755 100644 --- a/ui/storybook/stories/issue-management.stories.tsx +++ b/ui/storybook/stories/issue-management.stories.tsx @@ -62,6 +62,19 @@ const primaryIssue: Issue = { documentSummaries: issueDocumentSummaries, currentExecutionWorkspace: storybookExecutionWorkspaces[0]!, }; +const modelOverrideIssue: Issue = { + ...primaryIssue, + id: "issue-model-override-visual", + identifier: "MOD-1", + issueNumber: 1, + title: "Verify task-level model override provenance", + assigneeAdapterOverrides: { + adapterConfig: { + model: "gpt-5.6", + modelReasoningEffort: "high", + }, + }, +}; const childIssues = storybookIssues.filter((issue) => issue.parentId === primaryIssue.id); const longProject: Project = { ...storybookProjects[0]!, @@ -311,6 +324,27 @@ function IssuePropertiesLongValuePane({ inline = false }: { inline?: boolean }) ); } +function IssuePropertiesModelOverridePane() { + return ( +