Skip to content

fix(control-plane): recover receipt-bound lifecycle review closeouts - #7624

Merged
huangruiteng merged 1 commit into
mainfrom
codex/decision-lifecycle-recovery-20261029
Oct 30, 2026
Merged

huangruiteng merged 1 commit into
mainfrom
codex/decision-lifecycle-recovery-20261029

Conversation

@loopx-agent

@loopx-agent loopx-agent commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

原 Todo 在生命周期复核入场后,用原 Turn 完成最终 no-follow-up 收尾时,复核重入会误报身份冲突。与此同时,已选中 replan 的写回在无法重建来源时可能落入普通未来义务分支,提交没有语义 ACK 的 blocked 记录,随后卡在结算。

本次统一使用现有 completion-recovery vocabulary 重建两种合法收尾,并让所有已选中的 replan 在写入前经过同一来源校验。对历史上已提交、没有扣费且缺少资格校验的 blocked 写回,复用原生 checkpoint-context / supplement_checkpoint 做精确追加恢复:重读当前来源,只接受原身份及原判断,不执行任务变更,不覆盖旧记录,也不改写既有扣费。readback 与 checkpoint 共用同一个判定;身份、来源版本、后续 vision 和重复执行的拒绝条件保留。

验证:

  • 完整 TypeScript 控制面:5642 passed,0 failed,75 skipped。
  • Python lifecycle / replan / checkpoint 恢复回归:145 passed;包含真实 File、SQLite CLI、旧版本遗漏的故障注入、原始记录逐字节保留及重复调用不再扣费。
  • 标准 premerge:18 项 smoke 与 6 项直接检查通过;TypeScript typecheck、Ruff、diff 检查通过。
  • 14 个变更文件的原生公开边界扫描通过;语义 vocabulary advisory 没有发现新的受支持 carrier。

范围与限制:没有改动存储 backend、评分、宿主权限或调度周期。本地未配置独立 PostgreSQL 环境,75 项本地 skipped 保留;另已核对该精确提交的 真实 PostgreSQL authority CI 完成并通过。其余 build / chat-bundle CI 仍待完成。运行时改动按仓库规则等待维护者审核和合并授权。

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; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.

Request changes conclusion (author-owned PR; GitHub blocks formal self-review)

动机 / Motivation

[P1] 必需的完整 TS 套件尚未取得资格。 npm run -s test:control-plane 在预览桥接测试中挂起超过 30 分钟,终止本次拥有的停滞子进程后得到 5633 PASS、1 FAIL、75 SKIP。这是验证缺口,目前没有证据把它说成本 PR 的具体运行时代码缺陷,也没有证明它与本 PR 无关。最低修复是保留原失败,在可比并发条件下取得不可变基线与 head 的归因证据,或修复已确认的回归,再运行必需检查;不应靠放宽时限或仅选绿色重跑消除这条记录。

完成任务后恢复原 Turn 收尾的 CLI 使用者和 Agent。已完成的任务在同一 Turn 重入收尾时,旧路径可能拒绝原回执身份;旧的 blocked 记录若缺少语义资格,又无法重新读取所需上下文。新路径按原始身份补齐证明,让同一轮收尾继续,避免重做任务或重复扣额。File 和 SQLite 的真实 CLI 对照验证了原轮恢复、单次扣额与重放,原历史记录保持不变。本次不授予新执行或合并权限,不修改存储格式,不证明已安装宿主、多 Agent 接收采用或端到端成本收益。

完整并发 TS 套件仍有未归因挂起,当前交付资格未通过;已安装宿主及后续实际工作采用也未由本次源码验证。

改动思路 / Approach

这个修复复用既有原轮回执与语义判定 owner。任务完成证明仍来自 canonical completion transition;是否可以恢复,由 TypeScript 检查 actor、原始 Turn、source、时间顺序和两种既有 completion recovery。Python 只读取当前提交回执、是否已有 spend,以及选中的 source guard,不能自行宣布恢复成功。

缺失语义资格的 blocked 旧记录,仅在实际 committed、没有 ACK、没有 debit 且仍匹配原 source 时获得重新读上下文的入口。refreshRecovery 随后仍要求相同 judgment,没有新的状态变更或后来的 vision,才返回既有 supplement_checkpoint。它补充原轮证明,不覆盖旧 run,也不制造新的执行器。资格、读回和补充这几个连接点共同完成一个真实 CLI 恢复路径;继续拆成只有字段或 serializer 的提交,不能交付该结果。架构判断为 retain,当前边界为源码 CLI 恢复,完整验证门仍失败,已安装宿主采用与收益没有取得资格。

以下是精确 head 的独立执行对照;表格表示测试观察,不表示模型采用或生产安装:

路径(File 与 SQLite) 不可变基线 当前 head
普通 delivery 与已有 lifecycle-key 收尾 4 PASS 4 PASS
原 Turn 收尾及旧 blocked 原 Turn 收尾 4 次 identity conflict 4 PASS
用原本合法的 lifecycle-key 单独隔离缺失资格问题 2 次 checkpoint_context_not_missing 2 PASS

具体改动 / Changes

关键代码讲解

完整 base-to-head 为 14 文件 +218/-13,包括 7 个 runtime 文件、一行按需查阅的修复指南及 6 个现有测试文件。qualify_replan_writeback 不再因 selected source 无法重建而跳过资格检查;这条反向拒绝路径很关键,否则“能恢复”可能变成“没有证明也放行”。evaluateCheckpointReadContext 仅增加精确 committed/no-spend blocked source 的读取分支,仍验证 provider lineage、任务和当前 source。refreshRecovery 使用原 judgment 的补充路径,禁止夹带新 mutation 或 later vision,并保留 replay 拒绝与已完成效果的处理。

采用规范 docs/reference/protocols/goal-vision-replan-contract-v0.md,精确版本 ce4c78088ea464cb31231513882bed6bb6933156。以下标签标识其中未编号的条款:completed-todo-lifecycle-reentry 在 replan_semantics.ts 复用 TODO_COMPLETION_RECOVERIES 的两个值;source-qualified-replan 由实际 source qualifier 和缺失重建拒绝证明;original-effects-once 由同轮读回、原始历史 bytes 不变、验证只执行一次及单次 debit/replay 证明。另核对同版 effect interpreter RFC 与 Todo/Turn 契约中的原效果顺序。没有增加新的持久化版本、默认配置、权限或独立产品入口。

独立运行共捕获 314 次真实 CLI subprocess 调用。两个源码版本使用相同 fixture 与解释器归属断言;只有构造旧坏状态时故意注入旧 qualifier 缺漏,恢复本身经过真实 owner。普通与 lifecycle-key 四条控制旅程各比较完整的 19 次调用包,保留字段结构、null、布尔、错误、修复命令和剩余 argv;仅规范化临时路径、观察时间、非负观察 staleness、稳定别名的随机 ID/digest。压缩的 scheduler host-facts 先解码再比较完整 JSON,四条均无未分类差异,ID 映射冲突为零。原始包并非逐字相同;这些对照不支持性能或模型理解收益。

对主干的风险 / Risks

PASS:66 项相关 Python、45 项 focused TS、隔离真实 PostgreSQL 16.2 的 380 项(零跳过)、Ruff、配置范围 mypy、TS typecheck、Python compile 与精确 diff 检查。PostgreSQL 服务及数据均为本次独立临时实例,已经停止;没有触碰活动 Goal 或共享数据库。default 完整套件的 75 个环境门控跳过没有记成通过,真实 PostgreSQL 路径由上述独立执行覆盖。

FAIL:完整 TS 套件的预览桥接挂起。该测试与 bridge 源码在基线/head 完全相同,但仅凭相同源码不能排除本 PR 的测试开销影响并发条件。随后基线两次、head 两次单文件测试均为 10/10 PASS,使用 60 秒测试界限;它们只说明隔离运行未复现,不能覆盖原始四 worker 完整套件条件。因此归因为 unresolved,没有宣称旧问题已修复或已证明无关。精确 diff 的 CQR 回执为 fail,保留这一必需验证阻断;standard premerge 的 6 项直接检查及 18 项选中检查均通过,但严格 CQR 门准确读回为 quality_invalid_receipt,整体 gate 仍失败,没有被这些绿色检查覆盖。

语义与 CI 对齐

源码复用既有 closed vocabulary,新增 request facts 均由 canonical 证据推导;没有 substring/prose 分类,也没有把自动化成功当作授权。普通控制分支保持原义,改变的是精确旧状态的恢复资格和缺失 source 的 fail-closed 行为。修复指南新增一条按需解释,actor、顺序、原始证明、停止条件与禁止重复扣额的义务均保留;它是 guidance,运行时校验是 enforced obligation。diff-scoped advisory 没检测到支持的新增 vocabulary carrier,但该结果不证明语义检查完备。本轮不获取、轮询或等待远端 CI。

我的整体评价 / Verdict

REQUEST_CHANGES。 架构与有界修复结果成立:现有 typed owner 承接原轮收尾,真实 CLI 对照验证了后续 durable writeback、单次扣额和 replay,属于 justified_increment。long_horizon 与 user_experience 的源码 CLI 路径为 improved,已有上下文与权限足以完成恢复,没有新增人工配置或确认轮次;已安装宿主、实际 Agent 后续工作和完整成本收益仍未验证。父目标的接收采用与原始结果返回义务没有因本 PR 消失。

阻断来自未归因的必需完整套件失败,不能由 focused 绿色覆盖。重新评审所需是相同并发 workload 的归因/修复证据和完整检查结果;若能独立证明故障在未变因果路径中先已存在,应保留单独质量/合并 hold,而不是要求本 PR 修复无关代码。有界整理已复用既有 recovery 枚举和窄 predicate,未发现需要扩大传输框架或另建恢复 owner 的理由。

已检查受影响 CLI/typed 路径与 companion surface 归属,没有渲染页面、控件或布局变化,视觉评审不适用,视觉未验证范围为 none;安装后的 App/Lark 执行不在本次源码资格内。本次没有执行安装、合并或更改他人的 review。

English verdict: REQUEST_CHANGES — a668b4c. The scoped lifecycle recovery is supported by real base/head CLI evidence and isolated PostgreSQL validation. The required full TS suite still has an unresolved concurrent preview-bridge hang; passing isolated reruns do not establish unrelatedness or qualification.

@huangruiteng
huangruiteng merged commit dfd04bd into main Oct 30, 2026
29 of 41 checks passed
@huangruiteng
huangruiteng deleted the codex/decision-lifecycle-recovery-20261029 branch October 30, 2026 03:57
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