Democrats wanted Beto O’Rourke to come out swinging in his second debate against Republican U.S. Senator Ted Cruz—and he did. But while O’Rourke started off strong laying out stark differences between himself and Cruz on issues such as judicial nominations and Russian meddling in U.S. elections, O’Rourke also stepped on his own message of civility in politics by repeatedly accusing Cruz of dishonesty. “He’s going to make up positions and votes that I’ve never held or have ever taken. He’s dishonest. It’s why the president called him ‘lying Ted.’ And it’s why the nickname stuck because it’s true.”

With three weeks left before the November 6 election, concerns are mounting that O’Rourke may come up short in his bid to upset the incumbent Cruz. A knockout punch in Tuesday’s debate would have helped and while O’Rourke threw a few solid shots, Cruz looked unfazed and certainly made no obvious or potentially hurtful errors.

For his part, Cruz seemed more polished—and practiced. He framed his issues against O’Rourke in a way that would appeal to the Republican base. And Cruz took away the familiarity of how everyone refers to O’Rourke by the nickname of “Beto” by never referring to him as anything other than “Congressman O’Rourke.” The subliminal message was simple: O’Rourke is not your friend. He’s a Washington insider.

But as a long-time Cruz watcher, I found his stage presence after a time takes on the feel of an act, rather than sincerity. This is especially true when Cruz reaches the point of tugging on voters’s heartstrings by talking about his children. Consider this line from the close of the first debate: “Being a dad of young kids is hard…Every day when I leave for the campaign trail, it’s hard. There are a lot of tears in the Cruz household.” Then tonight: “Look I will say, the hardest thing about being in this job is being a dad.” Cruz talked about missing one of his daughter’s basketball games because he stayed in Washington to vote for tax cuts.

Yes, O’Rourke talked about his children, too, and a drum set in the basement as well as caring for a blind squirrel. But I’ve heard Cruz use the visits home to his children before as props to humanize himself. Linking his missing a daughter’s game to voting on a tax cut simply looked like a way of telling voters that this was a sacrifice he was making for them so they would pay less taxes. It just felt smarmy.

In the debate overall, held in San Antonio, O’Rourke and Cruz painted each other as extremists of the right and left in America. O’Rourke described Cruz as someone who does not care about health care or the border economy. Cruz retorted by claiming O’Rourke would impeach President Trump and support an extremely expensive Medicare-for-all proposal made by Democratic Socialist Senator Bernie Sanders.

“Who has explicitly come out for impeaching President Trump?” Cruz asked. “That is extreme and it means…two years of a partisan circus shutting down the federal government in a witch hunt on the president. That’s not good for the state of Texas; it’s not good for our country.”

O’Rourke fired back, “Really interesting to hear you talk about a partisan circus after your last six years in the U.S. Senate. Listen, if you have this special relationship with President Trump, then where is the result of that? You were all talk and no action. The tariffs that the president has levied, the trade wars that he has entered this country into, is hurting no state more than it’s hurting Texas.”

At one point, O’Rourke tried to introduce the idea that he has been the candidate of civility. On the campaign trail he has largely stayed away from criticizing Cruz or Trump personally, leading some Democrats to complain that O’Rourke is trailing in the polls only because he has refused to take Cruz down a notch or two. And he did that during this debate, but he also noted that he had won an award for civility for a cross-country road trip that was broadcast live on Facebook as he traveled with U.S. Representative Will Hurd, a San Antonio Republican.

He toured “our ability to travel across the country as a Republican and a Democrat in a car and Facebook live stream the whole thing. But then to get to work in Congress enjoying one another’s legislation to do better for our constituents regardless of the party differences that might otherwise stand between us was recognized. It’s the same kind of approach that I take to just about everything that I do in Congress everything that I do in life.”

Cruz’s approach is to never give his opponent an inch: “I think we should focus on substance and not inflammatory rhetoric. Yet you know I will say it was striking and at this press conference in D.C. about civility, Congressman O’Rourke again repeated his call for impeaching President Trump. That’s the very essence of not civility. If we had impeachment next year we’d see utter chaos. We would see an end to the repeal of the job killing regulations that’s fueling our economic growth.”

We’re entering the final stretch of the race, with O’Rourke ending last month with $22.9 million in the bank, while Cruz had $11.2 million. The big difference is the $38 million campaign finance haul O’Rourke had in the third quarter of this year. But Cruz has allied organizations that are not directly coordinating with his campaign. Club for Growth, for one, reported buying more than $800,000 in television advertising at the end of September in support of Cruz. And President Trump is coming to Houston next Monday to fire up the faithful for Cruz. Against that, O’Rourke has been building a massive get-out-the-vote machine.

This likely was the final debate between Cruz and O’Rourke. CNN is hosting O’Rourke to a town hall in McAllen on Thursday. Cruz turned down the offer of one of his own, but asked Tuesday if the Thursday event could be converted into another debate. CNN officials said the network would agree if O’Rourke would. Since Cruz at the close of this debate referred to it as their last, that does not appear to have worked itself out.

Here is the full debate: