Highlights
- Smaller core, one eval path. verifiers now holds environments, harnesses, runtimes, and scoring. Full evaluations, serving, and platform uploads move to prime-rl.
vf-runis a minimal in-process runner for quick runs (#3047, #2610, #3052, #3056, #3046, #3054). - Native Prime VMs for services. Task services and Compose services run as native Prime VMs on the rollout LAN. Tool servers get their own Prime runtimes. Harbor Compose tasks run on native VMs, and each service gets its own disk size (#2910, #2918, #2999, #2876, #3018, #3020).
- Bring your own runtime. A
customruntime plugin implements any provider. Prime runtimes expose ports and mount volumes, and Docker runtimes support bind mounts (#2862, #2914, #2916). - One network policy config.
vf.NetworkPolicyConfigsets the policy for tasks (TaskData.network), scoring (ScoringConfig.network), and runtimes (Runtime.set_network) (#2902). - More scoring control. Rubric choices can map answers to scores. Traces can be dropped from training with
drop.ScoringConfig.skip_on_truncatedandskip_on_timeoutskip scoring, andAgentConfig.max_turn_tokenscaps each turn.Task.rescorescores a finished trace again offline (#2935, #2960, #2949, #2899). - Faster training data paths. Per-token node streams and record streams are NumPy arrays. Training arrays stay on the host and never stream. Episodes encode to JSON one node at a time, so the encoder does not block the event loop. Traces carry sampler probability heads, engine weight-version spans, and their run (#2961, #2980, #2934, #3042, #2804).
- New and updated harnesses. Add the OpenCode 2 ACP harness and the DeepSeek minimal ACP harness. Each harness declares its dialects on its config. Prime Agent uses the Rust 0.10 release, and the bundled harnesses are bumped to their latest versions (#2871, #2860, #2888, #2887, #3021–#3031, #3044).
Breaking
- The eval CLI is reduced to
vf-run.vf-eval,vf-replay,vf-init, the Rich dashboard, and eval platform push are removed. Usevf-runfor quick runs and prime-rl'suv run evalfor full evaluations and uploads. To score a saved trace again, callTask.rescore(trace). Drop--rich,--no-rich,--push,--no-push,push, andrun.attachfrom configs;setup_loggingno longer takesconsole(#2610, #3052, #2843, #3056, #3046). - Runtime providers other than Prime, Docker, and subprocess are removed. Migrate
modal,e2b,podman, andapptainertoprimeor to acustomruntime plugin.Runtime.run_programis removed; useRuntime.run.Runtime.open_processis nowRuntime.exec. Backend modules move toverifiers.v1.runtimes.backends.*(#2862). UnscoredErroris removed, andnanno longer means "unscored". Checktrace.droppedinstead, and replacenanchoices with adroplist on the criterion. Trainers must skip dropped traces (#2960).
Notes
- The env server moves to prime-rl. Import
EnvServer,EnvClient,EnvServerPool,EpisodeAssembly, andset_episode_hookfromprime_rl.env. ImportServeConfigand the pool configs fromprime_rl.configs.env_server. verifiers no longer installspyzmqormsgpack(#3054). - Streamed deltas carry no training arrays. Keep the arrays on the server with an episode hook and fetch them from there (#2934).
Changelog
- fix: install kimi-code from npm by @mikasenghaas in #2838
- chore: remove unused assets/ by @mikasenghaas in #2841
- docs: flatten docs/v1/ into the docs root by @mikasenghaas in #2842
- refactor: split tests into unit and integration suites by @mikasenghaas in #2837
- chore: prune skills/ to release only and remove vf-init by @mikasenghaas in #2843
- chore: freshen the standalone agent example by @mikasenghaas in #2844
- chore: drop CLAUDE.md in favor of native AGENTS.md by @mikasenghaas in #2847
- chore: remove the root configs/ directory by @mikasenghaas in #2846
- fix: list task skills in rlm's prompt by @mikasenghaas in #2845
- perf(v1): accept packed CSR sampling masks from prime-rl's /generate by @faresobeid in #2778
- feat: test network policy and notice across harnesses on prime by @mikasenghaas in #2849
- fix(v1): move prime-agent kernel venv into the shared install dir by @snimu in #2853
- Separate public Runtime views from provider lifecycle backends by @hallerite in #2827
- Move task verification into the common rollout lifecycle by @hallerite in #2830
- Run agentic judging in the selected verifier workspace by @hallerite in #2832
- Own task workspaces and Compose services through deployments by @hallerite in #2833
- perf(MessageDecoder): Decode streamed deltas in a worker without receive copies by @hubert-marek in #2811
- fix: switch the CI model to DeepSeek V4.1 Flash by @mikasenghaas in #2858
- fix: stop the resume task prompt from reading as exfiltration by @mikasenghaas in #2868
- feat: test sampling overrides across harnesses and dialects by @mikasenghaas in #2867
- test: use Clef for CI decision judging by @hallerite in #2861
- Fix isolated verifier runtime policy resolution by @xeophon in #2869
- Preserve authored Compose working directories by @xeophon in #2870
- fix: collect and same-box grade before closing the harness session by @hallerite in #2866
- Add OpenCode 2 ACP harness by @xeophon in #2871
- fix: match replayed turns through per-harness replay views by @mikasenghaas in #2864
- Remove the rlm checkout's git history after install by @hallerite in #2874
- Run task tool servers in a named Compose service by @hallerite in #2872
- fix(v1): preserve Anthropic stream errors and retry classification by @hallerite in #2881
- feat(v1): add DeepSeek minimal ACP harness by @hallerite in #2860
- fix(v1): default decision judge to Cloudflare Clef by @xeophon in #2884
- docs: clarify environment development and evaluation guides by @xeophon in #2720
- feat(v1): persist artifacts with Harbor destinations by @xeophon in #2885
- Use the Rust Prime Agent 0.10.0 release by @xeophon in #2887
- feat: pass dialect to replay views by @mikasenghaas in #2880
- fix(v1): classify Anthropic HTTP errors by status by @hallerite in #2889
- fix(v1): preserve ACP stops and verifier diagnostics by @hallerite in #2893
- docs: fix newline escapes in Python examples by @xeophon in #2892
- fix(v1): support separate graders in vf-validate by @xeophon in #2897
- Run tool servers on Prime runtimes of their own as VMs on the rollout LAN by @hallerite in #2876
- feat(v1): store engine weight-version spans on assistant nodes by @faresobeid in #2894
- feat: test overlapping requests from one harness by @mikasenghaas in #2900
- fix: drop the _v1 suffix from integration fixtures and doc examples by @mikasenghaas in #2901
- feat: declare each harness's dialects on its config by @mikasenghaas in #2888
- Make network policies one config: TaskData.network, ScoringConfig.network, Runtime.set_network by @hallerite in #2902
- Harbor: grade shared-box verifiers under their declared network policy by @hallerite in #2909
- feat(v1): Task.rescore re-scores a finished trace offline by @eligotts in #2899
- fix: declare models OpenClaw's catalog does not know by @mikasenghaas in #2877
- feat: bring your own runtime as a plugin, deprecate non-Prime VMs, demote non-Prime runtimes by @mikasenghaas in #2862
- feat(trace): carry sampler probability heads to training branches by @nxphi47 in #2804
- chore(deps): bump aiohttp from 3.14.3 to 3.14.4 by @dependabot[bot] in #2913
- chore: bump nano-rlm to 4cd7f39 by @hallerite in #2926
- Build Harbor Compose workspaces from implicit Dockerfiles by @hallerite in #2933
- feat(rubric): scored choices; a nan reward leaves the rollout unscored by @rasdani in #2935
- fix(deps): bump certifi to 2026.10.19 for the eMudhra CA compromise by @hallerite in #2932
- fix(replay): reject unscored NaN rewards by @xeophon in #2936
- ENG-6873: chore(deps): require prime-sandboxes>=0.5.0 by @akirillo in #2930
- perf(v1): keep the config tree free of runtime imports and resolve vf names lazily by @skpulipaka26 in #2938
- fix: bump renderers so the config tree imports without openai by @mikasenghaas in #2950
- feat: per-turn token limit and scoring skip for truncated or timed-out runs by @mikasenghaas in #2949
- feat: skip scoring for traces a stop ends by @mikasenghaas in #2951
- fix: cap concurrent integration jobs at 16 by @mikasenghaas in #2952
- feat(harness): context compaction for the null harness by @nxphi47 in #2953
- fix(scoring): preserve skips across finalization timeouts by @xeophon in #2959
- feat: first-class drop on traces by @mikasenghaas in #2960
- Allow multiple appended user/tool messages in renderer bridge tail by @eligotts in #2944
- feat: expose ports on the prime runtime by @mikasenghaas in #2914
- fix(train): preserve graph prefixes with empty reasoning by @hubert-marek in #2911
- fix(gepa): reject dropped traces during optimization by @xeophon in #2972
- feat(v1): add Docker bind mounts and Prime volumes by @xeophon in #2916
- perf(v1): per-token node streams as numpy arrays by @mikasenghaas in #2961
- fix: scope run sampling to the run's client by @mikasenghaas in #2973
- feat(v1): add best-of-n-judge env by @hallerite in #2974
- fix(v1): bump mcp to 2.2.0 and keep tool exception text for the model by @hallerite in #2982
- perf(serve): drain and batch-decode frames in the env client receive loop by @samsja in #2983
- fix(runtimes): stop background processes during teardown by @xeophon in #2929
- chore: bump prime-sandboxes to 0.5.1 by @xeophon in #2984
- fix(harbor): create artifact directory before grading by @hallerite in #2986
- Update bundled harnesses and Code Mode settings by @xeophon in #2988
- fix: apply runtime blocklist to bash search results by @xeophon in #2963
- fix: normalize network rules and filter NanoRLM search by @hallerite in #2989
- perf: keep record streams as numpy arrays by @mikasenghaas in #2980
- feat: let the host keep finished episodes' training arrays by @mikasenghaas in #2934
- chore: require prime-runs 0.1.5 from PyPI by @kcoopermiller in #3001
- chore(deps): bump urllib3 from 2.7.0 to 2.8.0 by @dependabot[bot] in #2733
- chore(deps): bump pyjwt from 2.13.0 to 2.15.0 by @dependabot[bot] in #2735
- chore(deps): bump opentelemetry-api from 1.44.0 to 1.45.1 by @dependabot[bot] in #2964
- chore(deps): bump authlib from 1.7.2 to 1.9.1 by @dependabot[bot] in #2990
- chore(deps): bump msgpack from 1.2.1 to 1.2.3 by @dependabot[bot] in #2991
- chore(deps): bump litellm from 1.98.0 to 1.100.4 by @dependabot[bot] in #2992
- chore(deps): bump dnspython from 2.8.0 to 2.9.0 by @dependabot[bot] in #2993
- chore(deps): bump filelock from 3.32.4 to 4.2.1 by @dependabot[bot] in #3002
- chore(deps): bump virtualenv from 21.14.12 to 21.14.13 by @dependabot[bot] in #3008
- fix: use apk-installed Node and npm on Alpine by @xeophon in #3004
- fix: retry Node downloads before extracting by @xeophon in #3005
- fix(serve): discard kept episodes when clients disconnect by @xeophon in #2997
- Reuse interception tunnels for task-scoped MCP servers by @xeophon in #3006
- fix(CVE-2026-111497) in Brotli and Node by @danielzayas in #2998
- Run Prime task services as native VMs and fix Harbor setup by @xeophon in #2910
- Run Compose services as native Prime VMs by @xeophon in #2918
- Accept Harbor Compose tasks on native VMs by @hallerite in #2999
- Add a native Compose integration test on Prime by @hallerite in #3010
- fix(harbor): reject ignored verifier user overrides by @xeophon in #3014
- Honor configured disk size for native Compose sidecars by @xeophon in #3018
- Size native Compose disks per service by @xeophon in #3020
- Bump Codex to 0.166.0 and codex-acp to 2.5.0 by @xeophon in #3021
- Bump DeepSeek harness to 0.2.1-rc.5 by @xeophon in #3023
- Bump mini-swe-agent's LiteLLM dependency to 1.106.6 by @xeophon in #3031
- chore(deps): bump joserfc from 1.7.4 to 1.7.6 by @dependabot[bot] in #3017
- Bump Hermes Agent to v0.22.5 by @xeophon in #3024
- Bump Claude Code to 2.1.314 and claude-agent-acp to 0.99.1 by @xeophon in #3022
- Bump Kimi Code to 2.4.1 by @xeophon in #3025
- Bump OpenCode to 2.2.5 by @xeophon in #3026
- Bump OpenClaw to 2026.10.9 by @xeophon in #3027
- Bump Prime Agent to 0.10.2 by @xeophon in #3028
- Bump nano-rlm to e4d4407f by @xeophon in #3029
- Bump Terminus 2 to Harbor 0.25.0 by @xeophon in #3030
- chore(deps): bump oauthlib from 3.3.1 to 4.0.0 by @dependabot[bot] in #3035
- fix: bump prime-sandboxes to 0.5.3 by @mikasenghaas in #3043
- feat(rlm): drop network-dependent prompt guidance on boxes with no network by @rasdani in #3011
- Bump nano-rlm to 48da1d9c by @rasdani in #3044
- fix: bump prime-sandboxes to 0.5.4 by @akirillo in #3045
- feat: remove the eval's platform push and the prime-runs dependency by @mikasenghaas in #3046
- feat: encode episodes to JSON one node at a time and record runs on traces by @mikasenghaas in #3042
- chore: bump prime-sandboxes to 0.5.5 by @DamianB-BitFlipper in #3048
- improvement(interception): keep tunnels serving with prime-tunnel by @kcoopermiller in #3041
- feat: add vf-run, a minimal in-process runner by @mikasenghaas in #3047
- improvement(interception): close the connection after each health answer by @kcoopermiller in #3049
- refactor(eval): remove vf-eval by @mikasenghaas in #2610
- feat: remove the vf-replay cli by @mikasenghaas in #3052
- fix: give best-of-n judges more turns in the agentic judge test by @mikasenghaas in #3053
- feat: configurable tool server startup timeout by @mikasenghaas in #3051
- feat: drop the cli unit tests by @mikasenghaas in #3055
- feat: remove the rich dashboard by @mikasenghaas in #3056
- feat: remove the env server by @mikasenghaas in #3054
- chore: require stable renderers 0.2.0 by @mikasenghaas in #3060
- fix: retain format violations as zero-reward training samples by @hallerite in #3059
New Contributors
- @nxphi47 made their first contribution in #2804
- @akirillo made their first contribution in #2930
- @skpulipaka26 made their first contribution in #2938
- @danielzayas made their first contribution in #2998
Full Changelog: v0.4.0...v0.4.1