独立设计文档(审阅中):候选工作单元(WorkCell)组合定义、启动与分层动作设计
变更审阅:PR #188
父地图:#181
Outcome
冻结候选工作单元定义(WorkCell Definition)如何绑定一个真实或仿真部署的启动值,并在任何驱动 import、设备连接或物料 bootstrap 前生成确定、脱敏的候选启用快照(Activation Snapshot)。
已接受决策(Accepted Decisions)
-
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 后缀分派;未知或无后缀失败,不做内容探测;.py 只进行受限 AST 编译,不 import/exec 作者源码。
-
D3-07=A:一个 .py 启动文件必须恰好声明一个顶层 @workcell 根定义;零个或多个失败,被引用的嵌套定义不计入。
-
D3-08=A:任意已登记设备作者句柄只消费已发布目录的 init_param_schema.config;现代 @device 由带类型的 __init__ 静态生成并在发布时冻结,作者句柄不另建合同;遗留 YAML 只作为遗留设备生成同一字段的兼容来源。
-
D3-09=A:公开 InitParam 使用封闭类型闭集;fan-out 必须满足全部目标 Schema 的安全交集,不做字符串、数字或单位隐式转换。
-
D3-10=A:唯一外部输入规范化为封闭候选启用请求(Activation Request),顶层只有 schema_version、必需 definition_digest、instance 和 params;零外部输入时整个对象缺席。
-
D3-11=A:v1 不实现 catalog: 启动引用;生产从 workspace/package 内显式文件启动并固定源码/目录 digest;未来目录引用只允许 exact revision/digest,禁止 latest。
-
D3-12=A:稳定实例身份、根世界位姿、外部连接和 Edge/机器放置属于 instance 部署字段,不属于公开 InitParam;改变 instance_id 创建新实例,改变其他部署字段为同一实例创建新快照。
-
D3-13=A:敏感配置(Secret)只接受封闭 SecretRef {provider, key, version?};Provider 是候选启用解析器(Activation Resolver)的内部 Adapter;v1 不热轮换。
-
D3-14=A:Uni-Lab OS 在驱动创建前原子持久化不可变、内容寻址的候选启用快照(Activation Snapshot);Backend 只接收副本/投影;重启只复用完全相同 digest。
-
D3-15=A:候选启用解析器(Activation Resolver)只公开 prepare_activation(request) -> PreparedActivation | ActivationDiagnostics 深模块接口;全部副作用前诊断使用稳定 code/path/source_span/message/hint。
-
@workcell 函数签名是候选工作单元初始化合同(WorkCell Init Contract)的作者入口。
-
只有公开 InitParam 可以由 CLI 或持久候选启用图(Activation Graph)提供;私有设备配置不能穿透覆盖。
-
v1 允许 direct binding/fan-out,不允许启动参数改变固定结构。
-
Python 定义文件通过现有 -g/--graph 直接作为启动输入;不新增 --workcell;每个文件恰好一个顶层 @workcell 根定义。
-
参数输入是可选的覆盖层,不是每个项目必须提交的第二个文件:
- 没有公开
InitParam 时,只需 Python 定义;
- 所有公开
InitParam 都有默认值且本次不覆盖时,也只需 Python 定义;
- Phase 0 遇到无默认值、现场覆盖或敏感配置(Secret)引用时明确拒绝启用;完整 v1 后续按 D3-03 接受单一外部覆盖对象。
-
固定、非敏感且对该定义所有启用一致的站内设备值可以写在 Python 定义中;会随物理安装变化或需要外部选择的值必须显式提升为公开 InitParam。
-
敏感值只以 secret reference 流转,不进入定义、目录、日志、诊断或候选启用快照(Activation Snapshot)明文。
-
无论是否存在参数输入,activation resolver 都必须冻结候选启用快照(Activation Snapshot);运行时审计与重启比较不能退化为“直接运行 Python 后不留解析事实”。
已接受制品模型
一个候选工作单元(WorkCell)项目具有:
- 一个必需的作者制品:
workcell.py,拥有固定结构、相对位姿、私有固定配置和候选工作单元初始化合同(WorkCell Init Contract);
- 一个按需存在的启用参数输入:小型强类型 JSON、表单提交或持久部署记录,只保存公开参数覆盖和敏感配置(Secret)引用;空覆盖不得强制生成文件;
- 一个每次启用都生成的系统制品:候选启用快照(Activation Snapshot),保存已解析参数、来源、定义/目录指纹和稳定身份,但不保存敏感值明文。
因此,“两个制品”不是“每个项目必须有 Python + JSON 两个文件”,而是定义与启用参数具有不同权威;在零外部参数或全默认场景中,作者只维护 Python 文件。
协议冻结状态
D3-01~D3-15 已全部由维护者确认。当前剩余设计决策为 0 项;本票继续保持打开和 stage:protocol-definition,等待 #182/#183 前置合同对齐、正式 Schema/实现子票与跨仓验收,不把“Grill 完成”误作功能已实现。
Acceptance gates
关联
父地图:#181
Outcome
冻结候选工作单元定义(WorkCell Definition)如何绑定一个真实或仿真部署的启动值,并在任何驱动 import、设备连接或物料 bootstrap 前生成确定、脱敏的候选启用快照(Activation Snapshot)。
已接受决策(Accepted Decisions)
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后缀分派;未知或无后缀失败,不做内容探测;.py只进行受限 AST 编译,不 import/exec 作者源码。D3-07=A:一个
.py启动文件必须恰好声明一个顶层@workcell根定义;零个或多个失败,被引用的嵌套定义不计入。D3-08=A:任意已登记设备作者句柄只消费已发布目录的
init_param_schema.config;现代@device由带类型的__init__静态生成并在发布时冻结,作者句柄不另建合同;遗留 YAML 只作为遗留设备生成同一字段的兼容来源。D3-09=A:公开
InitParam使用封闭类型闭集;fan-out 必须满足全部目标 Schema 的安全交集,不做字符串、数字或单位隐式转换。D3-10=A:唯一外部输入规范化为封闭候选启用请求(Activation Request),顶层只有
schema_version、必需definition_digest、instance和params;零外部输入时整个对象缺席。D3-11=A:v1 不实现
catalog:启动引用;生产从 workspace/package 内显式文件启动并固定源码/目录 digest;未来目录引用只允许 exact revision/digest,禁止latest。D3-12=A:稳定实例身份、根世界位姿、外部连接和 Edge/机器放置属于
instance部署字段,不属于公开InitParam;改变instance_id创建新实例,改变其他部署字段为同一实例创建新快照。D3-13=A:敏感配置(Secret)只接受封闭
SecretRef {provider, key, version?};Provider 是候选启用解析器(Activation Resolver)的内部 Adapter;v1 不热轮换。D3-14=A:Uni-Lab OS 在驱动创建前原子持久化不可变、内容寻址的候选启用快照(Activation Snapshot);Backend 只接收副本/投影;重启只复用完全相同 digest。
D3-15=A:候选启用解析器(Activation Resolver)只公开
prepare_activation(request) -> PreparedActivation | ActivationDiagnostics深模块接口;全部副作用前诊断使用稳定code/path/source_span/message/hint。@workcell函数签名是候选工作单元初始化合同(WorkCell Init Contract)的作者入口。只有公开
InitParam可以由 CLI 或持久候选启用图(Activation Graph)提供;私有设备配置不能穿透覆盖。v1 允许 direct binding/fan-out,不允许启动参数改变固定结构。
Python 定义文件通过现有
-g/--graph直接作为启动输入;不新增--workcell;每个文件恰好一个顶层@workcell根定义。参数输入是可选的覆盖层,不是每个项目必须提交的第二个文件:
InitParam时,只需 Python 定义;InitParam都有默认值且本次不覆盖时,也只需 Python 定义;固定、非敏感且对该定义所有启用一致的站内设备值可以写在 Python 定义中;会随物理安装变化或需要外部选择的值必须显式提升为公开
InitParam。敏感值只以 secret reference 流转,不进入定义、目录、日志、诊断或候选启用快照(Activation Snapshot)明文。
无论是否存在参数输入,activation resolver 都必须冻结候选启用快照(Activation Snapshot);运行时审计与重启比较不能退化为“直接运行 Python 后不留解析事实”。
已接受制品模型
一个候选工作单元(WorkCell)项目具有:
workcell.py,拥有固定结构、相对位姿、私有固定配置和候选工作单元初始化合同(WorkCell Init Contract);因此,“两个制品”不是“每个项目必须有 Python + JSON 两个文件”,而是定义与启用参数具有不同权威;在零外部参数或全默认场景中,作者只维护 Python 文件。
协议冻结状态
D3-01~D3-15 已全部由维护者确认。当前剩余设计决策为 0 项;本票继续保持打开和
stage:protocol-definition,等待 #182/#183 前置合同对齐、正式 Schema/实现子票与跨仓验收,不把“Grill 完成”误作功能已实现。Acceptance gates
workcell.py启动,不要求空 params 文件;-g/--graph启动 Python 定义;任何外部参数输入明确失败但仍生成默认值快照;init_param_schema.config校验,不直接读取或 import 运行时驱动;-g/--graph是唯一启动定义来源参数,所有输入种类经过同一候选启用解析器(activation resolver);-g/--graph只接受.py、.json、.graphml;未知或无后缀失败,.py不 import/exec 且恰好一个顶层@workcell根定义;关联