If you have a QueueTaskDispatcher which returns a CauseOfBlockage from canRun, that becomes BlockedItem.getCauseOfBlockage, which is displayed in the queue widget.
But if it returns a CauseOfBlockage from canTake (AFAICT the same for Node.canTake), JobOffer.canTake sees that it is non-null, throws out the actual object with all of its diagnostics, and you wind up with a BuildableItem with CauseOfBlockage.BecauseNodeIsBusy which tells you nothing and may be totally misleading.
By asking an implementation to return a @CheckForNull CauseOfBlockage rather than a simple boolean, the implication is that a non-null return value will be displayed to the user. Currently this is not the case.
To add insult to injury, Support Core does not report the result of canTake.
- is related to
- 
                    JENKINS-45927 CauseOfBlockage of items in Queue is extremely verbose -         
- Open
 
-         
- relates to
- 
                    JENKINS-35403 QueueDecisionHandler should be able to return CauseOfBlockage -         
- Open
 
-         
- 
                    JENKINS-6598 Let Node and NodeProperty have more control over whether a node can run a task -         
- Closed
 
-         
- links to
