import { useCallback, useEffect, useMemo, useState } from "react"; import "./ReliabilityView.css"; type ReliabilityResponse = { windowDays: number; generatedAt: string; 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; }>; 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 "—"; } const minutes = value / 60_000; return `${minutes.toFixed(1)}m`; } export function ReliabilityView() { const [data, setData] = 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); }, []); useEffect(() => { void load(); const pollInterval = setInterval(() => { void load(); }, 60_000); return () => clearInterval(pollInterval); }, [load]); const headlineColorVar = useMemo(() => { const rate = data?.headline.inReviewFailureRate7d; if (rate === null || rate === undefined) { return "var(--text-muted)"; } if (rate < 0.05) { return "var(--color-success)"; } if (rate < 0.1) { return "var(--color-warning)"; } return "var(--color-error)"; }, [data]); return (

Reliability

{data?.headline.inReviewFailureRate7d === null || data?.headline.inReviewFailureRate7d === undefined ? `Insufficient data — ${data?.headline.reason ?? "unknown"}` : formatPercent(data.headline.inReviewFailureRate7d)}

In-review flow

{data?.perDay.map((row) => ( ))}
Date Entered Bounced
{row.date} {row.tasksEnteredInReview} {row.tasksBouncedToInProgress}

Duration

P50{formatDuration(data?.duration.p50Ms ?? null)}
P95{formatDuration(data?.duration.p95Ms ?? null)}
Samples: {data?.duration.sampleCount ?? 0}

Merge attempts

Mean{data?.mergeAttempts.mean?.toFixed(2) ?? "—"}
Max{data?.mergeAttempts.max ?? "—"}
    {Object.entries(data?.mergeAttempts.histogram ?? {}).map(([bucket, count]) => (
  • {bucket}
    {count}
  • ))}
); }