@@ -202,6 +202,43 @@ export function InferenceProvider({
202202 // ── Data fetching (gated by isActive) ──────────────────────────────────────
203203 const latestDate = availableDates . length > 0 ? availableDates . at ( - 1 ) : undefined ;
204204
205+ // Runs available for the current model selection, and which one is selected.
206+ // Computed here (above useChartData) so the chart can query "as of" the selected
207+ // run. Re-exposed on the context value below.
208+ const modelPrefixes = useMemo (
209+ ( ) =>
210+ Object . entries ( MODEL_PREFIX_MAPPING )
211+ . filter ( ( [ , model ] ) => model === selectedModel )
212+ . map ( ( [ prefix ] ) => prefix ) ,
213+ [ selectedModel ] ,
214+ ) ;
215+
216+ const filteredAvailableRuns = useMemo (
217+ ( ) => filterRunsByModel ( availableRuns , modelPrefixes , [ ...effectivePrecisions ] ) ,
218+ [ availableRuns , modelPrefixes , effectivePrecisions ] ,
219+ ) ;
220+
221+ const effectiveSelectedRunId = useMemo ( ( ) => {
222+ if ( ! filteredAvailableRuns ) return selectedRunId ;
223+ const filteredRunIds = Object . keys ( filteredAvailableRuns ) ;
224+ if ( filteredRunIds . length === 0 || filteredRunIds . includes ( selectedRunId ) ) return selectedRunId ;
225+ return filteredRunIds . reduce ( ( max , id ) => ( id > max ? id : max ) , filteredRunIds [ 0 ] ) ;
226+ } , [ filteredAvailableRuns , selectedRunId ] ) ;
227+
228+ // The latest run for this model on the selected date. GitHub run ids increase
229+ // monotonically with time, so the lexicographically-greatest id is the newest run.
230+ const latestRunIdForModel = useMemo ( ( ) => {
231+ const ids = filteredAvailableRuns ? Object . keys ( filteredAvailableRuns ) : [ ] ;
232+ return ids . length > 0 ? ids . reduce ( ( max , id ) => ( id > max ? id : max ) , ids [ 0 ] ) : '' ;
233+ } , [ filteredAvailableRuns ] ) ;
234+
235+ // Only constrain the query when an earlier-than-latest run is selected; otherwise
236+ // the chart shows the full latest view (and reuses the materialized-view fast path).
237+ const asOfRunId =
238+ effectiveSelectedRunId && latestRunIdForModel && effectiveSelectedRunId !== latestRunIdForModel
239+ ? effectiveSelectedRunId
240+ : undefined ;
241+
205242 const {
206243 graphs,
207244 loading : chartDataLoading ,
@@ -223,6 +260,7 @@ export function InferenceProvider({
223260 isActive ,
224261 latestDate ,
225262 compareGpuPair ?? null ,
263+ asOfRunId ,
226264 ) ;
227265
228266 // For GPU comparison date picker — use shared availability data from global filters
@@ -699,14 +737,6 @@ export function InferenceProvider({
699737 setUserPowers ( ( prev ) => ( prev === null ? prev : null ) ) ;
700738 } , [ selectedModel , effectiveSequence , effectivePrecisions , selectedYAxisMetric ] ) ;
701739
702- const modelPrefixes = useMemo (
703- ( ) =>
704- Object . entries ( MODEL_PREFIX_MAPPING )
705- . filter ( ( [ , model ] ) => model === selectedModel )
706- . map ( ( [ prefix ] ) => prefix ) ,
707- [ selectedModel ] ,
708- ) ;
709-
710740 // ── Debounced GPU selection tracking ─────────────────────────────────────
711741 // Fire after 3s of no changes so we capture the "settled" selection.
712742 // Skip the first render (initial data load) to avoid noise.
@@ -922,19 +952,9 @@ export function InferenceProvider({
922952 } , [ applyPreset ] ) ;
923953
924954 // ── Filtered runs ─────────────────────────────────────────────────────────
925-
926- const filteredAvailableRuns = useMemo (
927- ( ) => filterRunsByModel ( availableRuns , modelPrefixes , [ ...effectivePrecisions ] ) ,
928- [ availableRuns , modelPrefixes , effectivePrecisions ] ,
929- ) ;
930-
931- const effectiveSelectedRunId = useMemo ( ( ) => {
932- if ( ! filteredAvailableRuns ) return selectedRunId ;
933- const filteredRunIds = Object . keys ( filteredAvailableRuns ) ;
934- if ( filteredRunIds . length === 0 || filteredRunIds . includes ( selectedRunId ) ) return selectedRunId ;
935- return filteredRunIds . reduce ( ( max , id ) => ( id > max ? id : max ) , filteredRunIds [ 0 ] ) ;
936- } , [ filteredAvailableRuns , selectedRunId ] ) ;
937-
955+ // filteredAvailableRuns / effectiveSelectedRunId are computed above the data
956+ // fetch (so the chart can query "as of" the selected run).
957+ //
938958 // NOTE: We intentionally do NOT sync effectiveSelectedRunId back to
939959 // GlobalFilterContext (setSelectedRunId). That would cause a full tree
940960 // re-render on every precision change because filteredAvailableRuns
0 commit comments