numBlockedByIdleVehicle

How many vehicles are held up by a vehicle that has nothing to do: parked on the travel path.

A subset of numBlockedByVehicle, not a fourth bucket. The three causes above sum to numTransportersBlocked and this one does not join that sum; it says how much of the vehicle cause is a vehicle nothing is due to move. Summing four would double-count.

This is the duration that numObstructionsDetected cannot give. That counter records the instants at which a vehicle was found behind a parked one, and a count alone cannot tell a queue from a stall: forty waits that clear and one that never does look the same in it, and on a pair of real models the count puts them in the wrong order. This is time-weighted, so its average is the mean number of vehicles standing behind a parked vehicle at any moment.

The simple AGV shop with its carts left where they stop reads 40.5 obstructions a replication and 0.1166 here: a tenth of one cart out of two, waiting at any moment, which is what forty waits that each end at the next arrival come to. Sending the carts home takes both readings to zero. A fleet that has actually stopped reads the number of vehicles that stopped and holds it there -- one stuck vehicle of two is 0.96 for the rest of the run, against a count of one.

What counts is judged the same way the obstruction detector judges it (GuidedTransporter.isPermanentlyStationary), so the two agree about any one instant. Two cases are deliberately outside it, both because resolving them means scanning rather than reading a field: a vehicle waiting for a general two-way link's direction, whose obstructors are every vehicle running that link, and a vehicle refused a free zone by a closure that has not been granted. A vehicle waiting on a spur is included, since a spur's reservation names one vehicle. So this reads low rather than high where it is incomplete, which is the safe direction for a diagnostic: it never invents a stall.