So well, in fact, that he was one out away from back-to-back shutouts until Mike Trout and Albert Pujols hit two-out singles in the bottom of the ninth and prompted Astros skipper Bo Porter to make a change 128 pitches into his starter's outing.
Keuchel settled for two earned runs -- the product of Howie Kendrick's ensuing triple off reliever Josh Zeid -- in 8 2/3 innings, which was one less than what Richards gave up to the first five batters of the game.
"That's a very powerful lineup," Keuchel and his 2.63 ERA said of the Angels. "I was lucky to get into the ninth inning. I was careful, but at the same time, my game is to go out and attack the zone."
Richards entered Monday with a 2.18 ERA in his previous five starts, but he gave up five runs in the first three innings and put his team in an early three-run hole.
The 25-year-old right-hander gave up a leadoff double to Jose Altuve, walked George Springer, uncorked his Major League-leading 10th wild pitch, then made an errant throw to third on an attempted pickoff, allowing the game's first run to score.
"That play at third was my fault," catcher Chris Iannetta said. "I thought I got the sign to pick over. I didn't see the sign correctly with whatever sequence we were using. Obviously, Luis [Jimenez] didn't break, because he didn't get the same sign. So that was on me."
What followed -- a walk to Dexter Fowler, then back-to-back RBI singles by Jason Castro and Matt Dominguez -- was on Richards, who had been the best starter of an overachieving rotation through the season's first six weeks.
"I was making some good pitches, and they were spitting on some good two-strike breaking balls," Richards said, "and they found a way to put the ball in play."
It wound up being Richards' first loss -- and only the Angels' third in their last 11 games -- but his ERA only jumped from 2.40 to 2.90 because he was able to complete seven innings.
Richards gave up a two-out RBI single to Fowler in the second and a one-out RBI single to Chris Carter in the third, but retired 12 of the last 14 batters he faced and recorded 21 outs for the sixth time in nine starts this season.
"There's a lot of positive things I'm going to take away from this game," he said. "I found a way to go seven innings. The first three I gave up some runs, but then I put up some zeros and kept us in the ballgame and gave us a chance to score some runs. Nothing but positives."
Keuchel had given up 17 earned runs in 23 career innings against the Angels heading into this outing, which came six weeks after he gave up four runs in five innings against the Angels in his season opener.
But by the time the 26-year-old southpaw took the mound for the ninth, the Angels had only four baserunners -- one on a walk, one on a jam-shot blooper and two on infield singles -- and Keuchel had thrown 20 2/3 consecutive scoreless innings.
"I think the biggest thing for him tonight was really that sinker was very good," Iannetta said. "He was throwing it for strikes, he was also throwing it below the zone. ... He was getting a lot of swings and misses on it. And he always has that changeup in his back pocket. He was working really quick, especially out of the stretch. He was very quick to the plate, and he was keeping guys off balance, too. He pitched a great game."