The narrative that loomed over the Yankees last offseason involved denunciations for frugality and missed opportunity.

Bryce Harper and Manny Machado were free agents entering their primes, and the Yankees showed no interest in Harper and minimal interest in Machado. Hal Steinbrenner heard a lot of criticism that he lacked his father’s big-name, big-ticket flair.

As it turned out, the Yankees probably had the best offseason of any team, spreading their money around to create depth that has fortified what will be their first division-title winner since 2012. Final grades are reserved until after the postseason because if, say, Adam Ottavino surrenders an elimination-game homer, the perception of his first Yankees season will be soiled.

But, so far, so good.

“I don’t get affected by outside noise,” Brian Cashman said. “We [GMs] are all charged with doing the right thing, not the popular thing or the expected thing.”

Thoughts on an offseason in which Cashman mainly did the right thing:

1. The Yankees re-signed Brett Gardner and Gio Urshela (minor league deal to keep him from testing free agency) last October and — with Wins Above Replacement (Baseball Reference version) as the barometer — they have outperformed Harper and Machado, respectively. Of course, Harper and Machado are more talented. But they also came with 23 years and $635 million in obligation. The Yankees’ most regrettable acquisition in the past four years was when they acted like a caricature of the George Steinbrenner Yankees and simply could not resist Giancarlo Stanton’s homer power, star power and 10 years and nearly $300 million remaining.

Also, the Phillies and Padres did get bumps in attendance, but not much in the standings with the additions of Harper and Machado.

2. The Phillies, Mets and Yankees were probably as active as any teams this offseason. Besides Harper, Philadelphia signed Andrew McCutchen and David Robertson away from the Yankees in free agency. McCutchen had played in the most games since 2010, and Robertson had appeared in the fourth-most in the same span. Both missed most of this season due to injury.

Like the Yankees, the Mets made two high-profile relief additions, giving up perhaps their best prospects in Justin Dunn and especially Jarred Kelenic for Edwin Diaz while signing Jeurys Familia for more (three years, $30 million) than the Yankees gave Ottavino (three years at $27 million). Imagine if the Mets had signed Ottavino and Zack Britton and kept Kelenic.

How hard is it to get free-agent relievers right? Five of the 10 who received the most guaranteed money last offseason had negative WARs (Familia, Andrew Miller, Joe Kelly, Kelvin Herrera and Cody Allen), Robertson had a WAR of 0.0, Joakim Soria was at 0.1 and Justin Wilson was at 1.1, a fine year for the Mets. But only two teams have two relievers who each have registered better than a 2.0 WAR this season: the A’s with Liam Hendriks and Yusmeiro Petit and the Yankees with Britton and Ottavino.

3. DJ LeMahieu is among the best free-agent signings in Yankees history. Think about that. When the Yankees inked him to a two-year, $24 million pact, it felt like secondary news and/or overkill. Now, he is there with Reggie Jackson, Goose Gossage, Orlando Hernandez and Mike Mussina.

LeMahieu might have a hard time cracking into the AL MVP top five, but it’s hard to imagine a player being more valuable to his team than LeMahieu has been this year. He stayed healthy during a year when the Yankees set a record for injured list usage. His versatility made the injuries more tolerable. And his hitting style — contact with impact — influenced and improved the lineup. The Mets invested two years at $20 million in Jed Lowrie hoping for similar.

4. James Paxton took four months to find health and comfort to become a top-of-the-rotation piece. But he has done that, posting a 2.50 ERA and .533 OPS against since Aug. 1. And, as opposed to Kelenic’s showing in the minors for the Mariners, Justus Sheffield has yet to display that the Yankees will regret dealing him to Seattle for Paxton.

5. All was not perfect. Sonny Gray became the latest not to handle the Yankees cauldron only to go elsewhere (Reds) and thrive (2.80 ERA, 10.4 strikeouts per nine innings).

Troy Tulowitzki was signed for the minimum wage and the worst expectation — that he could not stay healthy — was realized. But his cheap signing allowed the Yankees to redirect cash elsewhere. A chunk went to extend Aaron Hicks (seven years, $70 million) and Luis Severino (four years, $40 million), who have yet to produce much due to injury.

CC Sabathia ($8 million) was re-signed, and his health and pitching were not great. But don’t undersell his value to a convivial, focused clubhouse. J.A. Happ has not pitched well, but he has pitched regularly and the Yankees were 20-9 in his starts. His durability has been valuable because no way are the Yankees 20-9 if, say, Chance Adams or Nestor Cortes Jr. make the 29 starts.

6. The offseason mainly helped with the future. Having Britton and Ottavino gives the Yankees a bullpen foundation with Chad Green and Tommy Kahnle if Aroldis Chapman opts out of his contract and/or Dellin Betances leaves in free agency. Mike Tauchman (obtained in a trade just before the season) has many of the same skills as Gardner, in case the longest-serving Yankee’s tenure is up.

LeMahieu, Paxton and Happ are under control at least through next season and Urshela is near the Super Two borderline, so he might not even be arbitration eligible until after the 2021 season.