docs: add thread status sync design

This commit is contained in:
kris
2026-04-04 10:43:39 +08:00
parent 48a45f04c6
commit f180a5e4a8

View File

@@ -0,0 +1,360 @@
# 主 Agent 线程状态文档与增量同步设计
日期:`2026-04-04`
## 1. 背景
当前 Boss 已经具备:
- 新设备导入时,主 Agent 会主动理解活跃线程的项目目标、当前进度、技术架构、阻塞点和建议下一步。
- 已导入设备上的活跃线程一旦继续活动,系统会自动同步项目理解,并在主 Agent 会话里补轻量提醒。
- 主 Agent 当前已经能读取最近的活跃项目理解,并基于这些理解给出下一步建议和接手提示。
当前问题也很明确:
1. **主 Agent 为了跟上线程进展,仍然会在不少场景重新向线程发起完整理解请求。**
- token 消耗偏高
- prompt 体积偏大
- 当活跃线程很多时,成本会快速放大
2. **如果只依赖“完整项目理解快照”,实时性又不够。**
- 用户继续在电脑上操作 Codex 线程时,主 Agent 可能落后一段时间
- 主 Agent 接手时,需要重新拉很多上下文
3. **把状态写回线程项目工作区作为文档文件不可取。**
- 会污染工作区
- 容易制造脏 diff
- 容易被误提交
- 多线程并行时容易冲突
因此,这个设计的目标是:
- 让主 Agent 平时更多依赖结构化状态,而不是反复扫整段聊天历史
- 保持接近实时的项目进展同步
- 只在关键时刻多花 token
- 不污染线程项目工作区
## 2. 目标与非目标
### 2.1 目标
1. 为每个真实线程建立一份 **线程状态文档**,作为主 Agent 理解线程的主入口。
2. 为每个线程建立一组 **线程进展事件**,用于记录最近的轻量增量变化。
3. 主 Agent 默认改为基于:
- 线程状态文档
- 最近几条线程进展事件
- 项目记忆
来理解活跃线程。
4. 仅在关键时刻再向线程发起完整深拉,以保持高实时性。
5. 让“新设备导入”和“已导入设备的持续同步”共用同一套机制。
6. 在线程详情或会话信息里提供一个只读的 `线程状态` 入口,便于用户查看主 Agent 当前掌握的状态。
### 2.2 非目标
1. 不把线程状态文档写入用户项目仓库。
2. 不把线程状态文档开放成默认可编辑内容。
3. 不引入向量数据库、复杂 embedding 检索或多级知识库系统。
4. 不重写现有群聊审批、设备导入或主 Agent 记忆架构。
5. 不把所有线程活动都升级成完整项目理解请求。
## 3. 设计概览
本设计采用三层结构:
1. **线程状态文档**
- 稳定快照
- 代表“当前线程现在是什么状态”
2. **线程进展事件**
- 轻量增量
- 代表“最近发生了什么变化”
3. **关键时刻深拉**
- 只在主 Agent 真要接手、真要调度、真要做关键判断时触发
- 用更高 token 成本换取更高准确度
主 Agent 后续默认读取路径为:
1. 当前用户指令
2. 对应线程/项目的线程状态文档
3. 最近 3 到 5 条线程进展事件
4. 项目记忆
5. 必要时再向线程发起一次深拉
## 4. 数据模型
### 4.1 ThreadStatusDocument
新增线程级状态文档模型。
建议字段:
- `documentId`
- `projectId`
- `threadId`
- `threadDisplayName`
- `folderName`
- `deviceId`
- `projectGoal`
- `currentPhase`
- `currentProgress`
- `technicalArchitecture`
- `currentBlockers`
- `recommendedNextStep`
- `keyFiles: string[]`
- `keyCommands: string[]`
- `updatedAt`
- `sourceTaskId`
- `sourceKind`
说明:
- `currentPhase` 用于把线程从“当前在做什么阶段”抽出来,例如:
- 需求梳理
- 架构设计
- 功能实现
- 联调验证
- 修复回归
- 部署上线
- `keyFiles``keyCommands` 不追求完整,只保留主 Agent 接手时最需要知道的关键点。
### 4.2 ThreadProgressEvent
新增线程增量进展事件模型。
建议字段:
- `eventId`
- `projectId`
- `threadId`
- `threadDisplayName`
- `deviceId`
- `eventType`
- `phase_changed`
- `progress_updated`
- `blocker_added`
- `blocker_resolved`
- `next_step_changed`
- `architecture_updated`
- `handoff_ready`
- `summary`
- `phase`
- `blockerDelta`
- `nextStepDelta`
- `createdAt`
- `sourceTaskId`
- `sourceMessageId`
说明:
- 这层的目标不是完整审计,而是为主 Agent 提供低 token 的“最近变化摘要”。
- 事件数量需要限流和裁剪,例如每线程只保留最近 20 条。
### 4.3 与现有模型的关系
当前已有:
- `ProjectUnderstandingSnapshot`
- `MasterAgentMemory`
- `threadContextSnapshots`
本次关系建议:
- `ProjectUnderstandingSnapshot` 继续保留,用于兼容现有项目级理解视图。
- `ThreadStatusDocument` 成为线程级主结构化状态。
- 项目级 `projectUnderstanding` 继续作为“项目展示层聚合结果”,但底层来源应逐步转向线程状态文档。
- `MasterAgentMemory` 继续负责长期记忆,不负责替代线程当前状态。
- `threadContextSnapshots` 继续负责上下文预算和风险状态,不负责承载项目理解正文。
## 5. 同步策略
### 5.1 全量理解刷新
触发场景:
1. 新设备导入后的首次理解
2. 已导入设备中,主 Agent 第一次接触某个线程
3. 用户明确要求主 Agent 接手当前项目
4. 检测到线程进入明显新阶段
5. 距离上一次全量理解已经超过阈值
行为:
- 向目标线程发起一次结构化“线程状态理解”任务
- 更新整份 `ThreadStatusDocument`
- 必要时同步更新 `ProjectUnderstandingSnapshot`
- 对主 Agent 会话补一条轻量进展提醒
### 5.2 轻量增量同步
触发场景:
1. heartbeat 检测到线程最近活跃
2. 线程刚回写了新执行结果
3. 但当前还没有进入需要完整深拉的关键阶段
行为:
- 不重做完整线程理解
- 只抽取一条轻量 `ThreadProgressEvent`
- 必要时更新 `ThreadStatusDocument` 中的少数字段:
- `currentProgress`
- `currentBlockers`
- `recommendedNextStep`
- `updatedAt`
### 5.3 关键时刻深拉
触发场景:
1. 主 Agent 要真正接手当前项目
2. 主 Agent 要发起线程调度或群聊协作
3. 主 Agent 要给出指导性的下一步开发建议
4. 当前线程状态文档和最近事件不足以支撑判断
行为:
- 向线程发起一次完整深拉
- 允许在这个关键时刻多花 token
- 更新线程状态文档并刷新主 Agent 的接手上下文
## 6. Prompt 组装策略
主 Agent 以后默认不再反复扫线程完整聊天历史。
新的理解顺序为:
1. 用户当前消息
2. 线程状态文档
3. 最近 3 到 5 条线程进展事件
4. 项目级长期记忆
5. 当前线程上下文预算和风险信息
6. 必要时才深拉线程
这样做的收益:
- token 成本更稳定
- 主 Agent 理解更连续
- 接手时不需要每次从零重新扫历史
## 7. 主 Agent 与线程的交互变化
### 7.1 线程状态理解 Prompt
全量理解时,线程不再返回泛化的“项目理解 JSON”而是更明确地返回线程状态文档字段。
要求:
- 只返回结构化 JSON
- 不返回无意义内部字段
- 不重复线程 ID、目录路径、设备 ID
- 只保留主 Agent 接手真正需要的事实
### 7.2 轻量事件 Prompt
增量同步时,线程不需要重写整份文档,只需返回:
- 是否进入新阶段
- 最近完成了什么
- 是否出现新阻塞
- 下一步是否变化
这类 prompt 需要尽量短,并显式禁止输出冗长总结。
## 8. 前台体验
### 8.1 主 Agent 会话
继续保留轻提醒,但来源改成“线程状态文档 + 最近进展事件”。
可见文案示例:
- `已同步线程状态:...`
- `最新进展:...`
- `建议下一步:...`
- `主 Agent 可接手:...`
### 8.2 线程详情 / 会话信息
新增一个只读入口:`线程状态`
展示内容:
- 当前目标
- 当前阶段
- 当前进度
- 技术架构
- 当前阻塞
- 建议下一步
- 关键文件
- 关键命令
- 最近更新时间
默认不可编辑。
### 8.3 已导入设备与新导入设备
两者统一走同一套机制:
- 新导入设备:首次理解
- 已导入设备:活跃线程持续增量同步
- 主 Agent 最终都读取同一套线程状态文档和最近进展事件
## 9. 约束与风险
### 9.1 不能把线程状态文档写进项目仓库
原因:
- 污染工作区
- 容易制造脏 diff
- 容易被误提交
- 多线程并行修改时易冲突
所以文档必须由 Boss 自己维护,并保存在 Boss 状态层。
### 9.2 不能完全放弃深拉
如果完全变成“只查文档”,主 Agent 会因为文档滞后而接手失败。
所以深拉仍然保留,但只在关键时刻触发。
### 9.3 增量事件必须限流
如果线程每次活动都写大段事件,最终只是把 token 压力从“全量理解”转移成“事件堆积”。
因此:
- 每线程只保留最近有限数量事件
- 重复事件应合并
- 明显无价值事件不写入
## 10. 分期实现建议
### 第一批
1. 新增 `ThreadStatusDocument`
2. 新增 `ThreadProgressEvent`
3. 新增线程状态文档的全量刷新任务
4. 主 Agent prompt 默认改为读取“线程状态文档 + 最近事件”
### 第二批
1. 新增轻量事件同步任务
2. 为 heartbeat / thread reply 增加“轻量事件优先、全量理解兜底”的策略
3. 主 Agent 会话补更稳定的轻提醒
### 第三批
1. 在线程详情或会话信息增加 `线程状态`
2. 对主 Agent 接手场景补更明确的接手卡片
3. 对阶段切换、阻塞变化做更强的事件归并
## 11. 验收标准
1. 主 Agent 平时不再因为线程每次活动都重跑完整项目理解。
2. 活跃线程继续推进时,主 Agent 仍能在较短时间内获得最新进展。
3. 当用户明确要求主 Agent 接手项目时,主 Agent 能依赖线程状态文档与最近事件快速进入正确上下文。
4. 不会向线程项目工作区写入状态文档文件。
5. APP 中能查看线程状态,但默认不可编辑。