Skip to content

[候选工作单元(WorkCell)D3] 启用参数、启动解析与敏感配置(Secret)合同 #184

Description

@TablewareBox

独立设计文档(审阅中):候选工作单元(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_digestinstanceparams;零外部输入时整个对象缺席。

  • 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)项目具有:

  1. 一个必需的作者制品:workcell.py,拥有固定结构、相对位姿、私有固定配置和候选工作单元初始化合同(WorkCell Init Contract);
  2. 一个按需存在的启用参数输入:小型强类型 JSON、表单提交或持久部署记录,只保存公开参数覆盖和敏感配置(Secret)引用;空覆盖不得强制生成文件;
  3. 一个每次启用都生成的系统制品:候选启用快照(Activation Snapshot),保存已解析参数、来源、定义/目录指纹和稳定身份,但不保存敏感值明文。

因此,“两个制品”不是“每个项目必须有 Python + JSON 两个文件”,而是定义与启用参数具有不同权威;在零外部参数或全默认场景中,作者只维护 Python 文件。

协议冻结状态

D3-01~D3-15 已全部由维护者确认。当前剩余设计决策为 0 项;本票继续保持打开和 stage:protocol-definition,等待 #182/#183 前置合同对齐、正式 Schema/实现子票与跨仓验收,不把“Grill 完成”误作功能已实现。

Acceptance gates

  • 零公开参数和全默认参数场景均可只用 workcell.py 启动,不要求空 params 文件;
  • Phase 0 通过 -g/--graph 启动 Python 定义;任何外部参数输入明确失败但仍生成默认值快照;
  • 一次启用最多接受一个外部覆盖对象;多个来源同时出现时在硬件副作用前失败;
  • 未知、缺失、越界、单位不符和 private override 在硬件副作用前失败;
  • 任意已登记设备作者句柄只按冻结的 init_param_schema.config 校验,不直接读取或 import 运行时驱动;
  • secret plaintext 不进入 Git、CLI history、日志、Registry 或 snapshot;
  • 修改启动值产生新候选启用快照(Activation Snapshot),不产生新定义 revision;
  • -g/--graph 是唯一启动定义来源参数,所有输入种类经过同一候选启用解析器(activation resolver);
  • -g/--graph 只接受 .py.json.graphml;未知或无后缀失败,.py 不 import/exec 且恰好一个顶层 @workcell 根定义;
  • 失败启动留下零 partial driver、零 live Registry instance、零物料 bootstrap。

关联

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions