@@ -1191,13 +1191,20 @@ function writeBlockedRunRows(sessionRoot, fixtures, reservations) {
11911191 fixtures . laneSetupEvidence . records . map ( ( record ) => [ record . laneId , record ] )
11921192 ) ;
11931193 const tasksById = new Map ( fixtures . manifest . tasks . map ( ( task ) => [ task . instance_id , task ] ) ) ;
1194+ const existingPrimaryKeys = new Set (
1195+ readManifestRowsIfPresent ( sessionRoot )
1196+ . filter ( ( row ) => ! row . scoring ?. baselineArmId )
1197+ . map ( ( row ) => primaryReservationKey ( row . lane_id , row . task_id , row . repeat_index ) )
1198+ ) ;
11941199 for ( const reservation of reservations . filter (
11951200 ( slot ) => slot . status === 'terminal_missing_evidence'
11961201 ) ) {
11971202 const laneCard = cardsByLane . get ( reservation . laneId ) ;
11981203 const task = tasksById . get ( reservation . taskId ) ;
11991204 const evidence = evidenceByLane . get ( reservation . laneId ) ;
12001205 if ( ! laneCard || ! task || ! evidence ) continue ;
1206+ const key = primaryReservationKey ( laneCard . laneId , task . instance_id , reservation . repeatIndex ) ;
1207+ if ( existingPrimaryKeys . has ( key ) ) continue ;
12011208 const runId = sanitize (
12021209 `${ laneCard . laneId } -${ task . instance_id } -${ reservation . repeatIndex } -missing-evidence`
12031210 ) ;
@@ -1260,6 +1267,7 @@ function writeBlockedRunRows(sessionRoot, fixtures, reservations) {
12601267 )
12611268 } )
12621269 ) ;
1270+ existingPrimaryKeys . add ( key ) ;
12631271 }
12641272}
12651273
@@ -1887,6 +1895,10 @@ function runKey(laneId, taskId, repeatIndex, prefix = '') {
18871895 return `${ prefix } ${ laneId } :${ taskId } :${ repeatIndex } ` ;
18881896}
18891897
1898+ function primaryReservationKey ( laneId , taskId , repeatIndex ) {
1899+ return `${ laneId } ::${ taskId } ::${ repeatIndex } ` ;
1900+ }
1901+
18901902function existingRunKeys ( sessionRoot ) {
18911903 return new Set (
18921904 readManifestRowsIfPresent ( sessionRoot ) . map ( ( row ) =>
@@ -3313,15 +3325,38 @@ function validateBaselineSession(args) {
33133325 errors . push ( `expected ${ expectedSlots } reserved slots, found ${ reservations . length } ` ) ;
33143326 const rows = readManifestRowsIfPresent ( sessionRoot ) ;
33153327 validateSessionPaths ( sessionRoot , rows , errors ) ;
3328+ const primaryRowCounts = new Map ( ) ;
3329+ for ( const row of rows . filter ( ( entry ) => ! entry . scoring ?. baselineArmId ) ) {
3330+ const key = primaryReservationKey ( row . lane_id , row . task_id , row . repeat_index ) ;
3331+ primaryRowCounts . set ( key , ( primaryRowCounts . get ( key ) ?? 0 ) + 1 ) ;
3332+ }
3333+ for ( const [ key , count ] of primaryRowCounts ) {
3334+ if ( count > 1 ) errors . push ( `duplicate primary baseline row for reservation ${ key } ` ) ;
3335+ }
33163336 const blockedReservations = reservations . filter (
33173337 ( slot ) => slot . status === 'terminal_missing_evidence'
33183338 ) ;
3339+ const blockedReservationKeys = new Set (
3340+ blockedReservations . map ( ( slot ) => primaryReservationKey ( slot . laneId , slot . taskId , slot . repeatIndex ) )
3341+ ) ;
3342+ const blockedRowKeys = new Set ( ) ;
3343+ const extraBlockedRowKeys = [ ] ;
33193344 const blockedRows = rows . filter (
33203345 ( row ) =>
3321- row . status === 'setup_failed' && [ 'grepai' , 'codebase-memory-mcp' ] . includes ( row . lane_id )
3346+ ! row . scoring ?. baselineArmId &&
3347+ row . status === 'setup_failed' &&
3348+ String ( row . scoring ?. fallbackReason ?? '' ) . startsWith ( 'terminal_missing_evidence:' )
33223349 ) ;
3323- if ( blockedRows . length !== blockedReservations . length ) {
3324- errors . push ( 'terminal missing-evidence rows must be present for every blocked reservation' ) ;
3350+ for ( const row of blockedRows ) {
3351+ const key = primaryReservationKey ( row . lane_id , row . task_id , row . repeat_index ) ;
3352+ blockedRowKeys . add ( key ) ;
3353+ if ( ! blockedReservationKeys . has ( key ) ) extraBlockedRowKeys . push ( key ) ;
3354+ }
3355+ const missingBlockedRowKeys = [ ...blockedReservationKeys ] . filter ( ( key ) => ! blockedRowKeys . has ( key ) ) ;
3356+ if ( missingBlockedRowKeys . length > 0 || extraBlockedRowKeys . length > 0 ) {
3357+ errors . push (
3358+ `terminal missing-evidence rows must match blocked reservations exactly; missing=${ missingBlockedRowKeys . length } , extra=${ extraBlockedRowKeys . length } `
3359+ ) ;
33253360 }
33263361 if ( errors . length > 0 )
33273362 throw new Error ( `baseline session validation failed:\n- ${ errors . join ( '\n- ' ) } ` ) ;
0 commit comments