fix(FN-WF): show review-lane gate progress on task rows

`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.
This commit is contained in:
Fusion Agent
2026-08-25 01:40:26 +00:00
parent d866617f40
commit ca171502f7
3 changed files with 61 additions and 3 deletions

View File

@@ -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.

View File

@@ -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<typeof isWipColumnRole>[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 };
}

View File

@@ -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");
});
});