来自 roadmap #1252 第 3 点的遗留部分(该 roadmap 已检查关闭)。
现状(已落地部分)
play 的组装侧已半标准化:
src/unilab/base/config_adapter.py:50-115 BackendAdapter.build_play_env_cfg_override():统一消费 owner YAML 根部的 play_profile 段(play_profile.env 浅合并进 env override,play_profile.scene 冷路径物化视觉场景 XML);约 46 个 owner YAML 已声明 play_profile;
- 回放 session 工厂收敛到
src/unilab/visualization/interactive_playback.py(create_rsl_rl/appo/sac/hora_distill_playback_session),PPO/APPO/SAC/TD3/FlashSAC 主入口都走 build_play_env_cfg_override()。
遗留缺口(本 issue 的范围)
- play_profile 只有渲染语义:全仓 owner 的
play_profile 键只有 render_spacing 和场景视觉键(source_model_file/ground_texture_file/skybox_rgb1/2/ground_texrepeat),没有任何 owner 在 play 时关闭 DR/noise/push/curriculum——例如 conf/ppo/task/go2_arm_manip_loco/motrix.yaml:94-109 play 时仍 push_robots: true + 全量 domain_rand,观测 corruption(enable_corruption: true)同样生效。mjlab 惯例是 task 工厂 play=True 分支剥离 corruption/pushes/curriculum。
- 入口覆盖不齐:
scripts/play_interactive.py:924、src/unilab/scripts/play_hora_appo.py:110、scripts/play_viser.py:224 仍走 build_task_env_cfg_override(),play_profile 不生效;且 play_profile 门控在 training.play_only(config_adapter.py:69),训练后回放(play_only=false)连渲染档也跳过。
- 无 schema/契约:
structured_configs.py 无 play 字段,play_profile 的可用键集合没有声明式约束与审计。
交付边界
- 扩展
play_profile(或新增声明式 play 段)支持剥离 domain_rand / noise / push / curriculum 键,并在 structured_configs.py 或 conf 契约文档中固化支持字段集;提供共享默认 play profile 避免 owner 重复;
- 三个未覆盖入口改走 play override;重新评估
training.play_only 门控使训练后回放也应用 play variant;
- 与 sim2sim WARNING_LIST 衔接(play 变更不得触发跨后端契约误判);
- 不引入新的 play 执行入口,复用现有 playback session 工厂(roadmap 边界)。
预计规模:10 文件 / 500 行以内。外部卫星仓(microduck_rl_unilab、engineai_rl_unilab)的 owner 同步补 play_profile 作为验收样例。
来自 roadmap #1252 第 3 点的遗留部分(该 roadmap 已检查关闭)。
现状(已落地部分)
play 的组装侧已半标准化:
src/unilab/base/config_adapter.py:50-115BackendAdapter.build_play_env_cfg_override():统一消费 owner YAML 根部的play_profile段(play_profile.env浅合并进 env override,play_profile.scene冷路径物化视觉场景 XML);约 46 个 owner YAML 已声明play_profile;src/unilab/visualization/interactive_playback.py(create_rsl_rl/appo/sac/hora_distill_playback_session),PPO/APPO/SAC/TD3/FlashSAC 主入口都走build_play_env_cfg_override()。遗留缺口(本 issue 的范围)
play_profile键只有render_spacing和场景视觉键(source_model_file/ground_texture_file/skybox_rgb1/2/ground_texrepeat),没有任何 owner 在 play 时关闭 DR/noise/push/curriculum——例如conf/ppo/task/go2_arm_manip_loco/motrix.yaml:94-109play 时仍push_robots: true+ 全量 domain_rand,观测 corruption(enable_corruption: true)同样生效。mjlab 惯例是 task 工厂play=True分支剥离 corruption/pushes/curriculum。scripts/play_interactive.py:924、src/unilab/scripts/play_hora_appo.py:110、scripts/play_viser.py:224仍走build_task_env_cfg_override(),play_profile 不生效;且play_profile门控在training.play_only(config_adapter.py:69),训练后回放(play_only=false)连渲染档也跳过。structured_configs.py无 play 字段,play_profile 的可用键集合没有声明式约束与审计。交付边界
play_profile(或新增声明式 play 段)支持剥离domain_rand/noise/push/curriculum键,并在structured_configs.py或 conf 契约文档中固化支持字段集;提供共享默认 play profile 避免 owner 重复;training.play_only门控使训练后回放也应用 play variant;预计规模:10 文件 / 500 行以内。外部卫星仓(microduck_rl_unilab、engineai_rl_unilab)的 owner 同步补 play_profile 作为验收样例。