A refused upgrade produces a wall of conflict output that names twenty packages and does not say which one is responsible. prohibits answers the question directly.
$ composer prohibits symfony/console 4.2
laravel/framework v5.6.39 requires symfony/console (~3.3)
$ composer why doctrine/inflector
laravel/framework v5.6.39 requires doctrine/inflector (~1.1)
$ composer why-not php 7.3
some/package 1.4.0 requires php (^7.0 <7.3)
why-not is the alias worth remembering, and pointing it at php is how you find out what is pinning a project to an old runtime. The output is a single line naming the package and the constraint, which turns an afternoon of bisecting into a decision about one dependency. It reads the installed tree rather than resolving, so it is instant.