会话绑定频道无关计划
概述
本文档定义了长期的频道无关会话绑定模型,以及下一次实现迭代的具体范围。
目标:
- 让 subagent 绑定的会话路由成为核心能力
- 将频道专属行为保持在适配器中
- 避免正常 Discord 行为的回归
为什么要做
当前行为混合了:完成内容策略、目标路由策略、Discord 专属细节。
这导致了诸如:并发运行时主频道和线程的重复投递、复用绑定管理器时的过期 token 使用、webhook 发送缺少活跃度计数等边缘情况。
第一轮迭代范围
本次迭代有意限制范围。
1. 添加频道无关的核心接口
添加绑定和路由的核心类型和服务接口。
核心类型包括 BindingTargetKind、BindingStatus、ConversationRef、SessionBindingRecord。
核心服务契约包括 SessionBindingService(bind、listBySession、resolveByConversation、touch、unbind)。
2. 添加一个核心投递路由器
添加单一的完成事件目标解析路径。本迭代只路由 task_completion,其他事件类型的现有路径保持不变。
3. Discord 保持为适配器
Discord 仍是第一个适配器实现,负责创建/复用线程会话、通过 webhook 或频道发送发送绑定消息、验证线程状态、映射适配器元数据。
4. 修复已知正确性问题
- 复用线程绑定管理器时刷新 token 用量
- 为基于 webhook 的 Discord 发送记录出站活跃度
- 停止在会话模式完成中为绑定线程目标做隐式主频道回退
5. 保持当前运行时安全默认值
禁用线程绑定 spawn 的用户没有行为变更。默认:channels.discord.threadBindings.spawnSubagentSessions = false。
不在第一轮迭代中
显式延后:ACP 绑定目标、Discord 之外的新频道适配器、所有投递路径的全局替换、协议级变更、绑定持久化的存储迁移/版本重设计。
路由不变量
本迭代的强制不变量:
- 目标选择和内容生成是独立步骤
- 如果会话模式完成解析到活跃的绑定目标,投递必须瞄准该目标
- 不允许从绑定目标到主频道的隐藏重路由
- 回退行为必须显式且可观测
兼容性和上线
- 关闭线程绑定 spawn 的用户无回归
- 本迭代不改变非 Discord 频道
上线步骤:着陆接口和路由器(在当前功能门控后),路由 Discord 完成模式绑定投递通过路由器,保留非绑定流的遗留路径,用定向测试和金丝雀运行时日志验证。
第一轮迭代所需测试
- 管理器 token 轮换使用复用后的最新 token
- webhook 发送更新频道活跃度时间戳
- 同一请求方频道中两个活跃绑定会话不重复到主频道
- 绑定会话模式运行的完成仅解析到线程目标
- 禁用 spawn 标志保持遗留行为不变
提案实现文件
核心:src/infra/outbound/session-binding-service.ts(新)、src/infra/outbound/bound-delivery-router.ts(新)、src/agents/subagent-announce.ts。
Discord 适配器和运行时:src/discord/monitor/thread-bindings.manager.ts、src/discord/monitor/reply-delivery.ts、src/discord/send.outbound.ts。
第一轮完成标准
- 核心接口存在并已接入完成路由
- 上述正确性修复已合并并有测试
- 绑定会话模式运行无主频道和线程重复完成投递
- 禁用绑定 spawn 部署无行为变更
- ACP 保持显式延后