feat(FN-WF): show the in-review stage as a badge, not a step list
An in-review card now renders its stage through the running-gate badge alone — Code Review, then Documentation, then Merging — with no progress bar, no counter, and no expandable step list. This reverts the review-lane progress section added earlier in this series. That change was a correct fix for the complaint at the time (the review lane showed nothing at all), but with the lane reduced to two milestones in a fixed order the 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 defect for free rather than by repair. The list is built from `task.enabledWorkflowSteps`, which is FROZEN on the card at planning time, so a card planned before its workflow changed rendered a milestone that no longer exists as permanently `pending` — a ghost row that could never resolve. Removing the deleted `verification` group created exactly that on in-flight cards. No list, no ghost, and no reconciliation pass to write and maintain. Cost, stated rather than hidden: a NON-BLOCKING gate that failed is no longer visible from the board — Documentation cannot hold a card, so a failed delivery note now merges silently and must be read on the card itself. Blocking failures are unaffected: a Code Review REVISE moves the card back to in-progress, which is the most visible signal the board has. Tests updated to the new truth, not around it: the review-lane assertions now expect `.card-progress` and `.card-steps-list` to be absent. pnpm lint 0 errors, typecheck, test:gate, and 738 tests across every suite that touches card progress (TaskCard, ListView, taskProgress, board-mobile, live-ticker). The full dashboard suite's 22 failures are pre-existing and unrelated — ChatView, voice dictation, model menus, process supervision — with no card or progress test among them.
This commit is contained in:
7
.changeset/review-lane-badge-only.md
Normal file
7
.changeset/review-lane-badge-only.md
Normal file
@@ -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`.
|
||||
@@ -337,14 +337,13 @@ interface ListViewProps {
|
||||
*/
|
||||
function shouldShowTaskProgress(task: Task, flags?: Parameters<typeof isWipColumnRole>[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(
|
||||
|
||||
@@ -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<string | null>(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:
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user