+ {!variants.some(v => v.id === "none") && snapshots.some((s, i) => s.date < TL_CONDITION_START && med[i] != null) &&
+
}
{variants.map(v =>
)}
{/* The scale switch at the legend row's right end, where Graph 2 keeps its own. */}
{!loss &&
}
diff --git a/web/demo/19-live-timeline.jsx b/web/demo/19-live-timeline.jsx
index da797d8..56d4c48 100644
--- a/web/demo/19-live-timeline.jsx
+++ b/web/demo/19-live-timeline.jsx
@@ -50,7 +50,7 @@ const tlVariants = (q, horizon, snapshots) => {
};
/* ---------------- time-series chart ---------------- */
-// Before Oct 21 only the median is visible until hovered or selected; then
+// Before Oct 21 the Baseline median is blue until hovered or selected; then
// model answers appear as ink-gray circles. Since Oct 21 each prompt condition
// has a colored dot, with model answers in its details. No connecting lines.
// The ensemble median remains an ink mark, for the ONE horizon
@@ -81,6 +81,9 @@ function TimelineChart({ q, snapshots, horizon, scale }) {
const axisEnd = n > 1 ? Math.max(days[n - 1], yearEnd) : yearEnd;
const span = axisEnd > days[0] ? axisEnd - days[0] : 0;
const xDay = day => (span === 0 ? (pad.l + W - pad.r) / 2 : pad.l + ((day - days[0]) / span) * (W - pad.l - pad.r));
+ const changeDay = Date.parse(TL_CONDITION_START + "T00:00:00Z") / 864e5;
+ const showChange = n > 0 && changeDay >= days[0] && changeDay <= axisEnd;
+ const isBaseline = i => snapshots[i].date < TL_CONDITION_START;
const x = i => xDay(days[i]);
const xs = snapshots.map((_, i) => x(i));
const futureTicks = [];
@@ -206,6 +209,9 @@ function TimelineChart({ q, snapshots, horizon, scale }) {
))}
{axisEnd > days[n - 1] && W - pad.r - xs[n - 1] >= labelGap &&
Dec 31}
+ {showChange &&
}
{/* Historical model answers are revealed only for the active date. */}
{series.map(s => (
@@ -231,12 +237,15 @@ function TimelineChart({ q, snapshots, horizon, scale }) {
{/* The median's marks, unjoined. The larger transparent target also works on touchscreens. */}
{med.map((v, i) => v == null ? null : (
hover(e, i)} onMouseLeave={leave} onFocus={e => hover(e, i)} onBlur={leave}
onClick={e => select(e, i)} onKeyDown={e => keySelect(e, i)}>
-
+
))}
@@ -254,6 +263,10 @@ function TimelineChart({ q, snapshots, horizon, scale }) {
))}
+ {showChange &&
+ Oct 21, 2026: Methodology change to add more prompting strategies
+
}
+
{hovered && (
{hoveredModels.map(([label, val]) => (
@@ -274,7 +287,7 @@ function TimelineChart({ q, snapshots, horizon, scale }) {
: snapshots[hv].draws > 1 ? ` · ${snapshots[hv].draws} draws per model · point = mean` : ""}{loss ? " · deaths" : ""}
-
Ensemble median
+
{isBaseline(hv) ? "Baseline prompt · ensemble median" : "Ensemble median"}
{fmtV(med[hv])}
@@ -412,6 +425,8 @@ function TimelinePanelCurrent({ qid = TL_HEADLINE, title = "Probability of an AI
+ {!variants.some(v => v.id === "none") && snapshots.some((s, i) => s.date < TL_CONDITION_START && med[i] != null) &&
+ }
{variants.map(v => )}
{/* The scale switch at the legend row's right end, where Graph 2 keeps its own. */}
{!loss && }