From b8bb3b48e548a404dcbae55acc4d6e1ff57381c3 Mon Sep 17 00:00:00 2001 From: castrojo Date: Tue, 8 Sep 2026 14:55:12 +0000 Subject: [PATCH] fix(factory): render an unavailable change-failure rate instead of 0.0% MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pct() multiplied null by 100, so a missing changeFailureRate from fetch-dora.js (deliberately null when no terminal runs exist) rendered as a misleading 0.0%. pct() now treats null/undefined/non-finite inputs as unavailable and renders "—", reserving 0.0% for real measured values. Fixes projectbluefin/documentation#1091 Signed-off-by: castrojo --- scripts/metrics-panels.test.js | 15 +++++++++++++++ src/components/factory/panels/MetricsPanels.tsx | 5 +++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/scripts/metrics-panels.test.js b/scripts/metrics-panels.test.js index 1ab95ca85..f0b4c5fea 100644 --- a/scripts/metrics-panels.test.js +++ b/scripts/metrics-panels.test.js @@ -436,6 +436,21 @@ function render(fixtures) { // ── Tests ────────────────────────────────────────────────────────────────── +test("null change failure rate renders unavailable marker, never 0.0%", () => { + const doraNullRate = { + ...DORA, + current: { ...DORA.current, changeFailureRate: null }, + }; + const html = render({ + countme: COUNTME_FULL, + brew: BREW, + dora: doraNullRate, + scorecard: SCORECARD, + }); + assert.ok(!html.includes("0.0%")); + assert.ok(html.includes("—")); +}); + test("lead time renders as not-measured, never as 0", () => { const html = render({ countme: COUNTME_FULL, diff --git a/src/components/factory/panels/MetricsPanels.tsx b/src/components/factory/panels/MetricsPanels.tsx index cd122472f..618685b4d 100644 --- a/src/components/factory/panels/MetricsPanels.tsx +++ b/src/components/factory/panels/MetricsPanels.tsx @@ -61,7 +61,7 @@ interface DoraMonthly { } interface DoraCurrent { deploymentsPerWeek: number; - changeFailureRate: number; + changeFailureRate: number | null; medianLeadTimeHours: number | null; leadTimeReason?: string; } @@ -113,7 +113,8 @@ function fmt(n: number | null | undefined): string { return n.toLocaleString("en-US"); } -function pct(n: number): string { +function pct(n: number | null | undefined): string { + if (n == null || !Number.isFinite(n)) return "—"; return `${(n * 100).toFixed(1)}%`; }