diff --git a/.changeset/review-lane-badge-only.md b/.changeset/review-lane-badge-only.md new file mode 100644 index 0000000000..63302eb253 --- /dev/null +++ b/.changeset/review-lane-badge-only.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: In-review cards show the running gate as a badge instead of a step list. +category: feature +dev: Reverts the review-lane progress section in `TaskCard` and `ListView` added earlier in this series. `showProgressSection` and `shouldShowTaskProgress` no longer include the review column, so an in-review card renders its stage through `getRunningOptionalGateBadge` (Code Review → Documentation → Merging) with no bar, counter, or expandable list. This also removes a defect for free: the list is built from `task.enabledWorkflowSteps`, frozen on the card at planning time, so a card planned before a workflow changed rendered a removed milestone as permanently `pending`. diff --git a/packages/dashboard/app/components/ListView.tsx b/packages/dashboard/app/components/ListView.tsx index d5ef2a9ad0..d537a34224 100644 --- a/packages/dashboard/app/components/ListView.tsx +++ b/packages/dashboard/app/components/ListView.tsx @@ -337,14 +337,13 @@ interface ListViewProps { */ function shouldShowTaskProgress(task: Task, flags?: Parameters[0]): boolean { /* - 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. + FNXC:TaskCardWorkflowProgress 2026-08-25-11:40: + The review lane reports its stage through the running-gate BADGE, not a progress count, matching + TaskCard. A review-column workflow has few milestones in a fixed order, so a count adds noise + without answering anything the badge does not. It also avoids rendering a milestone that no longer + exists: the count comes from `enabledWorkflowSteps`, which is frozen on the card at planning time. */ - return task.status === "executing" - || isWipColumnRole(flags, task.column) - || isReviewColumnRole(flags, task.column); + return task.status === "executing" || isWipColumnRole(flags, task.column); } function getTaskProgress( diff --git a/packages/dashboard/app/components/TaskCard.tsx b/packages/dashboard/app/components/TaskCard.tsx index e4e6d03ed0..7902817587 100644 --- a/packages/dashboard/app/components/TaskCard.tsx +++ b/packages/dashboard/app/components/TaskCard.tsx @@ -1115,15 +1115,8 @@ function TaskCardComponent({ : TIME_INDICATOR_COLUMNS.has(task.column); const [isSaving, setIsSaving] = useState(false); - /* - FNXC:TaskCardWorkflowProgress 2026-08-25-02:10: - The review lane starts expanded too. This initial state is computed once per mount, and moving a - card between columns remounts it, so a card that was expanded in in-progress collapsed the moment - it reached review — exactly where a review-column workflow has gates worth watching. - */ const [showSteps, setShowSteps] = useState( isWipColumn || - isReviewColumn || (isIntakeColumn && task.steps.some(s => s.status === "done" || s.status === "skipped")) ); const [missionTitle, setMissionTitle] = useState(null); @@ -1772,9 +1765,21 @@ function TaskCardComponent({ operator saw nothing for the stage those gates were promoted into. Resolved by TRAIT, not by the hardcoded `in-review` id, so a renamed board behaves the same. */ + /* + FNXC:TaskCardWorkflowProgress 2026-08-25-11:40: + The review lane shows its stage as a BADGE, not a step list. A review-column workflow has few + milestones in a fixed order (Code Review -> Documentation -> merge), so the running-gate badge + already answers "where is this card", and a list of two rows plus every finished implementation + step is noise on a board. + It also removes a whole failure mode: the list is built from `task.enabledWorkflowSteps`, which is + frozen on the card at planning time, so a card planned before a workflow changed rendered a + milestone that no longer exists as permanently `pending`. No list, no ghost. + Cost, stated: a non-blocking gate that failed is no longer visible from the board — open the card. + Blocking failures still move the card back to in-progress, which is visible. + */ const showProgressSection = unifiedProgress.total > 0 - && (task.status === "executing" || isWipColumn || isReviewColumn); + && (task.status === "executing" || isWipColumn); /* FNXC:BoardPerformance 2026-07-26-09:46: diff --git a/packages/dashboard/app/components/__tests__/TaskCard.test.tsx b/packages/dashboard/app/components/__tests__/TaskCard.test.tsx index b98eba1ff3..82d2c1e722 100644 --- a/packages/dashboard/app/components/__tests__/TaskCard.test.tsx +++ b/packages/dashboard/app/components/__tests__/TaskCard.test.tsx @@ -2790,20 +2790,15 @@ describe("TaskCard", () => { expect(badge).toHaveTextContent(label); expect(badge?.className).toContain("pulsing"); /* - FNXC:TaskCardWorkflowProgress 2026-08-25-01:10: - The review lane now RENDERS its breakdown: a review-column workflow runs Verification, - Documentation & Delivery and Code Review there as real advancing work, and suppressing the - section left the operator with no signal for that stage. The running-gate badge remains a - distinct, additive affordance — it is not replaced by the bar. + FNXC:TaskCardWorkflowProgress 2026-08-25-11:40: + The BADGE is the review lane's whole progress affordance: no bar, no counter, no step list. + A review-column workflow has few milestones in a fixed order, so the running gate answers "where + is this card" on its own. Suppressing the section also removes a real defect: the list is built + from `enabledWorkflowSteps`, frozen on the card at planning time, so a card planned before a + workflow changed rendered a milestone that no longer exists as permanently `pending`. */ - expect(container.querySelector(".card-progress")).not.toBeNull(); - /* - FNXC:TaskCardWorkflowProgress 2026-08-25-02:10: - The list is EXPANDED on arrival in the review lane, as it already was in in-progress. The - initial state is computed once per mount and a column move remounts the card, so a card the - operator had open collapsed itself at exactly the point its review gates start running. - */ - expect(container.querySelector(".card-steps-list")).not.toBeNull(); + expect(container.querySelector(".card-progress")).toBeNull(); + expect(container.querySelector(".card-steps-list")).toBeNull(); }); /*