From ca171502f7a19f10f517f0eaad49923219abc0e7 Mon Sep 17 00:00:00 2001 From: Fusion Agent Date: Tue, 25 Aug 2026 01:40:26 +0000 Subject: [PATCH] fix(FN-WF): show review-lane gate progress on task rows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `TaskCard` already switches to the full pipeline once a card reaches its review lane, but `ListView` resolved progress with `scope: "implementation"` unconditionally — and `shouldShowTaskProgress` suppressed the review column outright. Implementation scope hides exactly `verification`, `documentation-delivery` and `code-review`, so a list row showed "-" or a stale count for the stage the operator was watching. That default was written when those steps existed only as invisible gates. builtin:coding-ideas-v2 promotes them into first-class review-lane work, so the rule now hides the very thing it was asked to surface. Both call sites resolve the lane through `isReviewColumnRole` — by trait, not by the hardcoded `in-review` id, so a renamed board behaves the same. Regression coverage asserts both directions: implementation scope still hides the gates, and the full pipeline surfaces Verification, Documentation & Delivery and Code Review. Dashboard 250 tests, smoke lane 6 files / 81 tests / 19/19 scenarios, test:gate and verify:fast green. --- .changeset/review-lane-progress-visibility.md | 7 ++++ .../dashboard/app/components/ListView.tsx | 25 +++++++++++++-- .../taskProgress.review-gates.test.ts | 32 +++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 .changeset/review-lane-progress-visibility.md diff --git a/.changeset/review-lane-progress-visibility.md b/.changeset/review-lane-progress-visibility.md new file mode 100644 index 0000000000..583f5e83dd --- /dev/null +++ b/.changeset/review-lane-progress-visibility.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Task rows now show Verification and Documentation & Delivery progress while a card sits in review. +category: fix +dev: `ListView` resolved progress with `scope: "implementation"` unconditionally while `TaskCard` already switched to the full pipeline in the review lane, so review-column gates were invisible in list view and `shouldShowTaskProgress` suppressed the column entirely. Both now resolve the lane through `isReviewColumnRole` (trait-based, not the hardcoded `in-review` id). This matters for review-column workflows such as `builtin:coding-ideas-v2`, which promote Verification and Documentation & Delivery from hidden checklist entries into first-class review-lane gates. diff --git a/packages/dashboard/app/components/ListView.tsx b/packages/dashboard/app/components/ListView.tsx index 90055eced1..d5ef2a9ad0 100644 --- a/packages/dashboard/app/components/ListView.tsx +++ b/packages/dashboard/app/components/ListView.tsx @@ -7,7 +7,7 @@ import { ArrowUpDown, ArrowUp, ArrowDown, Link, Columns3, EyeOff, Eye, ChevronRi import { DEFAULT_COLUMN, THINKING_LEVELS, getErrorMessage, isColumn, sortTasksForDisplayColumn, type Task, type TaskDetail, type Column, type ColumnId, type TaskCreateInput, type MergeResult, type GithubIssueAction, type PrInfo, type ThinkingLevel } from "@fusion/core"; import { resolveEffectiveAutoMerge } from "../../../core/src/merge/task-merge"; import { useColumnLabel } from "../i18n/labels"; -import { isArchivedColumnRole, isCompleteColumnRole, isIntakeColumnRole, isPreImplementationColumnRole, isWipColumnRole } from "../utils/columnRoles"; +import { isArchivedColumnRole, isCompleteColumnRole, isIntakeColumnRole, isPreImplementationColumnRole, isReviewColumnRole, isWipColumnRole } from "../utils/columnRoles"; import { batchUpdateTaskModels, fetchNodes, fetchTaskDetail, rebuildTaskSpec, refreshPrStatus, updateTask } from "../api"; import { TaskDetailContent } from "./TaskDetailModal"; import { PrCreateModal } from "./PrCreateModal"; @@ -336,7 +336,15 @@ interface ListViewProps { * looked idle while an agent was working in it. */ function shouldShowTaskProgress(task: Task, flags?: Parameters[0]): boolean { - return task.status === "executing" || isWipColumnRole(flags, task.column); + /* + FNXC:TaskCardWorkflowProgress 2026-08-24-19:30: + Review-lane rows must report progress too. A workflow whose Verification and Documentation gates + run in the review column has real, advancing work there; suppressing the column left the operator + with no signal for the stage they explicitly promoted. + */ + return task.status === "executing" + || isWipColumnRole(flags, task.column) + || isReviewColumnRole(flags, task.column); } function getTaskProgress( @@ -346,8 +354,19 @@ function getTaskProgress( /* FNXC:TaskCardWorkflowProgress 2026-07-21-22:26: List progress for WIP matches TaskCard: only implementation steps, not Todo Plan Review or In-review Code Review gates. + + FNXC:TaskCardWorkflowProgress 2026-08-24-19:30: + ...but that match was only half-implemented: TaskCard switches to the full pipeline once the card + reaches its review lane (`scope: task.column === "in-review" ? "full" : "implementation"`), while + this list stayed on implementation scope unconditionally. A review-column workflow such as + builtin:coding-ideas-v2 promotes Verification and Documentation & Delivery from hidden checklist + entries into first-class review-lane gates, so a list row showed `-` or a stale count for exactly + the stage the operator moved them there to watch. Resolve the lane by TRAIT, not by the hardcoded + `in-review` id, so a renamed board behaves the same. */ - const progress = getUnifiedTaskProgress(task, { scope: "implementation" }); + const progress = getUnifiedTaskProgress(task, { + scope: isReviewColumnRole(columnFlags, task.column) ? "full" : "implementation", + }); if (progress.total === 0 || !shouldShowTaskProgress(task, columnFlags)) { return { label: "-", percent: 0, hasProgress: false }; } diff --git a/packages/dashboard/app/utils/__tests__/taskProgress.review-gates.test.ts b/packages/dashboard/app/utils/__tests__/taskProgress.review-gates.test.ts index cdb00827a8..48e64965b0 100644 --- a/packages/dashboard/app/utils/__tests__/taskProgress.review-gates.test.ts +++ b/packages/dashboard/app/utils/__tests__/taskProgress.review-gates.test.ts @@ -17,3 +17,35 @@ describe("review-gated progress", () => { expect(getRunningWorkflowStepLabel(task)).toBe("Verification"); }); }); + +/* +FNXC:TaskCardWorkflowProgress 2026-08-24-19:30: +A review-column workflow (builtin:coding-ideas-v2) promotes Verification and Documentation & +Delivery from hidden checklist entries into first-class review-lane gates. Implementation scope +hides exactly those, so a board card or list row in the review lane must use the FULL pipeline or it +reports nothing for the stage the operator moved them there to watch. +*/ +describe("review-lane gate visibility", () => { + const task = { + steps: [{ name: "Implement", status: "done" }], + enabledWorkflowSteps: ["plan-review", "verification", "documentation-delivery", "code-review"], + workflowStepResults: [ + { workflowStepId: "plan-review", status: "passed", verdict: "APPROVE", phase: "pre-merge" }, + { workflowStepId: "verification", status: "passed", phase: "pre-merge" }, + { workflowStepId: "documentation-delivery", status: "in-progress", phase: "pre-merge" }, + ], + } as never; + + it("hides the review gates from implementation scope", () => { + const ids = getUnifiedTaskProgress(task, { scope: "implementation" }).items.map((item) => item.id); + expect(ids).not.toContain("workflow-verification"); + expect(ids).not.toContain("workflow-documentation-delivery"); + }); + + it("surfaces Verification and Documentation & Delivery in the full pipeline", () => { + const ids = getUnifiedTaskProgress(task, { scope: "full" }).items.map((item) => item.id); + expect(ids).toContain("workflow-verification"); + expect(ids).toContain("workflow-documentation-delivery"); + expect(ids).toContain("workflow-code-review"); + }); +});