I had a look in CvAI.py, in functions doCityAIUpdate and doCityAIProduction. Here are some interesting facts. (For each item, add a disclaimer of "If I'm reading the code right."

)
One big shortcoming is how the AI assigns pop to planets. It recalculates its population assignments to planets for every city every turn. In doing so, it seeks a food surplus of only +3 (which is not enough against FF growth costs) and prioritizes hammers after that. It never prioritizes commerce planets! That's why it researches so poorly. Compare to our Paradise that jumped on its 1-1-6 "gems" planet ASAP.
Another shortcoming is how it selects planets to build nutrition/mining/commerce facilities. For each, it selects the available planet with the largest CURRENT production of that type. This is wrong! Planet size should be the determinant here. For a food facility, the AI will pick a size-1 2-2-1 planet over a size-3 1-1-6 planet. But the facility gives only +1 food on the former and +3 food on the latter!
Mining facilities come out even worse, since the AI doesn't match up build orders with what planets it's actually working. It will build a mining facility on a 0-2-5 blue planet ahead of a 2-0-3 white planet, then happily ignore the blue planet in order to work more food.
Each time the AI selects a city build, there is a 15% chance of exiting out with no FF mod logic and building whatever the AI would build in the unmodded game. If the AI is at war, there is another check for a 40% chance to exit. This is an interesting safeguard. If both checks do not exit, then function doCityAIProduction attempts to override the standard city AI by using a weighting system.
The weight threshold (100 minimum) is pretty low in comparison to the rest of the function. Even a single angry citizen is assigned weight 115 which will always result in overriding the standard city AI to build a happy building, unless a higher-weight override is found. It seems very common for the AI to get stuck in overgrowing the tight health and happy caps, especially considering its difficulty in managing starbases to claim resources. So it builds ever more expensive cap lifters to compensate. And the standard AI has the outlet of whipping away angry or sick citizens but that comes too late in FF.
It gives increased weight to health and happy buildings based on the number of sick and angry citizens in the city, which isn't really right. A Sports Arena restores just as much productivity to a city with 3 angry citizens as to a city with 1 angry citizen, but in the former case it will be weighted much higher. This sort of works in the standard game - a city with 3 angry citizens will in sequence build a temple, colosseum, theater - but not for FF where the prize for building one Arena is double and triple the cost to build more.
The AI (at least this function) completely ignores the Value-specific buildings! If it needs happiness, it will build the 280-hammer 7th Sports Arena over the 1st Temple of Worship! AFACT, the only way for the AI to build the value-specific buildings is if the FF AI falls through to the standard AI. It also does not build Stardocks and several other mod buildings except by fall-through.
The rules for starbase construction are very rudimentary. First, the AI doesn't dispatch a conship to a starbase location until it has already saved up enough gold. Then it weights a location mostly by the number of resources reachable by the starbase, which explains why Vlad reached out so far from his homeland for that one. It doesn't distinguish between resource types (we humans know that the cap lifters are far better.) Then there is no logic to dispatch a second conship to build lanes and resource extractors until the starbase is actually complete.
(Let me be clear that I'm not at all bashing Jon Shafer for any AI shortcomings. Final Frontier is still spectacularly well done for essentially a throw-in game mod, and I completely understand that first getting the mechanics right and functional was far more important than polishing the AI.)