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:
Fusion Agent
2026-08-26 03:19:40 +00:00
parent 8b64b88bfd
commit e71ccb9d70
4 changed files with 34 additions and 28 deletions

View 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`.

View File

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

View File

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

View File

@@ -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();
});
/*