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:
7
.changeset/review-lane-progress-visibility.md
Normal file
7
.changeset/review-lane-progress-visibility.md
Normal 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.
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user