// Calibration report — estimate-vs-actual evidence behind the cones function CalibrationScreen({ onBack }) { const DS = window.CommiTeaDesignSystem_20e63b; const { Card, Badge, Icon } = DS; const c = window.CT_DATA.calibration; // scatter chart geometry const W = 420, H = 300, pad = { l: 36, r: 16, t: 14, b: 30 }; const maxD = 9; const X = (d) => pad.l + (d / maxD) * (W - pad.l - pad.r); const Y = (d) => H - pad.b - (d / maxD) * (H - pad.t - pad.b); const BiasBar = ({ bias }) => { if (bias == null) return n too small; return (
15 ? 'var(--warn)' : 'var(--ok)', borderRadius: '0 3px 3px 0', opacity: 0.75, }}>
15 ? 'var(--warn)' : 'var(--ok)', width: 42, textAlign: 'right' }}>+{bias}%
); }; return (

Calibration

{c.n} closed issues with estimates · evidence, not opinion

curve active · n ≥ 20
{/* scatter */} {[1, 3, 5, 8].map((d) => ( {d}d {d}d ))} {/* perfect line */} honest {/* fit */} you · ×{c.fit} {/* points */} {c.scatter.map(([e, a], i) => ( ))}

estimated (x) vs actual days (y) · actuals inferred from git events, never tracked

{/* per-label bias */}
{c.labels.map((r, i) => (
{r.label} n={r.n} · {r.median}
))}
{/* per-person */}
{c.people.map((p, i) => (
{p.who.split(' ').map((w) => w[0]).join('')}
{p.who} · n={p.n} · {p.note}
15 ? 'var(--warn)' : 'var(--ok)' }}>+{p.bias}%
))}
{/* effect on forecasts */}
{c.effect.raw} {c.effect.banded}

You are not bad at estimating; you are optimistic in a very stable way. Stable, I can work with.

); } Object.assign(window, { CalibrationScreen });