President Trump promised to lower taxes, combat terrorism and replace the Affordable Care Act in a speech to a joint session of Congress, Feb. 28. Here are key moments from that speech. (Sarah Parnass/The Washington Post)

Vice President Pence and House Speaker Paul Ryan listen as President Trump addresses a joint session of Congress.

On the positive side, President Trump’s speech began with a long overdue condemnation of the anti-Semitic attacks across the nation and the shooting in Kansas. He did not repeat his claim from a press briefing earlier in the day that desecration at Jewish cemeteries may have been the work of people who wanted to make him look bad. The speech was not as gloomy or sinister as his inaugural address. (“A new national pride is sweeping across our nation.”) There was no message about “carnage.” And he did not rail at the press. So he did not feed the narrative that he is unstable or plagued by paranoid delusions.

He framed the speech as a look ahead to the 250th anniversary of the country’s founding. (“What will America look like as we reach our 250th year? What kind of country will we leave for our children? I will not allow the mistakes of recent decades past to define the course of our future.”) This was, by far, the most presidential we have seen him.

He also talked in a more reasoned fashion about immigration. “I believe that real and positive immigration reform is possible, as long as we focus on the following goals: to improve jobs and wages for Americans, to strengthen our nation’s security, and to restore respect for our laws,” he said. “If we are guided by the well-being of American citizens then I believe Republicans and Democrats can work together to achieve an outcome that has eluded our country for decades.” What that would entail is far from clear, especially because his base is opposed to any comprehensive immigration reform. (Unfortunately, he also fanned the myth that immigrants disproportionately commit more crimes, choosing to single them out with a special office within the Department of Homeland Security.)

By far the most dramatic moment came with a call-out to the widow of slain Navy SEAL William “Ryan” Owens. Tearing and looking upward to heaven, she received extended applause from the entire audience.

Aside from that, the speech had little to commend in it. The substitute for gloom and doom turned out to be sophomoric pabulum like: “We just need the courage to share the dreams that fill our hearts.” Entirely devoid of substance, the fortune-cookie-like admonitions sounded like time fillers to extend the speech to an acceptable length. (“From now on, America will be empowered by our aspirations, not burdened by our fears.”) With too many clunkers like “Think of the marvels we can achieve if we simply set free the dreams of our people,” it’s evident he really needs a presidential-caliber speechwriter.

Trump has been president for about 40 days, but he sounds like he is still giving stump speeches. Alas, on health-care policy he largely repeated campaign promises. “I am also calling on this Congress to repeal and replace Obamacare with reforms that expand choice, increase access, lower costs and, at the same time provide better health care.” Well, the issue is how to do that, and there was no indication he had any idea how to approach the issue. The only items he listed were protection for preexisting conditions (how, he did not say), health spending accounts and unspecified tax credits, litigation reform and flexibility for governors. That’s it. Nothing was mentioned about whether people will be able to buy equivalent insurance without Obamacare subsidies. Even more cringeworthy, he continued to raise expectations to new, unattainable heights. (“Everything that is broken in our country can be fixed. Every problem can be solved. And every hurting family can find healing, and hope.”)

On taxes, the lack of content was laughable. “My economic team is developing historic tax reform that will reduce the tax rate on our companies so they can compete and thrive anywhere and with anyone. At the same time, we will provide massive tax relief for the middle class.” And how is this paid for? Don’t ask. Do the rich get tax breaks, too? You wouldn’t know from his remarks.

While devoid of particulars, there were some intriguing lines about foreign policy: “The only long-term solution for these humanitarian disasters is to create the conditions where displaced persons can safely return home and begin the long process of rebuilding. America is willing to find new friends, and to forge new partnerships, where shared interests align.” That, perhaps, suggests a more engaged and collaborative foreign policy than he’s described before. (However, he might not, then, want to cut the State Department budget by 37 percent, as he suggested earlier today.) He also gave a shoutout to NATO and even to democracy. (“We strongly support NATO, an alliance forged through the bonds of two World Wars that dethroned fascism, and a Cold War that defeated communism. . . . Free nations are the best vehicle for expressing the will of the people — and America respects the right of all nations to chart their own path.”) He claimed the “money is pouring in” from allies agreeing to up their contributions. We await the fact-checking on that one.

So, if you were looking for real details about policy matters, you no doubt were disappointed. Most critically, GOP members of Congress got little sense as to what the president would and would not accept as an Obamacare replacement. That means they’ll be flying blind, hoping to reach consensus that won’t be so unpopular with voters that Trump turns on his own party members. One cannot over-emphasize how strange it is that the White House is providing no cover, let alone direction, on arguably the most important aspects of its own agenda.

Happy talk and mindless phrases, of course, leave Trump with wiggle room to blame Democrats or Republicans, or both, when things don’t work out, but it makes success on complex and controversial issues much more difficult.