diff --git a/docker/miles-ports/Dockerfile b/docker/miles-ports/Dockerfile index 940711fd..16db11ed 100644 --- a/docker/miles-ports/Dockerfile +++ b/docker/miles-ports/Dockerfile @@ -3,7 +3,7 @@ # the build host has no docker). The script produces the real image with # `crane append` (one layer from docker/miles-ports/make_layer.py) because the # build host has no docker daemon. Pushed PRIVATE to -# ghcr.io/michaellchung/yeto-miles-ports:-. +# ghcr.io/agentenv/yeto-miles-ports:-. # # docker build --platform linux/amd64 -f docker/miles-ports/Dockerfile \ # --build-arg MILES_COMMIT=... --build-arg SGLANG_COMMIT=... \ @@ -18,9 +18,9 @@ # the fork sources and regenerates the version metadata. FROM docker.io/radixark/miles@sha256:4d69750720eb1a4b99976a3fed45ed018e1fc4fff3d240667fa17d258dfc6e0c -ARG MILES_REPOSITORY=https://github.com/michaellchung/miles +ARG MILES_REPOSITORY=https://github.com/agentenv/miles ARG MILES_COMMIT=44d41efd0a0428cb12b4ee34422de6f5e1ccb9d9 -ARG SGLANG_REPOSITORY=https://github.com/michaellchung/sglang +ARG SGLANG_REPOSITORY=https://github.com/agentenv/sglang ARG SGLANG_COMMIT=2fa880182eefdb31e64d8ea70317be27f9f32121 # setuptools-scm version of SGLANG_COMMIT (describe v0.5.20-69-g4e4148f1b); # pinned because the one-commit clone has no tags to describe. diff --git a/docker/ppu-train/Dockerfile b/docker/ppu-train/Dockerfile index 49755e8e..cdfc5c2e 100644 --- a/docker/ppu-train/Dockerfile +++ b/docker/ppu-train/Dockerfile @@ -82,7 +82,7 @@ RUN git init -q /opt/miles && cd /opt/miles \ # verl fork at the commit yeto pins (yeto/rl/adapters/verl/pins.py). Its # runtime deps are in requirements.txt; vllm is not installed (the PPU # sampler is SGLang). -ARG VERL_REPOSITORY=https://github.com/michaellchung/verl +ARG VERL_REPOSITORY=https://github.com/agentenv/verl ARG VERL_COMMIT=acad9875a8bdfc81afbcb0a50d146b2630f44093 RUN git init -q /opt/verl && cd /opt/verl \ && git remote add origin "${VERL_REPOSITORY}" \ diff --git a/docker/yeto-release/README.md b/docker/yeto-release/README.md index 42e4c26a..bbde61fa 100644 --- a/docker/yeto-release/README.md +++ b/docker/yeto-release/README.md @@ -47,7 +47,7 @@ the base image, the tag, the layer sha256 and (after a push) the image digest. | Date | Commit | Image | Layer | |---|---|---|---| -| 2026-10-19 | eb516a2a | `ghcr.io/michaellchung/yeto-release@sha256:4681b4dce5ce8494101c5d4d116593572afd3fa46ca3087fa2685ff83e3d0220` | 25.96 MB, sha256 c9e2f69a… | +| 2026-10-19 | eb516a2a | `ghcr.io/agentenv/yeto-release@sha256:4681b4dce5ce8494101c5d4d116593572afd3fa46ca3087fa2685ff83e3d0220` | 25.96 MB, sha256 c9e2f69a… | ## Not verified diff --git a/docs/MILES_RL.md b/docs/MILES_RL.md index d6617849..e1cc5a7d 100644 --- a/docs/MILES_RL.md +++ b/docs/MILES_RL.md @@ -389,11 +389,11 @@ claimed to be optimal for every model. either. A Modal island needs a syncer address reachable from Modal (head public IP, or `--syncer-public-addr` under `--controller local`). - **Images and pins** (`yeto/rl/__init__.py`). `--rl-engine ports` (default) - uses `MILES_NEXT_IMAGE` = `ghcr.io/michaellchung/yeto-miles-ports@sha256:37ac689e...` + uses `MILES_NEXT_IMAGE` = `ghcr.io/agentenv/yeto-miles-ports@sha256:37ac689e...` (tag `c35702e-4e4148f`, linux/amd64, **public** since 2026-10-07: pulled anonymously; a private `--rl-image` takes its login from `SKYPILOT_DOCKER_*` or `--rl-image-private`, see `launcher.registry_login_for`), which extends the public `radixark/miles` image with the - pinned forks: Miles `MILES_NEXT_COMMIT` = `c35702ee` (michaellchung/miles + pinned forks: Miles `MILES_NEXT_COMMIT` = `c35702ee` (agentenv/miles `yeto/ports` line) and SGLang `SGLANG_NEXT_COMMIT` = `4e4148f1`; `/opt/yeto/image-manifest.json` records every SHA. `--rl-image` overrides the digest. On Nebius a baked VM image holding these layers is used when the @@ -782,7 +782,7 @@ launcher no longer forwards it. | engine source | who owns the island loop | | --- | --- | -| `michaellchung/miles` at `MILES_NEXT_COMMIT` and `michaellchung/sglang` at `SGLANG_NEXT_COMMIT`, baked into `MILES_NEXT_IMAGE` (no bundle) | Yeto's `IslandDriver`; upstream Miles is used as a library through role ports | +| `agentenv/miles` at `MILES_NEXT_COMMIT` and `agentenv/sglang` at `SGLANG_NEXT_COMMIT`, baked into `MILES_NEXT_IMAGE` (no bundle) | Yeto's `IslandDriver`; upstream Miles is used as a library through role ports | The learner verifies its source (repository, commit, clean detached checkout, import path) before any model is loaded @@ -1321,7 +1321,7 @@ enters the algorithm hash. Each round emits `rl_advantage_transform` ### Policy-loss variants (`rl-algo-loss-variants`) > **Status: expressible, not opened.** Route B (user decision 2026-09-30): -> the computation is a variant branch in the Miles fork (`michaellchung/miles` +> the computation is a variant branch in the Miles fork (`agentenv/miles` > `yeto/ports`, `--policy-loss-variant`); yeto only describes, translates and > validates. The variants arrived in fork commit 5c1b49eb; the current > `MILES_NEXT_COMMIT` (ddce2099) descends from it and is listed in @@ -1444,7 +1444,7 @@ and the image digest (this makes the single-island All four algorithms are the Miles shared actor/critic PPO (`--advantage-estimator ppo`; Miles derives `use_critic`) and differ only in the GAE variant, the value loss and a few loss terms. Yeto declares, validates, translates and orchestrates; -the math lives in Miles or in the fork (`michaellchung/miles`). +the math lives in Miles or in the fork (`agentenv/miles`). **Fork pin and overlay.** The GAE variants, the positive-example LM loss, the SAO math, the tied-embedding critic value head and `--critic-updates-per-step` exist @@ -1716,7 +1716,7 @@ which loads `fn_path` and calls it with the actor on every rank. The trainable-state export/apply and grad-norm plugins live in Yeto. This and the other compatibility changes (elastic M1-M6 verbs, loss variants, Qwen3.8-Next LoRA layout, engine-failure propagation) are carried as commits on -`michaellchung/miles` `yeto/ports`; they are **not** proposed upstream +`agentenv/miles` `yeto/ports`; they are **not** proposed upstream (radixark/miles). `MILES_NEXT_COMMIT` must name a commit carrying them, otherwise `--rl-engine ports` refuses to start (before any Miles component or model is created) with an error naming the pin. diff --git a/examples/stage1/glm5next-mini-modal-dense.yaml b/examples/stage1/glm5next-mini-modal-dense.yaml index 28230adf..9e6e4112 100644 --- a/examples/stage1/glm5next-mini-modal-dense.yaml +++ b/examples/stage1/glm5next-mini-modal-dense.yaml @@ -62,8 +62,8 @@ store_access: head: direct images: - sampler: ghcr.io/michaellchung/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 - trainer: ghcr.io/michaellchung/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 + sampler: ghcr.io/agentenv/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 + trainer: ghcr.io/agentenv/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 docker_device_args: [--gpus, all] # unused on Modal; the containers get the GPUs trainer: diff --git a/examples/stage1/glm5next-mini-modal-g1c.yaml b/examples/stage1/glm5next-mini-modal-g1c.yaml index ad1d7533..9d8445f7 100644 --- a/examples/stage1/glm5next-mini-modal-g1c.yaml +++ b/examples/stage1/glm5next-mini-modal-g1c.yaml @@ -68,8 +68,8 @@ store_access: head: direct images: - sampler: ghcr.io/michaellchung/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 - trainer: ghcr.io/michaellchung/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 + sampler: ghcr.io/agentenv/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 + trainer: ghcr.io/agentenv/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 docker_device_args: [--gpus, all] # unused on Modal; the containers get the GPUs trainer: diff --git a/examples/stage1/glm5next-mini-modal.yaml b/examples/stage1/glm5next-mini-modal.yaml index 71e3b4d2..3845d4f0 100644 --- a/examples/stage1/glm5next-mini-modal.yaml +++ b/examples/stage1/glm5next-mini-modal.yaml @@ -54,8 +54,8 @@ store_access: head: direct images: - sampler: ghcr.io/michaellchung/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 - trainer: ghcr.io/michaellchung/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 + sampler: ghcr.io/agentenv/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 + trainer: ghcr.io/agentenv/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 docker_device_args: [--gpus, all] # unused on Modal; the containers get the GPUs trainer: diff --git a/examples/stage1/modal-mini-inventory.yaml b/examples/stage1/modal-mini-inventory.yaml index fd434c18..efc28eb5 100644 --- a/examples/stage1/modal-mini-inventory.yaml +++ b/examples/stage1/modal-mini-inventory.yaml @@ -13,7 +13,7 @@ nodes: hbm_gib: 80 host_memory_gib: 400 mounts: {/data: /data} - image: ghcr.io/michaellchung/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 + image: ghcr.io/agentenv/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 runtime: docker roles: [trainer] - name: modal-sampler @@ -26,6 +26,6 @@ nodes: hbm_gib: 80 host_memory_gib: 100 mounts: {/data: /data} - image: ghcr.io/michaellchung/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 + image: ghcr.io/agentenv/yeto-miles-ports@sha256:5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721 runtime: docker roles: [sampler] diff --git a/scripts/build_miles_ports_image.sh b/scripts/build_miles_ports_image.sh index 82beb498..5b409eac 100755 --- a/scripts/build_miles_ports_image.sh +++ b/scripts/build_miles_ports_image.sh @@ -12,7 +12,7 @@ # (default: shallow fetch into $OUT/megatron-lm) # MILES_COMMIT / SGLANG_COMMIT override the pinned fork commits # CRANE crane binary (go-containerregistry >= 0.20) -# DEST_REPO ghcr.io/michaellchung/yeto-miles-ports (private) +# DEST_REPO ghcr.io/agentenv/yeto-miles-ports (private) # Registry auth: crane reads ~/.docker/config.json; nothing is printed. # Writes: $OUT/{layer.tar,image-manifest.json,build-record.json} set -euo pipefail @@ -21,7 +21,7 @@ PUSH=0; [ "${1:-}" = "--push" ] && PUSH=1 CRANE=${CRANE:-crane} MILES_SRC=${MILES_SRC:-$HOME/work/miles-next} SGLANG_SRC=${SGLANG_SRC:-$HOME/work/sglang-next} -DEST_REPO=${DEST_REPO:-ghcr.io/michaellchung/yeto-miles-ports} +DEST_REPO=${DEST_REPO:-ghcr.io/agentenv/yeto-miles-ports} OUT=${OUT:-$(mktemp -d /tmp/img-build-XXXXXX)} # radixark/miles multi-arch index (upstream docker/Dockerfile at radixark diff --git a/scripts/build_verl_npu_image.sh b/scripts/build_verl_npu_image.sh index a3fee358..9faa4700 100755 --- a/scripts/build_verl_npu_image.sh +++ b/scripts/build_verl_npu_image.sh @@ -58,7 +58,7 @@ VLLM_ASCEND_BRANCH="releases/v0.23.0" MINDSPEED_BRANCH="core_r0.18.0" MEGATRON_TAG="core_v0.18.0" TRANSFORMERS_VERSION="5.10.4" -VERL_REPOSITORY="https://github.com/michaellchung/verl" +VERL_REPOSITORY="https://github.com/agentenv/verl" VERL_COMMIT="acad9875a8bdfc81afbcb0a50d146b2630f44093" mkdir -p "$OUT_DIR" diff --git a/scripts/build_yeto_release_image.sh b/scripts/build_yeto_release_image.sh index 336edf2e..80e4cf02 100755 --- a/scripts/build_yeto_release_image.sh +++ b/scripts/build_yeto_release_image.sh @@ -9,7 +9,7 @@ # # Inputs (env): # CRANE crane binary (go-containerregistry >= 0.20) -# DEST_REPO ghcr.io/michaellchung/yeto-release +# DEST_REPO ghcr.io/agentenv/yeto-release # OUT output directory (default: a new /tmp/yeto-release-XXXXXX) # Registry auth: crane reads ~/.docker/config.json; nothing is printed. # Writes: $OUT/{layer.tar,release-manifest.json,build-record.json[,image.tar]} @@ -18,7 +18,7 @@ set -euo pipefail cd "$(dirname "$0")/.." PUSH=0; [ "${1:-}" = "--push" ] && PUSH=1 CRANE=${CRANE:-crane} -DEST_REPO=${DEST_REPO:-ghcr.io/michaellchung/yeto-release} +DEST_REPO=${DEST_REPO:-ghcr.io/agentenv/yeto-release} OUT=${OUT:-$(mktemp -d /tmp/yeto-release-XXXXXX)} PREFIX=opt/yeto/src diff --git a/scripts/check_miles_ports_image.sh b/scripts/check_miles_ports_image.sh index 958aaec6..9178e4e9 100755 --- a/scripts/check_miles_ports_image.sh +++ b/scripts/check_miles_ports_image.sh @@ -40,8 +40,11 @@ chk sglang_version "$(sed -n 's/^__version__ = version = .\([^"'"'"']*\).*/\1/p' chk sglang_dist_info "$(ls opt/sglang/lib/python3.12/site-packages/ | grep -c "^sglang-${SGLANG_VERSION//+/_}.*dist-info$\|^sglang-${SGLANG_VERSION}.dist-info$")" 1 chk manifest_miles "$(python3 -c 'import json;print(json.load(open("opt/yeto/image-manifest.json"))["miles"]["commit"])')" "$MILES_SHA" chk manifest_sglang "$(python3 -c 'import json;print(json.load(open("opt/yeto/image-manifest.json"))["sglang"]["commit"])')" "$SGLANG_SHA" -chk miles_origin "$(git config -f root/miles/.git/config remote.origin.url)" "https://github.com/michaellchung/miles" -chk sglang_origin "$(git config -f sgl-workspace/sglang/.git/config remote.origin.url)" "https://github.com/michaellchung/sglang" +# Images built before 2026-10-22 carry the forks' former home (michaellchung); +# the SHAs are the same on agentenv. +chk_origin() { case "$2" in "https://github.com/agentenv/$3"|"https://github.com/michaellchung/$3") chk "$1" "$2" "$2" ;; *) chk "$1" "$2" "https://github.com/agentenv/$3" ;; esac; } +chk_origin miles_origin "$(git config -f root/miles/.git/config remote.origin.url)" miles +chk_origin sglang_origin "$(git config -f sgl-workspace/sglang/.git/config remote.origin.url)" sglang chk m3_lora_plugin_present "$(test -f root/miles/miles_plugins/models/qwen3_8_next/lora.py && echo yes)" yes chk qwen4exp_lora_hooks "$(grep -c supported_lora_modules sgl-workspace/sglang/python/sglang/srt/models/qwen4_exp.py | awk '{print ($1>0)?"yes":"no"}')" yes chk a27_workers_lost "$(grep -c workers_lost root/miles/miles/utils/workers/ray_worker_manager.py | awk '{print ($1>0)?"yes":"no"}')" yes diff --git a/scripts/modal_qwen3_8_next_4layer_lora.py b/scripts/modal_qwen3_8_next_4layer_lora.py index c4aa6d92..986e72fa 100644 --- a/scripts/modal_qwen3_8_next_4layer_lora.py +++ b/scripts/modal_qwen3_8_next_4layer_lora.py @@ -30,7 +30,7 @@ import modal IMAGE = ( - "ghcr.io/michaellchung/yeto-miles-ports:c35702e-4e4148f" + "ghcr.io/agentenv/yeto-miles-ports:c35702e-4e4148f" "@sha256:37ac689e29caeecf9faf8587a3ad58c154ecffc7798711d5bd59d792d002b9f9" ) ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) diff --git a/tests/rl_loss_variant_reference.py b/tests/rl_loss_variant_reference.py index c1919e9b..079e1d8a 100644 --- a/tests/rl_loss_variant_reference.py +++ b/tests/rl_loss_variant_reference.py @@ -1,7 +1,7 @@ """Independent reference formulas for rl-algo-loss-variants (design D3, task 2.1). Written from the papers with plain torch on small tensors; imports neither -yeto nor miles, so it can check the Miles fork (``michaellchung/miles`` +yeto nor miles, so it can check the Miles fork (``agentenv/miles`` ``--policy-loss-variant``) and yeto's translation without sharing code. Notation: rho_t = exp(logp_t - old_logp_t), A_t the advantage, mask the loss diff --git a/tests/test_rl_engine_pins.py b/tests/test_rl_engine_pins.py index 165a1a03..62298707 100644 --- a/tests/test_rl_engine_pins.py +++ b/tests/test_rl_engine_pins.py @@ -35,7 +35,7 @@ def test_legacy_pins_and_bundle_are_gone(): def _assert_ports_checkout(script: str, path: str) -> None: lowered = script.lower() - assert "bundle" not in lowered and "agentenv" not in lowered + assert "bundle" not in lowered and "michaellchung" not in lowered for repository, commit, name in ( (rl.MILES_NEXT_REPOSITORY, rl.MILES_NEXT_COMMIT, "miles"), (rl.SGLANG_NEXT_REPOSITORY, rl.SGLANG_NEXT_COMMIT, "sglang"), @@ -114,10 +114,47 @@ def test_verify_miles_revision_ports_rejects_commit_mismatch(tmp_path, monkeypat verify(tmp_path, expected=rl.MILES_NEXT_PINS) +def test_miles_fork_lives_on_agentenv(): + from yeto.rl.adapters.miles import pins + + assert rl.MILES_NEXT_REPOSITORY == "https://github.com/agentenv/miles" + assert rl.SGLANG_NEXT_REPOSITORY == "https://github.com/agentenv/sglang" + assert rl.MILES_NEXT_IMAGE.startswith("docker:ghcr.io/agentenv/yeto-miles-ports@sha256:") + assert rl.MILES_NEXT_PINS.former_repositories == pins.MILES_NEXT_FORMER_REPOSITORIES + + +@pytest.mark.parametrize( + "origin", + [ + "https://github.com/agentenv/miles", + "https://github.com/agentenv/miles.git", + # Images built before the move keep the former origin in /root/miles. + "https://github.com/michaellchung/miles", + "https://github.com/michaellchung/miles.git/", + ], +) +def test_verify_miles_revision_accepts_current_and_former_origin( + tmp_path, monkeypatch, origin +): + verify, _ = _fake_git(monkeypatch, tmp_path, commit=rl.MILES_NEXT_COMMIT, origin=origin) + assert verify(tmp_path, expected=rl.MILES_NEXT_PINS) == tmp_path.resolve() + + +def test_island_commit_override_keeps_former_origins(): + from types import SimpleNamespace + + from yeto.rl.adapters.miles.island_entry import miles_revision_pins + + pins = miles_revision_pins(SimpleNamespace(miles_commit="a" * 40)) + assert pins.repository == rl.MILES_NEXT_REPOSITORY + assert pins.accepts_origin("https://github.com/michaellchung/miles.git") + assert not pins.accepts_origin("https://github.com/radixark/miles") + + def test_verify_miles_revision_ports_rejects_origin_mismatch(tmp_path, monkeypatch): verify, _ = _fake_git( monkeypatch, tmp_path, commit=rl.MILES_NEXT_COMMIT, - origin="https://github.com/agentenv/miles" + origin="https://github.com/radixark/miles" ) with pytest.raises(RuntimeError, match="origin mismatch"): verify(tmp_path, expected=rl.MILES_NEXT_PINS) diff --git a/tests/test_rl_engine_selection.py b/tests/test_rl_engine_selection.py index 80c99a71..ac138fe4 100644 --- a/tests/test_rl_engine_selection.py +++ b/tests/test_rl_engine_selection.py @@ -171,7 +171,7 @@ def test_rl_image_default_is_the_ports_image(monkeypatch): ports = _cli(("--rl-engine", "ports")) _prepare_rl_args(ports) assert ports.rl_image == MILES_NEXT_IMAGE - assert "ghcr.io/agentenv" not in ports.rl_image + assert "/yeto-miles-ports@sha256:" in ports.rl_image # not the legacy agentenv/miles image assert _island_task(ports, monkeypatch).resources.image_id == MILES_NEXT_IMAGE explicit = "docker:example/miles@sha256:" + "e" * 64 pinned = _cli(("--rl-engine", "ports", "--rl-image", explicit)) diff --git a/tests/test_rl_ports_image.py b/tests/test_rl_ports_image.py index 15585c2c..bc7daccc 100644 --- a/tests/test_rl_ports_image.py +++ b/tests/test_rl_ports_image.py @@ -44,7 +44,7 @@ def login(monkeypatch): def test_ports_image_is_the_private_digest_pinned_fork_image(): assert rl.default_rl_image() == rl.MILES_NEXT_IMAGE assert re.fullmatch( - r"docker:ghcr\.io/(michaellchung|agentenv)/yeto-miles-ports@sha256:[0-9a-f]{64}", + r"docker:ghcr\.io/agentenv/yeto-miles-ports@sha256:[0-9a-f]{64}", rl.MILES_NEXT_IMAGE, ) assert rl.MILES_NEXT_BASE_IMAGE.startswith("docker:docker.io/radixark/miles@sha256:") diff --git a/tests/test_rl_reconfig_e1.py b/tests/test_rl_reconfig_e1.py index de380ba9..8caae861 100644 --- a/tests/test_rl_reconfig_e1.py +++ b/tests/test_rl_reconfig_e1.py @@ -1,6 +1,6 @@ """rl-infra-spec 3.1-3.7 (E1) CPU tests: journal, ledger, controller, driver safe point. -The fakes below model the fork's membership contract (michaellchung/miles +The fakes below model the fork's membership contract (agentenv/miles yeto/ports 0af62f4d: epoch CAS, idempotent repeat right after commit, ``incomplete`` after a half-failed stop, cordon/in-flight drain, cordoned admission). They are CPU stand-ins for protocol tests only; the GPU diff --git a/tools/probes/e2_cut_harness.py b/tools/probes/e2_cut_harness.py index 3b0f456c..bd82fcb6 100644 --- a/tools/probes/e2_cut_harness.py +++ b/tools/probes/e2_cut_harness.py @@ -54,7 +54,7 @@ def _current_miles_commit() -> str: raise RuntimeError("cannot find MILES_NEXT_COMMIT in yeto/rl/adapters/miles/pins.py") return m.group(1) -IMAGE = f"ghcr.io/michaellchung/yeto-miles-ports@{IMAGE_DIGEST}" +IMAGE = f"ghcr.io/agentenv/yeto-miles-ports@{IMAGE_DIGEST}" MILES_COMMIT = _current_miles_commit() IMAGE_TAG = f"{MILES_COMMIT[:7]}@{IMAGE_DIGEST[7:15]}" # label only; the digest is the pin MODELS = { diff --git a/tools/probes/s25_g1/image_probe.py b/tools/probes/s25_g1/image_probe.py index 24701de9..156c7153 100644 --- a/tools/probes/s25_g1/image_probe.py +++ b/tools/probes/s25_g1/image_probe.py @@ -5,7 +5,7 @@ import modal # Same digest as yeto.rl.adapters.miles.pins.MILES_NEXT_IMAGE (the container has no yeto). -MILES_NEXT_IMAGE = ("docker:ghcr.io/michaellchung/yeto-miles-ports@sha256:" +MILES_NEXT_IMAGE = ("docker:ghcr.io/agentenv/yeto-miles-ports@sha256:" "5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721") app = modal.App("yeto-s25-g1-probe") diff --git a/tools/probes/s25_g1/modal_app.py b/tools/probes/s25_g1/modal_app.py index 73f0cf20..8c7e9c5f 100644 --- a/tools/probes/s25_g1/modal_app.py +++ b/tools/probes/s25_g1/modal_app.py @@ -39,7 +39,7 @@ # T-G1B: YETO_G1_PLAN=examples/stage1/glm5next-mini-modal-dense.yaml (set at deploy time; # the image env carries it into every container, so all of them plan the same file) PLAN = os.environ.get("YETO_G1_PLAN", "examples/stage1/glm5next-mini-modal.yaml") -IMAGE = ("ghcr.io/michaellchung/yeto-miles-ports@sha256:" +IMAGE = ("ghcr.io/agentenv/yeto-miles-ports@sha256:" "5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721") MILES_COMMIT = "1618b5c38db80e17ec928cfa47fe832cb18565fc" # s25-distopt MODELS_VOLUME, STORE_VOLUME = "yeto-s25-g1-models", "yeto-s25-g1-store" diff --git a/yeto/rl/adapters/miles/algorithm_flags.py b/yeto/rl/adapters/miles/algorithm_flags.py index 5e534a04..2082f237 100644 --- a/yeto/rl/adapters/miles/algorithm_flags.py +++ b/yeto/rl/adapters/miles/algorithm_flags.py @@ -249,7 +249,7 @@ def _builtin_rows() -> list[FlagMapping]: # (arguments.py:3194-3199), i.e. arbitrary overrides incl. use_tis/eps_clip: # it would bypass the spec entirely, so it is refused like any unmapped flag. "--custom-config-path", - # Miles fork (michaellchung/miles yeto/ports, rl-algo-loss-variants route + # Miles fork (agentenv/miles yeto/ports, rl-algo-loss-variants route # B): mapped by yeto.rl.algos.loss_variants; listed here so they are # adapter-owned from import time. Upstream only once the pin carries them # (loss_variants.FORK_COMMITS). diff --git a/yeto/rl/adapters/miles/island_entry.py b/yeto/rl/adapters/miles/island_entry.py index 48585224..b199a224 100644 --- a/yeto/rl/adapters/miles/island_entry.py +++ b/yeto/rl/adapters/miles/island_entry.py @@ -1108,14 +1108,20 @@ def miles_revision_pins(args: Any) -> Any: """The Miles commit the island checks for ``--miles-commit`` (full SHA); None without it (``verify_miles_revision`` then checks the pinned MILES_NEXT_PINS).""" from yeto.provenance import is_immutable_commit - from yeto.rl.adapters.miles.pins import MILES_NEXT_REPOSITORY, MilesRevisionPins + from yeto.rl.adapters.miles.pins import ( + MILES_NEXT_FORMER_REPOSITORIES, + MILES_NEXT_REPOSITORY, + MilesRevisionPins, + ) commit = getattr(args, "miles_commit", None) if not commit: return None if not is_immutable_commit(commit) or len(str(commit)) != 40: raise ValueError(f"--miles-commit must be a full 40-hex commit, got {commit!r}") - return MilesRevisionPins(MILES_NEXT_REPOSITORY, str(commit).lower()) + return MilesRevisionPins( + MILES_NEXT_REPOSITORY, str(commit).lower(), MILES_NEXT_FORMER_REPOSITORIES + ) def _preflight_codex_harness(args) -> None: diff --git a/yeto/rl/adapters/miles/overlay.py b/yeto/rl/adapters/miles/overlay.py index 53445e8c..1ea9c7fc 100644 --- a/yeto/rl/adapters/miles/overlay.py +++ b/yeto/rl/adapters/miles/overlay.py @@ -3,7 +3,7 @@ The ports image ships Miles c35702e (``yeto.rl.MILES_NEXT_COMMIT``) installed editable at ``/root/miles`` (= ``~/miles``) and records that commit in ``/opt/yeto/image-manifest.json``. The critic-family flags live on the fork -branch ``yeto-critic-c357`` (michaellchung/miles, local, NOT pushed): the +branch ``yeto-critic-c357`` (agentenv/miles, local, NOT pushed): the critic-family commits rebased onto c35702e. Instead of a push + new image, the island setup applies ``c35702e..CRITIC_C357_RESULT_COMMIT`` as a ``git apply`` patch shipped inside the frozen code snapshot (the workdir). diff --git a/yeto/rl/adapters/miles/pins.py b/yeto/rl/adapters/miles/pins.py index 2bc5533b..6f78c8b9 100644 --- a/yeto/rl/adapters/miles/pins.py +++ b/yeto/rl/adapters/miles/pins.py @@ -12,12 +12,24 @@ class MilesRevisionPins(NamedTuple): repository: str commit: str + # Origins that also identify ``repository`` (the fork's earlier homes). + # Images already built keep the origin they were built with. + former_repositories: tuple[str, ...] = () + + def accepts_origin(self, origin: str) -> bool: + """True when ``origin`` (``.git`` suffix and trailing ``/`` ignored) names this fork.""" + + normalized = origin.rstrip("/").removesuffix(".git").rstrip("/") + return normalized in (self.repository, *self.former_repositories) MILES_PEFT_VERSION = "0.20.0" # Ports engine (the only Miles engine): upstream Miles plus yeto compatibility -# commits on michaellchung/miles ``yeto/ports``; fetched directly, no bundle. -MILES_NEXT_REPOSITORY = "https://github.com/michaellchung/miles" +# commits on agentenv/miles ``yeto/ports``; fetched directly, no bundle. +MILES_NEXT_REPOSITORY = "https://github.com/agentenv/miles" +# The fork moved from michaellchung to agentenv on 2026-10-22 (same SHAs); +# images built before the move carry the old origin in /root/miles. +MILES_NEXT_FORMER_REPOSITORIES = ("https://github.com/michaellchung/miles",) MILES_NEXT_UPSTREAM_COMMIT = "9e4260de047a704208535c0e90c531929879ab40" # yeto/ports (= yeto-elastic-m1-m6 after four review rounds): run_plugin, # --worker-dynamic-port-start, the elastic M1-M6 changes and the LoRA bridge @@ -56,7 +68,7 @@ class MilesRevisionPins(NamedTuple): MILES_NEXT_COMMIT = "44d41efd0a0428cb12b4ee34422de6f5e1ccb9d9" # sgl-project/sglang ``sglang-miles`` head when radixark/miles@9e4260d was # committed (upstream's Dockerfile follows that branch unpinned). -SGLANG_NEXT_REPOSITORY = "https://github.com/michaellchung/sglang" +SGLANG_NEXT_REPOSITORY = "https://github.com/agentenv/sglang" SGLANG_NEXT_UPSTREAM_COMMIT = "571212b636baca45e10fa3b4da11a289123f3235" # yeto/lora-checksum (a1240c530 = 9f29303 + WeightChecker checksum covers LoRA adapter A/B); # yeto/ports 9f29303: the ported agentenv/sglang patches (see sglang-patch-port.md). @@ -64,7 +76,7 @@ class MilesRevisionPins(NamedTuple): # n17-qwen3coder-single-call (2fa880182 = 4e4148f1b + qwen3_coder honors # parallel_tool_calls=false under tool_choice=auto: at most one tool call; S17 N17). SGLANG_NEXT_COMMIT = "2fa880182eefdb31e64d8ea70317be27f9f32121" -# Fork lineage on michaellchung/miles yeto/ports, oldest first; the single +# Fork lineage on agentenv/miles yeto/ports, oldest first; the single # source for every "this fork commit carries X" set (rl-code-quality-cleanup # 0.7). Each entry is the previous one plus the change named here; the newest # is MILES_NEXT_COMMIT. Append a commit here and the loss-variant set @@ -131,7 +143,9 @@ def miles_fork_lineage_from(commit: str) -> frozenset[str]: TMS_PRELOAD_BASE_BINARY_SHA256 = ( "c26551247616cabb0bb79dbd26abb61a688a4bb47c9b6a6f9873cfc98093640d" ) -MILES_NEXT_PINS = MilesRevisionPins(MILES_NEXT_REPOSITORY, MILES_NEXT_COMMIT) +MILES_NEXT_PINS = MilesRevisionPins( + MILES_NEXT_REPOSITORY, MILES_NEXT_COMMIT, MILES_NEXT_FORMER_REPOSITORIES +) # radixark/miles:dev multi-arch index (upstream docker/Dockerfile at # radixark 9e4260d, sglang v0.5.20 base): the base MILES_NEXT_IMAGE extends # (its linux/amd64 manifest). Public. @@ -143,7 +157,8 @@ def miles_fork_lineage_from(commit: str) -> frozenset[str]: # SGLANG_NEXT_COMMIT at /sgl-workspace/sglang, both the base's editable # installs (pure-Python overlay, scripts/build_miles_ports_image.sh; # docker/miles-ports/Dockerfile). /opt/yeto/image-manifest.json records -# every SHA. PUBLIC on ghcr.io/michaellchung since 2026-10-07 (anonymous +# every SHA. Copied digest-for-digest to ghcr.io/agentenv on 2026-10-22 +# (earlier home ghcr.io/michaellchung, public since 2026-10-07) (anonymous # pull); a private image needs SKYPILOT_DOCKER_{USERNAME,PASSWORD,SERVER} or # --rl-image-private (yeto.launcher.registry_login_for; read:packages token). # Tag 44d41ef-2fa8801; (S24 L2.2: Miles s24-miles-import2 and the lazy-modelopt @@ -154,7 +169,7 @@ def miles_fork_lineage_from(commit: str) -> frozenset[str]: # @sha256:bcd5ffd3...; build record openspec/changes/rl-infra-spec/evidence/ # ports-image/2026-10-14-17aeb5c-2fa8801/). Earlier: tag 386ae3b-2fa8801; (S23 P0-1.11 GPU run: Miles s23-sao-streaming-roles; previous 64b591a-2fa8801 @sha256:fa2413be...; build record openspec/changes/rl-infra-spec/evidence/ports-image/2026-10-14-386ae3b-2fa8801/). Earlier: (S19 #1: critic family + algo-supplement metrics baked in; previous ddce209-2fa8801 @sha256:9c252c38...) (S18 ARU-3: Miles s18-agentic-suspend = 2f7871fb2 + --agentic-suspend-between-turns; previous 2f7871f-2fa8801 @sha256:62b4f164..., efbbc63-2fa8801 @sha256:a7990076..., 8bc5223-4e4148f @sha256:4aeafd77...) ghcr.io/michaellchung (public package); linux/amd64 only. MILES_NEXT_IMAGE = ( - "docker:ghcr.io/michaellchung/yeto-miles-ports@sha256:" + "docker:ghcr.io/agentenv/yeto-miles-ports@sha256:" "5b9dc2a9e6e315d73dabfbc6faae428b59cc01aabec6189645a5c8c80d6e3721" ) MILES_NEXT_IMAGE_MANIFEST = "/opt/yeto/image-manifest.json" @@ -179,8 +194,8 @@ def miles_fork_lineage_from(commit: str) -> frozenset[str]: def default_rl_image() -> str: """The digest-pinned ``--rl-image`` default. - MILES_NEXT_IMAGE: upstream Miles' image with the pinned michaellchung - forks preinstalled, public on ghcr.io/michaellchung (a registry login is + MILES_NEXT_IMAGE: upstream Miles' image with the pinned agentenv + forks preinstalled, on ghcr.io/agentenv (a registry login is injected only via SKYPILOT_DOCKER_* or --rl-image-private; see yeto.launcher.registry_login_for). """ diff --git a/yeto/rl/adapters/miles/revision.py b/yeto/rl/adapters/miles/revision.py index 44161c23..29500ac0 100644 --- a/yeto/rl/adapters/miles/revision.py +++ b/yeto/rl/adapters/miles/revision.py @@ -134,7 +134,7 @@ def git(*args: str) -> str: raise RuntimeError( f"Miles revision mismatch: expected {expected.commit}, got {commit}" ) - if origin.removesuffix(".git").rstrip("/") != expected.repository: + if not expected.accepts_origin(origin): raise RuntimeError( f"Miles origin mismatch: expected {expected.repository}, got {origin}" ) diff --git a/yeto/rl/adapters/miles/rollout.py b/yeto/rl/adapters/miles/rollout.py index df2080d5..ce7b48eb 100644 --- a/yeto/rl/adapters/miles/rollout.py +++ b/yeto/rl/adapters/miles/rollout.py @@ -10,7 +10,7 @@ E1 membership verbs (rl-infra-spec 3.4, :class:`~..ports.ElasticRolloutPool`) map yeto member ids (``engine:``) onto the fork's explicit membership -API (fork M2/M3, michaellchung/miles ``yeto/ports`` 0af62f4d): +API (fork M2/M3, agentenv/miles ``yeto/ports`` 0af62f4d): ``InferenceController.start_cells/stop_cells(expected_epoch)``, ``wait_cells_tracked``, ``drain_cells``/``uncordon_cells``, ``get_membership_status`` and ``restore_membership_state``. Only cells declared diff --git a/yeto/rl/adapters/miles/state.py b/yeto/rl/adapters/miles/state.py index 175296cf..9dcd076e 100644 --- a/yeto/rl/adapters/miles/state.py +++ b/yeto/rl/adapters/miles/state.py @@ -1,6 +1,6 @@ """``PolicyState`` port over the actor ``run_plugin`` entry point (task 3.4, D4). -Assumes the ``michaellchung/miles`` ``yeto/ports`` patch (task 1.4):: +Assumes the ``agentenv/miles`` ``yeto/ports`` patch (task 1.4):: TrainGroup.run_plugin(fn_path: str, kwargs: dict | None = None) -> list[Any] @@ -52,7 +52,7 @@ def require_run_plugin(controller_cls: Any = None) -> None: raise PolicyStateError( "the pinned Miles (MILES_NEXT_COMMIT " f"{MILES_NEXT_COMMIT[:12]}) has no TrainerController.run_plugin; " - "the ports engine needs the michaellchung/miles yeto/ports patch " + "the ports engine needs the agentenv/miles yeto/ports patch " "(rl-engine-ports task 1.4)." ) diff --git a/yeto/rl/adapters/miles/state_plugin.py b/yeto/rl/adapters/miles/state_plugin.py index 5125287e..21e5d086 100644 --- a/yeto/rl/adapters/miles/state_plugin.py +++ b/yeto/rl/adapters/miles/state_plugin.py @@ -1,6 +1,6 @@ """Trainable-state export/apply executed *inside* every Megatron rank (task 3.4, D4). -Loaded by upstream's generic entry point (``michaellchung/miles`` ``yeto/ports``): +Loaded by upstream's generic entry point (``agentenv/miles`` ``yeto/ports``): ``TrainGroup.run_plugin(fn_path, kwargs)`` -> ``train_actor.run_plugin`` -> ``load_function(fn_path)(actor, **kwargs)`` on every rank of every cell (the ports path guarantees a single cell). Every function here is collective: all diff --git a/yeto/rl/adapters/verl/image.py b/yeto/rl/adapters/verl/image.py index b096d1b1..5ad70f0c 100644 --- a/yeto/rl/adapters/verl/image.py +++ b/yeto/rl/adapters/verl/image.py @@ -7,7 +7,7 @@ (``patch_verl``). ``--rl-image verl-build:`` selects it; Modal caches the layers, so only the first run builds. yeto's object-store client (boto3, ``STORE_CLIENT_REQUIREMENTS``) is added to the same venv. yeto's own image default -(ghcr.io/michaellchung/yeto-miles-ports) is unchanged. +(ghcr.io/agentenv/yeto-miles-ports) is unchanged. """ from __future__ import annotations diff --git a/yeto/rl/adapters/verl/pins.py b/yeto/rl/adapters/verl/pins.py index 9736ae1e..52680645 100644 --- a/yeto/rl/adapters/verl/pins.py +++ b/yeto/rl/adapters/verl/pins.py @@ -1,12 +1,12 @@ """verl pins (rl-verl-backend design D1, D10; user decision S16). -The user's fork https://github.com/michaellchung/verl at acad9875 (the commit +The user's fork https://github.com/agentenv/verl at acad9875 (the commit S16 measured on Modal 1xH100, VERL-MODAL-CHECK-S16.md). Dependencies come from the fork's own ``uv.lock`` (``uv sync --frozen --all-packages --extra vllm --extra fsdp``), the same recipe as upstream ``docker/Dockerfile.uv.cu130``. """ -VERL_REPOSITORY = "https://github.com/michaellchung/verl" +VERL_REPOSITORY = "https://github.com/agentenv/verl" VERL_COMMIT = "acad9875a8bdfc81afbcb0a50d146b2630f44093" VERL_BASE_IMAGE = "nvidia/cuda:13.0.2-devel-ubuntu24.04" VERL_PYTHON = "3.12" diff --git a/yeto/rl/algos/critic_fork.py b/yeto/rl/algos/critic_fork.py index 634eff75..8acaaf50 100644 --- a/yeto/rl/algos/critic_fork.py +++ b/yeto/rl/algos/critic_fork.py @@ -1,6 +1,6 @@ """Miles fork pin for the critic family (rl-algo-critic-family, S13 fork merge). -``yeto-critic-family`` on michaellchung/miles (local commit, not pushed, not in an +``yeto-critic-family`` on agentenv/miles (local commit, not pushed, not in an image) merges the critic-family fork branches onto yeto/ports 039471508: * yeto-gae-variant ce96fc060 -- ``--gae-variant`` / ``--gae-lambd-mode`` / diff --git a/yeto/rl/algos/loss_variants.py b/yeto/rl/algos/loss_variants.py index 5982731f..114fc36e 100644 --- a/yeto/rl/algos/loss_variants.py +++ b/yeto/rl/algos/loss_variants.py @@ -1,7 +1,7 @@ """Token-level policy-loss variants (change ``rl-algo-loss-variants``, route B). Registration module listed in :data:`yeto.rl.algos.EXTENSION_MODULES`. The -computation lives in the Miles fork (``michaellchung/miles`` ``yeto/ports``, +computation lives in the Miles fork (``agentenv/miles`` ``yeto/ports``, ``--policy-loss-variant``, design D1 route B); yeto only describes, translates and validates. Through the P0 registry (never by editing the shared files) it adds: @@ -56,7 +56,7 @@ "gmpo": (("gmpo_log_clip_low", 0.4), ("gmpo_log_clip_high", 0.4)), } -# Fork CLI flags (FORK-2b, michaellchung/miles yeto-loss-variants); names +# Fork CLI flags (FORK-2b, agentenv/miles yeto-loss-variants); names # checked against the fork diff before the pin moves. VARIANT_FLAG = "--policy-loss-variant" PARAM_FLAGS = { diff --git a/yeto/rl/algos/sao.py b/yeto/rl/algos/sao.py index 6d208664..680569aa 100644 --- a/yeto/rl/algos/sao.py +++ b/yeto/rl/algos/sao.py @@ -21,7 +21,7 @@ (two roles with separate layouts, one syncer per role, lockstep paired fragments, critic optimizer steps = actor steps x num_critic_epochs); * :func:`sao_fork_argv` -- the Miles fork flags (``yeto-sao`` branch, - michaellchung/miles 6b5bd88c + ce96fc06 GAE variants) a spec translates to; + agentenv/miles 6b5bd88c + ce96fc06 GAE variants) a spec translates to; * rejections: SAO DIS fields without ``policy_objective='sao_dis'``, sao_dis without explicit bounds, sao_dis combined with another policy-loss variant, and sao_dis at the current ports pin (the fork commit carrying it is local @@ -63,7 +63,7 @@ HL_GAUSS_SIGMA_RATIO = 0.75 VALUE_REWARD_RANGE = (0.0, 1.0) -# Commits of michaellchung/miles carrying --policy-objective sao_dis and the +# Commits of agentenv/miles carrying --policy-objective sao_dis and the # classification value loss: the critic-family fork pin (yeto-critic-family # e07e51c07 = yeto-sao 6b5bd88c merged with GAE variants, VAPO and # --num-critic-epochs). Local, not pushed, not in an image (critic_fork.py).