diff --git a/.changeset/fn-7377-planner-chat-failed-banner.md b/.changeset/fn-7377-planner-chat-failed-banner.md
new file mode 100644
index 0000000000..6d3dc3b88b
--- /dev/null
+++ b/.changeset/fn-7377-planner-chat-failed-banner.md
@@ -0,0 +1,7 @@
+---
+"@runfusion/fusion": patch
+---
+
+summary: Hide failed-task banners while task planner chat is maximized.
+category: fix
+dev: TaskDetailModal no longer mounts failed-banner chrome during expanded planner Chat; Activity and collapsed detail still show failures.
diff --git a/packages/dashboard/app/components/TaskDetailModal.tsx b/packages/dashboard/app/components/TaskDetailModal.tsx
index d97e058ad0..512919ce8b 100644
--- a/packages/dashboard/app/components/TaskDetailModal.tsx
+++ b/packages/dashboard/app/components/TaskDetailModal.tsx
@@ -2728,6 +2728,11 @@ export function TaskDetailContent({
Maximized Activity applies to Live, Feed, and Raw Logs, not only the legacy `current` chat segment. Reserve the detail surface for header context and Activity content, and do not mount branch-group chrome in this mode so expand/promote controls are not hidden-but-focusable.
*/
const shouldShowBranchGroupCard = Boolean(task.branchContext?.groupId && !isActivityExpanded);
+ /*
+ FNXC:TaskDetailPlannerChat 2026-07-01-00:00:
+ Maximized Planner Chat reserves vertical room for task identity and the planner conversation, so failed-task chrome is not mounted in that state. Normal detail, Activity expansion, and collapsed Planner Chat still surface task failures immediately.
+ */
+ const shouldShowTaskFailureAlert = Boolean(task.status === "failed" && task.error && !isPlannerChatExpanded);
const taskActionMenuModel = useMemo(() => buildTaskActionMenuModel({
task,
@@ -3463,7 +3468,7 @@ export function TaskDetailContent({
{isWorkspaceTask(workingTask) && }
>
)}
- {task.status === "failed" && task.error && (
+ {shouldShowTaskFailureAlert && (
⚠
diff --git a/packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx b/packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx
index 1b92aeafe5..8dee9d1e02 100644
--- a/packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx
+++ b/packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx
@@ -228,6 +228,107 @@ describe("TaskDetailModal planner Chat tab", () => {
expect(detail).toHaveClass("task-detail-content--planner-chat-expanded");
expect(detail).not.toHaveClass("task-detail-content--chat-expanded");
});
+
+ it("hides failed-task banner only while planner Chat is expanded and restores it on collapse", async () => {
+ const user = userEvent.setup();
+ const { container } = render(
+ ,
+ );
+ const detail = container.querySelector(".task-detail-content");
+
+ expect(screen.getByText("Task Failed")).toBeInTheDocument();
+ expect(screen.getByText("Planner failed hard")).toBeInTheDocument();
+ expect(container.querySelector(".detail-error-alert")).toBeInTheDocument();
+
+ await user.click(screen.getByTestId("task-planner-chat-expand-toggle"));
+
+ expect(detail).toHaveClass("task-detail-content--planner-chat-expanded");
+ expect(screen.queryByText("Task Failed")).not.toBeInTheDocument();
+ expect(screen.queryByText("Planner failed hard")).not.toBeInTheDocument();
+ expect(container.querySelector(".detail-error-alert")).toBeNull();
+
+ await user.click(screen.getByTestId("task-planner-chat-expand-toggle"));
+
+ expect(detail).not.toHaveClass("task-detail-content--planner-chat-expanded");
+ expect(screen.getByText("Task Failed")).toBeInTheDocument();
+ expect(screen.getByText("Planner failed hard")).toBeInTheDocument();
+ expect(container.querySelector(".detail-error-alert")).toBeInTheDocument();
+ });
+
+ it("keeps failed-task banner visible while Activity is expanded", async () => {
+ const user = userEvent.setup();
+ const { container } = render(
+ ,
+ );
+ const detail = container.querySelector(".task-detail-content");
+
+ expect(screen.getByText("Task Failed")).toBeInTheDocument();
+ expect(screen.getByText("Activity failure stays visible")).toBeInTheDocument();
+
+ await user.click(screen.getByTestId("task-chat-expand-toggle"));
+
+ expect(detail).toHaveClass("task-detail-content--chat-expanded");
+ expect(detail).not.toHaveClass("task-detail-content--planner-chat-expanded");
+ expect(screen.getByText("Task Failed")).toBeInTheDocument();
+ expect(screen.getByText("Activity failure stays visible")).toBeInTheDocument();
+ expect(container.querySelector(".detail-error-alert")).toBeInTheDocument();
+ });
+
+ it("does not render empty failed-task alert shells for non-failed or errorless failed tasks", () => {
+ const { container, rerender } = render(
+ ,
+ );
+
+ expect(screen.queryByText("Task Failed")).not.toBeInTheDocument();
+ expect(container.querySelector(".detail-error-alert")).toBeNull();
+
+ rerender(
+ ,
+ );
+
+ expect(screen.queryByText("Task Failed")).not.toBeInTheDocument();
+ expect(container.querySelector(".detail-error-alert")).toBeNull();
+ });
});
describe("TaskDetailModal summarize title action", () => {