// History Details / Forensics — full pipeline view per company const { useState: useStateHD, useEffect: useEffectHD } = React; function HistoryDetailsView({ tweaks, initialEntityId, initialDate }) { const companies = window.DATA?.companies || []; const initialId = initialEntityId || window.DATA.todaysBrief?.entityId || companies[0]?.id; const [selectedId, setSelectedId] = useStateHD(initialId); const [search, setSearch] = useStateHD(""); const [openRunId, setOpenRunId] = useStateHD(null); const [expandedRejection, setExpandedRejection] = useStateHD(null); const [expandedPubCitation, setExpandedPubCitation] = useStateHD(null); const [forensicsData, setForensicsData] = useStateHD(null); const [loading, setLoading] = useStateHD(false); const summaries = window.DATA.companySummaries || {}; useEffectHD(() => { loadForensics(initialId, initialDate); }, []); function loadForensics(id, targetDate) { setSelectedId(id); setLoading(true); setOpenRunId(null); setExpandedPubCitation(null); fetch(`/api/frontend/entity/${id}/forensics`) .then(r => r.json()) .then(d => { setForensicsData(d); if (!d.days || d.days.length === 0) return; // If a target date is provided, open the run for that date; otherwise open the latest const targetDay = targetDate ? d.days.find(day => day.date === targetDate) : d.days[0]; const day = targetDay || d.days[0]; setOpenRunId(null); // Scroll to the target day after render if (targetDate) { requestAnimationFrame(() => { const el = document.getElementById(`hd-day-${targetDate}`); if (el) el.scrollIntoView({ behavior: "smooth", block: "start" }); }); } }) .catch(console.error) .finally(() => setLoading(false)); } const filtered = companies.filter(c => c.name.toLowerCase().includes(search.toLowerCase()) || c.ticker.toLowerCase().includes(search.toLowerCase()) ); const days = forensicsData?.days || []; const entityName = forensicsData?.entityName || companies.find(c => c.id === selectedId)?.name || selectedId; const ticker = forensicsData?.ticker || companies.find(c => c.id === selectedId)?.ticker || ""; return (
Every bullet considered, kept or cut, with the pipeline's full reasoning.
No runs found for this entity.
)}{r.narrative}
{b.text}
{b.novelty === "rewritten" && b.rewriteReason && (No active bullets for this day.
)}{item.scoreReason}
{item.evidence}
{d.reason}
{d.score}/5
{d.overall_verdict}
{cv.claim_text}
} {cv.reasoning &&{cv.reasoning}
} {claimEvidence.length > 0 && ({e.headline}
} {e.text &&{e.text}
}| Date | Text | Score |
|---|---|---|
| {rb.date ? rb.date.slice(0, 10) : "—"} | {rb.text} | {(rb.score * 100).toFixed(1)}% |