Skip to content

feat(context): 为 Specialist 保留有效子任务约束,补齐长任务压缩与恢复 #215

Closed

Description

@NanaseInori

2026-10-14 完成与整理记录

已由 PR #239 集成至 main(实现提交 2215f2c0)。Specialist 的持久任务约束、修正/替换/撤回和跨 attempt 恢复已实现,现有测试检查多轮实际请求和数据库重开。按已完成关闭。

核对版本:main@88a7ba86。以下保留原问题/PR 说明。


问题

Specialist 当前依赖有限的近期历史和待消费父指令构建请求,缺少对子任务原始委托、仍有效的纠正和未完成事项的独立持续保留机制。

当早期父指令已被消费,并退出近期历史窗口,且没有另外写入持续保留的工作项、笔记或后续消息时,该指令可能不再进入后续请求。数据库保存着原记录,并不等于本轮模型仍能访问它。

审查基准:0e15d1d104fe535965cf68df50bca6f106f20d52。

影响范围:Go control plane、Specialist 请求构建、子代理指令投递与持久化恢复。

当前代码依据

  • internal/application/specialist_runner.go:maxSpecialistHistoryMessages = 12,maxSpecialistHistoryBytes = 64 * 1024;specialistRequestWithLayout() 选择近期历史,超过剩余字节预算的消息被跳过。这条路径没有调用主代理的持久历史压缩流程。
  • internal/store/specialist_context.go:listEligibleSpecialistContextMessagesTx() 只选择状态为 pending 的父代理指令;commitSpecialistContextTx() 在提交后将其标记为 consumed。
  • internal/application/specialist_context.go:子任务输入包括共同 Mission 目标、当前父指令、子代理工作项和笔记。共同 Mission 目标不必然包含某个子代理的具体委托和后续纠正。
  • 当前 Specialist 不提供工具,不能自行读取已经退出近期历史的原始记录。

主代理已有持久摘要,因此本项只针对子代理路径,不重复建设主代理功能。

触发场景

向某个 Specialist 发送具体委托,例如「仅检查鉴权模块,保持公共接口不变」。该消息成功消费后,继续多轮分析和补充输入,使最初消息退出最近 12 条历史;另增加独立的 64 KiB 历史预算压力场景。

若委托没有被另行保存为持续约束,当前请求可能只剩共同任务目标和近期讨论。预期仍能识别该子任务的当前范围、有效纠正与未完成事项,而不需要父代理每轮重新粘贴最初委托。

最小可用目标

第一阶段建立有界、有来源和版本绑定的子任务连续性记录,必须持续投递当前委托、仍有效纠正及必要的未完成事项。已消费只代表该次指令已交付,不能自动等同于该约束已经失效;明确替代或撤回的旧指令则不得重新生效。优先复用现有 child-owned WorkItem 的描述、验收条件及来源记录,补足投递保证,不另建重复任务系统。

将近期历史之外的可选背景收敛为有界、持久、可校验摘要可作为第二阶段;自动摘要生成不是第一阶段正确投递当前约束的前提。保留原始消息和证据指针,第一阶段应能在现有 no-tool Specialist 上独立工作;受限历史回读可以随后与有工具子代理接线,不以全面开放工具作为修复前提。

区分任务约束的生命周期与执行 attempt:同一 child 的仍有效委托应能跨重试 attempt 延续;每次投递及消费收据必须重新绑定当前 attempt,不能复用旧 attempt 的投递状态、lease 或执行授权。

单纯把 12 条改成更多条目,或假定模型会在回答里主动复述关键约束,都不能提供上述保证。

验收条件

  • 多轮测试使原始委托退出近期消息窗口,实际发出的请求仍包含当前有效的子任务范围、关键纠正和未完成事项。
  • 最近 12 条消息、64 KiB 历史字节上限及最终模型上下文窗口裁剪分别有回归;持续约束在最终实际请求中仍完整,必需内容无法容纳时明确停止或收敛,不静默丢失后继续。
  • 测试包含多次真实纠正、替代和撤回:保留当前约束,不复活被明确替代的旧约束。
  • 数据库重开后仍保留相同的当前约束和来源绑定;若实施第二阶段摘要,再验证压缩不会改写原始历史,摘要失败有明确且有界的处理方式。
  • 两个不同子代理的委托和摘要不能混用;同一 child 跨 attempt 保留仍有效约束,但投递/消费收据只绑定当前 attempt,不恢复旧 lease,父指令消费仍保持幂等。
  • 生成摘要若发起模型调用,其 token、费用和重试纳入现有预算;摘要不授予工具、凭据、审批或旧 lease。
  • 验收检查实际模型输入、持久记录和失败状态,不以模型偶然复述了目标作为唯一通过证据。

权限与非目标

本项涉及子代理上下文与持久化,不增加文件修改、Shell、网络或其他子代理的读取权限。历史材料仍是带来源的任务上下文,不恢复旧执行权限。若扩展持久协议,应补齐兼容、恢复和回滚读取边界。

证据边界

依据固定提交的历史选择和指令消费链路确认条件性缺口,不声称每个子任务都会丢失目标,也不声称已用真实模型复现错误交付。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions