It’s probably unfair to say that the St. Louis Cardinals snuck into the postseason last year. After all, they were expected to contend at the outset of the season and subsequently led the division race over each of their final 35 games. With 91 wins, they were a worthy playoff team, and their triumph in the NLDS only reinforced that perception.

But if the Cardinals were more than a smoke and mirrors act, they weren’t always the most convincing contender either. It took them 90 games to finally clear the .500 bar for good and despite playing in the National League’s least talented division, they never separated themselves from their competition. Had Milwaukee swept the 90-loss Rockies in the season’s final weekend, they’d have pipped St. Louis for the Central.

It’s also not clear how well-positioned this team is to compete going forward. There are big holes in the outfield, aging veterans in key positions, and plenty of question marks on both sides of the ball. Frustratingly for Cardinals fans, management made few moves to address those problems this winter. With spring training just a few weeks away, it appears that the Cardinals missed a golden opportunity to solidify their position at the top of a winnable division.

Perhaps the biggest source of trouble going forward is that the club’s best position players are at or nearing the end of their peaks. That became clear early on in 2019: For a team that was supposed to hit its way to the playoffs, the Cardinals wound up with a mediocre offense. The Redbirds posted a 95 wRC+, good for 15th in the circuit, and without a big season from Paul Goldschmidt, Marcell Ozuna, or Matt Carpenter. The big producers actually regressed, and it took breakouts from unexpected sources like Kolten Wong and Tommy Edman to buoy the lineup.

The problem starts with Goldschmidt, whose last elite offensive season came all the way back in 2015. He was more of a very good hitter than a great one from 2016-2018 and just posted the worst numbers of his illustrious career in 2019; a .476 slugging percentage for a first basemen in the rabbit ball era just isn’t all that impressive. He was better in the second half, and his Statcast metrics only tapered off modestly, so it’s not like he’s cooked; 2019 may well prove to be a down year. Either way though, he looks more like a good player than a great one at this stage.

Carpenter appears even further down the trail. Thirty-four isn’t ancient and he’s two years removed from a 140 wRC+ season. But he’s also at an age where decline can set in rapidly, and unfortunately for Cardinals fans, it appears that was the case last season. To wit:

One Bad Year or a Sign of Decline? BA OBP SLG BB% K% Exit Velo Hard Hit % 2018 .257 .374 .523 15.1 23.3 89.6 44.7 2019 .226 .334 .392 12.8 26.1 87.2 31.1 SOURCE: Baseball Savant

There were mitigating circumstances, most prominently a back strain and a foot contusion that led to separate stints on the injured list. He wasn’t hitting well before the injuries though, and it’s hard to find anything encouraging about the trajectory of his numbers or their underlying inputs. ZiPS sees him as a two-and-a-half win player. That seems like a fair over/under, though given the Statcast metrics, I’d take the under.

St. Louis will also feel the loss of Ozuna. As Ben Clemens touched on when the outfielder signed with Atlanta, Ozuna is a tough guy to evaluate. More so than with most players, it’s easy to overstate his virtues, of which there are many: His imposing physique and athleticism, titanic home runs, impressive exit velocity numbers, and a solid defensive reputation. Perhaps for that reason, it’s easy to treat him as a sleeping giant, to expect that his 2017 star-level production will become the norm rather than the good-not-great numbers that characterize most of his career production (at least, that’s a bias this author has to fight). But whether you treat Ozuna like a star or merely a first-division regular, the Cardinals will miss his bat in the lineup. He was a three-win player last season and notched a 110 wRC+ in the cleanup spot — the third-best mark on the team.

And they will miss that production all the more if the guys who stepped up last year can’t repeat the trick. Wong may approximate the 108 wRC+ he posted last year — he also had the same mark back in 2017 — but that’s probably his ceiling. He’s a career 96 wRC+ guy and he’s still the same line drive hitter he’s always been. He’s regularly among the league’s laggards in most power categories, as well their raw ingredients like exit velocity and hard hit percentage. His 3.7 WAR last season marked a career high; we’ll probably look back on it as his career year.

But the biggest shot in the arm came from Edman, a prospect of very modest renown who showed up last summer and helped catalyze a sleepy Cardinals team into the playoffs. He didn’t debut until June and needed another month to become a fixture in the lineup, but once there, he made a mark. The Cards went 48-28 in games he started, and even better, he fit the team perfectly, starting up and down the lineup and in three different positions.

Now the bad news: Edman’s big league production exceeded anything he’s accomplished as a minor leaguer. His 123 wRC+ is the best line he’s posted since Rookie ball. It’s possible that he’s a true talent .340 BABIP hitter, and that his newfound power is the product of something besides the lively ball and an extended hot streak. But it’s perhaps more likely that he’s more of a useful player than an All-Star.

There are serious question marks elsewhere as well. Yadier Molina is now 37 and just had his worst season since 2007. Dexter Fowler’s bat mostly bounced back in 2019, but he’ll be 34 on Opening Day and he’s a league average hitter in a corner outfield spot. The other corner is a wild card: Will Tyler O’Neill hit well enough to stave off Dylan Carlson? Will either produce like a playoff team needs from a bat-first player?

To look at the offense piece by piece is to see a team with limited upside. It’s not that there aren’t good players. ZiPS projects Paul DeJong as a 3.5 WAR shortstop, and you’d imagine that some of the aging veterans hold off father time. But other than Carlson, it’s hard to see a breakout player here, and it’s entirely possible that most of the old guys have played their best baseball.

The pitching staff looks similarly shaky. Jack Flaherty is an ace and Miles Mikolas has established himself as a mid-tier starter. Behind them though, the Cardinals have depth but little certainty.

Dakota Hudson is one of the league’s ripest regression candidates. It’s SABR 101 to point to the difference between a pitcher’s ERA and FIP/xFIP as if that alone closes a case, but in this instance, the gap between Hudson’s 3.35 ERA and 4.93 FIP is enormous. He doesn’t miss many bats, walked more than 10% of opponents last year, and had the second worst K-BB% in the league among qualified starters. He’s a groundball machine pitching in front of a slick infield defense, so it isn’t surprising that he out-pitched his peripherals; you just shouldn’t expect him to do so by so much in his second spin through the league.

The Cardinals also got more out of Adam Wainwright in 2019 than they should expect in 2020. Thirty-eight now, he’s one of the oldest starters in baseball, and his bounce-back campaign last season was as pleasant as it was surprising. On the tail of a disappointing 2017 season, injuries limited him to just eight starts in 2018: That he coaxed 31 starts of 2.4 WAR ball out of his aging arm in 2019 was a minor miracle. The safe bet is that he won’t do it again in 2020.

The contingency plans behind those four run the gamut from competent innings eaters (Daniel Ponce de Leon) to promising-in-theory types (did you hear that Carlos Martínez is getting stretched out?) to shrug emojis (hello, Alex Reyes). You can squint and see how one or two of those guys will emerge to throw 120 innings of 110 ERA+ ball; these are the Cardinals, after all. On paper though, this looks like a middling rotation with a lot of question marks at the back.

Underlying all of these question marks are the lack of reinforcements this winter. The Cardinals didn’t completely stand pat — that would be the Cubs — but they’ve done very little to augment the big league roster. They re-signed Wainwright and backup catcher Matt Wieters, and added Kwang-Hyung Kim, a lefty from South Korea who projects as a backend starter, to compete for a job in the rotation.

But you could argue that the club lost as much talent as it brought in. For one, Ozuna is gone, and the gap between him and O’Neill could be significant in a tight divisional race. The Cards also dealt Randy Arozarena and José Martínez to Tampa Bay for former first-round pick Matthew Liberatore. It’s a nifty piece of business — the consensus among prospect folks is that St. Louis won the deal — but one that removes two useful role players from the roster in exchange for future value.

With little left on the market, the offseason looks like a big missed opportunity for St. Louis. The contenders around them look weak: The Brewers lost a lot of talent this winter, and while they got creative with their reinforcements, they look worse on balance. The Cubs steadfastly avoided even modest upgrades. The Reds, of all teams, look potent after spending more than $150 million and turning a three-horse race into what looks like a four car pileup. But even their additions only put them in the mix; the division remains up for grabs.

Veteran teams with a solid but aging core usually do what they can to maximize their competitive window. On paper, the Cardinals looked like the kind of team that should do just that, and take a decisive step toward re-capturing the division. Instead, in a year flush with starters and outfielders, the Cards held their ground, betting that their incumbents have enough in the tank to get over the line without much in the way of new blood. They may be right; there is no clear favorite to usurp them.

But St. Louis hasn’t done all it can to remain atop the heap. Should they lose the division by a game or three, it will tempting — as it always is for the also-rans — to point back to that one blown lead in June, or the game that got away in Pittsburgh, as the reasons why they came up short. For a team like this though, it’s a copout. Unexpected things happen all the time in the round ball-round bat game. And for the Cardinals, the window to proactively address those vagaries has just closed.