import { useCallback, useEffect, useMemo, useState } from "react"; import "./ReliabilityView.css"; type ReliabilityResponse = { windowDays: number; generatedAt: string; resetAt: string | null; headline: { inReviewFailureRate7d: number | null; reason?: string }; perDay: Array<{ date: string; tasksEnteredInReview: number; tasksBouncedToInProgress: number; postMergeAuditFailures: { block: number; warn: number; off: number } | null; fileScopeInvariantFailures: number | null; recoverAlreadyMergedReviewTasksRecoveries: number | null; hasSamples?: boolean; }>; duration: { p50Ms: number | null; p95Ms: number | null; sampleCount: number; reason?: string }; mergeAttempts: { mean: number | null; max: number | null; histogram: Record; reason?: string }; }; function formatPercent(value: number): string { return `${(value * 100).toFixed(1)}%`; } function formatDuration(value: number | null): string { if (value === null) { return "—"; } return `${(value / 60_000).toFixed(1)}m`; } function formatDateTime(value: string | null | undefined): string { if (!value) { return "—"; } const parsed = new Date(value); return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleString(); } export function ReliabilityView() { const [data, setData] = useState(null); const [showEmptyDays, setShowEmptyDays] = useState(false); const [showResetConfirm, setShowResetConfirm] = useState(false); const [resetError, setResetError] = useState(null); const load = useCallback(async () => { const response = await fetch("/api/health/reliability"); if (!response.ok) { throw new Error(`Failed to load reliability metrics (${response.status})`); } const payload = (await response.json()) as ReliabilityResponse; setData(payload); }, []); const resetStats = useCallback(async () => { setResetError(null); const response = await fetch("/api/health/reliability/reset", { method: "POST" }); if (!response.ok) { throw new Error(`Failed to reset reliability metrics (${response.status})`); } await load(); setShowResetConfirm(false); }, [load]); useEffect(() => { void load(); const pollInterval = setInterval(() => { void load(); }, 60_000); return () => clearInterval(pollInterval); }, [load]); const failureRate = data?.headline.inReviewFailureRate7d; const reliabilityRate = useMemo(() => { if (failureRate === null || failureRate === undefined) return null; return Math.max(0, Math.min(1, 1 - failureRate)); }, [failureRate]); const headlineColorVar = useMemo(() => { if (reliabilityRate === null) return "var(--text-muted)"; if (reliabilityRate >= 0.95) return "var(--color-success)"; if (reliabilityRate >= 0.9) return "var(--color-warning)"; return "var(--color-error)"; }, [reliabilityRate]); const totalEntered = useMemo(() => (data?.perDay ?? []).reduce((sum, row) => sum + row.tasksEnteredInReview, 0), [data?.perDay]); const totalBounced = useMemo(() => (data?.perDay ?? []).reduce((sum, row) => sum + row.tasksBouncedToInProgress, 0), [data?.perDay]); const perDayRows = useMemo(() => { if (!data?.perDay) return []; return showEmptyDays ? data.perDay : data.perDay.filter((row) => row.hasSamples !== false); }, [data?.perDay, showEmptyDays]); const mergeAttemptTaskCount = useMemo( () => Object.values(data?.mergeAttempts.histogram ?? {}).reduce((sum, count) => sum + count, 0), [data?.mergeAttempts.histogram], ); const windowStartLabel = data ? formatDateTime(data.resetAt ?? new Date(Date.parse(data.generatedAt) - data.windowDays * 86_400_000).toISOString()) : "—"; return (

Reliability

{failureRate === null || failureRate === undefined ? `Insufficient data — ${data?.headline.reason ?? "unknown"}` : formatPercent(reliabilityRate ?? 0)}
{reliabilityRate !== null ?
In-review success rate (last 7d)
: null} {data?.resetAt ?
{`Counting since ${formatDateTime(data.resetAt)}`}
: null}
Details
{`${totalBounced} bounced / ${totalEntered} entered (last ${data?.windowDays ?? 7}d)`}
{failureRate !== null && failureRate !== undefined ?
{`Failure rate: ${formatPercent(failureRate)}`}
: null}
{`Window: ${windowStartLabel} → ${formatDateTime(data?.generatedAt)}`}
{data?.resetAt ?
{`Reset baseline: ${formatDateTime(data.resetAt)}`}
: null} {data?.headline.reason ?
{`Reason: ${data.headline.reason}`}
: null}

In-review flow

{perDayRows.map((row) => ( ))}
DateEnteredBounced
{row.date}{row.tasksEnteredInReview}{row.tasksBouncedToInProgress}

Duration

P50{formatDuration(data?.duration.p50Ms ?? null)}
P95{formatDuration(data?.duration.p95Ms ?? null)}
Samples: {data?.duration.sampleCount ?? 0}
More stats
{`P50 raw: ${data?.duration.p50Ms ?? "—"} ms`}
{`P95 raw: ${data?.duration.p95Ms ?? "—"} ms`}
{`Sample count: ${data?.duration.sampleCount ?? 0}`}
{data?.duration.reason ?
{`Reason: ${data.duration.reason}`}
: null}

Merge attempts

Mean{data?.mergeAttempts.mean?.toFixed(2) ?? "—"}
Max{data?.mergeAttempts.max ?? "—"}
    {Object.entries(data?.mergeAttempts.histogram ?? {}).map(([bucket, count]) => (
  • {bucket}
    {count}
  • ))}
More stats
{`Tasks counted: ${mergeAttemptTaskCount}`}
{`Histogram total: ${mergeAttemptTaskCount}`}
{data?.mergeAttempts.reason ?
{`Reason: ${data.mergeAttempts.reason}`}
: null}
{showResetConfirm ? (

Reset reliability stats?

This sets a new baseline for reliability statistics. Historical events older than the reset time are excluded from counts but are not deleted.

{resetError ?
{resetError}
: null}
) : null}
); }