Files
DevFlow/docs/02-架构设计/上下文根治设计-20261006.md
lxy 9ff26f0c8f 修复: 子代理报告双缺陷——熔断补收尾轮 + 报告新近度豁免
① 熔断无收尾轮: max_rounds 打满(达 effective_max 上界且未收敛)时, 旧逻辑直接 teardown 截断, 父任务/消费方拿到的是末轮思考独白而非任务报告。现补一次无工具收尾轮: system 指令「输出最终任务总结报告」+ tools=None(stream_round 空工具表), 成功则 push 报告文本+落库再走原收尾出口; 失败(全候选耗尽/MidStream/Stale)不重试不停靠, 静默落回原截断路径——报告是增益非闸门, 预算仅 1 轮 max_retries=0。

② 报告被视图压缩吞掉: summarize_tool_results 加新近度豁免(RECENCY_EXEMPT_TOOL_RESULTS=2), 末尾 2 条 tool_result 恒不压缩——豁免判定在冻结决策之前且不进决策表, 无前缀缓存漂移; 委托完成报告/末轮工具结果全文保留给 LLM 下一轮消费, 根治「>2KB envelope 下一轮即被 JSON 分支折叠 512 字符, 父 LLM 从未见过报告全文」。

测试: 新增 summarize_recency_exempt_keeps_last_two_tool_results 锁定豁免行为; cargo test -p devflow --lib 712 passed 0 failed; todo.md 两项销账。
2026-10-06 16:47:07 +08:00

16 KiB

上下文根治设计(2026-10-06)—— 治 223:1 结构性浪费

铁证:84cb104c 会话 2.2 天烧 4.3 亿 tokens,prompt:completion=223:1,日均 1.9 亿。 本质:每轮全量重发历史——轮数线性,token 爆炸,首 token 延迟同步恶化。不是 bug,是组装策略必然。 原则:分层组装取代全量重发;历史不删只降级(压缩可逆);对用户透明,对 agent 工具透明。

一、分层上下文(治"全量")

  • L1 常驻(固定小):system_prompt + pinned_goals + 任务状态卡。目标 <8K,永不随轮次增长。
  • L2 工作集(滑动窗口):最近 N 轮原文 + 当前任务活跃文件/结果。按"信息增益"滑动,非固定条数。
  • L3 检索层(按需召回):窗口外历史不进 prompt,转为可检索——关键词/语义命中才临时注入(复用 knowledge_inject 的检索管线,扩到对话历史)。
  • 无破坏性保证:所有降级内容原文全在库(L3 可召回+压缩可逆 C-r1),agent 能力不降级,丢的是"每轮都带全部家当"的浪费。

二、工具结果瘦身(治最大头,先行)

9386 条消息中 tool 4379 条——单条最大 8K+,是上下文膨胀主力。

  • 超阈值(如 2K)的工具结果:正文落盘(外置文件/独立表),上下文只留「头部 200 字摘要 + 句柄路径」。
  • 与 D2a(过期外置)同构一套机制,两处受益。
  • 句柄可被 agent 主动展开(read 句柄文件)——需要时找得回,不需要时不占位。

三、压缩升级(从"水位兜底"到"常规操作")

  • 现状:120K 水位才触发,1M 窗口下形同虚设。
  • 改:压缩不再是水位兜底,而是 L2→L3 的常规滑动——每轮组装时,窗口外的轮次自动结构化摘要(记忆卡形态,信息增益判据保留),原文留库可按段重载(C-r1)。

四、量化预期

  • prompt 均值 71K → 目标 ≤20K(工作集+召回),单轮成本/延迟降 70%+
  • 223:1 → 目标 ≤50:1(继续随 C-m 记忆卡质量优化)
  • 长会话不再有"轮数税"——206 轮与 6 轮的单轮成本趋同。

五、实施序(每阶段独立可交付,无破坏)

  • P1(S):工具结果瘦身(阈值落盘+句柄)——最大头先行,零行为变化
  • P2(M):L1/L2/L3 组装器重构(build_for_request 改造,窗口+检索)
  • P3(M):压缩常规化+记忆卡产出(C-m1)+按段重载(C-r1)
  • P4(S):量化验收(223:1→≤50:1 看板)+回归(agent 能力不降级测试集)

六、与旧 C 批次关系

本设计整合取代 C1-C6/C-m1-m3 的发散条目:C-r0(验证后台化)独立不变;C-m2(判据挂 pinned_goals)/C-r1(可逆)并入 P2/P3。旧条目销账以本档为准。

七、修订(2026-10-06 用户定调):从「分层组装」升级为「上下文调度系统」

定调:同会话连续工作是常态,设计目标不是控制会话长度,而是支撑无限长会话的资源调度——OS 虚拟内存同构:窗口有限,会话地址空间无限。 修正:撤回"百轮会话收敛拆分"建议;一~六节的 L1/L2/L3 保留为页管理基建,本节新增调度层。

调度系统设计(新增)

  • 页式单位:上下文按页管理——轮次页/工具结果页/文件页。页=换入换出与压缩的最小单位。
  • 热度调度:页带热度(最近访问/被引用频次)。热页驻工作集(L2);冷页压缩归档(L3,结构化摘要+原文留库);压缩不丢=冷页永远可召回。
  • 缺页召回:agent 引用历史(关键词/句柄/goal 关联)→检索命中→临时换入本轮上下文,用完即出——召回不计入常驻。
  • 任务聚类切换(切换能力的核心):工作集按任务/主题聚类重组,非纯时间窗口——用户在多任务间切换时,上下文随任务维度切换(当前任务的热页+该任务关联页),并行任务互不污染。任务边界=页的聚类标签(pinned_goals/主题标记)。
  • 调度目标函数:token 花在刀刃=按"任务相关性×信息增益"分配窗口配额;调度决策零 LLM 调用(规则引擎,成本为零)。

修订后的一句话

长会话=常态运行环境;上下文调度器=它的虚拟内存管理器;压缩可召回=它的 swap;任务聚类切换=它的进程调度。

八、再修订(2026-10-06 用户定调):跨会话调度与召回也是常态

定调:调度地址空间=会话内 + 跨会话。会话 A 的产出/结论,会话 B 工作中可召回引用——跨会话不是边界,是同一个页池的不同命名空间。

跨会话调度设计(新增)

  • 页命名空间分级:会话内页(默认私有) / 跨会话共享页(结论页/知识页/任务产出页,显式或按策略晋升共享)。
  • 跨会话召回:检索半径覆盖全页池——会话 B 缺页召回时,共享页与会话 A 的可召回页同池命中,带来源标注(「来自会话 X 的结论」)。
  • 与 knowledge 库关系:知识条目=最高等级的共享页(已晋升、已蒸馏);本设计的跨会话召回把"未蒸馏的对话产出"也纳入召回半径——knowledge 是终点,页池是全程。
  • 晋升机制:会话内页→(蒸馏/用户标记/高频跨任务引用)→共享页→(结构化)→knowledge 条目。晋升是单向门,防未蒸馏噪音污染共享池。

多人场景(预留位,下阶段设计)

  • 页带 owner 与 ACL 位;共享池分个人池/团队池;多人可召回引用=团队池+权限过滤。
  • 本期只预留页结构字段(owner/acl/scope),不做多人实现——接口先行,机制后置。

九、完整审视(2026-10-06 二次评审)——四个真问题与修正

问题1:机制并存未收敛(最重)

压缩机制(现有)/D2a 工具结果外置/L3 检索召回/knowledge 条目/页池——五个名字,一套事(都是"内容降级+可找回")。三次定调追加未合并同类项。 修正:统一收敛——唯一存储=页池,唯一调度器,唯一召回入口;压缩/D2a/knowledge 都是页池上的策略与晋升形态,不再作为平行系统各自演化。旧机制改造为页池前身,不新建平行通路。

问题2:实施范围失控风险

页池+晋升+跨会话+多人——北极星画完了,但一个桌面 app 一次吃下=过度设计。 修正:v1 范围锁死=单会话页池+极简调度器(recency+引用计数热度,goal 标签聚类,关键词缺页召回)+knowledge 照旧(它已覆盖跨会话召回大部分需求)。跨会话命名空间/晋升/多人=v2+,触发条件=单会话版实测后仍有跨会话痛点。基建等真实触发。

问题3:缺评估设计与调度可观测

"agent 能力不降级"怎么证?P4 的回归测试集不存在。 修正:①建任务回归集(固定任务清单,改造前后跑对比:完成质量/轮数/成本)②调度器可观测(页命中/召回率/换出量进日志与面板)③误调度代价显性化(热页误换出→下轮回查次数)。

问题4:与模型平台原生能力对齐未检查

模型侧可能原生提供上下文编辑/记忆工具(如 Claude 的 context editing/memory tool)——自研调度若与平台能力重复,应优先用平台原生(维护成本低、演化跟随厂商)。 修正:实施前先做平台能力对齐检查(一次调研任务),能用原生的不自研;自研部分聚焦平台没有的(任务聚类切换/跨会话页池)。

审视后的 v1 锁定范围(修正结论)

P1 工具结果瘦身 + P2 单会话页池与极简调度 + P3 压缩常规化(页池前身改造) + P4 评估集与量化。 七/八节的调度系统与跨会话设计降级为北极星方向;实施以本节 v1 范围为准。

十、知识引用注入的统筹与分工(2026-10-06 补充:第九节收敛的正向展开)

上下文生态的注入类型盘点:工具结果句柄/对话历史页/压缩摘要与记忆卡/knowledge 条目/pinned_goals/技能注入/规范注入——统筹不当=五套并行的重演。

分工矩阵(按蒸馏程度×生命周期×注入方式)

类型 蒸馏程度 生命周期 注入方式 角色
工具结果句柄 原始 任务内 agent 主动 read 展开 工作证据
对话历史页 轻摘要 会话内→跨会话(v2) 检索召回临时换入 过程记忆
压缩摘要/记忆卡 中蒸馏 会话长期 工作集常驻(摘要形态) 阶段结论
knowledge 条目 高蒸馏 永久 system_prompt 检索注入 沉淀规范
pinned_goals/任务态 实时 任务期 L1 常驻 当前意图

统筹四原则

  1. 单一来源:每种内容只有一个当前形态的家(原始在页池/蒸馏在 knowledge),晋升单向门,禁双存双写。
  2. 注入方式随蒸馏程度:越原始越被动(agent 主动拉/句柄展开),越蒸馏越主动(系统注入 prompt)——检索系统替 agent 省的每一分注意力,都来自上游的蒸馏质量。
  3. 召回入口统一:全部类型注册到同一检索面,agent 视角只有一个记忆系统(分类型返回,来源标注)——agent 不需要知道背后几套存储。
  4. 三层配额防炸弹:prompt 注入配额(既有 ≤20 条/1.5K)+每轮召回页配额(新增,如 ≤5 页)+句柄展开按需——总量有闸,信息炸弹在结构上不可能。

与既有机制对账

knowledge_inject(检索注入)=统筹第 4 行的既有实现,扩为统一检索面的注册方之一;compress(压缩)=第 3 行的产生器;D2a/P1(句柄)=第 1 行的产生器;审计 subscriber(H4)=统筹的观测面。无新系统,只有分工明确化。

十一、自主性原则(2026-10-06 用户定调:海纳川流,增强非依赖)

定调:CLAUDE.md/看板/外部规范/memory 等=可选输入源(海纳川流,有则增强);devflow 核心运作(知识/纪律/调度/领单)必须内生——外部全删,系统照常运作。

依赖矩阵重排

  • 内生核心(必需,无外部也运作):知识库条目(自己的注入面)/引擎层机制(B5b 看板轮询领单=运行时化,非提示词)/仓库 pre-commit hook(跟仓库走)/状态机与调度器。
  • 增强输入(可选,缺失不影响):CLAUDE.md 注入/共享技能(cm)/看板摘要/memory 召回/走查报告。
  • 迁移:CLAUDE.md 领单纪律降级为过渡形态,正解=①治理规则做成知识库条目(自己的记忆) ②领单引擎化(B5b)。pre-commit hook 从技能层迁仓库层(更内生)。

十二、顶层定调:广义知识库=知识载体总集(2026-10-06 用户定调)

定调:知识库=宏观概念,包含 kms/memory/skill/页池/knowledge/外部输入的一切知识载体。技能与记忆的"海纳+有效高质量引用"同属上下文知识库管理的一环。上下文调度系统的地址空间=全部载体。

载体谱系(蒸馏程度×形态×引用方式的光谱)

载体 形态 蒸馏/时效 引用方式 调度角色
会话页池 对话/工具原始页 原始/热 缺页召回换入 工作记忆
压缩摘要·记忆卡 结构化摘要 中蒸馏/温 工作集常驻 阶段结论
knowledge 条目 高蒸馏条目 高蒸馏/持久 system_prompt 注入 规范与沉淀
pinned_goals 意图态 实时 L1 常驻 当前意图
memory 文件 跨会话个人记忆 中蒸馏/持久 项目召回+按需 Read 跨会话自我认知
kms 文档 文档级知识 沉淀/冷 按需 Read 领域参考书
skill 可执行流程知识 沉淀/持久 触发执行(不是读,是跑) 能力包
外部输入(CLAUDE.md/看板/报告) 增强流 实时 注入/摄入 海纳川流

统筹原则扩展(在十节四原则之上)

  1. 载体按形态分工:陈述性知识走引用(页/条目/kms/memory),程序性知识走执行(skill)——"知道什么"引用,"会做什么"触发,引用与执行分治。
  2. 海纳=摄入管线统一:外部输入与内部产出进同一摄入管线(页池→蒸馏→晋升),skill 的沉淀也走此管线的"执行验证通过"分支——摄入不分内外,质量 gate 统一。
  3. 引用质量=相关性×蒸馏度×时机:高质量引用不是"多给",是"对的载体在对的时机以对的方式"——调度器的目标函数升级为此三元组。

对实施的影响

统一检索面(P2 细化)的注册方扩展至全载体(memory/kms/skill 的索引也注册);skill 特殊——注册的是"能力描述",命中时走执行而非注入。P2 工作量小幅上调,架构位置不变。

十三、devflow.md:项目认知投影文件(对标 CLAUDE.md,本土化超越)

定调:类似而非照搬,青出于蓝。CLAUDE.md=用户手写的静态注入;devflow.md=agent 自主维护的活的项目认知投影——从"每次启动读一遍死文件"升级为"分层分区的活上下文"。

与 CLAUDE.md 的能力对照

维度 CLAUDE.md devflow.md
维护者 用户手写 agent 自动维护为主,用户可写覆盖
形态 纯文本一次读 结构化分区,分区独立刷新
时效 启动读一次静态 启动读取+运行中事件驱动刷新(警示/状态可中途生效)
内容 手写规范 规范(迁移自 CLAUDE.md)+状态投影(HEAD/看板摘要/活跃任务,自动)+知识投影(按当前任务相关性从页池/knowledge 拉)
兼容 — 海纳:项目存在 CLAUDE.md 则自动并入投影(增强非依赖,呼应第十一节)

四分区设计

  1. 规范纪律区(低频):领单纪律/提交规范/红线——从现 CLAUDE.md 迁移;用户手写优先,agent 建议追加需用户确认。
  2. 项目状态区(高频自动):HEAD/分支/未提交数/看板摘要/活跃任务——每次刷新重写,机器事实源(防凭记忆汇报的文件化)。
  3. 知识投影区(任务相关):当前任务关联的 knowledge 条目/记忆卡/页池热页摘要——调度器按相关性投喂,会话切换即换。
  4. 警示区(事件驱动):挂机必读/外部干预告知/退回说明——事件触发插入,读后标记已消费。

机制要点

  • 读取:会话启动读 devflow.md(存在则并入;CLAUDE.md 同目录存在也并入,优先级 devflow.md > CLAUDE.md)——两者都没有,按知识库内生纪律照常运作(第十一节自主性)。
  • 刷新:状态区/警示区事件驱动重写(写者唯一=状态投影器);运行中会话的刷新对下一轮组装生效。
  • 边界:devflow.md 是投影不是真相——真相在引擎/DB/页池;文件损坏可随时重建(从真相源再生成)。

十四、devflow.md 多角色论证收敛(2026-10-06 /swarm:怀疑者+行业对标+实施务实+用户代言四方)

三路论证共识(全部指向同一结论)

运行中文件刷新(原十三节设计)砍除——①架构矛盾:system_prompt/volatile_tail 是 loop 不变量(启动组装一次,mod.rs:138/:441),中途改文件对运行中 loop 零生效;②token 代价:兑现刷新需破坏 provider prompt 缓存前缀,每轮重算 system 段=token 实涨(违背知识管理高效原则);③行业零先例(全行业规则文件均会话级加载),高风险无容错。 替代(零新机制):中途更新走既有 insert 消息范式(insert_stall_warning/insert_goal_verify_nudge/inject_runtime_message——往 conv.messages 尾插,build_for_request 每轮自然重组,天然下一轮生效,G2 已在用)。

行业对标关键结论

验证有效:agent 生成规则(Cursor)/按相关性加载(Agent Requested+repo map)/跨会话持久。已证为坑:init fossilization/只增不删/多源漂移/静默截断。 真空白护城河(坚持):状态机器投影(五家工具无一把工作流状态写入记忆文件)+警示事件驱动插入——但载体不是文件,是 insert 消息范式+DB 直注。 同质化区(兼容):纪律区做得像 CLAUDE.md 越利于兼容——创新在投影/警示/领单,不在文件格式标新立异。

定稿:v1 MVP 切片(S-M)

  1. 启动读取:devflow.md(两分区:规范纪律+领单)+CLAUDE.md 并入→build_runtime_prompt 第七段纯追加(两条组装路径都接);文件读取微秒级,注入的 token 才是成本——内容按相关性裁剪,禁全量。
  2. 警示区:事件→insert 消息范式(零新机制);非文件分区。
  3. 状态:不文件化——DB 直注(build_context_lists 既有,比文件投影更新鲜)+H3 git 实测(已有)。
  4. 知识投影:knowledge_inject 既有+补相关性元数据(行业经验:规则死于描述,元数据决定拉取质量)。

v2+(北极星,触发制)

agent 自主维护协议/知识投影动态化/跨会话投影——v1 实测后按真实痛点渐进。

token 高效三律([补 1] 原则落定)

①不破坏 prompt 缓存前缀 ②投影内容按相关性裁剪禁全量注入 ③文件读取不花钱,注入 token 才花钱——一切设计以"注入的 token 换来的决策价值"为核算单位。