The documentation on PoolCounter::$slots says that it limits the number of workers "working on this task type". But that's not true, it limits the number of workers globally, with all tasks with non-zero slots being lumped in together.
PoolCounter::hashKeyIntoSlots() returns an integer, it doesn't preserve the prefix which identifies the task type. The integer is then used as a global key. The client code does not add a task type prefix at any stage. With slots=1 I saw in my debug log:
Sending pool counter command: ACQ4ANY 0 1 1 1
But with no slots for the equivalent operation:
Sending pool counter command: ACQ4ANY mw:pcache:idhash:44-0!*!0!!en!5:revid:68 1 1 1