@@ -3509,6 +3509,10 @@ function startAllowedToolRecovery(state, payload, platform, artifactDecision = n
35093509 )
35103510 }
35113511 const recoveryFootprint = projectMutationFootprintForRecovery ( footprint )
3512+ const canonicalOperationTargets = [
3513+ ...( artifactDecision . sourceTargets || [ ] ) ,
3514+ ...( artifactDecision . targetTargets || [ ] )
3515+ ]
35123516 state . turnLiveness . inFlightOperation . mutationLease = mutationLease
35133517 state . turnLiveness . inFlightOperation . mutationFootprint = recoveryFootprint
35143518 state . turnLiveness . inFlightOperation . mutationPreObservation = preObservation
@@ -3523,7 +3527,13 @@ function startAllowedToolRecovery(state, payload, platform, artifactDecision = n
35233527 state . taskRecoveryCommitFence ?. writerGeneration ?? 0 ,
35243528 expectedStateSequence : state . taskRecoveryCommitFence ?. stateSequence ?? 0 ,
35253529 kind : artifactDecision . operation || 'mutation' ,
3526- exactTargets : recoveryFootprint . normalizedTargets || footprint . normalizedTargets ,
3530+ // ArtifactSlotDecisionV2 computes targetSetDigest from its canonical target
3531+ // projection. The raw footprint can still contain a Windows short-path or
3532+ // differently-cased alias, so binding that raw spelling to the canonical
3533+ // digest makes an otherwise valid operation fail closed on some runners.
3534+ exactTargets : canonicalOperationTargets . length
3535+ ? canonicalOperationTargets
3536+ : ( recoveryFootprint . normalizedTargets || footprint . normalizedTargets ) ,
35273537 targetSetDigest : artifactDecision . targetSetDigest ,
35283538 beforeDigest : preObservation . snapshotDigest
35293539 } , operationFenceOptions )
0 commit comments