Verdict on this Mac: PASS for the calls below. No-device: NOT OBSERVED. Linux GPU: NOT RUN. NVIDIA: NOT RUN.
experiments/gpu/gpu_nif.mojo and experiments/gpu/add_host.mojo are unchanged. scripts/gpu-batch.sh rebuilds the historical library, builds experiments/gpu/batch_nif.mojo, and loads both.
E25: gpu_nif 42. The batch kernel adds four float32 pairs, (1,10), (2,20), (3,30), (4,40), and the NIF returns the integer sum 110. A second call returned 110. Two concurrent tasks returned [110, 110] (inspect printed the charlist ~c"nn" before the script asked for charlists: :as_lists).
The batch callback calls initialize_runtime() and is registered with abi_dirty_cpu(), because the host waits on ctx.synchronize(). That flag is a choice from the Stage 4 constants, not a measurement that the GPU driver yields the scheduler for the whole wait.
If has_accelerator() is false, batch_sum raises and the callback returns {:error, :no_device}. This machine took the device path, so that tuple was not seen. A CPU sum is not substituted.
MAX is pinned in requirements-gpu.txt (max==26.6.0). requirements.txt stays mojo==1.1.0 only. The Linux workflow does not install MAX.