diff --git a/.changeset/fn-7665-funnel-planning-label.md b/.changeset/fn-7665-funnel-planning-label.md new file mode 100644 index 0000000000..3f33ca88c9 --- /dev/null +++ b/.changeset/fn-7665-funnel-planning-label.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: The Command Center SDLC funnel now labels the intake stage "Planning", matching the renamed board column. +category: fix +dev: commandCenter.funnel.stage.triage, enteredInRange, and completionRateAria English strings (and SdlcFunnel.tsx t() fallbacks) changed to "Planning"/"Entered planning"/"in-range planning entrants"; dashboard locale copy re-synced. Aggregator stage key "triage" and the i18n key names are unchanged. diff --git a/packages/dashboard/app/components/command-center/SdlcFunnel.tsx b/packages/dashboard/app/components/command-center/SdlcFunnel.tsx index 6d396e2ba9..9e1f0cd2a7 100644 --- a/packages/dashboard/app/components/command-center/SdlcFunnel.tsx +++ b/packages/dashboard/app/components/command-center/SdlcFunnel.tsx @@ -12,13 +12,21 @@ import "./SdlcFunnel.css"; /** The funnel sub-shape carried on the activity analytics payload (U7). */ type SdlcFunnelData = ActivityAnalytics["funnel"]; -/** Human-readable label per stage key, falling back to the raw key. */ +/** + * FNXC:CommandCenter 2026-07-08-00:00: + * The SDLC funnel's intake stage displays as "Planning" (not "Triage") for + * consistency with the renamed board column (FN-7660/FN-7665). The aggregator + * stage KEY produced by aggregateSdlcFunnel and matched below stays "triage" — + * only the English display text changes. + * + * Human-readable label per stage key, falling back to the raw key. + */ function useStageLabels(): (stage: string) => string { const { t } = useTranslation("app"); return (stage: string) => { switch (stage) { case "triage": - return t("commandCenter.funnel.stage.triage", "Triage"); + return t("commandCenter.funnel.stage.triage", "Planning"); case "todo": return t("commandCenter.funnel.stage.todo", "Todo"); case "in-progress": @@ -99,7 +107,7 @@ export function SdlcFunnel({ range }: { range: DateRange }) { {t("commandCenter.funnel.completionRateHint", "Done ÷ entered (in range)")} @@ -124,7 +132,7 @@ export function SdlcFunnel({ range }: { range: DateRange }) {
- {t("commandCenter.funnel.enteredInRange", "Entered triage")} + {t("commandCenter.funnel.enteredInRange", "Entered planning")}
{formatCount(funnel?.enteredInRange ?? 0)}
diff --git a/packages/dashboard/app/components/command-center/__tests__/SdlcFunnel.test.tsx b/packages/dashboard/app/components/command-center/__tests__/SdlcFunnel.test.tsx index 5525f5923f..1ca05cd116 100644 --- a/packages/dashboard/app/components/command-center/__tests__/SdlcFunnel.test.tsx +++ b/packages/dashboard/app/components/command-center/__tests__/SdlcFunnel.test.tsx @@ -61,7 +61,7 @@ describe("SdlcFunnel", () => { expect(apiMock).toHaveBeenCalledWith(expect.stringContaining("/command-center/activity"), undefined); // Funnel bars carry an accessible label per stage with its count. - expect(screen.getByLabelText("Triage: 4")).toBeTruthy(); + expect(screen.getByLabelText("Planning: 4")).toBeTruthy(); expect(screen.getByLabelText("In progress: 3")).toBeTruthy(); expect(screen.getByLabelText("Done: 2")).toBeTruthy(); // Unknown-trait columns surface under "Other". @@ -73,7 +73,7 @@ describe("SdlcFunnel", () => { render(); await screen.findByTestId("cc-area-funnel"); - expect(screen.getByRole("img", { name: "Completion rate for in-range triage entrants" })).toBeTruthy(); + expect(screen.getByRole("img", { name: "Completion rate for in-range planning entrants" })).toBeTruthy(); expect(screen.getByTestId("cc-funnel-completion-rate").textContent).toContain("50%"); expect(screen.getByTestId("cc-funnel-done").textContent).toContain("2"); expect(screen.getByTestId("cc-funnel-entered").textContent).toContain("4"); @@ -102,7 +102,7 @@ describe("SdlcFunnel", () => { render(); await screen.findByTestId("cc-area-funnel"); - expect(screen.getByRole("img", { name: "Completion rate for in-range triage entrants" })).toBeTruthy(); + expect(screen.getByRole("img", { name: "Completion rate for in-range planning entrants" })).toBeTruthy(); expect(screen.getByTestId("cc-funnel-completion-rate").textContent).toContain("—"); }); diff --git a/packages/i18n/locales/en/app.json b/packages/i18n/locales/en/app.json index cab1e41738..7ff9ce14f6 100644 --- a/packages/i18n/locales/en/app.json +++ b/packages/i18n/locales/en/app.json @@ -1620,11 +1620,11 @@ "funnel": { "ariaLabel": "Tasks per workflow stage", "completionRate": "Completion rate", - "completionRateAria": "Completion rate for in-range triage entrants", + "completionRateAria": "Completion rate for in-range planning entrants", "completionRateHint": "Done ÷ entered (in range)", "doneInRange": "Reached done", "empty": "No task transitions in the selected range.", - "enteredInRange": "Entered triage", + "enteredInRange": "Entered planning", "rangeDays_one": "{{count}} day range", "rangeDays_other": "{{count}} day range", "stage": { @@ -1633,7 +1633,7 @@ "inReview": "In review", "other": "Other", "todo": "Todo", - "triage": "Triage" + "triage": "Planning" }, "throughputPerDay": "Tasks done / day", "throughputTitle": "Throughput",