I have actually found decent success recently (especially with Fable) giving it an "added line budget". This does more than anything else to keep it on task. The trick is knowing an approximate line count beforehand, but sometimes the LLM will push back on what it should cut. But usually it just doesn't add all those "nice to have" redundancies and multipage comments and unit tests that check if a certain phrase is still in the error message.
Keeping a simple log of "accepted/rejected" avenues is basically all that's needed, maybe with a root style guide in the project. I've got several multi-day sessions in 5.6 Sol running without going off the rails in terms of complexity. After a while in this loop it actually starts to remind/berate itself to keep things straight-forward.
Just ask it to do it. You can ask it to do a line reduction cleanup pass before each commit. I don’t know why they default to adding complexity because they are capable of doing it better just by asking.
Recently watched a podcast featuring Bob Martin. He uses coding agents to measure and reduce cyclomatic complexity of the generated code. Not something I tried myself yet.