背景
#317(Prime Agent 集成报告)中的记账隔离已由 #327 修复:nudgeShownTurns、压缩失败追踪等账本已按 sessionId 键化,会话启动/退出只清理本会话。本 issue 跟踪剩余的两个结构性缺口(即 #317 的接缝 1 与接缝 2),修复后同一 pi 进程内的多会话宿主(Prime 等内联子/兄弟会话)才能真正跑顺。
问题 1:回合边界判定不统一
现状:什么消息算"新回合起点"在三个地方各自独立判定,且互不一致:
src/tokens.ts:98 — hostTokens 估算
src/index.ts:739 — turnKey 计算
src/messages.ts:29 — 上下文条目划分
影响:宿主通过 agent_message(custom_message)注入的消息进入上下文,但不算回合起点 → 多个真实回合塌缩进同一个 turnKey:
- nudge 记账格子错位(账本已隔离但格子本身错了)
- 退化熔断、节流阀的周期统计失真
- 回合证据闭合(reasoning-drop)对齐不到正确的回合
方案:
- 导出单一谓词
isTurnBoundary(entry),三处收敛到同一实现
- 提供宿主策略入口(是否把
custom_message/agent_message 计为回合起点),默认保持 pi 原生行为不变(不改变存量单会话用户的 nudge 节奏)
- 在宿主适配文档中写明该契约(连带补
docs/host-adapter.md)
问题 2:子会话状态继承(deriveChildState)
现状:runtime.stateFor(childSid) 一律返回全新状态。
影响:
- pi 原生 delegate(独立进程跑子会话)→ 全新状态是正确语义,保持不变
- 内联子会话(同进程,如 Prime RLM)→ 需要继承父会话的压缩块(否则
decompress/search_context 找不到块),但节奏基线(nudge 记账、节流阀、失败计数、预算水位)应重新起算
方案:设计 deriveChildState(parentState) → childState 契约:
- 继承:压缩块、消息引用、原始消息索引(保证块可解压、可搜索)
- 重置:所有节奏账本(nudge shown、compress 失败追踪、节流阀、溢出计数)
- 一次性迁移标记(子会话首次派生时写入,避免重复派生)
- 持久化沿用
~/.pi/agent/sessions/<childSid>.acp.json,与父文件独立
验收
关联
背景
#317(Prime Agent 集成报告)中的记账隔离已由 #327 修复:
nudgeShownTurns、压缩失败追踪等账本已按sessionId键化,会话启动/退出只清理本会话。本 issue 跟踪剩余的两个结构性缺口(即 #317 的接缝 1 与接缝 2),修复后同一 pi 进程内的多会话宿主(Prime 等内联子/兄弟会话)才能真正跑顺。问题 1:回合边界判定不统一
现状:什么消息算"新回合起点"在三个地方各自独立判定,且互不一致:
src/tokens.ts:98— hostTokens 估算src/index.ts:739— turnKey 计算src/messages.ts:29— 上下文条目划分影响:宿主通过
agent_message(custom_message)注入的消息进入上下文,但不算回合起点 → 多个真实回合塌缩进同一个turnKey:方案:
isTurnBoundary(entry),三处收敛到同一实现custom_message/agent_message计为回合起点),默认保持 pi 原生行为不变(不改变存量单会话用户的 nudge 节奏)docs/host-adapter.md)问题 2:子会话状态继承(
deriveChildState)现状:
runtime.stateFor(childSid)一律返回全新状态。影响:
decompress/search_context找不到块),但节奏基线(nudge 记账、节流阀、失败计数、预算水位)应重新起算方案:设计
deriveChildState(parentState) → childState契约:~/.pi/agent/sessions/<childSid>.acp.json,与父文件独立验收
deriveChildState继承/重置语义有单元测试;pi 原生 delegate 路径零变化docs/host-adapter.md覆盖回界策略与子会话派生契约关联