The rule that catches everyone
REv2 platform matching is whole-set equality, not a subset match. A worker advertising three properties is reachable only by a client requesting all three, with the same values. Request two of them and nothing matches; request a fourth and nothing matches. An action whose platform no pool advertises has nowhere to run: depending on the scheduler it waits or is rejected, and Bazel runs it locally instead only if--remote_local_fallback is set.
What a pool advertises
Two sources, merged:- Derived properties, from the pool’s configured operating system and container image, typically
OSFamilyandcontainer-image. - Explicit properties, set on the pool, which merge over the derived ones.
Pool = "large" advertises three properties:
The Bazel side
An exec platform requests properties withexec_properties:
platforms/BUILD.bazel
--config group of your own:
.bazelrc
.bazelrc extends a group aspect setup bazelrc writes:
<name> is the deployment name aspect auth status shows.
Aspect support gives you the exact property set each pool advertises; on a self-hosted deployment, it’s in the pool’s configuration. Copy it verbatim.
Routing specific actions to specific pools
The usual reason for a second pool is that some actions need something the default workers don’t have, such as more memory. When the second pool runs the same image as the default one, aPool property is all that separates them, and a target can ask for it directly:
server/BUILD.bazel
exec_properties merge into its exec platform’s, so the action requests OSFamily, container-image and Pool together, exactly what the large pool advertises.
If the second pool runs a different image,
Pool alone won’t match. The merged
request still carries the default platform’s container-image. Give that pool
its own platform with its own image and a constraint of your own, register it
alongside the default one, and select it with exec_compatible_with on the
target.Operating systems
Checking what actually happened
The Build Results UI shows, per invocation, how many actions executed remotely versus locally. If a build you expected to fan out runs actions locally under--remote_local_fallback, or has actions that wait or are rejected, the platform isn’t matching.
--toolchain_resolution_debug='.*' and Bazel’s execution log show which platform each action resolved to, which is the fastest way to see what your build is actually requesting.
Related
- Remote execution: what the fleet is and how it scales.
- Parallelize remote execution: getting more actions in flight once pools match.
- Configuration options: requesting a new pool on an Aspect Enterprise deployment hosted by Aspect.

