Skip to content

Fix recovery of file deltas carrying the current unread index - #8095

Merged
huangruiteng merged 1 commit into
mainfrom
codex/unread-index-delta-recovery
Nov 5, 2026
Merged

huangruiteng merged 1 commit into
mainfrom
codex/unread-index-delta-recovery

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

A valid progressive file delta could silently fall back to full recovery when it carried the current unread index. The producer included the index so readers could discover unread material without a retained model baseline; the restore path expected the ordinary file encoding.

Restore now derives both supported encodings from the verified current capture. It accepts only an exact match and still falls back on noncanonical changes. The wire format, scope checks, and recovery source are unchanged.

Validation: the native progressive regression failed before the fix. After the fix, 197 Python tests passed across the focused suites; the TypeScript codec suite and type check passed. The tests exercise progressive and ordinary file deltas, exact reconstruction, and rejection of a noncanonical replacement that would otherwise produce the same content. This fixes recovery behavior; it does not establish model token savings.

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; reasoning_effort=max; declaration_source=runtime_reported

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

动机 / Motivation

使用保存的上下文继续工作的 Agent,需要从当前文件找到尚未读取的材料。旧版本已把当前未读材料的索引放进增量,但恢复器只认可普通编码,因而把合法增量退回完整捕获;重复继续工作时会多读整份内容。这里的捕获指保存的完整上下文,文件存在并不证明模型已读或保留。

本次验证的结果是:携带当前索引的合法文件增量可以恢复,普通文件增量继续兼容;任意替换、错误身份或错误摘要仍回退到同一份当前完整捕获。本次不更改激活默认值、工作授权、扣额、调度或模型保留判断;安装态宿主采用、净 token 节省和持续效率收益尚未验证。

改动思路 / Approach

生产器与恢复器复用同一当前导航选择,仍由既有 TypeScript codec 校验;保留普通编码是现有调用者的兼容需求,不新增状态或权限 owner。本次交付当前未读索引的严格文件增量恢复及既有普通格式兼容;模型采用、安装态宿主和长期效率不在已验证范围。

问题发生在同一个 codec 的两种既有用法之间:普通编码仅计算文件差异;progressive 编码还强制携带当前索引,避免读取者为发现当前材料而先取旧文件。旧恢复器只重新计算前一种形状,内容虽能恢复,合法 progressive 增量却被误判。现在先重算携带当前导航的标准形状,再尝试普通编码;两者都不匹配时沿原完整捕获恢复路线退出。

最强反对理由是完整回退已经保障正确性,增加分支未必带来可测的长期收益。这里保留修复的依据是实际生产器和普通调用者同时存在,且问题能由不可变 base 重现。删除当前索引会损害无旧文件的发现路径,接受任意等价编辑会放松契约,新建协议或第二个状态 owner 则无必要。这个小范围共享选择比上述替代方案更合适。

具体改动 / Changes

审查 head 0e8a77e5d9b0c0d9b2bf0cfea4ed92f5b7cd3658,实际不可变 base 4b7afef2215067dd1171f308b93c9336e1c6e5d9。完整 diff 为4文件、33+/10-;生产代码21+/10-,测试12+,没有新增配置、CLI、存储状态或版本词表。

  • fileNavigationPaths 从当前对象是否拥有 unread_context_index 派生路径。它复用原选择条件,null/空对象仍作为数据;不从文案猜测状态,也不把数据当成任意编辑路径。
  • restoreContextDelivery 保留 current/base 摘要、目标身份、scope 和 ancestry 校验,随后精确比较重新派生的标准 change tree。只有两个现有编码形状可以通过,应用的仍是派生树;“整个替换成同样结果”也不会被接受。
  • prepareNativeContext 改用共享选择器,删除局部重复选择。生产器的输出没有随修复变化;普通 prepareContextDelivery 和 Python 的 source-edits 恢复适配器继续使用同一个 typed owner。

规格依据为改动前的上下文交付指南及其required-work-context 契约,spec_revision=4b7afef2215067dd1171f308b93c9336e1c6e5d9。原条款未编号,这里用审计标签对应既有要求:CANONICAL-RECOVERY(精确派生、拒绝任意等价树)、CURRENT-DISCOVERY(当前索引不依赖旧文件或虚构模型保留)、SAFE-CURRENT-FALLBACK(损坏输入回到同一当前完整捕获,不能重跑 admission),均有当前 head 的执行证据。

已搜索普通编码、progressive 生产器、恢复入口及未改动的 Python/CLI 调用者。最新读取的 main 两个生产文件仍与 base 同 blob,修复未重复已落地能力。没有新手填状态;索引是既有当前文件的派生发现信息,coverage_confirmed=false 仍保持。原有恢复 RFC 的经验只作提醒,不把传输成功或测试数量当作模型采用与收益。

对主干的风险 / Risks

没有发现本 diff 的阻塞性正确性问题。最危险的回归方向是为了接纳合法导航而接纳任意编辑,因此同时验证正常和反方向拒绝。

验证 结果与边界
完整 native unread 模块及冻结 base 反例 head 7 PASS;同一新模块在 base 6 FAIL、1 PASS,六项均在 full/delta 断言暴露原缺陷。当前材料更新或重排后,删除旧捕获仍能通过真实 context-read 读取尾部约束并写入下一产物
完整 TypeScript codec 模块 PASS,34项,覆盖普通文件格式、保留输入、精确数字及错误恢复
独立 base/head codec 矩阵 18行,三种 surface × 六种索引状态;每端108个损坏恢复和90个 scope 拒绝用例。生产器、普通编码、retained 和损坏回退的完整输出相等;仅12个合法导航恢复从 full 变为 delta
真实 source-checkout CLI 8次调用覆盖环境关闭、显式关闭、当前索引读取、不支持宿主显式开启;完整 stdout、stderr、退出码逐字相同,无归一化,测试文件不变且 registry/runtime 均未创建
扩展的五个 Python 模块 FAIL:161 PASS、2 FAIL、56 SKIP。两个失败在不可变 base/head 的同一8例命令中均为2 FAIL、6 PASS,失败身份与错误详情一致;只归一化 pytest 临时目录编号
类型、lint 和标准 premerge TS typecheck PASS;配置的完整 Ruff 范围两端 PASS;mypy 17源文件 PASS;标准 exact-diff premerge PASS,保留1个继承的 maintainability advisory

两个既有 Python 失败分别是保存投影预期不创建 runtime 的断言,以及直接调用预期返回 mode 时的 KeyError。相关 saved-project 测试、activation/IO 路径、配置和依赖字节没有变化,且当前恢复不变量另有独立通过证据。当前 policy26 允许将这类已归因的既有失败与正确性结论分开;失败仍保留为 FAIL,严格 change-quality 资格继续 FAILED,不能写成全绿或合并许可。56个跳过项未展开为跨平台证据。

启用默认值未变;已实际验证 opt-out 下的 schema、完整指令/诊断、输入、文件状态与副作用。纯 codec 矩阵不冒充真实 IO,真实文件/CLI 测试也不证明安装态宿主或模型理解。按当前契约没有查询、轮询或等待远端 CI。回退继续使用当前完整捕获,不重复 guard、claim 或扣额;没有修改作者分支或放宽校验。

我的整体评价 / Verdict

goal_achieved 仅指当前文件增量恢复缺陷的修复。long_horizon=improved、user_experience=improved 的依据是重复继续工作时合法增量可恢复、当前尾部材料仍可用,且无需额外复制、配置、确认或人工交互轮次;持续模型效率和完整成本尚未测量。

架构 retain、范围 proportionate、default_off_isolation=isolated:共享当前导航选择,保留实际普通调用者所需的精确格式兼容,不引入新状态、版本或权限 owner。visual_review=not_applicable,检查的是 codec 和 CLI 文件读取路径,无渲染页面修改;渲染范围无待验项。安装态 Host/模型采用、模型保留、跨平台跳过项和长期净收益未验证。

当前准确 head 的 APPROVE 与严格质量资格 FAILED、GitHub readiness 和维护者合并权限分别保留。未发现应要求作者在这个修复中加入的额外重构;局部共享已消除本次重复知识。

English verdict: APPROVE — 0e8a77e; verified canonical recovery of current unread navigation with ordinary-format compatibility and strict corruption fallback; pre-existing Python failures and strict qualification remain failed, with merge authority separate.

@huangruiteng
huangruiteng merged commit acc00f5 into main Nov 5, 2026
28 of 38 checks passed
@huangruiteng
huangruiteng deleted the codex/unread-index-delta-recovery branch November 5, 2026 08:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants