Repository navigation
Validate saved complete Turn context before recovery - #8529
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · max
评审提交 ce512ca7c8c4bffb11debc0ebe5e534c0ee26c8a
动机 / Motivation
受影响的是在压缩或恢复会话后继续原工作的 Codex Agent。同一 Codex 会话打开一个已保存的 Turn 时,旧入口可能接纳摘要相符但版本不支持的完整决定。候选拒绝这种决定并返回该文件的显式读取入口。新决定被拒绝后,同一会话的隐式恢复仍可能交付上一轮的内容。本次改动处理已保存决定的读回和原生会话发布。需要把未知版本和混用格式的同会话拒绝接入现有恢复入口清理。
改动思路 / Approach
复用完整 v1 的 typed 校验,并让原生 journal 决定哪个捕获可作为当前恢复入口。这一变更覆盖保存后再次呈现和原生恢复入口发布。原件的显式引用负责按摘要读取,隐式选择器负责同一会话的当前恢复。正常替换更新选择器。两个不同 Turn 的对照可分辨错误中的原件是否正确,以及实际恢复走了哪个引用。
具体改动 / Changes
关键代码讲解
5 个文件,增加 239 行、删除 85 行。依据 docs/reference/protocols/turn-envelope-v0.md 核对 validate-complete-source、same-turn-native-recovery、retain-historical-readback。 基线规范
checkedContextPresentationSource 复用完整决定校验,覆盖没有 progressive 视图的 Delta 路径。project_saved_context_capture 先验原文件摘要和 Goal、Agent、Turn,再区分版本并返回错误或进入原生准备。_retire_native_recovery_lookup 在完整 v1 到达原生准备后撤下旧 selector,验证成功再发布当前读回。第 365 行的早返回绕过这一过程。 实现
对主干的风险 / Risks
[P2] 被拒绝的替换会使上一个 Turn 继续作为当前上下文。 File 和 SQLite 中先选 A,后提交摘要和身份均匹配的 B。未知版本及 v0 混完整绑定时,候选返回 exit 1 和 B 的回执,但无路径 quota context-read 仍得到 A,compact hook 也返回 A 的摘要。相同基线错误地接纳 B,候选的 v1 内容签名拒绝则正确撤下 A。各原件字节保持,读取未增加准入或扣额。
语义与 CI 对齐
348 项 Python 测试通过,14 项原生 Codex loopback 未启用。63 项 TypeScript 测试、类型检查、Ruff、配置内 mypy 以及标准 premerge 的 6 项直接和 19 项定向检查通过。已有参数化测试依次跑几种坏输入,只在最后检查 journal。最后的签名错误清除了前任指针,前面的版本分支因此漏测。独立 File、SQLite 对照在每个分支结束后实际读回当前指针,复现上述 P2。远程 CI 未查询。
我的整体评价 / Verdict
请沿同一 native session、Goal、Agent 及已核验替换源清理旧的隐式入口,并保留两个原件的显式读取。逐个验证未知版本、混用绑定和签名错误之后的 compact hook 与无路径读取,同时覆盖不同身份仍不得影响当前会话。
English verdict: REQUEST_CHANGES. Rejecting a replacement must stop implicit recovery from presenting the preceding Turn. The exact original capture remains available for explicit reads.
…lidate-recorded-complete-context-20261111 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · max
评审提交:959568d12b97a82f051f3f229e25a7ca9f05bce6
[P2] 同会话的新捕获被拒绝后,仍能隐式读取上一轮。 未知版本或 v0 混绑在 CLI 提前返回,A 仍留在原生恢复索引。File 和 SQLite 上,无文件参数的读取及压缩后的 SessionStart 都能返回 A。 把已核对身份且匹配同一原生会话的版本拒绝交给现有恢复 owner;在拒绝前让旧的隐式索引失效。保留 A 的显式摘要读法,并保证其他会话及 legacy/off 路径不受影响。 已有讨论
动机 / Motivation
Codex 压缩或工具恢复后,需要继续读取本轮已保存的决定。原生会话已接受捕获 A,同一 Goal 和 Agent 的下一轮捕获 B 具有正确外层摘要,但版本未知或混有 v0 标记及完整绑定。主干会接受这种 B 并把它发布为当前来源。本提交拒绝 B,返回只读取 B 的 heartbeat_receipt 的诊断命令,并在 v1 内部摘要不符时清除旧来源。未知版本或 v0 混绑在 CLI 提前返回,A 仍留在原生恢复索引。File 和 SQLite 上,无文件参数的读取及压缩后的 SessionStart 都能返回 A。本轮验证源码 CLI 与原生 Hook。C1 当前合入预演存在四处冲突,未验证该组合、安装环境的模型采用或付费 Benchmark。
改动思路 / Approach
沿用完整来源校验器和原生会话日志。已验证的变化是诊断只读原回执。仍需统一同会话失败后的隐式恢复行为。 CLI 先核对文件摘要和身份。TypeScript 复用 v1 来源校验,原生准备读回与 Benchmark 预读都将未验证来源引向回执诊断。原生会话已在内部摘要错误时退役旧索引,版本错误尚未走这条路径。
具体改动 / Changes
关键代码讲解
11 个文件,+349/−112。基线协议要求恢复原捕获和原身份。verified-saved-source:未知版本、混绑及内部摘要错误均拒绝。same-turn-recovery:版本拒绝仍可恢复到 A,未满足。original-receipt-no-replay:仅回读 B 的回执,两个原文件与每轮各一条回执保持不变,零扣费。基线协议
project_saved_context_capture 在进入原生日志前提前返回;prepare_codex_context 只在已识别的 v1 路径调用退役。checkedContextPresentationSource 统一 v1 校验。原生准备和 Benchmark 预读保留了经校验的选择、分页和原回执诊断。版本分支 会话日志 来源校验 准备读回 Benchmark 预读
现有测试在连续跑完四种坏输入后才检查日志,最后一个内部摘要错误会清掉索引。独立验证每种坏输入前重新建立 A。四个未知版本或 v0 混绑用例都返回 A,两个内部摘要错误对照则拒绝隐式读取。现有测试
对主干的风险 / Risks
旧决定仍可能进入压缩恢复后的工作上下文,带回过时的要求或停止条件。原始文件的显式摘要读法正常。两边各九项 legacy/off 对照通过。C1 当前预演在协议、CLI、完整来源 owner 与测试四处冲突,须另行集成验证。
语义与 CI 对齐
141 项 Python 通过、14 项 opt-in 跳过;91 项 TypeScript、类型检查、Ruff 通过。标准 canary 的 6 项直接和 19 项选中检查通过,Benchmark 人工验收门槛仍在。独立检查有四个真实失败;未查询 hosted CI。
我的整体评价 / Verdict
请求修改。让同会话的版本拒绝在返回前退役旧隐式索引,并把无路径读与压缩恢复的断言移到每个坏输入之后。原捕获的显式读回与回执诊断应继续可用。没有 UI 或首屏改动。本轮验证源码 CLI 与原生 Hook。C1 当前合入预演存在四处冲突,未验证该组合、安装环境的模型采用或付费 Benchmark。
English verdict: REQUEST_CHANGES. Request scoped pointer invalidation. Four File and SQLite cases reject the new source and still expose the preceding Turn through implicit CLI and compact recovery. Receipt-only diagnostics and the inner-binding control pass.
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · max
本次评审对应提交 68711b1fd70cf18e4d70ed3c178f55f56ef4c165。
[P2] 同会话的新捕获被拒绝后,仍能隐式读取上一轮。 已有讨论
动机 / Motivation
Codex 压缩或工具恢复后,需要继续读取本轮已保存的决定。原生会话已接受捕获 A,同一 Goal 和 Agent 的下一轮捕获 B 具有正确外层摘要,但版本未知或混有 v0 标记及完整绑定。主干会接受这种 B 并把它发布为当前来源。本提交拒绝 B,返回只读取 B 的 heartbeat_receipt 的诊断命令,并在 v1 内部摘要不符时清除旧来源。未知版本或 v0 混绑在 CLI 提前返回,A 仍留在原生恢复索引。File 和 SQLite 上,无文件参数的读取及压缩后的 SessionStart 都能返回 A。评审范围是源码 CLI 与原生 Hook。
改动思路 / Approach
沿用完整来源校验器和原生会话日志。已验证的变化是诊断只读原回执。仍需统一同会话失败后的隐式恢复行为。 CLI 先核对文件摘要和身份。TypeScript 复用 v1 来源校验,原生准备读回与 Benchmark 预读都将未验证来源引向回执诊断。原生会话已在内部摘要错误时退役旧索引。版本错误在这一步之前返回。
具体改动 / Changes
关键代码讲解
11 个文件,+388/−113。基线协议要求恢复原捕获和原身份。verified-saved-source 已拒绝未知版本、混绑与内部摘要错误。same-turn-recovery 仍待修复,版本拒绝后可恢复到 A。original-receipt-no-replay 通过,诊断只读取 B 的回执,每轮保留原有的一条回执,零扣费。基线协议
上轮评审提交为 959568d12b97a82f051f3f229e25a7ca9f05bce6,本轮基线仍为 beff0f3e55d1f70eceebbd8e78c11f1cff34643b。两轮间只有一处生产代码改动。无会话的附带首读采用计算后的 output_limit。独立 UTF-8 样例在基线首屏输出 64,000 字节,候选默认和显式 12,000 字节均用六页连续读完同一份 60,837 字节选区与原回执。输出预算 本轮增量
project_saved_context_capture 在进入原生日志前提前返回。prepare_codex_context 在已识别的 v1 路径调用索引清理。checkedContextPresentationSource 统一 v1 校验。原生准备和 Benchmark 预读保留了经校验的选择、分页和原回执诊断。版本分支 会话日志 来源校验 准备读回 Benchmark 预读
现有测试在连续跑完四种坏输入后才检查日志,最后一个内部摘要错误会清掉索引。独立验证每种坏输入前重新建立 A。四个未知版本或 v0 混绑用例都返回 A,两个内部摘要错误对照则拒绝隐式读取。现有测试
对主干的风险 / Risks
旧决定仍可能进入压缩恢复后的工作上下文,带回过时的要求或停止条件。原始文件的显式摘要读法正常。两边各十四项 legacy/off 对照通过。C1 当前预演在协议、CLI、完整来源 owner 与测试四处冲突,须另行集成验证。
语义与 CI 对齐
142 项 Python 通过,14 项 opt-in 跳过。91 项 TypeScript、类型检查与 Ruff 通过。标准 canary 的 6 项直接和 19 项选中检查通过。Benchmark 仍有人工验收门槛。独立检查复现四个旧索引失败。Hosted CI 本轮未查。
我的整体评价 / Verdict
请求修改。让同会话的版本拒绝在返回前退役旧隐式索引,并把无路径读与压缩恢复的断言移到每个坏输入之后。原捕获的显式读回与回执诊断应继续可用。验证覆盖源码 CLI 的首读与原生恢复。组合运行、已安装环境的模型采用和付费 Benchmark 待验证。
English verdict: REQUEST_CHANGES. At 68711b1fd70c, the stateless cap is verified. Four File and SQLite cases still expose the preceding Turn. Retire the preceding selector before same-session version rejection.
songoow
left a comment
There was a problem hiding this comment.
Reviewer: model_agent · GPT-6 Astra Pro · OpenAI · self_reported
评审提交 68711b1fd70cf18e4d70ed3c178f55f56ef4c165。完整十一文件及当前作者自评均已核查;本轮独立复现了已有未解决 P2,不重复创建同一 inline。
动机 / Motivation
恢复原生会话中已保存决定的 Agent,需要在继续工作前确认本次 Turn 的来源仍完整且受支持。旧入口可把未知版本的完整捕获当成普通旧格式呈现;候选拒绝它并返回原回执的诊断读取,但同一会话先前选中的旧 Turn 仍可能被隐式恢复。
期望且已部分实现的结果是:坏来源不成为本次工作上下文,呈现失败可沿原身份和原摘要恢复,不再准入或扣费。当前尚未完成的是拒绝替换来源后撤销旧的隐式选择,独立 File/SQLite 验证中旧 Turn 仍被后续读取和压缩恢复钩子返回。范围限于 saved capture 的验证、呈现与原生恢复;不据此认证完整 C1、实际模型采用或 benchmark 成果。
改动思路 / Approach
原文件、摘要与 Goal/Agent/Turn 身份仍由 capture reader 核对;完整决定的内容和契约交给 TypeScript source owner。Python adapter 将“来源未验证”和“来源已验证、仅可选呈现失败”分开:前者只能读原 heartbeat receipt 诊断,后者保留已验证上下文。prepared ready capture 与 benchmark 指引也接到这条验证路径。
复用现有 source validator、session journal 与 recovery reference 的架构方向合理。当前 PR 边界应包括同一原生会话在拒绝本次来源后的恢复状态,不能只让显式命令失败而保留旧选择。无需增加新的恢复协议;应在身份与会话范围确认后,由既有 owner 统一撤销可误用的隐式指针。
具体改动 / Changes
关键代码讲解
project_saved_context_capture检查原字节、外层摘要及身份,再区分 complete 与明确的 legacy 格式。stateless initial read 现在传入实际的 12,000 字节默认输出限制;本轮真实子进程回归通过。checkedContextPresentationSource复用 typed complete source 检查,覆盖 delta-only;Python 包装保留原数值 token,不通过重新序列化伪造一个新来源。_retire_native_recovery_lookup与_commit_native_context_recovery分别拥有旧选择撤销和新选择发布。不过前者只在后续 recognized complete 路径到达,未知版本及混合 v0 的早退没有经过它。- prepared capture readback 重新投影 ready capture,失败保留原回执;benchmark 指引把失败后的全文发现改成 receipt-only 诊断、恢复原件后重试原 projection。文档和 self-repair 行与这条边界一致。
规范依据是 Turn envelope 契约 的原来源、原身份与呈现不授予新权力要求;C1 的后续采用资格不是本修复的全部合并前提。
| 契约项 | 当前 head 判断 |
|---|---|
verified_before_work |
显式 projection、delta-only 与 ready capture 路径已加强;未知与混合版本拒绝,诊断只选原 receipt。 |
same_turn_native_recovery |
未满足。被拒绝的替换来源没有统一撤销前一个 Turn 的隐式恢复选择。 |
original_receipts_no_admission |
实测保留原文件与每个 Turn 的一次 receipt,零 quota debit,没有重复 guard。 |
bounded_initial_read |
stateless 默认输出上限的新增子进程回归通过;没有推断模型 token 或费用降低。 |
complete_C1_adoption |
范围外。真实模型、完整 C1 组合及运行成果成本未在本轮认证。 |
对主干的风险 / Risks
[P2] 替换来源被版本检查拒绝后,旧 Turn 仍作为当前会话上下文恢复。 位置在 quota_capture.py:366–375。先在会话中成功选择 A,再用同 Goal/Agent 的新 Turn B、正确外层摘要,但把版本改为未知值,或使用 v0 名称却保留 complete binding。head 的 B projection 返回失败,随后不带显式 capture 的 context-read --initial-read 仍成功返回 A;compact hook 同样提供 A 的旧恢复摘要。已验证的旧内容不等于当前被拒绝 Turn 的上下文,Agent 可能按旧决定继续。
我用真实 CLI、真实 File/SQLite authority 和原生 session journal 独立运行八个场景:两种存储的 base unknown 接受 B;head unknown 与 mixed-v0 均拒绝 B 却保留 A;head inner-content-hash 错误则正确撤销选择,后续隐式读取失败。相同原字节用于 base/head 对照;读取、钩子、journal 指针和 receipt/debit 都做了后续读回。因此这是失败分支漏过已有 owner,不是旧数据本身有权限问题。
最小修复是在已经确认调用者身份和 native session 范围后,让不支持格式的拒绝也经过同一旧选择撤销;保留显式原件的诊断读取,不清理其他会话或其他 Goal 的记录。加入“先选 A,再拒绝 B,再隐式读/compact”的 File/SQLite 回归,并覆盖其他身份不被清理、合法 legacy 与关闭呈现路径。现有测试只检查 B 命令失败,不能证明 A 已不可被误用。
语义与 CI 对齐
PASS:exact-head 的 40 项 focused Python(invalid source、默认输出上限、publication ordering、prepared capture 和 benchmark instruction)、98 项 TypeScript context/envelope 与控制面 typecheck。初次 Python 运行因临时目录子进程加载 editable 旧 checkout 得到 33 passed/7 failed;保留日志,显式绑定 exact-head PYTHONPATH 后 40 passed,未更改源代码或断言。额外真实 CLI 反例仍失败,说明 suite 全绿没有覆盖上述 session replacement 状态。quick premerge 的 6 项直接、4 项选定检查全部通过;总 gate 仍为 benchmark manual review hold,不是验证失败或合并授权。
远端有 TS core 失败和 pending/queued 项,未穷尽归因,不称 CI 全绿;本次 REQUEST_CHANGES 的依据是独立可复现的恢复错误。没有执行付费 benchmark、实际用户会话或全量测试。
我的整体评价 / Verdict
建议 REQUEST_CHANGES,保留现有 P2。来源验证、receipt-only 失败提示和 stateless 输出限额均有实际价值;十一文件 +388/−113 的改动围绕一个恢复边界,主要成本来自已有路径重排和回归覆盖。问题在于这一边界尚未闭合:显式拒绝与隐式恢复必须对“本次来源不可用”给出一致结果。
本轮没有提出重复架构、代码风格或未来 RFC 门槛作为阻断。本改动不改变渲染界面,视觉检查不适用;未验证范围为已安装宿主中的真实模型采用、完整 C1 组合及长期成本。修好同一会话的拒绝后状态,再复跑上述最小反例即可重新评审。
English verdict: REQUEST_CHANGES at 68711b1. The existing P2 is independently reproduced: unsupported replacement captures fail while implicit read and compact recovery still serve the previous Turn. The targeted source tests pass; the uncovered state transition remains blocking.
Signed-off-by: huangruiteng <huangrt01@163.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
…pair-8529-TjPDBr Signed-off-by: huangruiteng <huangrt01@163.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
…pair-8529-TjPDBr Signed-off-by: huangruiteng <huangrt01@163.com>
huangruiteng
left a comment
There was a problem hiding this comment.
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · max
审阅提交 ff7ba16e0ffe11155716fc8882b741026ccdaebc。APPROVE。旧 P2 已复现并修复,当前完整差异没有阻塞项。原评审线程
动机 / Motivation
Codex 会话和 benchmark worker 在响应丢失或上下文压缩后,需要找回已经作出的工作决定。
同一会话先发布 Turn A,再恢复 Turn B。B 的文件摘要正确而版本不受支持时,旧实现可能让工作继续读取 A,带入上一轮的要求和停止条件。
修复后,B 只提供原回执供诊断,隐式读回停止指向 A。补回有效捕获即可沿原 Turn 继续,长内容可用同一个游标逐页补齐。
交付范围是已有决定的校验和呈现。领取、租约、准入和结算仍使用原 Turn 的入口与回执。
改动思路 / Approach
完整 Turn 的真实性由现有 typed 校验器判定,旧入口的撤下和领取回执的读回都归原生会话 journal 所有。 范围到保存后的上下文校验、同会话读回与首屏分页为止,涵盖 Codex Hook 和 benchmark 预检。
文件摘要和原身份匹配后,完整来源由 TypeScript 解析原版本和绑定。受支持的来源才能成为当前工作上下文。原生 adapter 持已有 session 锁撤下同一 Goal 和 Agent 的旧入口。若拒绝的是刚记录的 ready 捕获,Hook 仍能沿原领取与租约引用读回。
只改错误提示会留下隐式旧入口,清空整份 journal 则会切断已发生的领取。这里使用同一个 journal 做作用域清理,复用原 reader 完成诊断和分页。无状态首屏窗口较小,后续读取继续走同一选择游标。
具体改动 / Changes
按 72d5bced2da9d1418c201c715c911c4e2826d7e1 的 docs/reference/protocols/turn-envelope-v0.md 验收。基线协议
- 显式完整 v1 已实现。完整捕获在原生、无状态、仅 Delta、raw/off 和未启动会话这五条路径校验。历史 raw/v0 的显式摘要读回保留。
- 摘要绑定的读回 已实现。相同长 Goal 首屏从 59,300 字节降到 12,000 字节。当前源码和隔离 wheel 均用六页重建出同一份原选择,正文、Stop 和原回执完整读回。
- 沿用原 Turn 已实现。File/SQLite 的原始 heartbeat 回执只有一条,新增 spend 为零。准备失败后诊断、读回与重试使用同一领取 ID,事件日志保持原字节。
关键代码讲解
project_saved_context_capture检查外层 SHA-256 与 Goal、Agent、Turn。未知版本或混用 binding 走失败响应,未验证来源的生成命令只选取/heartbeat_receipt。quota CLIcheckedContextPresentationSource把完整 v1 的原数字 token 和内容交给已有requireCompleteTurnDecision,纯 Delta 也过该检查。typed source_retire_native_recovery_lookup在原生会话锁下清理恢复指针。只有当前捕获摘要匹配已记录的 ready 捕获时,才留存原 claim/lease 的读回输入。之后发布有效捕获会清理这一临时投影。原生 journalcodex_execution_preparation_readback_context以原 claim id 生成读回,完整来源用context-project校验。Benchmark 预检执行同一个投影入口,依据结果选择后续 reader。准备读回 Benchmark 入口
对主干的风险 / Risks
本次反向用例先发布 A,再提交摘要正确、版本或内层绑定无效的 B。匹配作用域时,隐式 CLI 和 compact Hook 都停止返回 A。不同会话、Goal、Agent 或错误摘要和 Turn 继续保有原入口。对已领取的 B,诊断页与显式读取均无法确认 ready 已交付,原领取引用仍能读回。历史 raw/off 用同样的输入比较过 base、head 和 wheel。
PASS 796 个 Python 检查,60 个 opt-in 跳过,80 个 TypeScript 检查,CI 同范围 Ruff、mypy、双语 diff、公开边界与维护性检查通过。Premerge 并行首轮的 CLI 输出预算 smoke 超时。固定相同 base/head 后单独重跑原脚本通过,结合其余 18 个选定检查和 6 个直接检查构成完整覆盖。GitHub 的 Sign-off 与 merge-gate 尚待独立读回。
语义与 CI 对齐
Benchmark 的人工检查覆盖预检命令、诊断与受支持来源的恢复提示。standalone 与 prepared-host 均执行实际生成的命令,覆盖已有 reader。评分、提交和运行授权不参与这一改动。产品验证使用隔离本机和合成数据,实际 Host 采纳与基准得分未实测。
我的整体评价 / Verdict
长期恢复更可靠。一次失败可以保住原回执和领取,补回有效来源即可继续原 Turn。对调用方,原参数就足以定位同一决定和续页,减少重新执行 guard 的诱因。生产改动集中在现有验证和 journal owner,并复用已有错误码与读回词汇。旧 P2 的触发场景及修复引入的领取读回回归均已覆盖。
English verdict: APPROVE. Rejected saved Turns retire the scoped native lookup, preserve claim readback, and keep the first page bounded with lossless continuation.
Resolved at ff7ba16. File and SQLite reproduce A then rejected B. The implicit reader and compact hook refuse the old context, other scopes keep their recovery, and the original ready claim remains readable without a second claim. Verified by the exact-head approval.
|
Request changes conclusion (author-owned PR; GitHub blocks formal self-review) Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · max 本次评审对应提交 合并后审计 [P2]:替代缓存目录被拒绝时,仍可能隐式读到上一轮。 动机 / MotivationCodex 从已保存决定恢复时需要继续读取本轮约束和停止条件。同一原生会话先发布捕获 A,再用原始文件摘要和正确的 Goal、Agent、Turn 提交 B。B 使用现有会话目录之外的缓存根,该目录因权限不是私有而被拒绝。基线在无法准备缓存时返回失败,保留先前的隐式恢复入口。本提交在正常缓存路径上拒绝未知版本、混用格式及错误内部绑定,退役 A,并保留 B 的摘要限定诊断回执。但缓存根检查早于会话恢复退役:响应返回 B 的诊断回执,随后的无文件参数 context-read 和 compact 后的 SessionStart 都仍指向 A。这次合并后审计覆盖真实源码 CLI 和原生生命周期,不声称已验证已安装版本、C1 组合或完整模型采用。 改动思路 / Approach沿用已存在的完整来源校验器与会话日志;无需再建恢复状态。正常来源拒绝现已退役旧入口,替代缓存根在进入该 owner 前失败,仍需补齐。 原生 journal 已有按会话退役旧入口的逻辑。应让替代缓存失败与版本、签名拒绝走同一条受控路径,诊断只读原回执。 具体改动 / Changes关键代码讲解11 个文件,+580/−153。按原契约核对 verified-saved-source、same-turn-recovery 和 original-receipt-no-replay。完整来源契约 当前缓存检查 实际合并提交。先发布 A,再用正确外层摘要提交 B。将输出缓存指定为权限为 0755 的独立目录;CLI 在进入 prepare_codex_context 之前返回错误。目录、会话和输入是隔离夹具,期间保留两个原件和各自唯一回执,支出为零。用私有缓存重试完好的 B 后,可以从隐式入口读到 B。正常缓存下的未知版本、混合标记和损坏绑定也确实不会再返回 A。 对主干的风险 / Risks但缓存根检查早于会话恢复退役:响应返回 B 的诊断回执,随后的无文件参数 context-read 和 compact 后的 SessionStart 都仍指向 A。 若宿主按默认恢复入口继续,可能使用 A 的旧约束和停止条件。旧基线、该 PR 最终提交与合并提交都复现缓存分支,属于未覆盖的原有边界。 语义与 CI 对齐File 与 SQLite 各用完好 B 和损坏绑定 B 验证四例;正常缓存的六组拒绝、12 KB 首读和 148 项相关测试已通过。没有检查托管 CI 或运行付费推理。 我的整体评价 / Verdict合并后审计:建议补齐缓存前置失败的退役路径。既有未知版本/混合标记的问题已经修复;这条新记录只跟踪另一路径仍返回旧 Turn。恢复 CLI 的结果变化,无首屏改动。验证范围为两个隔离后端的 native 生命周期。 English verdict: REQUEST_CHANGES. Post-merge audit: an early cache refusal still leaves the prior Turn selectable. Route the scoped failure through the existing native recovery owner. |
Current author verification
Head
68711b1fd70cf18e4d70ed3c178f55f56ef4c165targetsmain@beff0f3e55d1. A rejected saved source exposes its recorded heartbeat receipt for diagnosis. Native preparation readback checks the saved source before offering its body. Benchmark preflight applies the same distinction.A stateless
context-project --initial-readused the bulk output window when the caller omitted a byte limit. The attached read now uses the documented 12,000-byte default, including navigation. Its cursor continues the same selected body from the next byte. Explicit budgets and ordinary recovery readers still use their existing settings.中文摘要
无状态首读默认应用 12,000 字节上限。真实 Codex 本地回环在 shell 工具与 Code Mode 均复现旧首读截断,修复后通过连续分页完整读回。File 和 SQLite 隔离检查保留原内容与原回执。Benchmark 人工审阅仍待完成。
Saved complete Turn recovery
#8489 ships an explicit writer for complete v1 decisions. On the base below, a saved decision with an unsupported version still returned success from context projection when its file digest matched. This was reproduced on File and SQLite across stateless, native, Delta-only and raw recovery.
The projection now reuses the existing typed complete-source validator. An unsupported version, mixed legacy binding or invalid signature returns the recorded receipt and an explicit digest-bound context reader. The native session publishes the current recovery selector only after validation succeeds. Historical readback continues to use the original capture and digest. Recovery performs no fresh admission or spend.
This extracts the saved-context protection already exercised by C1 #8266. The local composition keeps C1's product tree and shares the extended test. With this slice on main, that comparison removes 283 lines of C1 diff while retaining the bilingual experimental ledgers. #8518 separately covers recorded journal inspection and resume.
Verification at ce512ca
中文摘要
已保存的完整 v1 捕获先通过原契约校验,再发布为当前恢复来源。未知版本、混用格式或签名损坏会返回原记录回执和按摘要读取的入口。File、SQLite、隔离 wheel 和 C1 组合已验证。独立评审待完成。