独立设计文档(审阅中):候选工作单元(WorkCell)组合定义、启动与分层动作设计
变更审阅:PR #188
父地图:#181
Outcome
冻结候选工作单元(WorkCell)的物理设计表达:设备与固定资源的选型、数量、包含、库位(Site)绑定、连接、相对位置和旋转,同时阻止定义或启动覆盖真实物料(Material)与库位占用(SiteOccupancy)权威事实。
D2 已全部收口
D2-01:坐标、单位与旋转
- 选择 A:物理位姿采用右手 Z-up;候选工作单元(WorkCell)根坐标中 X 向右、Y 远离工站正面、Z 向上。
pose.position.{x,y,z} 使用毫米;pose.rotation.{x,y,z} 使用度;XYZ 欧拉角按列向量矩阵 Rz(z) · Ry(y) · Rx(x) 解释。
- 拒绝 NaN/Infinity;
-0 规范为 0;角度规范到 [-180, 180);不做任意小数位舍入。
- 2D 与 3D 编辑器共用同一毫米制物理
pose;候选工作单元(WorkCell)不增加节点级 ui_layout 或第二套像素坐标。
- 定义级可选
layout_plane 只允许 XY | XZ | YZ;省略表示无首选 2D 平面。
D2-02:Python 位姿组合接口(Interface)
- 选择 A:父子组合统一使用
assign_child_resource(member, pose=Pose(position=..., rotation=...))。
pose 永远表达成员相对父节点的物理位姿,不塞进任意设备/资源作者句柄的私有 config。
- 省略
pose 时规范化为恒等位姿;物理可渲染成员产生结构化告警;Python 生成器始终输出显式 pose。
D2-03:嵌套父子变换
- 选择 A:
T_world(child) = T_world(parent) · T_parent(child),以矩阵递归组合世界位姿。
- 欧拉角只作为输入与派生展示,不把组合结果反写到定义。
- 根世界位姿归候选启用图(Activation Graph);父子环、缺父、双父及
parent/children 不一致均在发布前失败。
D2-04:v1 物料边界
- 选择 A:候选工作单元定义(WorkCell Definition)拥有固定结构、库位(Site)、物料设计约束和只读物料投影;库存权威(Inventory Authority)独占真实物料(Material)与库位占用(SiteOccupancy)动态事实。
- 日常上料、移位、取下、消耗分别走库存命令;工作流(Workflow)造成的物理变化通过作业执行占用(JobExecutionClaim)、变更集(ChangeSet)和回执(Receipt)结算。
- 动态缺料不阻止候选工作单元(WorkCell)启用,由任务物料准入(TaskMaterialAdmission)判定任务能否开始;定义升级不自动搬运、删除或迁移既有物料。
D2-05:库位(Site)
- 选择 A:v1 复用
config.sites[].label/content_type/position/size。
label 是所属成员内唯一、稳定的库位(Site)key;position/size 使用毫米并相对所属成员根;v1 容量固定为 1。
- 数组顺序用于首次物化 Backend
sort_order;物化后持久 Site.sort_order 成为传感器数组映射的权威顺序。
content_type 必须通过 PackageCatalog 解析为 Backend 允许的资源模板(ResourceTemplate)UUID。
- 定义中禁止
occupied_by、occupied_material_uuid 和真实物料(Material)身份;孔位和 UI 热区不自动升级为领域库位(Site)。
D2-06:真实物料预置执行链推迟到 v2+
- v1 可以描述和校验模板、预期数量与目标库位(Site)等物料设计预期,但不生成可执行预置命令。
- 候选工作单元(WorkCell)启用、重启和定义升级都不得创建/移动真实物料(Material)或写库位占用(SiteOccupancy)。
- v1 不增加
command_id、request_digest、整批预置事务或持久回执,也不把它们写入候选启用快照(Activation Snapshot)。首次安装由操作者通过现有库存权威(Inventory Authority)接口准备真实物料。
- 已讨论的稳定命令身份、请求摘要、整批事务和回执机制保留为 v2+ 候选目标;重开时重新评审,不成为 v1 实现依赖或接受门。
D2-07:遗留迁移
- 选择 A:离线遗留适配器(Adapter)输出规范图和迁移报告,不在读取时静默猜测。
position、pose.position、position3d、rotation 来源唯一时归一到 pose;等价重复告警;冲突失败并报告精确 JSON 路径。
- 遗留 2D 编辑器的毫米坐标也进入物理
pose,不分流到 ui_layout;只有两个坐标时必须结合无歧义 layout_plane 和第三轴来源,不能静默补零。
occupied_by、非空 data、真实物料(Material)身份与库位占用(SiteOccupancy)不进入定义。
- v1 不产生或接受可执行物料预置候选;遗留测试 seed 保留为显式测试夹具;逐夹具映射与固定点测试归 G1。
2D 物理布置与 layout_plane
2D 编辑器用于设计和测绘,显示与编辑的就是物理毫米坐标。普通拖动直接修改所选平面对应的两个 pose.position 分量,未显示的第三轴保持不变:
layout_plane |
2D 编辑轴 |
保持不变 |
XY |
X / Y |
Z |
XZ |
X / Z |
Y |
YZ |
Y / Z |
X |
Python 使用 layout_plane: Literal["XY", "XZ", "YZ"] | None = None;规范 JSON 仅在有首选平面时保存 graph.layout_plane。UI 的“None”规范化为 Python None / JSON 字段缺席,不保存字符串 "None"。
layout_plane 只选择观察/编辑平面,不创建第二坐标系,不改变轴方向、单位、父子变换或 Backend relative_position,也不把未显示轴归零。嵌套定义各自拥有自己的首选平面。
修改草稿(Draft)中的 pose 不产生硬件副作用,也不会自动移动真实设备;发布后形成新定义 revision,既有候选启用快照(Activation Snapshot)和工作流任务(WorkflowTask)继续固定旧 revision。只有显式重新启用后,新 pose 才进入后续运行模型。
当前前沿
D2 已完成;整个 Wayfinder 剩余 23 项:D4 7、D5 8、G1 8。下一批进入 #185,一次确认 D4 全部 7 项。
完整确认批次:#issuecomment-5181824831。
不包含
- endpoint、串口、连接开关或敏感配置(Secret);
- 库存权威(Inventory Authority)的日常增删改查(CRUD)、任务物料预留(TaskMaterialReservation)或作业执行占用(JobExecutionClaim)的实现;
- 3D 渲染器的具体实现;
- 编辑器临时 viewport、缩放、选中态和折叠态的持久化协议。
Acceptance gates
关联
父地图:#181
Outcome
冻结候选工作单元(WorkCell)的物理设计表达:设备与固定资源的选型、数量、包含、库位(Site)绑定、连接、相对位置和旋转,同时阻止定义或启动覆盖真实物料(Material)与库位占用(SiteOccupancy)权威事实。
D2 已全部收口
D2-01:坐标、单位与旋转
pose.position.{x,y,z}使用毫米;pose.rotation.{x,y,z}使用度;XYZ 欧拉角按列向量矩阵Rz(z) · Ry(y) · Rx(x)解释。-0规范为0;角度规范到[-180, 180);不做任意小数位舍入。pose;候选工作单元(WorkCell)不增加节点级ui_layout或第二套像素坐标。layout_plane只允许XY | XZ | YZ;省略表示无首选 2D 平面。D2-02:Python 位姿组合接口(Interface)
assign_child_resource(member, pose=Pose(position=..., rotation=...))。pose永远表达成员相对父节点的物理位姿,不塞进任意设备/资源作者句柄的私有config。pose时规范化为恒等位姿;物理可渲染成员产生结构化告警;Python 生成器始终输出显式pose。D2-03:嵌套父子变换
T_world(child) = T_world(parent) · T_parent(child),以矩阵递归组合世界位姿。parent/children不一致均在发布前失败。D2-04:v1 物料边界
D2-05:库位(Site)
config.sites[].label/content_type/position/size。label是所属成员内唯一、稳定的库位(Site)key;position/size使用毫米并相对所属成员根;v1 容量固定为 1。sort_order;物化后持久Site.sort_order成为传感器数组映射的权威顺序。content_type必须通过 PackageCatalog 解析为 Backend 允许的资源模板(ResourceTemplate)UUID。occupied_by、occupied_material_uuid和真实物料(Material)身份;孔位和 UI 热区不自动升级为领域库位(Site)。D2-06:真实物料预置执行链推迟到 v2+
command_id、request_digest、整批预置事务或持久回执,也不把它们写入候选启用快照(Activation Snapshot)。首次安装由操作者通过现有库存权威(Inventory Authority)接口准备真实物料。D2-07:遗留迁移
position、pose.position、position3d、rotation来源唯一时归一到pose;等价重复告警;冲突失败并报告精确 JSON 路径。pose,不分流到ui_layout;只有两个坐标时必须结合无歧义layout_plane和第三轴来源,不能静默补零。occupied_by、非空data、真实物料(Material)身份与库位占用(SiteOccupancy)不进入定义。2D 物理布置与
layout_plane2D 编辑器用于设计和测绘,显示与编辑的就是物理毫米坐标。普通拖动直接修改所选平面对应的两个
pose.position分量,未显示的第三轴保持不变:layout_planeXYXZYZPython 使用
layout_plane: Literal["XY", "XZ", "YZ"] | None = None;规范 JSON 仅在有首选平面时保存graph.layout_plane。UI 的“None”规范化为 PythonNone/ JSON 字段缺席,不保存字符串"None"。layout_plane只选择观察/编辑平面,不创建第二坐标系,不改变轴方向、单位、父子变换或 Backendrelative_position,也不把未显示轴归零。嵌套定义各自拥有自己的首选平面。修改草稿(Draft)中的
pose不产生硬件副作用,也不会自动移动真实设备;发布后形成新定义 revision,既有候选启用快照(Activation Snapshot)和工作流任务(WorkflowTask)继续固定旧 revision。只有显式重新启用后,新pose才进入后续运行模型。当前前沿
D2 已完成;整个 Wayfinder 剩余 23 项:D4 7、D5 8、G1 8。下一批进入 #185,一次确认 D4 全部 7 项。
完整确认批次:#issuecomment-5181824831。
不包含
Acceptance gates
pose;没有节点级ui_layout或第二套坐标;layout_plane只选择两条编辑轴,拖动时保持第三轴,不改变坐标系;config.sites[]在发布期完成稳定 key、几何、允许类型和顺序校验;关联