The custom image provably carries /opt/hostedtoolcache/node/26.8.2/x64/bin/node (ls inside the image confirms the layout, modes and the 150 MB binary), yet setup-node still downloads. So the miss is runtime-only: either the runner is not running that image or something shadows the path inside the job container. This step prints mounts, the tool-cache listing, a direct node -v from the baked path and the RUNNER_* env, then setup-node runs unchanged. Temporary: remove once the cause is known.