CHICAGO — When the Royals flip back through the script they wrote for this 2018 season, the plot holes will jump off the pages.

There is the list of decisions made about the relief corps that banished the Royals bullpen to the cellar of baseball with a league-worst 5.33 ERA.

There is the feeble offense that entered Saturday slugging a 29th-ranked .373 and that during a five-win month of June batted a majors-low .193.

And don't forget the two fluke injuries that knocked significant right-handed power out of the lineup at different junctures in the season: Catcher Salvador Perez slipped on stairs while carrying luggage three nights before Opening Day and partially tore a ligament in his knee; and outfielder Jorge Soler tripped out of the batter's box in the midst of a nine-game losing streak and fractured his toe in June.

But one plot twist the Royals won't rue is the emergence of their youngest Rule 5 pitcher as a viable major-league starter. Brad Keller on Saturday night again proved he belonged as the Royals beat the White Sox 3-1 at Guaranteed Rate Field.

The outing was not perfect. Keller only made it through five innings, his pitch count rising to 94 because of a strenuous final two frames. He issued three walks and struck out six batters. He yielded seven hits, though some were results of defensive shifts.

In the third inning, shortstop Adalberto Mondesi tried to make a play on a ball hit up the middle by Adam Engel and got crossed up with third baseman Alcides Escobar as Mondesi floated back to the left side of the diamond. In the fourth, Escobar charged a ground ball hit by Jose Abreu but could not deliver the ball quickly enough to first baseman Lucas Duda, resulting in an infield hit. In the fifth, Mondesi went after Yolmer Sanchez's line drive up the left side of the infield to try to cut it off, but he wound up kicking the ball toward the left-field line instead. Sanchez was credited a double on the play.

But Keller never let the innings snowball. None of those runners scored. The first two batters of the fourth inning reached base, but Keller ended the threat by striking out two of the final three that went to the plate. The White Sox strung together three straight hits in the fifth but never sent anyone home. Perez cut down one of them, as he threw out Engel trying to steal second base. And with runners on the corners and two outs, Keller induced his sixth groundball of the game to get out of the inning.

Keller had pitched most of the evening at a 1-0 deficit after allowing a solo home run to Nicky Delmonico in the second inning. He might have lost Saturday had the Royals offense in the sixth inning not figured out White Sox starter Dylan Covey, who had allowed one hit through five innings.

Alex Gordon hit a solo homer to tie the game at 1 and absolve Keller of a loss. Then Lucas Duda, who roped a two-out double to right field, scored the go-ahead run on Jorge Bonifacio's single. Covey was yanked from the game immediately.

Keller triumphed as the Royals improved to 38-85.

Royals relievers Brian Flynn, Kevin McCarthy, Tim Hill and Brandon Maurer all worked scoreless outings to keep the White Sox at bay through the eighth inning. Maurer, who allowed a leadoff double to Abreu when he took the mound in the eighth, even struck out three batters. He's allowed only one earned run and struck out 13 in his last nine innings.

Given an extra run of cushion on Escobar's RBI single in the ninth, Wily Peralta cruised through the bottom third of the White Sox order and recorded his eighth consecutive save.