diff --git a/src/components/Findings.tsx b/src/components/Findings.tsx index d842954..3a7d862 100644 --- a/src/components/Findings.tsx +++ b/src/components/Findings.tsx @@ -29,11 +29,14 @@ export function Verdict({ slice = null, kind = '', dates = { anchor: null, ceiling: null, submittedTo: null }, + dataSpan = null, }: { row: Row; slice?: Slice | null; kind?: string; dates?: LinkDates; + /** The full span of the claims table, for the "checked across all data" note. */ + dataSpan?: { from: string; to: string } | null; }) { const summary = str(row.summary); if (!summary) return null; @@ -65,7 +68,7 @@ export function Verdict({ )} AI analysis · Ava - {scanned && } + {scanned && }
@@ -97,7 +100,7 @@ export function Verdict({ * as labelled lines; older cases wrote prose, which falls back to sentence * bullets so nothing renders as a wall of text. */ /** The comparison, drawn: this period against that one, then what was set aside. */ -function Periods({ f }: { f: ReviewedFacts }) { +function Periods({ f, dataSpan = null }: { f: ReviewedFacts; dataSpan?: { from: string; to: string } | null }) { // longDate passes non-ISO text through unchanged, so an already-humanised // range renders as it was written. const span = (r: { from: string; to: string } | null) => (r ? `${longDate(r.from)} – ${longDate(r.to)}` : '—'); @@ -128,13 +131,33 @@ function Periods({ f }: { f: ReviewedFacts }) { )} {f.ceiling && <> · Nothing after {longDate(f.ceiling)} was used} +

+ {/* The two periods above are the RATE comparison. Deadlines, payer speed + and overturn rates are properties of the whole book, so they are + checked across everything — saying so stops the reasonable question + "why only six weeks?". */} +

+ Denial rates are compared between these two periods. Appeal deadlines, insurer payment + speed and appeal-overturn rates are checked across all claims + {dataSpan ? ` (${longDate(dataSpan.from)} – ${longDate(dataSpan.to)})` : ''}, and every + month is reconciled against the finance report. {f.requested && <> · Requested {span(f.requested)}; the last 6 weeks of it were compared with the 8 before them}

); } -function WorkStatement({ text, heading = 'Review coverage', bare = false }: { text: string; heading?: string; bare?: boolean }) { +function WorkStatement({ + text, + heading = 'Review coverage', + bare = false, + dataSpan = null, +}: { + text: string; + heading?: string; + bare?: boolean; + dataSpan?: { from: string; to: string } | null; +}) { const rows = workStatement(text); const reviewed = rows ? reviewedFacts(rows.find((r) => r.key === 'REVIEWED')?.items ?? []) : null; const row = (k: string) => rows?.find((r) => r.key === k); @@ -164,7 +187,7 @@ function WorkStatement({ text, heading = 'Review coverage', bare = false }: { te return (
{heading &&

{heading}

} - {reviewed && } + {reviewed && } {!reviewed && row('REVIEWED') && (

{row('REVIEWED')!.items.map(prose).join(' · ')}

)} diff --git a/src/screens/CaseScreen.tsx b/src/screens/CaseScreen.tsx index 1554388..068bd5f 100644 --- a/src/screens/CaseScreen.tsx +++ b/src/screens/CaseScreen.tsx @@ -73,7 +73,9 @@ export function CaseScreen() { // service date — read from the stats view, NOT from the briefing: the charts // take seconds to load and a link rendered without the anchor would silently // drop the deadline window and open thousands of rows instead of hundreds. - const lake = useQuery(() => client.rows('dni-rv-lakehouse-tables', { limit: 10 }), [], !asOf && hasFindings); + // Also used for the "checked across all claims (Mar 2 – Sep 13)" note, so it + // is fetched for replayed cases too. + const lake = useQuery(() => client.rows('dni-rv-lakehouse-tables', { limit: 10 }), [], hasFindings); const claimsStats = lake.data?.find((r) => str(r.table_name) === 'claims'); const linkDates = { ceiling: asOf, @@ -184,7 +186,17 @@ export function CaseScreen() { {/* ---------- The findings: what happened, how much, what to approve ---------- */} {hasFindings && ( <> - + {briefing.data ? ( ) : (