FN-7665: rename Command Center SDLC funnel intake stage label to Planning

Rename the Command Center SDLC funnel's intake stage display text from "Triage" to "Planning" to match the renamed board column, updating English locale copy and tests; the underlying aggregator/i18n key names stay "triage".

- SdlcFunnel.tsx: stage label fallback, enteredInRange, and completionRateAria copy changed to Planning/Entered planning/in-range planning entrants; added FNXC comment explaining the key-vs-label distinction
- packages/i18n/locales/en/app.json: synced English strings for the same three keys
- SdlcFunnel.test.tsx: updated assertions to match new Planning copy
- Added changeset (patch) documenting the label rename

Files changed:
 .changeset/fn-7665-funnel-planning-label.md              |  7 +++++++
 .../app/components/command-center/SdlcFunnel.tsx         | 16 ++++++++++++----
 .../command-center/__tests__/SdlcFunnel.test.tsx         |  6 +++---
 packages/i18n/locales/en/app.json                        |  6 +++---
 4 files changed, 25 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-7665

Fusion-Task-Lineage: d8aec609-6b8b-4f36-bb43-61d7c7c421f9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
This commit is contained in:
gsxdsm
2026-07-08 00:50:11 -07:00
parent d2e38ba920
commit 7cf70b3c59
4 changed files with 25 additions and 10 deletions

View File

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

View File

@@ -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 }) {
<RadialGauge
value={funnel?.completionRate ?? null}
label={t("commandCenter.funnel.completionRate", "Completion rate")}
ariaLabel={t("commandCenter.funnel.completionRateAria", "Completion rate for in-range triage entrants")}
ariaLabel={t("commandCenter.funnel.completionRateAria", "Completion rate for in-range planning entrants")}
/>
<span className="cc-stat-sub">
{t("commandCenter.funnel.completionRateHint", "Done ÷ entered (in range)")}
@@ -124,7 +132,7 @@ export function SdlcFunnel({ range }: { range: DateRange }) {
</div>
<div className="card cc-stat-card" data-testid="cc-funnel-entered">
<div className="cc-stat-label">
{t("commandCenter.funnel.enteredInRange", "Entered triage")}
{t("commandCenter.funnel.enteredInRange", "Entered planning")}
</div>
<div className="cc-stat-value">{formatCount(funnel?.enteredInRange ?? 0)}</div>
</div>

View File

@@ -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(<SdlcFunnel range={range7d} />);
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(<SdlcFunnel range={range7d} />);
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("—");
});

View File

@@ -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",