You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
P0-4: aprender builds on ANY of intel/gx10/yoga — a shared build pool label, host-layout parametrized, yoga joins the x86 pool first, gx10 after an arm64 sovereign-ci image (operator 2026-09-10) #3100
why wouldn't we let ONLY aprender use gx10 for build server if it needs it, and ditto yoga. if no issues, lets change our build process so aprender can use ANY of those three build servers, but we can always redirect builds if we need to run something special on gx10, cancel jobs, etc
Runner groups: gpu-nodes (gx10) is already aprender-only; gpu-x86 (yoga) is aprender + infra.
GitHub matches ALL labels of runs-on (no OR), so "any of the three" = one shared pool label. Done live: build on the 16 intel runners (org runners API), yoga-eph and a new build-only replica gx10-build (infra PMAT-1096-ephemeral-gpu-runners, forjar-applied). scripts/check_runner_labels.sh accepts build as a pool (branch PMAT-1098-build-pool-any-of-three).
What blocks the label switch: ci.yml is welded to the intel host: 33 hardcoded paths (/mnt/nvme-raid0/targets ×18, /mnt/nvme-raid0/cargo-ci ×12, /home/noah/data/sccache ×3) and the image localhost:5000/sovereign-ci:stable (amd64 only, 512 MB, registry on mac-server 192.168.1.149:5000 — LAN-reachable). workspace-test, guard-cargo, guard-tree, mutants all run INSIDE that image via docker run with those bind mounts. Re-labelling alone would land a job on yoga with no image and no such directories.
Plan (rows; each a PR with its own acceptance)
BP-1 parametrize the host layout (aprender, default-preserving): every run: block derives CI_TARGETS_ROOT, CI_CARGO_ROOT, SCCACHE_HOST_DIR, CI_IMAGE from the runner's environment with today's intel values as defaults (${CI_IMAGE:-localhost:5000/sovereign-ci:stable} …). Acceptance: diff of the rendered commands on intel is empty; a case table proves an override flows into the -v mounts and the image ref.
BP-2 yoga joins the x86 pool (infra):/etc/docker/daemon.jsoninsecure-registries: ["192.168.1.149:5000"]; the disposable runner writes .env (CI_IMAGE=192.168.1.149:5000/sovereign-ci:stable, CI_TARGETS_ROOT=~/eph-work/ci/targets, CI_CARGO_ROOT=~/eph-work/ci/cargo, SCCACHE_HOST_DIR=~/eph-work/sccache); the sovereign-ci image pre-pulled. Acceptance: workspace-test dispatched on yoga green at the measured duration; RAM headroom recorded (30 GB box).
BP-3 flip the labels:workspace-test (then guard-cargo, guard-tree, mutants) → [self-hosted, X64, Linux, build]. Acceptance: one merge-queue run lands on yoga while intel is saturated.
BP-4 gx10 (aarch64): build sovereign-ci for arm64 (buildx on gx10), publish to the same registry as a multi-arch manifest; drop X64 from the pool jobs after CI's exact nextest line is green on gx10 (measurement running today). Acceptance: a queue run on gx10-build green.
BP-5 redirect/cancel runbook + guard:machines/clean-room/runner/build-pool.sh <box> on|off toggles the label (API for persistent runners, forjar params for disposable ones); a guard refuses a job selector only gx10 can satisfy unless it names a GPU label.
Until BP-3 lands nothing changes for CI; BP-1 is safe to merge at any time.
Decision (operator, 2026-09-10, verbatim)
Measured today
gpu-nodes(gx10) is already aprender-only;gpu-x86(yoga) is aprender + infra.runs-on(no OR), so "any of the three" = one shared pool label. Done live:buildon the 16 intel runners (org runners API),yoga-ephand a new build-only replicagx10-build(infraPMAT-1096-ephemeral-gpu-runners, forjar-applied).scripts/check_runner_labels.shacceptsbuildas a pool (branchPMAT-1098-build-pool-any-of-three)./mnt/nvme-raid0/targets×18,/mnt/nvme-raid0/cargo-ci×12,/home/noah/data/sccache×3) and the imagelocalhost:5000/sovereign-ci:stable(amd64 only, 512 MB, registry on mac-server 192.168.1.149:5000 — LAN-reachable).workspace-test,guard-cargo,guard-tree,mutantsall run INSIDE that image viadocker runwith those bind mounts. Re-labelling alone would land a job on yoga with no image and no such directories.Plan (rows; each a PR with its own acceptance)
run:block derivesCI_TARGETS_ROOT,CI_CARGO_ROOT,SCCACHE_HOST_DIR,CI_IMAGEfrom the runner's environment with today's intel values as defaults (${CI_IMAGE:-localhost:5000/sovereign-ci:stable}…). Acceptance:diffof the rendered commands on intel is empty; a case table proves an override flows into the-vmounts and the image ref./etc/docker/daemon.jsoninsecure-registries: ["192.168.1.149:5000"]; the disposable runner writes.env(CI_IMAGE=192.168.1.149:5000/sovereign-ci:stable,CI_TARGETS_ROOT=~/eph-work/ci/targets,CI_CARGO_ROOT=~/eph-work/ci/cargo,SCCACHE_HOST_DIR=~/eph-work/sccache); the sovereign-ci image pre-pulled. Acceptance:workspace-testdispatched on yoga green at the measured duration; RAM headroom recorded (30 GB box).workspace-test(then guard-cargo, guard-tree, mutants) →[self-hosted, X64, Linux, build]. Acceptance: one merge-queue run lands on yoga while intel is saturated.sovereign-cifor arm64 (buildx on gx10), publish to the same registry as a multi-arch manifest; dropX64from the pool jobs after CI's exact nextest line is green on gx10 (measurement running today). Acceptance: a queue run ongx10-buildgreen.machines/clean-room/runner/build-pool.sh <box> on|offtoggles the label (API for persistent runners, forjar params for disposable ones); a guard refuses a job selector only gx10 can satisfy unless it names a GPU label.Until BP-3 lands nothing changes for CI; BP-1 is safe to merge at any time.