已开启
[Bug] cpx Responses input cursors and round metadata leak across sessions #56
tianjun创建于  4 天前
tianjun
4 天前 创建

问题背景

packages/cpx/src/codex-emitter.ts 将 prevInputCount 和 roundCount 都按固定 main 键存储,而 JSONL 文件按 rec.sid 分开。未固定会话的代理可经真实 resolveSession 接收不同 x-session-id,因此两个会话的请求交错时会互相消耗历史长度和轮次:第二个会话的首问丢失、不等长历史会重复另一轮的工具结果,轮次也从别的会话继续。

同一轮用户/工具结果行只更新 x_lake.data.roundIndex,x_cannbay.data.roundIndex 始终保留初始 0,导致同一行两个通道的轮次冲突。

复现

使用合成输入,不含真实会话或凭据。调用实际会话解析及 emitter/JSONL writer:A 的首轮输入 [user(A)],随后 B 的首轮输入 [user(B)]。旧版 B 文件只有 assistant 行,缺少首问,assistant roundIndex 为 1(应为 0)。不同长度历史交错时 A 的已发工具结果被重复,B 的新工具结果缺失。单会话两轮则用户行的 x_cannbay 第二轮仍为 0。

Host 回归命令:

cd packages/cpx
node_modules/.bin/vitest run tests/ut/codex-emitter.test.ts

基于最新 master 9ce8017ee71e4dd3ddaebc2f568f3ca041d0c837。同一最终 3 项回归在原始 emitter 上均失败;只按 sid 存游标/轮次,并同步赋值双通道用户轮次后,3 项全通过,原生 cpx 全量 20 文件 / 183 项通过,无跳过。

预期与范围

每个 sid 独立消费输入并从 roundIndex=0 开始;两个现有元数据通道在同一行一致。保留单会话追加和重放去重行为,不改数据字段、CLI、依赖或版本。测试写入临时本机 JSONL,不启动真实模型服务,不涉及 NPU。55 条所有状态 Issue / 40 条开放 PR 已去重;#6 是 Claude agent 展示,#8 是 Insight/opencode 曲线,#54 是 Responses 输出文本块,与此处输入/轮次状态不同。

likedislike
Ttianjun
4 天前 添加了label:bug-report
tianjun
4 天前 评论:

/assign @Ethan_Zou

likedislike
CANN-robotCANN-robot成员
4 天前 将 Ethan_Zou 设为负责人
Ttianjun
4 天前 关联了pull request:fix(cpx): isolate Responses capture state per session