← 上游 issue 专栏 · infra · 架构 RFC
#20architecturedshmultiagent2026-10-20
mch 机队架构升级:durable task graph + session control-plane split
状态:proposed · owner:infra · 目标:先批准 Phase 0 只读影子,不直接改生产
决策请求:是否批准 Phase 0 只读影子 DAG + 影子会话索引?只记录、不执行、不重启、不切换活跃 turn;用 31 unit 的现读数据判断新架构是否值得进入单 unit canary。
① 问题与证据
| 证据 | 现读 |
| 控制面/数据面耦合 | mch20 主会话约 106MB,session/list 44s;mch16 415MB、11h 无事件;mch1 1.1–2.4s(反例,说明不是所有 unit 都慢)。 |
| 执行单元是聊天 turn | turn 结束/进程退出会丢执行;mch5 曾出现“本轮完成前退出”。 |
| 关键路径是等待链 | mch1 R15-B 已实现,R15-A/R16 都在等 T8 的 A→B→C serial + count/ledger。 |
| child 数不等于效率 | 9 项目 job_time_share 60–118%,但 >100% 是口径重叠;mch16 有 99 child 但 11h 无事件。 |
| 任务契约缺失 | 没有 durable ready queue/lease;merge/review 在回合末集中收口,容易波次化。 |
② 提案:三层架构升级
A. 会话数据面 / 控制面分离
- JSONL 仍是唯一权威;新增每 unit 增量投影索引,列表只查摘要;
- session-list、索引、压缩移到侧车进程,不阻塞主线程;
- 旧 session 分段/正文外置/游标分页;索引可删除重建,按水位幂等回放。
B. 执行层:durable task graph + lease
- 聊天 turn 降为交互层;任务落盘依赖、写集、验收、预算、幂等键;
- 空闲执行器 lease 领取 ready task;fencing 防双提交;
- pipeline:完成即验收补位,不做整批等待;默认 16 不变。
C. 任务协议:Task Card + 写集锁 + merge queue
- 每任务先声明
depends_on / writes / reads / interface / acceptance / budget;
- 共享文件单一 integrator;merge queue 串行合并;reviewer 独立验收;
- 不按 child 数计功,只按验收通过的任务与关键路径计。
配套:gpt-6.1-sol 做 planner/高风险 reviewer,DeepSeek 做边界清晰 worker;测试影响图 + 密封缓存 + 异步全量门;持久状态机 + outbox + fencing。
③ 迁移阶段
- Phase 0(1–2 天,只读):固定 16/16/32;影子 DAG 只记录;影子索引只读日志;不重启、不切活跃 turn。
- Phase 1(单 unit canary):选一个空闲 alpha unit;只让新任务走新队列/索引;旧任务原地完成;24h、≥100 终态、零重复/零丢失才扩大。
- Phase 2(3 → 8 unit):逐级扩围;每级看 p95、完成量、重试、成本、冲突;任一门退化即回滚该批。
- Phase 3(31 unit):全量资格门 + owner 签署;保留旧日志/旧路由回滚窗;不强制 64。
④ 验收门(目标,不是实测)
| 维度 | 目标 |
| 热列表 p95 | ≤1s |
| 冷列表 p95 | ≤3s |
| 关键 RPC 退化 | ≤10% |
| 主线程阻塞 p99 | ≤100ms |
| 固定工作量 cycle time | 降 ≥20% |
| 验收通过任务/小时 | 不降 |
| 重复执行/冲突返工 | 0 未解释 / 不升 |
⑤ 非目标与风险
- 不把 child 数、maxWIP、job_time_share 当效率;不强制全队 64;
- 不在 mch1/mch5 活跃时做生产实验;不删除旧日志、不双权威;
- 不用“无事件”直接判死或重启;
- 风险:索引漏更新、双执行、迁移期兼容、模型路由返工;全部用影子/故障注入/canary 验证。
一句话:先做只读影子,证明“增量索引 + durable DAG”能把关键路径和列表等待降下来,再谈生产切换;这比继续加 child 或调 prompt 更难,但收益更大。