FN-8480: remove redundant board header descriptions

Remove redundant readiness descriptions from Todo and In Review board headers.

- Make column descriptions optional and omit Todo/In Review entries
- Render description markup only when a description is present
- Cover empty and populated header states and add a patch changeset

Files changed:
 .../fn-8480-remove-column-header-descriptions.md   |  7 +++++
 packages/core/src/types.ts                         |  9 ++++--
 packages/dashboard/app/components/Column.tsx       |  2 +-
 .../app/components/__tests__/Column.test.tsx       | 35 ++++++++++++++++++++++
 4 files changed, 49 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-8480

Fusion-Task-Lineage: e14bcf8c-1a44-4de3-9cfe-833bf8bb697e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
This commit is contained in:
gsxdsm
2026-07-22 00:37:15 -07:00
parent 0ade15481d
commit 93b693c639
4 changed files with 49 additions and 4 deletions

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Remove redundant readiness descriptions from Todo and In Review board headers.
category: fix
dev: Todo and In Review omit legacy COLUMN_DESCRIPTIONS entries so no empty description shell renders.

View File

@@ -4428,11 +4428,14 @@ export const COLUMN_LABELS: Record<Column, string> = {
archived: "Archived", archived: "Archived",
}; };
export const COLUMN_DESCRIPTIONS: Record<Column, string> = { /*
FNXC:BoardColumnDescriptions 2026-07-21-00:00:
Todo and In Review must not carry redundant status prose in board headers.
Their omitted entries intentionally suppress the description element.
*/
export const COLUMN_DESCRIPTIONS: Partial<Record<Column, string>> = {
triage: "Raw ideas — AI will plan these", triage: "Raw ideas — AI will plan these",
todo: "Specified and ready to start",
"in-progress": "AI is working on this in a worktree", "in-progress": "AI is working on this in a worktree",
"in-review": "Complete — ready to merge",
done: "Merged and closed", done: "Merged and closed",
archived: "Completed and archived", archived: "Completed and archived",
}; };

View File

@@ -835,7 +835,7 @@ function ColumnComponent({ column, tasks, projectId, maxConcurrent, showWorktree
</div> </div>
)} )}
</div> </div>
{!isCollapsed && (workflowMode ? COLUMN_DESCRIPTIONS[column] !== undefined : true) && ( {!isCollapsed && COLUMN_DESCRIPTIONS[column] !== undefined && (
<p className="column-desc">{COLUMN_DESCRIPTIONS[column]}</p> <p className="column-desc">{COLUMN_DESCRIPTIONS[column]}</p>
)} )}
{!isCollapsed && inlineFeedback && ( {!isCollapsed && inlineFeedback && (

View File

@@ -214,6 +214,41 @@ describe("Column Coding (Ideas) header indicator", () => {
}); });
}); });
/*
FNXC:BoardColumnDescriptions 2026-07-21-00:00:
Todo and In Review omit redundant readiness prose, and the shared Column renderer
must leave no empty description shell across desktop/mobile and task-data states.
*/
describe("Column legacy descriptions", () => {
it.each([
["Todo", "todo" as ColumnType, "Specified and ready to start"],
["In Review", "in-review" as ColumnType, "Complete — ready to merge"],
])("omits the description shell for an empty %s column", (label, column, removedDescription) => {
render(<Column {...defaultProps} column={column} tasks={[]} />);
expect(screen.getByRole("heading", { name: label, level: 2 })).toBeInTheDocument();
expect(screen.queryByText(removedDescription)).not.toBeInTheDocument();
expect(document.querySelector(".column-desc")).toBeNull();
});
it.each([
["Todo", "todo" as ColumnType, "Specified and ready to start"],
["In Review", "in-review" as ColumnType, "Complete — ready to merge"],
])("omits the description shell for a populated %s column", (label, column, removedDescription) => {
render(<Column {...defaultProps} column={column} tasks={[{ ...makeTask("FN-8480"), column }]} />);
expect(screen.getByRole("heading", { name: label, level: 2 })).toBeInTheDocument();
expect(screen.queryByText(removedDescription)).not.toBeInTheDocument();
expect(document.querySelector(".column-desc")).toBeNull();
});
it("retains the description for Planning", () => {
render(<Column {...defaultProps} tasks={[]} />);
expect(screen.getByText("Raw ideas — AI will plan these")).toHaveClass("column-desc");
});
});
describe("Column workflow mode (U9)", () => { describe("Column workflow mode (U9)", () => {
it("uses the workflow column display name instead of the legacy label", () => { it("uses the workflow column display name instead of the legacy label", () => {
render( render(