@@ -121,9 +121,25 @@ export function useChartData(
121121 if ( ! allRows || ! sequenceIslOsl ) return [ ] ;
122122 const seqFilter = ( r : { isl : number ; osl : number } ) =>
123123 r . isl === sequenceIslOsl . isl && r . osl === sequenceIslOsl . osl ;
124- const mainRows = allRows
125- . filter ( seqFilter )
126- . map ( ( r ) => ( selectedRunDate ? { ...r , date : selectedRunDate , actualDate : r . date } : r ) ) ;
124+ const seqFiltered = allRows . filter ( seqFilter ) ;
125+
126+ // For each (hw, framework, spec_method, disagg, precision) group, keep only
127+ // rows from the most recent date. When parallelism settings change between runs,
128+ // old config_ids create stale data points under the same legend line — drop them.
129+ const maxDatePerGroup = new Map < string , string > ( ) ;
130+ for ( const r of seqFiltered ) {
131+ const key = `${ r . hardware } |${ r . framework } |${ r . spec_method } |${ r . disagg } |${ r . precision } ` ;
132+ const cur = maxDatePerGroup . get ( key ) ;
133+ if ( ! cur || r . date > cur ) maxDatePerGroup . set ( key , r . date ) ;
134+ }
135+ const deduped = seqFiltered . filter ( ( r ) => {
136+ const key = `${ r . hardware } |${ r . framework } |${ r . spec_method } |${ r . disagg } |${ r . precision } ` ;
137+ return r . date === maxDatePerGroup . get ( key ) ;
138+ } ) ;
139+
140+ const mainRows = deduped . map ( ( r ) =>
141+ selectedRunDate ? { ...r , date : selectedRunDate , actualDate : r . date } : r ,
142+ ) ;
127143 if ( comparisonDates . length === 0 ) return mainRows ;
128144 const extraRows = comparisonQueries . flatMap ( ( q , i ) =>
129145 ( q . data ?? [ ] )
0 commit comments