To answer some of my questions that were left unanswered:
no, forward declaring classes is not the issue - I imagine in some scenarios it could be (if concepts are used in expressions that operate on types not actual instances of objects) but that's not the case in my codebase (I use concepts to constrain function arguments so class definitions are guaranteed to be available)
the thing to look for is inheritance (including CRTP) - the discussion in the related question that Jan linked directly addresses the problem I have; it's obvious to me now, I just wish the compiler gave me a warning as I still can't imagine a scenario where someone would want to intentionally do this