核心生成步骤(P05)提议的核实
10-23 codex 终端提议:模型只写新的判断、选择和方案;原件里已有的值、规则能算出的值、前序结果里已定的值,都由程序按引用生成。第一步做终稿生成,再从编译包里抽出通用的 P05。所有者要求先核实设计、暂不改代码,重点确认四件事:落点与现有实现是否一致;P05 要补哪些版本化契约;生成、回读、检查和修复轮怎样衔接;生成结果怎样保留原判断的性质、来源权限和适用条件。
核实由九个只读复核员完成:六个按子系统对照 hub-redesign 的代码,一个综合出设计,两个分别从安全和模型正确性的角度挑错。关键几处集成者又亲自对过代码。下面的 文件:行 指 hub-redesign 在 4a04761 前后的版本。
结论:方向和通用模型一致。P05、W05、T04 本来就写着“程序从槽位和引用出件,模型只写判断”。但第一步不该选终稿:终稿的要求项是运行级的,而运行级要求项现在没有层终态,也没有修复轮。建议先在编译上试点。
一、落点核对
| 提议的落点 | 结论 | 依据与差别 |
|---|---|---|
| 模型只填新的判断,其余由程序生成 | 部分一致 | 模型里分散在 W05(受限槽位)、T04(解析而非限制)等处,没有成为一条规则。只能靠槽位模式不要这些值来落实,不能变成“重复写就拒收”的规则;前序结果里的值经 rec: 重核,不是继承 |
| 终稿:投影已算出整体结论、等级和发现清单 | 照抄这一点一致,计算本身有错 | 投影确实算出了这些(packs/workflow/case-review-report/functions/projection.ts)。但它有四处错,生成器会把错误冻住,见第七节 |
| 终稿“影响小、容易验证” | 不一致 | 终稿的要求项是运行级的。运行级要求项只产生跨条目主张,没有层终态、错误路由和修复轮(hub/runs/engine/evaluate.ts:654-664;引擎 README 自己记着这个缺口:hub/runs/engine/README.md:303-305)。生成或回读失败没地方记“出件失败” |
| 把生成从检查函数里分离 | 诊断对,比提议说的更急 | 检查函数只许给五种未知原因(hub/rules/check.ts:84),不含 output_failed。编译包回读失败时给的 unknown(output_failed) 被判为输出无效,整份改成 check_error(check.ts:94)。条目成了“未核对”并留在已交付,违反 P05 R[0]。引擎也不写生成和回读动作 |
| 从冻结的输入、引用和槽位生成 | 部分一致 | 冻结输入已有现成形状(检查主体的输入,contracts/src/pack.ts:247-259)。缺口:源文件只按摘要冻结;编译的组带着合约和清单,却不带它们的摘要;RunContext 没有组成摘要;运行级输入没有提交;槽位数据里的引用不在边界解析(检查读片段的修复正在做,任务页 check-fragments.md) |
| 存为现有的 source_artifact,记生成器版本、输入依据、回读结果 | 部分一致 | 记录形状和 origin.generated 已有,四条核心路径在写。缺口:生成器只记 name@major;inputs 由调用方给,只校长度(hub/records/artifacts.ts:95-96);read_back 没有定义,也没人写;没有运行链接;可见性和读档位由调用方随意给 |
| 检查函数核验并交付 | 部分一致 | 检查只读 run.sources,看不到提交时才生成的产物;检查也从不交付,交付是交付前边界算分区和要求项状态。最小设计:检查照旧核槽位,回读把字节绑到槽位上 |
| 不再把计划全文藏在检查结论的 data 里 | 一致 | 全文现在复制进每条 validation@1 记录和每次 submit_result 回执,还占单条记录的上限,模型看到的文字里却没有它 |
| 复用 B01、W05、records/refs、沙箱、根组成、六个工具 | 一致,有三处调整 | 沙箱对所有函数种类用同一套限额,生成器要单独的;根组成是编译目录检查的依赖,不是两个生成器的依赖;复用机制已经有一个(知识生产器的 memo 按复用键写 generate 动作),P05 应沿用 |
| Hub 继续不调用模型 | 代码一致,文字要改 | 三处已发布的文字说得过头(docs/hub-r4-architecture.md:14 的 “The Hub never generates content”、进度页、contracts/src/tools.ts:27 给客户端的说明)。核心 P05 落地前,要改成“Hub 不调用模型,只经声明过的确定性包生成器生成” |
| 先用终稿和编译验证通用,再扩到文档派生 | 部分一致 | 两个用户还不够,还要同一份合约、不带产品语义。所谓“文档派生”,连接器读取后的投影已经在写 origin.generated(hub/connectors/read.ts:577-590),只是没有回读;叫“文档派生”会让“派生”多出一层意思,建议叫“连接器读取的投影” |
二、P05 要补的版本化契约
- 模型 v8 的 P05 规则:步骤在哪、补哪个要求项、前提是什么、失败分几类、存什么、读取器要多独立、复用覆盖什么。
workflow.json加可选的生成器声明:生成器和读取器是两个模块,各有自己的@版本。- 生成器输入沿用条目级或运行级的检查主体输入;运行级要补上槽位和跨条目主张。
- 生成器的输出、回读的输入和输出,各一个登记的形状。存下的字节由 Hub 做,不由包做。
- 定准
origin.generated:生成器加确切的包摘要(包摘要覆盖每个函数文件的字节,@major在 1.x 版本之间会撞);inputs由 Hub 算出并按引用解析;read_back指向回读动作。 - 生成和回读两种动作记录(运行、条目、输入、组件@版本、结果、复用键),以及它们的错误码,进码表。
- 规范字节:JSON 用 RFC 8785,文本照原样 UTF-8,Hub、包和独立核对脚本算出同一个 sha256。
- 交付面:条目级不变;运行级在 validation@1 加
run_requirements。 - 发布时的生成器样例:同样输入两次字节相同,读取器抓得出已知的坏字节,否则不发布。
- exec-plan@1 发布字节规范,带共享向量。
- 给客户端的服务器说明改措辞(见上)。
词表里现有的值都够用,不需要新词。
三、生成、回读、检查和修复轮的衔接
- 提交先过边界校验(结构、作用域、精确值),和现在一样。整份不受理时,不生成、不入库。
- 受理以后,各检查照旧核槽位,驳回按错误表路由到修复。每条驳回都指向模型能改的槽位。
- 闸门:这个条目的前置要求项的静态层都是 pass 才生成。“没有意外驳回”不够:前提记未知、或者反向用例里的预期驳回,都不能放行。
- 生成:在沙箱里调用生成器,用生成器自己的限额。
- 回读:另一个模块、另一次沙箱调用,读取器给出差异。到这一步为止一切都在内存里。
- 记下回读动作和生成动作。
- 失败(生成器出错、输出不合形状、回读出错、有差异、超过大小上限):不入库。生成器的要求项记未知(
output_failed),条目进未完成。这不算模型的错,不耗修复轮。 - 成功:等结果记录存下、确定受理以后再入库为 source_artifact。否则结果最后没被受理,入了库的字节也删不掉(对象只追加)。
- 交付前边界照旧算分区和要求项状态。记账型运行里,“已交付”只说明条目有了终态,不说明通过;用的一方只取全部必需要求项都满足的(门禁型,V06,现在还没做)。
- 下一轮:只为前提已经满足的条目生成,或者按复用键命中。
失败分三类,各记在不同的生产者头上:
- 模型写错了槽位:检查驳回,走修复轮。
- 生成或回读出错:
output_failed,记在包上,不耗轮。 - 前提没满足:不生成,归因沿用那条前提的归因,不记成数据缺口。
四、保留性质、来源权限和适用条件
性质。 字节本身不带性质(B02:“只支撑‘它在那儿出现过’,推不出‘它对’”)。性质留在关于它的主张上:
- Hub 汇总判断得出的事实,标“依赖判断”,前提指回那些判断。
- 终稿里的复核结论照样是判断,整体结论是在判断之上算出的事实。
- 生成物再被别的运行绑定时,要按“转载”的身份绑定,核它的检查按“规则管主张”办。判断不能因为进了生成物就变成源文件里的事实。复核员把这一条列为高风险,要写进模型 v8。
来源权限。
- 生成物默认只对运行者和管理员可见,再按输入收窄。
- 字节里含模型文字或人写的内容时,作者记提交人,来源类型记“声明”。不能记成 Hub 自己的投影,否则会绕过“受理不抬起人提供的字节”这条规则。
- 每次读都重核读者权限和受理。
- 包版本下架后不再生成;已有的主张显示“规则已撤回”。
- 生成和回读动作的详情只记码、指针、摘要和大小,不记会回显内容的文字。
适用条件。
- 生成器要求项的主张,绑定的摘要要加上产物的 sha256 和读到的每份来源的摘要(编译要补合约和清单的摘要)。任一摘要变了,主张作废。
- 照抄进产物的地址等值,它们的前提和期限(例如租约的到期时间)要跟着带上。
五、复用和缓存
复用键是下面这些内容的 RFC 8785 规范 JSON 的 SHA-256:
- 生成组件@版本
- 包摘要
- 生成器和读取器的标识
- 交给沙箱的规范输入:冻结的条目、规范的槽位、解析出的依据文字、运行上下文
任何一项变了就是新键:包换了版本、根或构建换了、条目内容变了、槽位变了、所引片段变了、参数变了、合约或清单变了、租约视图变了、限额变了。
命中了也不能绕过这些检查:
- 调用方对运行的可见性
- 每次读时的读者权限和受理
- 锁定的根和包摘要
- 本次提交的精确值解析
- 全部检查,带过来的条目也照跑
- 交付前边界
- 租约的有效期
建议先只记复用键,量过再开启命中。
六、验证
| 项 | 做法 | 通过条件 |
|---|---|---|
| 模型必填的字段 | 新旧槽位模式和真实提交对比 | Hub 能算的、已有的值都不在槽位里;终稿只剩分析、建议、缺口,编译只剩桶、块、步骤、期望 |
| 提交和修复次数 | 同一输入对基线重跑多次 | 不上升;下降要多次重复才算;output_failed 从不出现在修复明细里 |
| 传输量 | 量 start_run、submit_result 和记录的大小 | 计划全文不进回执和 validation@1 记录,按引用取 |
| 重复计算和耗时 | 同一台机器、同样输入重复跑 | 只按测得的数字说快了多少 |
| 错引来源 | 引用不在本次运行范围内 | 边界整份拒收,或者检查驳回,写明原因 |
| 构建不符 | 不同根的复核块合成终稿 | 开始运行时按根不等拒绝 |
| 原件变更 | 改一份输入以后重跑 | 新键,不复用;旧主张显示“被引片段已变” |
| 权限撤回 | 撤回读权限或受理以后再读 | 读不到,不给字节 |
| 回读失败 | 合成一个回读必然不一致的生成器 | 不入库,output_failed,条目未完成 |
| 依据不完整 | 某个条目哪一块都没交付 | 整体结论记未知,列出缺漏,不给结论码 |
| 缓存不能绕过检查 | 命中以后改权限、改根 | 每次照样核,读不到的不给 |
七、核实中顺带查出的现有缺陷
这几处和 P05 无关,已交给终端修:
- 检查函数不许给
output_failed:编译包回读失败时,条目成了“未核对”,而不是“未完成”(hub/rules/check.ts:84,hub/runs/engine/terminals.ts:53本来就把它映射成未完成)。 - 终稿的投影:
- 比的分区名
unfinished根本不存在(projection.ts:154;分区只有 delivered、rejected、quarantined、incomplete),所以缺漏条目从来不会被列出。 - 块结论取的是复核员自己写的结论码,没看 Hub 对它支持没有(
projection.ts:34-48)。 - 块结论的引用是空串。
- 缺了块结论时记驳回,不是未知。
- 比的分区名
- 运行级要求项没有层终态和修复轮:终稿包声明的修复行从来不生效,README 写的“修复 2 轮”与实际不符。这是核心缺口,也是终稿 P05 的前提。
八、要所有者定的
- 先后次序:建议先在编译上试点核心 P05(条目级;生成器、读取器和独立核对都已经有了),终稿等补上运行级要求项的结果字段以后再做。
- 方法变更:终稿的固定部分由包内生成器组织,模型只写分析、建议和缺口。架构第 6 节写的是“终稿由起草方组织”,所以这一条要所有者确认。
- 等级的并列规则:代码取“第一个最差块的等级”,任务页写“取各块最差的一块”,生成器要冻住哪一条。
- 措辞:把“Hub 不生成内容”改成“Hub 不调用模型,只经声明过的确定性包生成器生成”。
- 生成物能不能分享:建议第一步一律不可分享。
其余几条照复核员的推荐办,除非所有者另有意见:
- 失败怎么归类
- 读取器的独立性怎么判
- 失败的产物不留字节,只留摘要和差异
- 复用先只记键
- 不受理的提交不生成