冻结设计(commit 8841d27):候选工作单元(WorkCell)组合定义、启动与分层动作设计
变更审阅:PR #188
Outcome
作为候选工作单元(WorkCell)组合定义、启动、投影、动作(Action)暴露与跨仓验收的 Wayfinder 总导航。本票只维护目标、已接受决策、子票顺序、阻塞与跨票冲突;不再承载各协议面的完整 Schema、语法和验收细节。
已接受决策(Accepted Decisions)
候选工作单元定义(WorkCell Definition)拥有独立一等定义身份;启用后产生独立候选工作单元实例(WorkCell Instance)身份。
v1 使用固定结构;保留 @workcell 函数语法,Python 定义文件可直接作为启动输入;不支持候选结构选择(StructuralChoice)或动态拓扑。
Python 与规范 JSON/结构化画布允许双向语义创作;同一草稿同一时刻只有一种可写模式,不承诺源码字节无损,发布前要求规范 digest 固定点。
D2-01~03=A(D2-01 已按维护者编辑器模型修订):物理位姿采用右手 Z-up、毫米/度和固定 XYZ 欧拉合同;父子组合使用 assign_child_resource(..., pose=Pose(...));嵌套世界位姿通过矩阵递归组合。2D/3D 编辑共用唯一物理 pose,不增加节点级 ui_layout;定义级可选 layout_plane 选择 XY/XZ/YZ 观察与编辑平面。
D3-02=A:零覆盖不创建或持久化空 params 文件/记录;参数输入缺席表示“无覆盖”,但每次启用仍生成并持久化脱敏候选启用快照(Activation Snapshot)。
D3-03=A:一次启用最多接受一个外部覆盖对象;多个外部来源同时出现时在硬件副作用前失败,不做隐式叠加或优先级合并。
D3-04=A:Phase 0 仅支持 Python-only 零外部参数路径;完整 v1 保留单一外部覆盖对象合同。
D3-05:复用现有 -g/--graph 作为唯一启动定义来源参数,不新增 --workcell。
D3-06=A:-g/--graph 严格按 .py、.json、.graphml 后缀分派;未知或无后缀失败,不做内容探测。
D3-07=A:一个 .py 启动文件必须恰好声明一个顶层 @workcell 根定义;零个或多个失败,被引用的嵌套定义不计入。
D3-08=A:任意已登记设备作者句柄只消费已发布目录的 init_param_schema.config;现代 @device 由带类型的 __init__ 静态生成,作者句柄不另建合同。
D3-09=A:公开 InitParam 使用封闭类型闭集,fan-out 取全部目标 Schema 的无隐式转换安全交集。
D3-10=A:唯一外部输入规范化为封闭候选启用请求(Activation Request),并由 definition_digest 绑定精确定义;零外部输入时整个对象缺席。
D3-11=A:v1 仅从 workspace/package 内显式文件启动;未来目录引用必须固定 exact revision/digest,禁止 latest。
D3-12=A:实例身份、根世界位姿、外部连接和 Edge/机器放置属于实例部署字段,不属于公开 InitParam。
D3-13=A:敏感配置(Secret)只接受 SecretRef,不保存或传递明文,版本变化要求显式重新启用。
D3-14=A:Uni-Lab OS 在驱动创建前原子持久化内容寻址候选启用快照(Activation Snapshot),Backend 只接收副本/投影。
D3-15=A:候选启用解析器(Activation Resolver)只公开 prepare_activation(...) 深模块接口,CLI/UI 不自行编排内部阶段。
工作流支持动作(Workflow-backed Action)在 v1 以组合工作流调用(CompositeWorkflowInvocation)静态展开到同一个工作流任务(WorkflowTask)与执行计划(ExecutionPlan);不创建嵌套调度权威。
真实物料(Material)、库存、库位占用(SiteOccupancy)、任务物料预留(TaskMaterialReservation)、作业执行占用(JobExecutionClaim)与设备遥测投影(DeviceTelemetryProjection)不归候选工作单元定义或每次启动所有。
D1-06=A:v1 使用失败关闭 AST allowlist,动态控制流、任意调用/I/O 与未知节点一律拒绝。
D1-07=A:定义使用 PackageCatalog fqid、发布 revision 与摘要,成员 id= 是稳定 member_id。
D1-09=A:双向创作采用单草稿 CAS、完整语义 diff、显式 rebase 和无效草稿隔离。
D1-10=A:v1 显式 .py 启动与 PackageCatalog 固定依赖/资产闭包,workspace、wheel 和缓存 archive 必须一致。
D1-11=A:Draft → Candidate → Published 分层,只有 Published 可被引用/启用,发布原子失败关闭。
D1-08=A:规范 JSON 采用现有字段优先的 NetworkX node-link 形态;复用当前节点/连接字段,只新增必要的 config_bindings,并冻结规范排序、精确闭包、sidecar 与运行权威字段排除。
D2-04=A、D2-06 已决策延期:候选工作单元定义(WorkCell Definition)拥有固定结构、物料设计约束和只读投影;库存权威(Inventory Authority)独占真实物料(Material)与库位占用(SiteOccupancy)动态事实。v1 只描述和校验物料设计预期,启用、重启和定义升级均为零真实物料/库位占用写入;command_id、request_digest、整批预置事务和持久回执推迟到 v2+。
D2-05=A:v1 复用 config.sites[].label/content_type/position/size,冻结成员内稳定 key、毫米几何、容量 1、允许资源模板(ResourceTemplate)解析与 Backend sort_order 投影;定义禁止携带占用者。
D2-07=A(已修订):遗留位置由离线适配器(Adapter)输出规范图与迁移报告;2D 编辑器毫米坐标也迁移到物理 pose,唯一来源归一、等价重复告警、冲突失败;运行事实不进入定义。
D4-01~07=A:嵌套边固定 exact definition revision/digest,子成员 UUID 按根实例与 member_id 路径确定性派生;private | exported 与显式 re_export 失败关闭;候选可查看性与候选可寻址性分离;公共能力只允许收窄;Published 制品、PackageCatalog、设备注册表(Device Registry)和启用运行时权威分离;前端展开只影响视图;完整定义与公共合同使用双摘要。
D5-01~08 已冻结:工作流支持动作(Workflow-backed Action)只由 cell.expose_workflow_action(...) 显式导出;不引入 implementation.kind,复用 node_type="workflow" 与 x-unilabos-workflow-contract;复用既有工作流输入/输出、真实 Handle、物料占位符(ResourceSlot)、SiteSelector 和组合工作流调用(CompositeWorkflowInvocation),静态降低到唯一执行计划(ExecutionPlan)。不同调用的内部作业可以交错,不承诺整次调用数量上限或容量 N,不建立调用级持久许可,只由完整逐作业执行占用(JobExecutionClaim)保护设备、物料(Material)与源/目标库位(Site);取消、不确定性和物理结算(PhysicalSettlement)沿既有安全合同处理。
G1-01/02 按 B′ 冻结:永久支持 .json/.graphml 并无损保留旧字段,但所有格式共用单一规范编译、发布、候选启用解析器(Activation Resolver)与运行权威;无法分类的非空 data 无损保存后仍阻止发布/启用。G1-03~08=A:双夹具、双摘要固定点、真实跨仓集成、故障执行与按拥有仓交付。
子票
[候选工作单元(WorkCell)D1] 定义身份、AST 与双向创作 #182 — 候选工作单元定义(WorkCell Definition)身份、AST、规范定义图和 Python/JSON/画布双向创作。
[候选工作单元(WorkCell)D2] 装配拓扑、物理位姿与物料边界 #183 — 装配拓扑(Assembly Topology)、物理位姿、库位(Site)、资源模板(ResourceTemplate)与真实物料(Material)边界。
[候选工作单元(WorkCell)D3] 启用参数、启动解析与敏感配置(Secret)合同 #184 — 候选工作单元初始化合同(WorkCell Init Contract)、启动参数、候选启用快照(Activation Snapshot)、Secret Provider 和 activation resolver。
[候选工作单元(WorkCell)D4] 嵌套组合、公开边界与设备注册表(Device Registry)投影 #185 — 嵌套组合、private/export/re-export、可查看/可寻址、设备注册表(Device Registry)与前端投影。
[候选工作单元(WorkCell)D5] 工作流支持动作的发布、降低与并发语义 #186 — 工作流支持动作(Workflow-backed Action)的发布、静态降低、并发、取消与物理结算(PhysicalSettlement)。
[候选工作单元(WorkCell)G1] 遗留启动图迁移与跨仓验收 #187 — 遗留启动 JSON/trusted-exec 迁移、SZLab fixture 与 OS/FE/SZLab/Core 跨仓验收。
GitHub native sub-issue hierarchy 是唯一分解关系;后续 repository-local delivery Issue 应挂到拥有其协议的决策子票下,不直接平铺到本地图。
Frontier
D1~D5 与 G1 的协议决策已全部收口,名义未冻结决策共 0 项 。当前进入交付阶段:Uni-Lab-OS #22 、uni-lab-fe #24 与 Uni-Lab-SZLab #8 已作为 #187 的 native sub-issue 建立;Core 负责跨仓黄金测试、submodule pin 和最终接受门。
依赖顺序仍为 D1 → D2 → D3 → D4 → D5 → G1;交付可以在已冻结合同边界内拆仓并行,但不得在实现中建立第二套编译、调度器(Scheduler)、库存权威(Inventory Authority)或运行权威。
跨图约束
Blocked
当前无外部阻塞。协议已冻结,三个仓库本地交付子问题已建立;实现、跨仓测试、Core submodule pin 与回滚包尚未完成,因此 #181 /#187 仍不得进入 stage:accepted。
Fog
候选工作单元(WorkCell)及候选可查看性/候选可寻址性术语仍待根规范词汇表(Canonical Glossary)正式收录;
SZLab 夹具 11 个非空 data 的逐项归类是已定合同下的实现清单,不再是协议未决项。
Notes
2026-08-04 按维护者要求完成拆票。拆分前的完整设计正文与 Grill 记录保留在 Issue 编辑历史和既有评论中;后续新增细节写入对应子票,本票只更新导航和跨票状态。
Agent report
agent_report :
stage : implementation
reporter : Codex
execution_mode : agent
agent_product : Codex
agent_name : WorkCell Wayfinder decomposition
result : protocol-frozen-delivery-active
human_reviewer : active
Outcome
作为候选工作单元(WorkCell)组合定义、启动、投影、动作(Action)暴露与跨仓验收的 Wayfinder 总导航。本票只维护目标、已接受决策、子票顺序、阻塞与跨票冲突;不再承载各协议面的完整 Schema、语法和验收细节。
已接受决策(Accepted Decisions)
候选工作单元定义(WorkCell Definition)拥有独立一等定义身份;启用后产生独立候选工作单元实例(WorkCell Instance)身份。
v1 使用固定结构;保留
@workcell函数语法,Python 定义文件可直接作为启动输入;不支持候选结构选择(StructuralChoice)或动态拓扑。Python 与规范 JSON/结构化画布允许双向语义创作;同一草稿同一时刻只有一种可写模式,不承诺源码字节无损,发布前要求规范 digest 固定点。
D2-01~03=A(D2-01 已按维护者编辑器模型修订):物理位姿采用右手 Z-up、毫米/度和固定 XYZ 欧拉合同;父子组合使用
assign_child_resource(..., pose=Pose(...));嵌套世界位姿通过矩阵递归组合。2D/3D 编辑共用唯一物理pose,不增加节点级ui_layout;定义级可选layout_plane选择XY/XZ/YZ观察与编辑平面。D3-02=A:零覆盖不创建或持久化空 params 文件/记录;参数输入缺席表示“无覆盖”,但每次启用仍生成并持久化脱敏候选启用快照(Activation Snapshot)。
D3-03=A:一次启用最多接受一个外部覆盖对象;多个外部来源同时出现时在硬件副作用前失败,不做隐式叠加或优先级合并。
D3-04=A:Phase 0 仅支持 Python-only 零外部参数路径;完整 v1 保留单一外部覆盖对象合同。
D3-05:复用现有
-g/--graph作为唯一启动定义来源参数,不新增--workcell。D3-06=A:
-g/--graph严格按.py、.json、.graphml后缀分派;未知或无后缀失败,不做内容探测。D3-07=A:一个
.py启动文件必须恰好声明一个顶层@workcell根定义;零个或多个失败,被引用的嵌套定义不计入。D3-08=A:任意已登记设备作者句柄只消费已发布目录的
init_param_schema.config;现代@device由带类型的__init__静态生成,作者句柄不另建合同。D3-09=A:公开
InitParam使用封闭类型闭集,fan-out 取全部目标 Schema 的无隐式转换安全交集。D3-10=A:唯一外部输入规范化为封闭候选启用请求(Activation Request),并由
definition_digest绑定精确定义;零外部输入时整个对象缺席。D3-11=A:v1 仅从 workspace/package 内显式文件启动;未来目录引用必须固定 exact revision/digest,禁止
latest。D3-12=A:实例身份、根世界位姿、外部连接和 Edge/机器放置属于实例部署字段,不属于公开
InitParam。D3-13=A:敏感配置(Secret)只接受
SecretRef,不保存或传递明文,版本变化要求显式重新启用。D3-14=A:Uni-Lab OS 在驱动创建前原子持久化内容寻址候选启用快照(Activation Snapshot),Backend 只接收副本/投影。
D3-15=A:候选启用解析器(Activation Resolver)只公开
prepare_activation(...)深模块接口,CLI/UI 不自行编排内部阶段。工作流支持动作(Workflow-backed Action)在 v1 以组合工作流调用(CompositeWorkflowInvocation)静态展开到同一个工作流任务(WorkflowTask)与执行计划(ExecutionPlan);不创建嵌套调度权威。
真实物料(Material)、库存、库位占用(SiteOccupancy)、任务物料预留(TaskMaterialReservation)、作业执行占用(JobExecutionClaim)与设备遥测投影(DeviceTelemetryProjection)不归候选工作单元定义或每次启动所有。
D1-06=A:v1 使用失败关闭 AST allowlist,动态控制流、任意调用/I/O 与未知节点一律拒绝。
D1-07=A:定义使用 PackageCatalog fqid、发布 revision 与摘要,成员
id=是稳定member_id。D1-09=A:双向创作采用单草稿 CAS、完整语义 diff、显式 rebase 和无效草稿隔离。
D1-10=A:v1 显式
.py启动与 PackageCatalog 固定依赖/资产闭包,workspace、wheel 和缓存 archive 必须一致。D1-11=A:Draft → Candidate → Published 分层,只有 Published 可被引用/启用,发布原子失败关闭。
D1-08=A:规范 JSON 采用现有字段优先的 NetworkX node-link 形态;复用当前节点/连接字段,只新增必要的
config_bindings,并冻结规范排序、精确闭包、sidecar 与运行权威字段排除。D2-04=A、D2-06 已决策延期:候选工作单元定义(WorkCell Definition)拥有固定结构、物料设计约束和只读投影;库存权威(Inventory Authority)独占真实物料(Material)与库位占用(SiteOccupancy)动态事实。v1 只描述和校验物料设计预期,启用、重启和定义升级均为零真实物料/库位占用写入;
command_id、request_digest、整批预置事务和持久回执推迟到 v2+。D2-05=A:v1 复用
config.sites[].label/content_type/position/size,冻结成员内稳定 key、毫米几何、容量 1、允许资源模板(ResourceTemplate)解析与 Backendsort_order投影;定义禁止携带占用者。D2-07=A(已修订):遗留位置由离线适配器(Adapter)输出规范图与迁移报告;2D 编辑器毫米坐标也迁移到物理
pose,唯一来源归一、等价重复告警、冲突失败;运行事实不进入定义。D4-01~07=A:嵌套边固定 exact definition revision/digest,子成员 UUID 按根实例与
member_id路径确定性派生;private | exported与显式re_export失败关闭;候选可查看性与候选可寻址性分离;公共能力只允许收窄;Published 制品、PackageCatalog、设备注册表(Device Registry)和启用运行时权威分离;前端展开只影响视图;完整定义与公共合同使用双摘要。D5-01~08 已冻结:工作流支持动作(Workflow-backed Action)只由
cell.expose_workflow_action(...)显式导出;不引入implementation.kind,复用node_type="workflow"与x-unilabos-workflow-contract;复用既有工作流输入/输出、真实 Handle、物料占位符(ResourceSlot)、SiteSelector和组合工作流调用(CompositeWorkflowInvocation),静态降低到唯一执行计划(ExecutionPlan)。不同调用的内部作业可以交错,不承诺整次调用数量上限或容量 N,不建立调用级持久许可,只由完整逐作业执行占用(JobExecutionClaim)保护设备、物料(Material)与源/目标库位(Site);取消、不确定性和物理结算(PhysicalSettlement)沿既有安全合同处理。G1-01/02 按 B′ 冻结:永久支持
.json/.graphml并无损保留旧字段,但所有格式共用单一规范编译、发布、候选启用解析器(Activation Resolver)与运行权威;无法分类的非空data无损保存后仍阻止发布/启用。G1-03~08=A:双夹具、双摘要固定点、真实跨仓集成、故障执行与按拥有仓交付。子票
GitHub native sub-issue hierarchy 是唯一分解关系;后续 repository-local delivery Issue 应挂到拥有其协议的决策子票下,不直接平铺到本地图。
Frontier
D1~D5 与 G1 的协议决策已全部收口,名义未冻结决策共 0 项。当前进入交付阶段:Uni-Lab-OS #22、uni-lab-fe #24 与 Uni-Lab-SZLab #8 已作为 #187 的 native sub-issue 建立;Core 负责跨仓黄金测试、submodule pin 和最终接受门。
依赖顺序仍为 D1 → D2 → D3 → D4 → D5 → G1;交付可以在已冻结合同边界内拆仓并行,但不得在实现中建立第二套编译、调度器(Scheduler)、库存权威(Inventory Authority)或运行权威。
跨图约束
Blocked
当前无外部阻塞。协议已冻结,三个仓库本地交付子问题已建立;实现、跨仓测试、Core submodule pin 与回滚包尚未完成,因此 #181/#187 仍不得进入
stage:accepted。Fog
data的逐项归类是已定合同下的实现清单,不再是协议未决项。Notes
2026-08-04 按维护者要求完成拆票。拆分前的完整设计正文与 Grill 记录保留在 Issue 编辑历史和既有评论中;后续新增细节写入对应子票,本票只更新导航和跨票状态。
Agent report