ADR 0009: 场景分诊编排、Research 子 agent 与子 agent 技能隔离
状态: Accepted(2026-08-06) 日期: 2026-08-06 上级: ADR 0002(薄工作流内核 / 纯 Prompt + goal 架构)
背景
opencode-cabbage 的 @dev-lifecycle 是一条单线、面向新功能开发的流水线(setup → requirements → design → tasks → code → review → release),对 Bug 修复、紧急修复(hotfix)、业务调整、重构、技术债、基础设施、文档、回滚等常见场景强制套用重量模型,适用性不足。同时:
flow-requirements的决策映射定义了Research型 Ticket,但无执行者,调研落空。- 子 agent(architect/developer/reviewer/goal-verify)可加载任意 skill,无职责边界,易越权加载无关技能。
- 需求 / 设计阶段如需技术可行性调研,无专门承接。
决策
采用「场景分诊编排 + 独立 Research 子 agent + 子 agent 技能隔离」架构:
dev-lifecycle升级为场景分诊编排器:新增 Phase 0 场景分诊,内联权威路由表(新功能 / Bug 修复 / 紧急修复 / 业务调整 / 重构 / 技术债 / 基础设施 / 文档 / 回滚 / 调研),按输入特征分派到「完整功能流」或「轻量路径」;轻量路径复用flow-tdd/flow-code/flow-review/flow-release与 goal 工具,跳过 requirements/design/tasks 重量模型。- 新增
@researcher子 agent +flow-researchskill:独立承接 Research 型 Ticket 与调研场景,产出docs/dev/research/<topic>.md;方法论融合research(后台核查、一手来源)、deep-research(迭代深化、来源评分、反方搜索、置信度、元评审)、deep-thinking(决策自检)。 - 异常处理接入
@deep-think升级:Task 失败重试 3 次后、以及连续 continuation 无可验证进展时,先派发更强模型系统审视根因与替代方案,再 Pause 求助。 - 子 agent 技能隔离:通过 OpenCode agent
permission.skill(模式→动作)默认deny全部 skill,仅放行各自归属技能;tools布尔已废弃,改用permission.skill。 - 非功能场景 SOP 文档化:写入
docs/guides/sops/(一场景一文档),作为人工参考,不随插件分发;运行时权威分派逻辑在dev-lifecyclePhase 0。
备选方案
| 方案 | 说明 | 否决理由 |
|---|---|---|
| 新增独立 primary 路由器 agent | 由 @flow-router 判断输入并转发 | 每会话仅一个 primary 槽位,新增产生入口歧义;分诊本质是决策,作为 dev-lifecycle 首个 Phase 更自然 |
Research 并入 @architect | 不加新 agent,architect 加载调研 skill | 用户明确要求独立 Research subagent;调研与设计职责分离更清晰 |
用 agent tools 布尔限制技能 | tools: { "<skill>": false } | schema 标注 tools 已废弃,官方改推 permission 字段;且 permission.skill 支持模式匹配更精确 |
| 一 SOP 一 skill 全量实现 | 为 hotfix/docs/rollback 也建独立 skill | YAGNI:这些场景由编排 + 复用现有 skill 足够,单独建 skill 过度设计 |
后果
- 正向:开发生命周期从「仅功能流」扩展为「多场景 + 轻重两级」,常见非功能场景有明确路径。
- 正向:Research 型 Ticket 有独立执行者,调研产出结构化、可追溯。
- 正向:子 agent 职责边界清晰,技能隔离降低越权加载与上下文污染。
- 风险:
permission.skill依赖 OpenCode 运行时的 skill→模式匹配语义,弱模型可能绕过——缓解:prompt 内显式声明技能归属 + prompt-lint 校验资产一致性。 - 风险:新增 Research 能力后 skill 由 8 → 9,需同步更新收敛测试——缓解:
test/skills.test.ts已更新期望清单。 - 风险:场景分诊依赖模型判断输入类型,可能误判——缓解:无法确定时暂停询问用户,不擅自选择。