Skip to content

fix(agent): 产品 system prompt 更新无法进入直连 fallback 下恢复的存量 Codex 线程 #1697

Description

@zqchris

背景

codexHistoryHasProductPrompt 是个布尔 marker,只表示「这条线程的历史里曾经写入过产品 prompt」,不带版本信息

packages/maker-core/src/agents/codex/index.tsthread/resume 分支:

const shouldSendNativeDeveloperInstructions =
  !!developerInstructions
  && !useProxyChannel
  && (threadUsesWebSocket || opts.codexHistoryHasProductPrompt !== true);

因此当同时满足以下三条时,客户端升级后新版产品 prompt 永远不会进入该线程的上下文:

  1. 本地 codex proxy 不可用(isCodexProxyChannelReady() 为 false,走直连 fallback);
  2. 该线程不是 WebSocket / 订阅直连线程(threadModelProvider 为空);
  3. 该线程此前已写入过产品 prompt(marker = true)。

影响

这是投递机制层面的通用缺口,不绑定任何一次具体的 prompt 改动:只要产品 prompt 文本发生变化(host 共用段、Claude / Codex 专属段,或后续新增的段),存量线程在上述窄路径下继续跑旧文本。用户表现为「新版本已装、但恢复旧任务时行为还是老的」,且没有任何提示。

正常路径不受影响:

  • proxy 通道下 registerCodexDeveloperInstructions(threadId, developerInstructions) 每次 resume 都会重新注册当前文本;
  • WebSocket / 订阅直连线程 shouldSendNativeDeveloperInstructions 恒为真;
  • 全新线程一律拿到当前文本。

期望

给产品 prompt 建模版本(例如持久化内容 hash 或版本号,而不是布尔 marker),resume 时按版本比对决定是否重新下发;或在直连 fallback 路径下无条件重发当前 developerInstructions,由 Codex 侧去重。

需要同时确认:重发对已 compact 过的线程是否会造成重复段落,以及 loaded-thread resume 在当前 Codex 版本下忽略 override 的行为边界(代码注释中已记录 0.145 的这一限制)。

来源

由 PR #1650 的自动 review 发现(thread)。该 PR 新增了一段 Skill 来源优先级 system 文本,是这个缺口的一个实例,但缺口本身早于它存在,因此不在那个 PR 的范围内。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions