Currently all of these tools accept different dialects of QML.
qmlcachegen accepts almost everything the QML runtime does, even if it then results in runtime errors.
qmlsc rejects everything it happens to be unable to compile, but it does a rather involved type inference that can give retrieve information.
qmllint has its "findwarnings" pass which is the strictest, but also the messiest of the bunch.
The solution is to move the type inference out of qmlsc, and employ it in the other tools, too. In turn, the good parts of qmllint's checks (e.g. the check for undeclared signal parameters) should also be moved out and run as an extra pass in the other tools.
We can then decide which issues should cause diagnostics of what severeness in which tools. qmlcachegen might only warn about undeclared signal parameters, for example, but qmlsc should reject them.