"Counted when" differs per class and is the most commonly wrong part of an autoscaler: a registered instance, an active subscription, an assigned partition, a Ready node.
The node group has no policy of its own. Its desired count is derived from what the workload layer declared.
Batch consumers combine a schedule with lag because their demand is known in advance and their backlog is not.
Why not one policy form for all
Utilization is meaningless for the queue worker and the batch consumer, both of which are I/O-bound.
Concurrency is the request-serving equivalent of backlog: arrival rate × service time, a derived signal rather than a measured one.
Omitted here
Vertical scaling targets, which declare a resource quantity rather than an instance count, follow the same loop and are not drawn separately.