Say what not to look at
'Review my code' returns naming suggestions and missing type hints, because those are easy to find and always present. Excluding them is what surfaces the real findings: 'ignore formatting, a linter covers it'. Exclusions do more work than inclusions in review prompts.
Name the categories
Ask for specific failure classes — correctness bugs, race conditions, unhandled error paths. A model given categories searches for each in turn. A model given 'find problems' pattern-matches against whatever it noticed first and stops.
Demand a reproducing input
Require every finding to come with a concrete input that triggers it. This is the single most useful constraint in a review prompt, because it forces the model to discard the plausible-sounding findings it cannot actually justify. Add 'if a category is clean, say so' so it does not invent one to fill the space.