Codex 提示声明在轮次完成后仍被保留¶
已确认的取消会保留提示声明,直到其轮次完成。如果提示的查找条目先被逐出或替换,旧的 clearTurn() 就无法找到它。独立的声明映射随后会保留该提示,直到整个会话被清除。
修复将已声明提示纳入现有的精确线程/轮次清理。现有轮次匹配和 forget() 对象同一性检查保留替换提示的权限。注册表限制和取消时序保持不变。
源所有权与可达性¶
codex-structured-provider-events.ts:57注册传入的提示请求,并通过翻译器发布它们。codex-structured-session-acquire.ts:95将翻译器的轮次清理绑定到会话注册表。codex-structured-prompt-ownership.ts:33获取声明。已确认的取消有意保持其被拥有状态;未成功/未确认的取消会释放它。实际的CodexStructuredTurnCancellation在注入的中断传输确认成功后调用确认回调。codex-prompt-registry.ts:258独立修剪地址映射和日志绑定映射。两种修剪都不会移除声明。替换同一日志地址也可能同样使旧声明没有查找条目。- 稍后的
turn/completed会经过translateCodexNotification、日志翻译器和settleCodexJournalTurn。已接受的生命周期结算在codex-structured-journal-settlement.ts:170调用clearPromptTurn。 - 旧清理只枚举地址/绑定值。修复还会枚举
claims.keys(),仍按精确线程/轮次过滤。forget()仅当替换查找条目包含同一个提示对象时才删除它们。
安全过期的所有者是已获准清理的终止轮次的声明。活动声明会在无关轮次清理和注册表逐出中存活。被拒绝的生命周期结算不会清除它们。
复现¶
从工作树根目录,使用已安装的依赖:
ORCA_BACKGROUND_LAUNCH=1 node --expose-gc --max-old-space-size=192 docs/audits/codex-prompt-claim-retention/reproduce.cjs
对于 Electron,使用其已安装的可执行文件,并设置 ELECTRON_RUN_AS_NODE=1,使用相同的标志和脚本。最后一个可选参数选择报告路径;默认值为脚本旁边的 node-results.json。不会创建 Electron 窗口。
sources.cjs 针对当前源码反向应用 fix.patch,并拒绝基线哈希不匹配。它既不读取先前提交来重建实现,也不更改产品文件。证明在内存中打包实际源码。每个报告记录有效源码和捆绑哈希、依赖哈希以及运行时版本。只写入所请求的报告。
测试夹具使用实际的注册表、服务器请求投递、取消所有权函数、取消类、日志翻译器和延迟通知投递。它注入一个接受日志的接收器、中断传输和主轮次查找。提示属于子线程,因此生产子轮次取消分支不会枚举或终止进程。每个注入的进程辅助函数如果被意外调用都会抛出异常。
该序列创建 32 个普通的小型提示对象,确认它们的取消,接纳 256 个无关提示以逐出查找条目,然后完成原始的精确轮次。WeakRefs 在强制垃圾回收后统计提示的存活状态。未附加大型负载。20 秒截止时间和 192 MiB 堆限制约束了证明。
结果¶
Node 26.6.0 和 Electron 43.7.0 / Node 24.21.0 均产生:
| 观察 | 之前 | 之后 |
|---|---|---|
| 查找项被逐出后、完成前仍保留的已取消提示 | 32 | 32 |
| 精确轮次完成后仍保留 | 32 | 0 |
| 所有查找映射变空后仍保留 | 32 | 0 |
| 会话清除后仍保留 | 0 | 0 |
| 同地址替换且旧轮次完成后仍保留的旧提示 | 1 | 0 |
普通完成在两个版本上都会释放其提示。错误线程、错误轮次和拒绝完成对照保留声明。在两个版本上,替换提示及其活动声明在旧轮次清理后仍然有效。
四个回归测试覆盖 32 个被逐出的声明、替换权限、一个兼容性轮次摘要以及会话清理。应用反向源码会产生三个预期失败;会话清除对照通过。现有提示所有权/回复测试在反向源码上也通过。当前源码通过六个文件中的 71 个测试,外加 Node、CLI 和 Web 类型检查;validation.json 记录命令和其他检查。
限制¶
这是一个代码级生命周期缺陷。请求/完成顺序是故意注入的;这不是对 Codex 发出该序列或受影响主机的捕获。计数不测量普通提示字节数,也不建立增长率。它没有确定 #19831 或任何其他事件的原因。
source-versions.json 记录在指定 main 修订版本处匹配的基线源码。没有复现任何历史应用运行时。修复使用现有的轮次所有权和同一性检查;它不添加任意逐出策略。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca