diff --git a/packages/dashboard/app/components/TaskCard.css b/packages/dashboard/app/components/TaskCard.css
index 52099203a7..7fadc847c4 100644
--- a/packages/dashboard/app/components/TaskCard.css
+++ b/packages/dashboard/app/components/TaskCard.css
@@ -13,6 +13,13 @@
position: relative;
user-select: none;
touch-action: pan-x pan-y;
+ /*
+ FNXC:TaskCardLayout 2026-08-05-07:31 (FN-8802):
+ Every TaskCard host can become narrower than a card's populated intrinsic content, including pinned desktop docks and mobile columns. Make the shared root a border-box, shrinkable flex item so existing title truncation, badge wrapping, footer-chip wrapping, and visible trailing controls contain themselves without host-specific branches.
+ */
+ box-sizing: border-box;
+ min-width: 0;
+ max-width: 100%;
container-type: inline-size;
container-name: task-card;
}
diff --git a/packages/dashboard/app/components/__tests__/TaskCard.badge-wrap.test.tsx b/packages/dashboard/app/components/__tests__/TaskCard.badge-wrap.test.tsx
index fab85ff8c3..1874bcaa67 100644
--- a/packages/dashboard/app/components/__tests__/TaskCard.badge-wrap.test.tsx
+++ b/packages/dashboard/app/components/__tests__/TaskCard.badge-wrap.test.tsx
@@ -825,4 +825,43 @@ describe("TaskCard badge wrapping (FN-5162)", () => {
expect(styles.justifyContent).toBe("flex-start");
expect(styles.minWidth).toBe("0px");
});
+
+ it("contains minimal and populated cards when a host narrows below the mobile breakpoint", () => {
+ const { container: minimalContainer } = render(
+ ,
+ );
+ const { container: populatedContainer } = render(
+ makeTask()}
+ workflowBadge={{ workflowId: "wf-narrow", workflowName: "A workflow badge with an intentionally long name" }}
+ />,
+ );
+
+ for (const card of [
+ minimalContainer.querySelector(".card"),
+ populatedContainer.querySelector(".card"),
+ ] as HTMLElement[]) {
+ expect(card).toBeTruthy();
+ const styles = getComputedStyle(card);
+ expect(styles.minWidth).toBe("0px");
+ expect(styles.maxWidth).toBe("100%");
+ expect(styles.boxSizing).toBe("border-box");
+ }
+
+ expect(populatedContainer.querySelector(".card-menu-btn")).toBeTruthy();
+ expect(populatedContainer.querySelector(".card-size-badge")).toBeTruthy();
+ expect(populatedContainer.querySelector(".card-title")).toHaveTextContent("A deliberately long task title");
+ });
});