任务:编译包 2.0:按运行器的函数合约和运行环境配置核对计划

依据:docs/hub-r4-device-run.md(上真实台架的设计,第 1–5 节和第 8 节的分工),决定 26、27(docs/hub-r4-progress.md),理论文档第 6、7 节;模型用 node tools/show-element.ts D02 D03 D04 D07 B05 B06 B07 V03 W05 P05 读。

  • 分支和工作树:hub-case-runtime,目录 circle-hub-hub-case-runtime(依赖已装好)
  • 可以改的路径:只改 packs/workflow/case-compile/**(functions/、tables/、samples/、examples/、workflow.json、requirements.json、checks.json、slots.schema.json、SKILL.md、README.md、pack.json 和测试)。不碰 hub/、contracts/、scripts/ 和其他包。
  • 规则:同前(不推送、不建 PR、不发布、不部署;不碰 7420、钥匙串、环境配置文件和任何真实系统;测试只用合成数据,地址只用 192.0.2.0/24 和 2001:db8::/32;git commit -s)。所有者的规矩:未知只能是过渡状态,写明缺的事实和下一步动作,流程自动走这一步;Hub 只核验,不生成内容、不调用模型;枚举只来自 contracts/generated(运行时用按包生成的快照)。
  • 依赖:无,可以马上开始

要做的

  1. 合约(functions/runtime-contract.ts,取代 compile-contract@1):按原格式读运行器的函数合约。形状:schema、complete、对象唯一、(对象,方法)唯一、禁用对象下没有启用条目;状态、派发方式、参数种类只认 tables/runtime-contract-format.json 里的取值,不认识就整份拒绝,每个问题带 JSON 指针。身份:键排序、紧凑分隔、UTF-8 不转义、去掉摘要成员后重算 SHA-256,必须等于声明值和配置的期望值;有非整数数字或 BMP 以外的键就整份拒绝。只取启用条目,内部条目和认证候选不取。签名取参数名、种类、是否必填;默认值不复制;默认值是合约脱敏标记的参数(凭据类)不许出现在计划里。删掉 compile-contract@1、PARAM_TYPES、ADDRESS_ROLES 和旧的合成合约。
  2. 运行环境配置 runtime-profile@1(functions/profile.ts):期望身份;工作簿格式字面量(执行表名、九列表头、身份标记、范围名、收尾行、用例号形状);座位(运行器对象名、清单设备、网关序号);主机方法与清单设备;本轮允许的(对象,方法)及参数角色(设备命令行、主机 shell、字面断言、等待);设备和主机的拒绝表;synthetic 声明。整份校验、问题一次列全:允许集合必须是合约启用集合的子集,座位和主机必须指向清单里的设备。参数角色的取值只在包的格式表里写一处。
  3. workflow.json:加输入槽 profile(doc:doc,角色期望来源)和参数 autoid;声明 leases.prefix 为 bed/,修掉冻结的租约视图读不到 test-bed 分配地址的缺陷。清单解析与 test-bed 对齐(台架名字符集、services 和 reserved 必填、服务地址按数值比),保留 drift 测试。
  4. 用例抽取(functions/cases.ts):条目字段带 autoid、auto、priority,按文本原样,不转数字;支持两种排法(步骤是子节点;步骤写在用例正文、只有一个叶子期望);参数 autoid 选出一个用例,找不到或重复时 start_run 不受理,修正说明写明原因。
  5. 槽位:steps 为 {object, method, args, keywords},用合约里的原名;expects 为 {text, quote, after},after 是它判断的步骤号;replacements 为 [{case, bed}];bucket 为台架名;blocks 本轮只能为空。slots.schema.json 写全形状,结构错误的修正说明按它给出。
  6. 检查(全部从合约、配置、清单和命令目录推出,代码里不写任何对象名或方法名):组合在启用集合与允许集合的交集里;签名(位置参数个数、只用签名里有的关键字、必填齐、仅位置参数不用关键字);值(单行、没有 {} 或 {0}、不以 = 开头、首尾无空白);设备命令行过 catalog@1 和设备拒绝表,主机 shell 过主机拒绝表;地址(每个字面地址在台架上;设备命令行里只许本设备接口地址、本血缘分到的地址、服务器地址;替换表一一对应、替换后在台架上,并写进结论);期望(text 是套用替换表后引文的片段,after 指向设备命令行或主机 shell 步骤,至少一条)。模型能改的驳回码都有修复行,2 轮。
  7. 结论:配置声明 synthetic 时写“按合成合约核对”,否则写“按发布的运行器合约核对”和身份前 12 位;都写“不证明在真实设备上跑得通”。合约核对的支持结论 data 带出运行时版本和合约摘要(任务 2 的脚本要用)。
  8. examples/ 换成同一格式的合成运行器合约(对象和方法都是编的)、合成配置和合成清单(192.0.2.0/24、2001:db8::/32);SKILL.md 按新槽位改写,写明先在计划运行里修到全部满足,再按任务 2 的脚本生成工作簿;README 写下运行器 G 写法的格式说明(只写行为,不抄任何代码和配置值)。

必须有的测试

  • 合约:身份重算等于声明值;改一个字节就不等;另一份身份的旧副本被拒;非整数数字、BMP 以外的键被拒;不认识的状态、派发方式、参数种类被拒;禁用对象下有启用条目、重复组合被拒;内部条目和认证候选不在启用集合里。
  • 配置:允许集合超出合约启用集合、座位指向清单里没有的设备、角色取值不认识,各自整份拒绝并给出指针。
  • 抽取:两种排法各一份合成脑图;18 位 autoid(含大于 2^53 的值)原样保留;autoid 找不到或重复时 start_run 不受理。
  • 检查:samples/ 里每条规则一对正反例:未启用组合、本轮不允许的组合、多余关键字、缺必填、仅位置参数用了关键字、多行值、含 {}、以 = 开头、命令不在目录、设备命令命中拒绝表、主机命令含重启、台架外地址、设备命令行用了路由器地址、替换表不是一一对应、期望不是替换后引文的片段、期望跟在等待步骤之后、没有期望。
  • 租约前缀:production.test.ts 里真引擎上,test-bed 预订分到的地址,在以预订为前驱的编译运行里算“分到的地址”。
  • publish.test.ts 经真实注册表发布(临时 PostgreSQL;没有 sandbox-exec 时记跳过,不算通过);npx tsc –noEmit;pack-files.ts –check;全仓词表扫描零命中,不加例外,不登记基线。

完成后在终端里回报:提交号、测试数量、没做完或拿不准的地方。真实台架上的任何动作都由集成者做,并且要等所有者答复设计第 6 节的问题。