diff --git a/.changeset/remove-task-card-workflow-step-badge.md b/.changeset/remove-task-card-workflow-step-badge.md
new file mode 100644
index 0000000000..68d4e5cf29
--- /dev/null
+++ b/.changeset/remove-task-card-workflow-step-badge.md
@@ -0,0 +1,7 @@
+---
+"@runfusion/fusion": patch
+---
+
+summary: Remove redundant workflow labels from expanded task-card step lists.
+category: fix
+dev: Workflow step rows still show names, status dots, and active badges; the aggregate card workflow badge is unchanged.
diff --git a/packages/dashboard/app/components/TaskCard.css b/packages/dashboard/app/components/TaskCard.css
index 3851af6aef..9d00af6718 100644
--- a/packages/dashboard/app/components/TaskCard.css
+++ b/packages/dashboard/app/components/TaskCard.css
@@ -1153,30 +1153,6 @@ executing. These map 1:1 to the unified progress status so the dot color encodes
text-transform: uppercase;
}
-.card-step-workflow-badge {
- margin-left: auto;
- padding: 0 var(--space-xs);
- border-radius: var(--radius-pill);
- border: 1px solid var(--border);
- font-size: 0.5625rem;
- color: var(--text-muted);
- background: var(--surface);
- white-space: nowrap;
-}
-
-.card-step-workflow-badge--pre-merge {
- color: var(--in-review);
- background: var(--status-in-review-bg);
- border-color: color-mix(in srgb, var(--in-review) 35%, var(--border));
-}
-
-.card-step-workflow-badge--post-merge {
- color: var(--done);
- background: var(--status-done-bg);
- border-color: color-mix(in srgb, var(--done) 35%, var(--border));
-}
-
-
/* Animation for initializing spinner */
@keyframes task-card-initializing-spinner-spin {
from {
diff --git a/packages/dashboard/app/components/TaskCard.tsx b/packages/dashboard/app/components/TaskCard.tsx
index 39a687814b..8e8a27af8a 100644
--- a/packages/dashboard/app/components/TaskCard.tsx
+++ b/packages/dashboard/app/components/TaskCard.tsx
@@ -2788,6 +2788,9 @@ function TaskCardComponent({
`failed` (blocking gate failure → red/error). `running` shows the in-progress color.
No `card-step-dot--workflow-failed` override is needed — the status class carries the
distinction directly.
+
+ FNXC:WorkflowSteps 2026-06-30-12:00:
+ Workflow-sourced rows remain visible through their step names and status dots, but task cards intentionally omit the redundant `workflow` text badge so expanded step lists stay focused on progress.
*/
return (
@@ -2803,14 +2806,6 @@ function TaskCardComponent({
{t("tasks.active", "active")}
)}
- {step.source === "workflow" && (
-
- {t("tasks.workflow", "workflow")}
-
- )}
);
})}
diff --git a/packages/dashboard/app/components/__tests__/TaskCard.test.tsx b/packages/dashboard/app/components/__tests__/TaskCard.test.tsx
index 37435e6d28..cb5d9dafdb 100644
--- a/packages/dashboard/app/components/__tests__/TaskCard.test.tsx
+++ b/packages/dashboard/app/components/__tests__/TaskCard.test.tsx
@@ -2270,7 +2270,8 @@ describe("TaskCard", () => {
// FNXC:WorkflowSteps 2026-06-25-00:00 — graph-written results drive the card progress; names come from
// result.workflowStepName (with raw-id fallback), and advisory_failure (amber) is visually distinct
// from failed (red). No board-level name lookup is involved.
- it("renders workflow checks after normal steps with graph-written statuses and phase badges", () => {
+ // FNXC:WorkflowSteps 2026-06-30-12:00 — expanded task-card rows deliberately omit the redundant workflow text badge; tests preserve mixed implementation/workflow visibility through names, status dots, and the active badge instead.
+ it("renders workflow checks after normal steps with graph-written statuses and no workflow text badges", () => {
const { container } = render(
{
{ name: "Step 0", status: "done" },
{ name: "Step 1", status: "failed" as any },
],
- enabledWorkflowSteps: ["WS-001", "WS-002", "WS-003", "WS-004"],
+ enabledWorkflowSteps: ["WS-001", "WS-002", "WS-003", "WS-004", "WS-005"],
workflowStepResults: [
{
workflowStepId: "WS-001",
@@ -2296,6 +2297,12 @@ describe("TaskCard", () => {
workflowStepName: "Code Review Gate",
status: "failed",
},
+ {
+ workflowStepId: "WS-005",
+ workflowStepName: "Merge Validation",
+ status: "pending",
+ startedAt: "2026-06-25T00:00:00.000Z",
+ },
],
})}
onOpenDetail={noop}
@@ -2312,6 +2319,7 @@ describe("TaskCard", () => {
"Frontend UX Design",
"WS 003",
"Code Review Gate",
+ "Merge Validation",
]);
const dots = container.querySelectorAll(".card-step-dot");
@@ -2333,18 +2341,15 @@ describe("TaskCard", () => {
expect(dots[5]?.className).toContain("card-step-dot--failed");
expect(dots[5]?.className).not.toContain("card-step-dot--advisory_failure");
+ // Started-but-not-finished workflow step → running with the same active badge as implementation steps.
+ expect(dots[6]?.className).toContain("card-step-dot--running");
+ expect(dots[6]?.className).not.toContain("card-step-dot--pending");
+ expect(container.querySelector(".card-step-active-badge")?.textContent).toBe("active");
+
const workflowBadgeElements = container.querySelectorAll(".card-step-workflow-badge");
- const workflowBadges = Array.from(workflowBadgeElements).map((el) => el.textContent);
- expect(workflowBadges).toEqual(["workflow", "workflow", "workflow", "workflow"]);
-
- expect(workflowBadgeElements[0]?.className).toContain("card-step-workflow-badge--pre-merge");
- expect(workflowBadgeElements[1]?.className).toContain("card-step-workflow-badge--post-merge");
- expect(workflowBadgeElements[2]?.className).toContain("card-step-workflow-badge--pre-merge");
- expect(workflowBadgeElements[3]?.className).toContain("card-step-workflow-badge--pre-merge");
-
- workflowBadgeElements.forEach((badge) => {
- expect(badge.getAttribute("title")).toBe("Workflow check");
- });
+ expect(workflowBadgeElements).toHaveLength(0);
+ expect(container.querySelector('[title="Workflow check"]')).toBeNull();
+ expect(Array.from(container.querySelectorAll(".card-step-item")).some((item) => item.textContent === "workflow")).toBe(false);
});
it("renders the running state for a started-but-not-completed workflow step", () => {