Owner summary
这是一个按仓库协作规范管理的大型 roadmap issue :它定义跨 UniLab 与新建 unisim 仓库的集成结果、child issue 依赖顺序和最终回合边界,不把拆仓工作压缩成单个实现 PR。roadmap 的最终结果要求当前版图中的全部仿真物理后端完成迁移;首发只表示交付节奏,不表示其余后端可永久留在 UniLab。
建议在 github.com/unilabsim/unisim 新建独立仓库,以 PyPI distribution unisim-core 发布统一物理后端能力;Python import namespace 确定为 unisim。最小完整交付不是复制 src/unilab/base/backend/,而是先把 scene、随机化、asset、dtype、可视化等反向依赖改造成 package-neutral contract,再交付轻量 core、MuJoCo/Motrix 两个代表性 adapter、conformance kit,并只预留 benchmark API/结果 schema,不做实质 benchmark 开发。UniLab 保留 task/env/manager/Hydra/训练与机器人资产 owner,通过有期限的 re-export shim 分批切换为 unisim-core 消费者,最终删除仓内 backend 实现。
预计跨两个仓库 10–16 个 PR、约 80–140 个 touched files;大量代码是保留历史的移动,新增 glue/发布/文档约 2k–4k 手写 LOC。永久维护责任包括公开 backend API 的兼容策略、per-engine optional extras/support matrix、双仓兼容 CI、TestPyPI release/security、conformance 和 benchmark API/schema。命名、首发范围、版本、许可证、历史迁移、文档、shim、分支、TestPyPI 和资产策略均已由 maintainer 确认。
一句话问题
UniLab 已形成统一 SimBackend 和多个物理引擎 adapter,但这些实现仍与 UniLab 的 scene、domain randomization、asset、工具和训练侧 helper 双向耦合,既不能被独立 benchmark 消费,也不能作为一个轻量、稳定的物理后端 package 供 UniLab 以外的项目复用。
两个产品目标
物理引擎 benchmark(后续能力) :统一 contract 必须预留 benchmark 的 case/result/provenance 接口;本 roadmap 当前不实现 workload、性能测量或 benchmark 结论。
UniLab 的 physics provider :UniLab 继续拥有机器人学习 task 与训练生命周期,但只通过公开 unisim-core contract 构造和使用物理后端,不再内置或私有访问具体引擎实现。
这两个消费者必须使用同一套 contract 和 adapter;不为 benchmark 建第二套简化接口,也不为 UniLab 保留长期 fork。
当前证据
Architecture: 统一物理后端抽象、manager-based API 与 mjwarp-uni #882 首次记录未来拆出 unisim 的方向;Architecture Phase 1: 统一物理后端 contract 收敛(unisim 可提取边界) #888 / PR refactor: 统一物理后端 contract 收敛 Phase 1 (#888) #892 已完成第一阶段 SimBackend contract 收敛和 conformance seed,但明确把“建仓、拆包、版本、发布”留给后续 issue。
src/unilab/base/backend/base.py 已是公开统一接口,tests/base/test_backend_conformance.py、test_backend_imports.py、test_sim_backend*.py 已提供可复用的边界与一致性测试基础。
该目录目前仍不能直接移动:base.py 依赖 unilab.dr.types;factory 依赖 unilab.assets.hub 和 SceneCfg;各 adapter 还依赖 unilab.base.scene、unilab.terrains、unilab.utils.rotation、global dtype 与 UniLab playback helper。依赖倒置尚未完成。
UniLab 的 env/task/training/visualization 多处直接 import unilab.base.backend...,需要受控迁移和兼容窗口,不能一次 rename 后期待所有 consumer 自行修复。
当前开发工作树的 backend Python 代码约 55 个文件、17k 行;相关 backend tests 约 7.7k 行。这里包含多个 engine runtime、subprocess IPC、materialization 与 playback,不适合用一个大 PR 跨仓复制。
pyproject.toml 已把 MuJoCo、MJWarp、Motrix 和 Genesis 表达为 optional extras,说明 engine 依赖天然适合按 adapter 隔离;但当前基础 unilab package 仍携带 Torch、Gymnasium、Hydra、learner 等与 physics core 无关的依赖。
2026-09-02 查询 PyPI:unisim-core==0.0.1 是名称占位包;unisim==1.0.1 是另一个名为 “UniSim: Universal Similarity” 的项目。GitHub organization 当前没有 unilabsim/unisim 仓库。
推荐的 package 与仓库边界
unilabsim/unisim repository
src/unisim/
contract/ # backend-neutral types, capabilities, errors, lifecycle
registry/ # lazy adapter registry/factory; no Hydra
adapters/ # mujoco, motrix, ... optional engine implementations
subprocess_ipc/ # only if required by extracted adapters
conformance/ # reusable adapter author test kit
benchmark/ # engine-level workloads, metrics and result schema
UniLab repository
task / env / manager / Hydra owner YAML / registry mapping
reward / observation / termination / runner / learner / checkpoint / sim2sim
robot asset registry, HF download policy and task-owned scene composition
thin translation from UniLab config/scene/DR request to unisim inputs
unisim-core owns
SimBackend 的公开语义、backend identity、capability、错误类型和生命周期;
package-neutral scene/materialization input、state/control/reset/mutation 类型;
lazy factory/registry、adapter dependency diagnostics;
backend adapter、backend-native runtime、subprocess worker/IPC(若该 adapter 需要);
cold-path selector/materialization 与 hot-path buffer/step 规则;
conformance kit、benchmark API/result schema 与扩展点(workload、测量和结论暂缓);
wheel/sdist、版本、release note、支持矩阵和 API 文档。
UniLab 继续拥有
Hydra compose、task=<task>/<backend> owner YAML、training.sim_backend identity 规则;
NpEnvState、manager/env/task lifecycle、reward/observation/termination、runner/learner/IPC;
sim2sim policy I/O contract、checkpoint、训练与 play entrypoint;
机器人资产 HF registry/cache、task XML/fragment、terrain generation;
将 task-owned scene、DR plan 和显式 dtype/config 翻译成 unisim-core input 的 adapter layer。
不跨越的边界
unisim-core 不 import unilab,也不依赖 Hydra、Torch、Gymnasium、RSL-RL 或训练脚本。
UniLab 的 env/manager 只调用 unisim-core 已声明的公开 contract,不访问 engine model/data/private runtime。
asset/XML/model metadata 仍只在 materialization/cache 等冷路径处理;step/reset 热路径不解析 asset,也不用 getattr/hasattr 探测私有能力。
benchmark 只评价 physics contract;RL return、reward、收敛速度和策略效果属于 UniLab 或独立研究,不混入 core benchmark 分数。
命名与发布建议
GitHub repository / product brand:unilabsim/unisim / UniSim。
PyPI distribution:unisim-core(名称已占位)。
Python namespace:已确定为 unisim;PyPI distribution 仍为 unisim-core。
CLI:首版只在 benchmark 真有稳定入口后提供 unisim-bench;core library 不创建泛化的 train/play CLI。
License:建议延续 Apache-2.0,并在迁移时保留 copyright/provenance;具体 engine SDK、fixture asset 和 subprocess worker 的再分发条款逐项审计。
版本:沿用 UniLab 当前版本策略;bootstrap child 记录 source-of-truth、版本同步和 release note 规则,不另行发明独立版本体系。
首版范围选择
推荐首个可发布纵向切片为 core + MuJoCo + Motrix + conformance ,同时只预留 benchmark contract/API/result schema,不实现 benchmark workload、性能测量或结论;其余后端仍是本 roadmap 的强制最终迁移范围。
首发切片是阶段性 release;roadmap 完成前必须继续迁移全部后端,不能以首发 package 发布作为结束条件。
首发范围已确认;下表仅记录阶段性 release 的取舍,不改变 roadmap 必须迁移全部 backend 的最终边界:
选项
首版结果
规模与长期成本
A(推荐)
core + MuJoCo + Motrix;其余 adapter 逐个迁移
能形成至少双引擎 benchmark,风险可控;迁移期需短期 compatibility matrix
B
core + MuJoCo only
最快发布,但不能独立证明“统一多引擎 benchmark”目标,只能作为 package bootstrap
C
一次迁移全部当前 adapter
UniLab 更快清空旧目录,但把 IPC、GPU、runtime discovery、playback 和多种 SDK 风险合并到首发,review/release/support 成本最高
首版不自动承诺所有 engine、OS、Python、render、DR 和 sensor 能力对等;这只约束阶段性 release。roadmap 最终必须覆盖当前 UniLab backend registry/版图中的 MuJoCo、Motrix、Drake、MJWarp、Genesis、IsaacGym 和 IsaacSim;benchmark 当前只保留接口,不做实质开发。
Benchmark 接口预留(当前不做实质开发)
本 roadmap 只定义未来 benchmark 所需的稳定扩展点、case/result schema、provenance 字段和 adapter capability 查询接口,不实现 workload、性能采样、GPU/CPU 测量、结果比较或 benchmark 结论。任何实质 benchmark implementation 必须另立 child/issue,并经 maintainer checkpoint 授权。
接口设计仍须与 physics contract 共用同一 scene/control/state 语义,不能为 benchmark 创建第二套 backend API。
迁移策略
Phase 0 — ADR 与提取清单(UniLab,1 PR)
固定 namespace、public/private API、首发 adapter、版本兼容和 release ownership;
生成 import/dependency graph,把每个现有文件归类为 move、split、stay 或 delete;
明确 scene/DR/asset/dtype/playback 的依赖倒置接口;
记录 main 与活跃 integration branch 的 source-of-truth,未合入能力不能被静默当作稳定首发范围;
给出跨仓迁移表和 rollback 条件。
Phase 1 — 仓库与 package bootstrap(unisim,2–3 PR)
maintainer 授权后创建 public unilabsim/unisim,默认分支 main;
在隔离 clone 中优先用 filtered-history/import 保留可追溯提交,不重写 UniLab 现有分支历史;若历史保留成本过高,使用明确 provenance manifest 的 snapshot import;
建立 uv/uv_build、Apache-2.0、CODEOWNERS、issue/PR 模板、lint/type/test、wheel/sdist clean-install smoke;
抽出不 import UniLab/engine SDK 的 core contract、fake backend 和 conformance kit。
Phase 2 — 首个双引擎纵向切片(unisim,3–5 PR)
先迁 MuJoCo,再迁 Motrix;每个 adapter 独立一个 implementation issue/PR;
将 UniLab-owned scene、DR、asset、terrain、dtype 和 playback 依赖倒置到正式 input/protocol;
adapter optional extras、lazy import、缺依赖诊断和平台矩阵通过 clean env 验证;
预留 benchmark extension points/result schema 和最小 fake/reference hook;不实现 benchmark workload、性能测量或结论。
Phase 3 — UniLab consumer migration(UniLab,2–4 PR)
UniLab pin 已发布的 unisim-core pre-release/stable artifact,并在 owner config 层完成参数翻译;
unilab.base.backend 可短期作为只 re-export/诊断的 compatibility shim,但不保留实现副本或行为分叉;
env/manager/training/visualization consumer 分批改用新 public namespace;
全部 consumer 迁完后删除对应 UniLab backend 实现、重复 tests 和过渡 shim。
Phase 4 — 其余 adapter 与稳定发布(每 adapter 独立 child)
Drake、MJWarp、Genesis、IsaacGym、IsaacSim 等只在其 source branch 已进入声明 base、依赖许可证可发布、conformance 和平台验证明确后逐个迁移;
out-of-process adapter 共用一份 subprocess_ipc,不复制 worker protocol;
roadmap 完成前只使用 TestPyPI 完成预发布、安装 smoke 和兼容性验证;生产 PyPI 发布由 maintainer 在最终 roadmap PR 完成后手动执行。
文档迁移(与代码同等交付)
文档不是收尾工作,而是每个迁移 child 的纵向交付物。需要同步维护中英文入口和新仓库文档,避免代码已经切换但用户仍按照旧 import、旧安装命令或旧 backend identity 操作。
unisim 必须提供 README、安装与 optional extras 说明、public API/contract 文档、adapter support matrix、conformance kit 使用说明、benchmark workload/result schema、版本策略、CHANGELOG、迁移指南和 release 文档。
UniLab 必须同步更新 README.md、CONTRIBUTING.md、中英文 Sphinx getting-started/developer/backend 文档、backend 配置与 task 迁移示例;明确 unisim-core 版本约束、unilab.base.backend compatibility shim 的退役版本,以及 uv run 验证命令。
文档中的 engine support、性能数字、安装平台和 benchmark 结论只能引用同一 commit 的测试/benchmark 证据;不把单机结果写成普遍 support claim。
文档迁移 child 必须与对应代码 child 同步 review;中英文内容、链接、代码示例和 API 名称在文档 gate 中检查。
Child issue 与依赖顺序
本 roadmap 开发授权后,按以下顺序创建并合并 child issue;每个 child 一个主要结果、一个工作分支和一个 PR。编号为计划标识,实际 issue 创建后回填链接:
Child 1:ADR、依赖图与提取清单(UniLab) :固定 unisim namespace、首发 adapter、版本/许可证、compatibility window、文档 owner 和 benchmark 接口预留范围;产出 move/split/stay/delete 清单。
Child 2:unisim 仓库与 core/conformance bootstrap :从 declared base 的已确认来源建立仓库、构建/测试/release 骨架、package-neutral contract、fake backend 和 conformance kit。
Child 3:MuJoCo adapter + benchmark 接口 fixture :完成第一个真实 adapter、optional extra、cold-path materialization、step/reset/state-read conformance,并只提供 benchmark 接口 fixture 与文档,不做实质 benchmark。
Child 4:Motrix adapter + benchmark schema 对齐 :完成第二个真实 adapter、同一 workload 所需的接口/结果 schema 对齐和文档;不执行 benchmark workload、测量或结论。
Child 5:UniLab consumer migration :以已发布 unisim-core 为依赖,迁移 env/task/manager/training/visualization consumer,保留有期限 shim 并补回归。
Child 6:UniLab 文档与迁移指南收口 :同步中英文用户/开发者文档、安装/配置/示例、旧路径退役说明;若各代码 child 已包含完整文档,可由 maintainer 合并为同一纵向 child,但不得省略。
Child 7:Drake adapter :迁移 Drake backend、其依赖倒置、conformance、benchmark API 接入和文档;不执行实质 benchmark。
Child 8:MJWarp adapter :迁移 MJWarp backend、GPU/placement contract、conformance、benchmark API 接入和文档;不恢复已退役的 device-only lifecycle,不执行实质 benchmark。
Child 9:Genesis adapter :迁移 Genesis backend、runtime discovery、conformance、benchmark API 接入和文档;不执行实质 benchmark。
Child 10:IsaacGym adapter :迁移 IsaacGym backend 及其 out-of-process worker/IPC,复用共享 subprocess protocol,完成平台/support 证据、benchmark API 接入和文档;不执行实质 benchmark。
Child 11:IsaacSim adapter :迁移 IsaacSim backend 及其 out-of-process worker/IPC,复用共享 subprocess protocol,完成平台/support 证据、benchmark API 接入和文档;不执行实质 benchmark。
Child 12:全 backend 收口与 UniLab 删除 :确认上述七类 backend 均由 unisim-core 提供,删除 UniLab 内对应实现、重复测试和长期 compatibility shim,完成全量文档与迁移指南验收。
依赖关系为 1 → 2 → 3 → 4 → 5 → 6,随后按 7 → 8 → 9 → 10 → 11 → 12 完成全量 backend 收口;Child 7–11 可在 core 稳定后按 engine 并行,但 Child 12 必须等待全部 adapter、文档和 support matrix 完成,不能把任一当前 backend 标记为永久 deferred。
每个 child 的 PR base 必须是本 roadmap 集成分支 dev/issue-1428-unisim-extraction;该分支从 declared base dev/issue-1042-manager-based-api 的最新只读快照创建。所有开发和发布不得直接修改 UniLab main 或 dev/issue-1042-manager-based-api;全部 child 合并并在集成分支最新 head 通过 gate 后,才在 roadmap 完成阶段准备回合 declared base 的最终 PR,且在此之前不向其写入。
Roadmap / repository 治理
本 issue 创建在 UniLab,因为源代码、现有 consumer 和拆分决策当前由 UniLab 拥有;新仓库创建后,在 unilabsim/unisim 建 execution roadmap 并与本 issue双向链接。
UniLab declared base:dev/issue-1042-manager-based-api;提案时该分支 head e6867464(2026-09-02)。该分支和 main 在本 roadmap 执行期间均只读;所有 UniLab child 从 roadmap 集成分支创建,不能从 main 或 declared base 直接开发或发布。
unisim 仓库在创建后使用其 main 作为仓内 base;它不是 UniLab 的 declared base。跨仓 consumer PR 仍先在各自仓库完成本地 gate,再由 UniLab 集成分支承接。
本 issue 已获得全自主开发授权;实现、文档和 TestPyPI 验证可按 child 顺序连续推进,但不得修改 UniLab main 或 dev/issue-1042-manager-based-api。
两仓 PR 各自在最终 head 运行本仓完整本地 gate;UniLab child/集成分支继续遵循 make test-all(执行时使用仓库规定的 uv run 环境),unisim 仓库固定等价的 uv run gate。开发和发布阶段只使用 TestPyPI;credentials 位于 ~/.pypirc,不得输出、提交或复制其内容;最终生产 PyPI 发布由 maintainer 手动执行。
创建或更新任何 PR 前,必须确认工作树干净并在最终 head 记录 gate 结果;base 为 roadmap 集成分支的 PR 使用本地 gate 与 review,不触碰 UniLab main 或 declared base。
当 declared base 前进时,只在计划同步点读取其最新 head 并重建/同步 roadmap 分支;不得向 declared base 写入,不得把旧 head 的测试结果带入候选。
预计规模与 review
Phase 0:5–10 files,≤800 手写 LOC,1 PR。
Bootstrap/core:15–25 files,约 1k–2k 手写 LOC,2–3 PR。
首个两个 adapter:约 25–45 moved/edited files,1k–2k glue/benchmark LOC,3–5 PR;移动代码与新增手写代码分开报告。
UniLab migration/cleanup:约 30–60 touched files,2–4 PR;删除 LOC 不设硬上限,但每个 PR 只迁移一个 consumer/adapter 边界。
全部 adapter 完成预计合计 10–16 PR、80–140 touched files。发现公共 contract、IPC、release/support 或平台责任明显超出上述预估时,先更新 roadmap 再继续。
Review owner:Backend/API、Packaging/Release、UniLab Env/Config;benchmark API/schema 由 Backend + Performance reviewer 共同确认。
Acceptance criteria
Non-goals
不把 UniLab 的 manager/task/reward/learner/runner/checkpoint/sim2sim 搬入 unisim-core。
不借拆包重新设计第二套 backend V2、runner lifecycle 或 collector/learner protocol。
不在首版承诺全部 backend 的 parity;但 roadmap 最终交付不允许把当前 backend 永久留在 UniLab 或标记为可选迁移。
不把机器人 mesh/texture 打进 wheel;fixture asset 必须小、许可明确并拥有稳定 digest。
不以 benchmark 为由在常规 CI 强制专有 SDK、GPU 或长时 job。
不在两个仓库长期维护同一 adapter、protocol 或 conformance test 的副本。
roadmap 已授权创建 unilabsim/unisim、迁移代码、更新文档并发布到 TestPyPI;但不修改 UniLab main 或 dev/issue-1042-manager-based-api,不在 roadmap 完成前发布生产 PyPI。
Stop conditions / 范围复核点
unisim-core 为了构造 backend 仍必须 import UniLab scene/DR/asset/Hydra 类型;先完成依赖倒置,不发布循环依赖 package。
TestPyPI credentials、依赖许可证、目标平台和 engine runtime 的关键事实必须在对应 child 中记录;小型实现问题不得阻塞整体推进,但不得绕过 contract 或发布安全边界。
任一迁移 adapter 的 upstream SDK/license、fixture asset 再分发权或目标平台 wheel 可用性不清楚。
为保持兼容需要永久双实现、动态探测 backend 私有能力或绕过 SimBackend lifecycle。
active integration branch 与 main 的 contract/adapter 差异无法确定 source-of-truth。
benchmark 无法固定同步、transfer、scene 和 state 语义,导致结果比较的是不同 workload。
新增公共 execution path、常规硬件 CI、production support claim 或跨仓 release coupling 超出已确认范围。
Related
Owner summary
这是一个按仓库协作规范管理的大型 roadmap issue:它定义跨 UniLab 与新建 unisim 仓库的集成结果、child issue 依赖顺序和最终回合边界,不把拆仓工作压缩成单个实现 PR。roadmap 的最终结果要求当前版图中的全部仿真物理后端完成迁移;首发只表示交付节奏,不表示其余后端可永久留在 UniLab。
建议在
github.com/unilabsim/unisim新建独立仓库,以 PyPI distributionunisim-core发布统一物理后端能力;Python import namespace 确定为unisim。最小完整交付不是复制src/unilab/base/backend/,而是先把 scene、随机化、asset、dtype、可视化等反向依赖改造成 package-neutral contract,再交付轻量 core、MuJoCo/Motrix 两个代表性 adapter、conformance kit,并只预留 benchmark API/结果 schema,不做实质 benchmark 开发。UniLab 保留 task/env/manager/Hydra/训练与机器人资产 owner,通过有期限的 re-export shim 分批切换为unisim-core消费者,最终删除仓内 backend 实现。预计跨两个仓库 10–16 个 PR、约 80–140 个 touched files;大量代码是保留历史的移动,新增 glue/发布/文档约 2k–4k 手写 LOC。永久维护责任包括公开 backend API 的兼容策略、per-engine optional extras/support matrix、双仓兼容 CI、TestPyPI release/security、conformance 和 benchmark API/schema。命名、首发范围、版本、许可证、历史迁移、文档、shim、分支、TestPyPI 和资产策略均已由 maintainer 确认。
一句话问题
UniLab 已形成统一
SimBackend和多个物理引擎 adapter,但这些实现仍与 UniLab 的 scene、domain randomization、asset、工具和训练侧 helper 双向耦合,既不能被独立 benchmark 消费,也不能作为一个轻量、稳定的物理后端 package 供 UniLab 以外的项目复用。两个产品目标
unisim-corecontract 构造和使用物理后端,不再内置或私有访问具体引擎实现。这两个消费者必须使用同一套 contract 和 adapter;不为 benchmark 建第二套简化接口,也不为 UniLab 保留长期 fork。
当前证据
unisim的方向;Architecture Phase 1: 统一物理后端 contract 收敛(unisim 可提取边界) #888 / PR refactor: 统一物理后端 contract 收敛 Phase 1 (#888) #892 已完成第一阶段SimBackendcontract 收敛和 conformance seed,但明确把“建仓、拆包、版本、发布”留给后续 issue。src/unilab/base/backend/base.py已是公开统一接口,tests/base/test_backend_conformance.py、test_backend_imports.py、test_sim_backend*.py已提供可复用的边界与一致性测试基础。base.py依赖unilab.dr.types;factory 依赖unilab.assets.hub和SceneCfg;各 adapter 还依赖unilab.base.scene、unilab.terrains、unilab.utils.rotation、global dtype 与 UniLab playback helper。依赖倒置尚未完成。unilab.base.backend...,需要受控迁移和兼容窗口,不能一次 rename 后期待所有 consumer 自行修复。pyproject.toml已把 MuJoCo、MJWarp、Motrix 和 Genesis 表达为 optional extras,说明 engine 依赖天然适合按 adapter 隔离;但当前基础unilabpackage 仍携带 Torch、Gymnasium、Hydra、learner 等与 physics core 无关的依赖。unisim-core==0.0.1是名称占位包;unisim==1.0.1是另一个名为 “UniSim: Universal Similarity” 的项目。GitHub organization 当前没有unilabsim/unisim仓库。推荐的 package 与仓库边界
unisim-coreownsSimBackend的公开语义、backend identity、capability、错误类型和生命周期;UniLab 继续拥有
task=<task>/<backend>owner YAML、training.sim_backendidentity 规则;NpEnvState、manager/env/task lifecycle、reward/observation/termination、runner/learner/IPC;unisim-coreinput 的 adapter layer。不跨越的边界
unisim-core不 importunilab,也不依赖 Hydra、Torch、Gymnasium、RSL-RL 或训练脚本。unisim-core已声明的公开 contract,不访问 engine model/data/private runtime。getattr/hasattr探测私有能力。命名与发布建议
unilabsim/unisim/ UniSim。unisim-core(名称已占位)。unisim;PyPI distribution 仍为unisim-core。unisim-bench;core library 不创建泛化的train/playCLI。首版范围选择
推荐首个可发布纵向切片为 core + MuJoCo + Motrix + conformance,同时只预留 benchmark contract/API/result schema,不实现 benchmark workload、性能测量或结论;其余后端仍是本 roadmap 的强制最终迁移范围。
首发切片是阶段性 release;roadmap 完成前必须继续迁移全部后端,不能以首发 package 发布作为结束条件。
首发范围已确认;下表仅记录阶段性 release 的取舍,不改变 roadmap 必须迁移全部 backend 的最终边界:
首版不自动承诺所有 engine、OS、Python、render、DR 和 sensor 能力对等;这只约束阶段性 release。roadmap 最终必须覆盖当前 UniLab backend registry/版图中的 MuJoCo、Motrix、Drake、MJWarp、Genesis、IsaacGym 和 IsaacSim;benchmark 当前只保留接口,不做实质开发。
Benchmark 接口预留(当前不做实质开发)
本 roadmap 只定义未来 benchmark 所需的稳定扩展点、case/result schema、provenance 字段和 adapter capability 查询接口,不实现 workload、性能采样、GPU/CPU 测量、结果比较或 benchmark 结论。任何实质 benchmark implementation 必须另立 child/issue,并经 maintainer checkpoint 授权。
接口设计仍须与 physics contract 共用同一 scene/control/state 语义,不能为 benchmark 创建第二套 backend API。
迁移策略
Phase 0 — ADR 与提取清单(UniLab,1 PR)
main与活跃 integration branch 的 source-of-truth,未合入能力不能被静默当作稳定首发范围;Phase 1 — 仓库与 package bootstrap(unisim,2–3 PR)
unilabsim/unisim,默认分支main;uv/uv_build、Apache-2.0、CODEOWNERS、issue/PR 模板、lint/type/test、wheel/sdist clean-install smoke;Phase 2 — 首个双引擎纵向切片(unisim,3–5 PR)
Phase 3 — UniLab consumer migration(UniLab,2–4 PR)
unisim-corepre-release/stable artifact,并在 owner config 层完成参数翻译;unilab.base.backend可短期作为只 re-export/诊断的 compatibility shim,但不保留实现副本或行为分叉;Phase 4 — 其余 adapter 与稳定发布(每 adapter 独立 child)
subprocess_ipc,不复制 worker protocol;文档迁移(与代码同等交付)
文档不是收尾工作,而是每个迁移 child 的纵向交付物。需要同步维护中英文入口和新仓库文档,避免代码已经切换但用户仍按照旧 import、旧安装命令或旧 backend identity 操作。
unisim必须提供 README、安装与 optional extras 说明、public API/contract 文档、adapter support matrix、conformance kit 使用说明、benchmark workload/result schema、版本策略、CHANGELOG、迁移指南和 release 文档。README.md、CONTRIBUTING.md、中英文 Sphinx getting-started/developer/backend 文档、backend 配置与 task 迁移示例;明确unisim-core版本约束、unilab.base.backendcompatibility shim 的退役版本,以及uv run验证命令。Child issue 与依赖顺序
本 roadmap 开发授权后,按以下顺序创建并合并 child issue;每个 child 一个主要结果、一个工作分支和一个 PR。编号为计划标识,实际 issue 创建后回填链接:
unisimnamespace、首发 adapter、版本/许可证、compatibility window、文档 owner 和 benchmark 接口预留范围;产出 move/split/stay/delete 清单。unisim-core为依赖,迁移 env/task/manager/training/visualization consumer,保留有期限 shim 并补回归。unisim-core提供,删除 UniLab 内对应实现、重复测试和长期 compatibility shim,完成全量文档与迁移指南验收。依赖关系为
1 → 2 → 3 → 4 → 5 → 6,随后按7 → 8 → 9 → 10 → 11 → 12完成全量 backend 收口;Child 7–11 可在 core 稳定后按 engine 并行,但 Child 12 必须等待全部 adapter、文档和 support matrix 完成,不能把任一当前 backend 标记为永久 deferred。每个 child 的 PR base 必须是本 roadmap 集成分支
dev/issue-1428-unisim-extraction;该分支从 declared basedev/issue-1042-manager-based-api的最新只读快照创建。所有开发和发布不得直接修改 UniLabmain或dev/issue-1042-manager-based-api;全部 child 合并并在集成分支最新 head 通过 gate 后,才在 roadmap 完成阶段准备回合 declared base 的最终 PR,且在此之前不向其写入。Roadmap / repository 治理
unilabsim/unisim建 execution roadmap 并与本 issue双向链接。dev/issue-1042-manager-based-api;提案时该分支 heade6867464(2026-09-02)。该分支和main在本 roadmap 执行期间均只读;所有 UniLab child 从 roadmap 集成分支创建,不能从main或 declared base 直接开发或发布。main作为仓内 base;它不是 UniLab 的 declared base。跨仓 consumer PR 仍先在各自仓库完成本地 gate,再由 UniLab 集成分支承接。main或dev/issue-1042-manager-based-api。make test-all(执行时使用仓库规定的uv run环境),unisim 仓库固定等价的uv rungate。开发和发布阶段只使用 TestPyPI;credentials 位于~/.pypirc,不得输出、提交或复制其内容;最终生产 PyPI 发布由 maintainer 手动执行。main或 declared base。预计规模与 review
Acceptance criteria
unisim、distribution=unisim-core、首发范围、版本策略、license/repository visibility 和 benchmark 仅接口预留边界。unilabsim/unisim是可独立 clone/build/test 的仓库;历史或 provenance 可追溯到 UniLab 来源。unisim-core后不需要 UniLab、Hydra、Torch、Gymnasium 或任一 engine SDK,import 不触发 optional runtime。unisim-core使用已迁移 adapter;对应实现不存在长期双份,compatibility shim 有删除版本/issue。unisim-core公开 contract;UniLab 不再保留这些 backend 的实现副本或行为分叉,compatibility shim 已按记录版本删除。make test-all;unisim 最终 head 通过其完整uv rungate;发布 artifact 通过 isolated smoke。Non-goals
unisim-core。unilabsim/unisim、迁移代码、更新文档并发布到 TestPyPI;但不修改 UniLabmain或dev/issue-1042-manager-based-api,不在 roadmap 完成前发布生产 PyPI。Stop conditions / 范围复核点
unisim-core为了构造 backend 仍必须 import UniLab scene/DR/asset/Hydra 类型;先完成依赖倒置,不发布循环依赖 package。SimBackendlifecycle。main的 contract/adapter 差异无法确定 source-of-truth。Related
unisim方向(已关闭)。unisim可提取 contract 边界第一阶段(已关闭/已合入)。unisim-core是独立产品/发布边界,不并入单一unilabwheel。