Valid markup and eligible markup are different things
A schema block can parse perfectly, satisfy the vocabulary, and still qualify for nothing. This walks every typed node on a page, including nested ones, and reports which enhancements it is eligible for and exactly which property is blocking the rest.
Rich Result Eligibility
Validity and eligibility are different questions. A JSON-LD block can parse cleanly, satisfy the schema.org vocabulary, and still be ineligible for a single search enhancement because it is missing a property that the enhancement specifically requires. This checks the second question: for each type declared on the page, which enhancements does it actually qualify for, and precisely which property is standing in the way.
Eligible is not the same as guaranteed
Meeting every requirement earns you a place in the pool of candidates. It does not earn you the enhancement. That distinction is worth setting straight with a client before the markup ships, not after.
Required is a floor, not a target
Missing a required property is disqualifying. Having only the required properties makes you the weakest eligible candidate, which in practice is close to the same outcome.
Markup must match visible content
Every enhancement carries the same underlying condition: the marked up content has to be present and visible on the page. Structured data describing content a user cannot see is a policy violation, not a shortcut.
Enhancements get retired
FAQ and HowTo results were both dramatically curtailed. Building a content strategy on one specific rich result is building on something outside your control.