Jeff Flake is a retiring Arizona senator, Trump critic, and an eager defender of civility and democratic norms.

But Jeff Flake is also a hopelessly ineffectual Trump opponent – no matter how often Flake denounces President Trump's latest abuse, controversy, or scandal.

The soon-to-be-former Arizona senator has criticized, condemned, and shamed Trump on many occasions, and all of the incidents have played out in the same way. The media supplies 12 hours of fawning commentary that praises Flake for standing up for basic values of the republic in the face of a boorish commander-in-chief.

Yet concrete political repercussions for Trump are almost always negligible. The president hurls an insult or doubles down in response to critics like Flake, and around and around they go.

The latest example occurred on Monday, when Trump stood next to Russian President Vladimir Putin at a press conference in Finland and declined to blame Russia for interfering in the 2016 election.

Ignoring the conclusions of the FBI and U.S. intelligence authorities, Trump said that he doesn't see "any reason why" Russia would attempt to meddle in the election, remarks that Flake and many other Republicans quickly condemned.

Flake called Trump's defense of Russia "shameful." Likewise, Arizona Senator John McCain said that before Trump's statements in Helsinki, no president has ever "abased himself more abjectly before a tyrant."

I never thought I would see the day when our American President would stand on the stage with the Russian President and place blame on the United States for Russian aggression. This is shameful. — Jeff Flake (@JeffFlake) July 16, 2018

Yet for all of his stirring addresses and sharply worded Twitter posts, Flake has been a loyal vote for Trump's agenda on nearly every issue, with the exception of trade policy. According to FiveThirtyEight, Flake has voted in line with Trump's position more than 80 percent of the time: supporting controversial nominees like Jeff Sessions, Betsy DeVos, Neil Gorsuch, and Scott Pruitt; attempting to gut the Affordable Care Act; and casting a critical vote to pass a major tax overhaul.

Most recently, Flake promised not to block Trump's replacement for retiring Supreme Court Justice Anthony Kennedy before the president had even named his pick, despite Flake's ongoing consternation over tariffs.

So in light of his voting record, observers occasionally roll their eyes when Flake criticizes Trump for his nativism and shameless lies – after all, Flake confirmed the people who are actively carrying out Trump's agenda.

Now, Flake is again in the spotlight after critiquing Trump's words. Will Trump give a mea culpa after the Helsinki affair, and defer to the expertise of U.S. national intelligence agencies going forward? Probably not, based on past episodes.

With this in mind, here is an abridged history of every time Flake castigated Trump with no result.

October 2016: Flake launches multiple criticisms of Trump as the 2016 presidential election careens toward a finish.

Republicans should not be okay with @realDonaldTrump threatening to jail his opponent after the election. That is not who we are. — Jeff Flake (@JeffFlake) October 12, 2016

.@realDonaldTrump saying that he might not accept election results is beyond the pale — Jeff Flake (@JeffFlake) October 20, 2016

America deserves far better than @realDonaldTrump — Jeff Flake (@JeffFlake) October 7, 2016

Notably, after the release of the Access Hollywood tape, which captured Trump in 2005 bragging about groping women, Flake calls on him to drop out of the presidential race.

.@realDonaldTrump is wrong about his level of support. He needs to withdraw from the race. https://t.co/sv7K3qmF1w — Jeff Flake (@JeffFlake) October 8, 2016

Trump, obviously, did not withdraw.

November 2016: After Trump's victory, Flake meekly offers an olive branch.

Congrats to Pres. Elect Trump on a big win and a gracious and healing speech. I look forward to working with him. Now, back to eating crow.. — Jeff Flake (@JeffFlake) November 9, 2016

January 2017: Jeff Flake condemns Trump's travel ban on predominantly Muslim countries as "unacceptable."

May 2017: Trump fires FBI Director James Comey. Flake fires off an indignant tweet.

I've spent the last several hours trying to find an acceptable rationale for the timing of Comey's firing. I just can't do it. — Jeff Flake (@JeffFlake) May 10, 2017

August 2017: Flake releases a new book, Conscience of a Conservative: A Rejection of Destructive Politics and a Return to Principle. And with it, Flake's feud with Trump – which had been simmering up until that summer – reaches a boiling point.

The manifesto, with its title ripped from a similar Barry Goldwater book, is part autobiography and part ode to a bygone era of Goldwater-esque conservatism, real or imagined. Flake advocates for immigration reform. He sounds the alarm about the erosion of democratic norms.

He also criticizes Trump policies such as the travel ban on Muslim-majority countries. Of course, Flake was a strong advocate for confirming Supreme Court Justice Neil Gorsuch, a Trump appointee who was instrumental in upholding said ban last month.

Shortly after the book is released, Trump assails Flake as "toxic" and calls him "a non-factor in Senate" on Twitter, praising his primary opponent, Kelli Ward.

September 2017: After Trump announces that he is rescinding the Deferred Action for Childhood Arrivals program, or DACA, which shielded recent undocumented immigrants from deportation. Flake reacts strongly in the lead-up to the announcement, saying that Congress should "take immediate action."

Congress needs to take immediate action to protect #DACA kids. — Jeff Flake (@JeffFlake) September 1, 2017

October 2017: Flake announces that he will not run for re-election, blaming Trump's policies on trade and immigration and the debasing of American political life.

In his farewell Senate address that prompted awestruck media coverage – a speech in which Flake never mentioned Trump by name – the Arizona senator says, "We must never regard as 'normal' the regular and casual undermining of our democratic norms and ideals."

December 2017: With the congressional brawl over a proposed tax overhaul came one of Flake's most baffling decisions during the Trump presidency.

Despite reservations, Flake casts one of the decisive votes in favor of Trump's tax bill after receiving a promise from the White House that officials would push for a legislative solution before the expiration of DACA. The agreement, Flake says, was "an iron-clad guarantee that we’ll get it done by this date."

Of course, the DACA expiration came and went without a deal in Congress. Ever since, Flake has dealt with criticism that he got rolled during the negotiation.

Also in December, Flake urges Trump to stop attacking the Russia investigation and the FBI. "Let's not sow distrust in our democratic institutions," Flake wrote on Twitter.

January 2018: During the fallout from Trump's remarks referring to African nations and Haiti as "shithole countries," Flake confirms that Trump made the statement and condemns his remarks.

The words used by the President, as related to me directly following the meeting by those in attendance, were not “tough,” they were abhorrent and repulsive. — Jeff Flake (@JeffFlake) January 12, 2018

Trump strolls past the controversy and seems to deny ever making the comments.

In another Senate speech during the month of January, Flake harshly criticizes Trump's attacks on the media and basic facts. When Trump calls the press "the enemy of the people," Flake says, "our own president uses words infamously spoken by Josef Stalin to describe his enemies."

March 2018: A plan from Flake to temporarily extend DACA for three years fails ahead of the deadline when the program was set to expire. (Thanks to the courts, Trump's order to end DACA was stalled.)

Also in March, Flake vows to fight Trump's protectionist tariffs on aluminum and steels imports, arguing that "trade wars are not won, they are only lost." But sure enough, Trump's tariffs go into effect, and a multi-front trade war is underway by the summer.

June 2018: Flake assails the president on the family-separation policy at the border, demanding information on procedure and urging Trump to end a cruel practice.

This might be the one example where the president reversed course, but it certainly wasn't because of Flake's criticism. Widespread outrage over the family-separation crisis propelled Trump to issue an executive order on June 20 to detain families together but leaving in place the original "zero tolerance" prosecution strategy.

This month Flake also once again hits Trump over tariffs, saying that his forewarned trade war is in its "nascent stages." He urged his Senate colleagues to take action and reduce the president's ability to impose tariffs.

“It is not our charge to just go along just because the president shares our party affiliation," Flake says. But Senate Majority Leader Mitch McConnell declines to shepherd the bill to a vote. Negotiations are ongoing, but based on past attempts from Republicans to rein in Trump, the outlook is grim.

Viewed in the aggregate, Flake's constant stand-taking against Trump is somewhere between depressing and pathetic. Whether the outgoing senator will be a more effective Trump opponent in the private sector when his term runs out remains to be seen.

Flake seems to be nursing presidential ambitions, however implausible his race to the White House as a GOP primary challenger or third-party candidate might be. Hardline conservatives in Arizona loathe Flake, and Trump proved long ago that the Republican Party is unwilling or unable to challenge him.

But either way, after Flake leaves Congress in January, you can bet that Trump will continue to do and say outrageous things. Flake will condemn the president. He will win praise. Trump will react with ire. And on, and on.