929 lines
35 KiB
Markdown
929 lines
35 KiB
Markdown
# 调研报告:挑战/评审体系 + 质量门控结构化
|
||
|
||
**日期**: 2026-05-15
|
||
**作者**: 庞统士元 (pangtong-fujunshi)
|
||
**版本**: v2.6-research-03
|
||
**用途**: moziplus v2.6 AI Native DevOps 平台设计参考
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [课题 3:挑战/评审体系设计](#课题-3挑战评审体系设计)
|
||
- [已有经验](#已有经验知识库wiki--v10-三层实践)
|
||
- [业界优秀实践对比表](#业界优秀实践对比表课题3)
|
||
- [v1.0 三层体系评估](#v10-三层体系评估)
|
||
- [推荐方案](#推荐方案课题3)
|
||
- [课题 5:质量门控结构化](#课题-5质量门控结构化)
|
||
- [业界优秀实践对比表](#业界优秀实践对比表课题5)
|
||
- [推荐方案:评审结果存储与结构](#推荐方案评审结果存储与结构)
|
||
|
||
---
|
||
|
||
## 课题 3:挑战/评审体系设计
|
||
|
||
### 已有经验(知识库/wiki + v1.0 三层实践)
|
||
|
||
#### 知识库已有调研
|
||
|
||
我们在 `gate-mechanism-research.md`(2026-05-11)中已经做过一轮质量门控调研,识别出四种模式:
|
||
|
||
| 模式 | 代表项目 | 强制力 | 信任模型 |
|
||
|------|---------|--------|---------|
|
||
| LLM 自律型 | Claude Code、PAV skill | ❌ 弱 | 信任 LLM |
|
||
| 角色分工评审 | oh-my-claudecode | ⚠️ 中 | 不信任,靠隔离 |
|
||
| Guardrail 中断 | OpenAI Agents SDK | ✅ 强 | 不信任,靠代码 |
|
||
| DAG 条件流转 | TradingAgents / LangGraph | ✅ 强 | 不信任,靠结构 |
|
||
|
||
**核心结论**(上一轮调研):
|
||
1. 业界共识:不信任 LLM 自律
|
||
2. 检查的是产出,不是过程
|
||
3. Guard 定义与执行分离(声明式规则 + 代码层执行)
|
||
4. 失败处理有层级:block → retry → escalate
|
||
5. 不同任务类型不同标准
|
||
|
||
#### v1.0 三层挑战控制回顾
|
||
|
||
moziplus v1.0 PRD 定义了三层挑战:
|
||
|
||
| 层级 | 机制 | 参与者 | 触发时机 |
|
||
|------|------|--------|---------|
|
||
| **第 1 层**:Agent 自律 PAV | Plan→Act→Verify skill | 执行者自己 | 每个节点开始时 |
|
||
| **第 2 层**:节点 review | 司马懿独立评审 | 司马懿(或挑战者池) | 每个节点完成时 |
|
||
| **第 3 层**:最终整合审查 | 庞统汇总 + 司马懿终审 | 庞统 + 司马懿 | 任务完成时 |
|
||
|
||
PRD 的铁律 IR-1 规定:**每个任务至少 2 个 Agent(做 + 挑战)**。IR-2 规定:**每个节点都是 Plan → Execute → Validate**。
|
||
|
||
#### v2.6 架构现状
|
||
|
||
v2.6 架构文档中:
|
||
- 任务状态流转:`pending → claimed → working → review → done`(review 是状态机中的一个状态)
|
||
- review → pending(审核不通过打回)是合法转换
|
||
- 挑战者由庞统在黑板上分配(`assigned_by` 字段)
|
||
- 评审结果目前只有 `comments` 表(自然语言评论),缺乏结构化
|
||
|
||
---
|
||
|
||
### 业界优秀实践对比表(课题3)
|
||
|
||
#### 1. Superpowers:三阶段审查(implementer → spec reviewer → code quality reviewer)
|
||
|
||
**项目**: [obra/superpowers](https://github.com/obra/superpowers) — Agentic Skills Framework for Claude Code
|
||
|
||
**核心机制**:
|
||
|
||
Superpowers 的 subagent-driven-development 流程采用**两阶段串行审查**(不是三阶段,实际是两个独立 reviewer 串行执行):
|
||
|
||
```
|
||
Implementer subagent 执行任务
|
||
↓
|
||
Spec Reviewer subagent → 检查实现是否符合计划/需求规格
|
||
↓ (必须通过)
|
||
Code Quality Reviewer subagent → 检查代码质量(clean, tested, maintainable)
|
||
↓
|
||
下一任务
|
||
```
|
||
|
||
**关键设计细节**:
|
||
|
||
| 维度 | Spec Reviewer | Code Quality Reviewer |
|
||
|------|--------------|----------------------|
|
||
| **关注点** | 实现是否匹配计划 | 代码是否干净/可测/可维护 |
|
||
| **检查内容** | 功能完整性、与计划偏离、遗漏需求 | 单一职责、接口清晰度、测试覆盖 |
|
||
| **模型选择** | 用最强模型 | 用最强模型 |
|
||
| **顺序** | 先执行(必须通过) | 后执行(spec 通过后才触发) |
|
||
| **失败处理** | 标记偏离,返回给 implementer | 修改建议返回给 implementer |
|
||
|
||
**Implementer 报告四种状态**:
|
||
- `task_completed` — 完成且无需修改
|
||
- `task_completed_with_notes` — 完成,但有注意事项
|
||
- `task_blocked` — 被阻塞,需要人介入
|
||
- `task_failed` — 失败
|
||
|
||
**关键洞察**:
|
||
- **审查粒度是每个任务,不是每个文件** — 每个 subagent 完成一个 engineering task 后立即审查
|
||
- **串行门控** — spec review 必须通过后才做 code quality review,两个是串联的
|
||
- **审查者也是独立 subagent** — 不是同一个 agent 的不同角色,是独立的 spawned agent
|
||
- **并行执行但串行审查** — 多个 independent tasks 可以并行执行,但每个 task 的审查是串行的(参考 issue #469)
|
||
- **不靠 LLM 自律** — 审查是系统自动触发,不依赖 implementer 自觉
|
||
|
||
#### 2. TradingAgents:多空辩论(Bull↔Bear + Judge 裁决)
|
||
|
||
**项目**: [TauricResearch/TradingAgents](https://github.com/TauricResearch/TradingAgents) — Multi-Agent LLM Financial Trading Framework
|
||
|
||
**核心机制**:
|
||
|
||
TradingAgents 构建了**5 层结构化对抗**:
|
||
|
||
```
|
||
[4 位分析师并行] → 各自独立分析
|
||
↓
|
||
[Bull Researcher ↔ Bear Researcher] → 多空辩论(交替辩论,最多 max_debate_rounds 轮)
|
||
↓
|
||
[Research Manager] → 裁决,综合双方论据
|
||
↓
|
||
[Trader(3 级风险偏好)] → 根据研究报告做交易决策
|
||
↓
|
||
[Aggressive ↔ Conservative ↔ Neutral] → 风控三方辩论
|
||
↓
|
||
[Portfolio Manager] → 最终决策(Buy/Overweight/Hold/Underweight/Sell)
|
||
```
|
||
|
||
**关键设计细节**:
|
||
|
||
| 维度 | 研究辩论 | 风控辩论 |
|
||
|------|---------|---------|
|
||
| **参与者** | Bull vs Bear(2 方) | Aggressive vs Conservative vs Neutral(3 方) |
|
||
| **轮次控制** | `max_debate_rounds` 限制 | 条件边 `should_continue_debate` |
|
||
| **裁决者** | Research Manager | Portfolio Manager |
|
||
| **输出** | 综合研究报告 | 最终交易决策 |
|
||
|
||
**条件边实现**(LangGraph):
|
||
```python
|
||
workflow.add_conditional_edges(
|
||
"Bull Researcher",
|
||
should_continue_debate,
|
||
{
|
||
"Bear Researcher": "Bear Researcher",
|
||
"Research Manager": "Research Manager"
|
||
}
|
||
)
|
||
```
|
||
|
||
**关键洞察**:
|
||
- **结构化对抗 = 特殊的 Exit Gate** — 不是检查产出文件,而是校验**决策质量**
|
||
- **辩论机制天然提供多视角审查** — 不需要额外的 reviewer agent
|
||
- **条件边让流转逻辑图化、可验证**
|
||
- **适用于需要多角度论证的决策场景** — 投资/交易/方案选择
|
||
- **2026-04 v0.2.4 新增**:structured-output agents(Research Manager/Trader/Portfolio Manager),LangGraph checkpoint resume
|
||
|
||
#### 3. oh-my-claudecode:ralplan(Planner→Architect→Critic 三方共识)
|
||
|
||
**项目**: [Yeachan-Heo/oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode) — Teams-first Multi-agent orchestration for Claude Code
|
||
|
||
**核心机制**:
|
||
|
||
ralplan(Radical Planning)编排三个专业 Agent,在迭代循环中达成共识:
|
||
|
||
```
|
||
Planner Agent → 输出初始计划
|
||
↓
|
||
Architect Agent → 从架构视角审查/修正
|
||
↓
|
||
Critic Agent → 从批判视角挑战
|
||
↓
|
||
是否达成共识?
|
||
├── 是 → 输出最终计划
|
||
└── 否 → 回到 Planner,循环继续
|
||
```
|
||
|
||
**三种模式**:
|
||
|
||
| 模式 | 命令 | 适用场景 |
|
||
|------|------|---------|
|
||
| 基础模式 | `ralplan "描述"` | 普通规划 |
|
||
| 共识模式 | `ralplan --consensus "描述"` | 重要决策 |
|
||
| 深思熟虑模式 | `ralplan --deliberate "描述"` | 高风险场景 |
|
||
|
||
**Critic 角色**(继承自 oh-my-claudecode 的 Critic 设计):
|
||
|
||
| 阶段 | 描述 |
|
||
|------|------|
|
||
| 预判 Pre-commitment | 读代码前先预测 3-5 个最可能的问题 |
|
||
| 验证 Verification | 逐一检查每个文件引用和函数调用 |
|
||
| 多视角审查 Multi-perspective | 安全/运维/新人三个角度 |
|
||
| 缺口分析 Gap analysis | 主动找"缺失的东西" |
|
||
| 自审 Self-audit | 低置信度发现降级为 Open Questions |
|
||
|
||
**Critic 工具限制**:`disallowedTools: Write, Edit` — 硬编码禁用修改工具,保证评审独立性。
|
||
|
||
**Verdict 只有 4 种**:REJECT / REVISE / ACCEPT-WITH-RESERVATIONS / ACCEPT
|
||
|
||
**关键洞察**:
|
||
- **三方共识比双方更健壮** — Planner(规划) + Architect(架构) + Critic(批判),三方相互制衡
|
||
- **共识模式有明确退出条件** — 达成共识或超时
|
||
- **Critic 工具被硬编码禁用** — 不是 prompt 建议,是代码层面的限制
|
||
- **适合规划/设计阶段,不适合执行阶段** — ralplan 产出的是计划,不是代码
|
||
- **每种模式有不同的严谨程度** — 按风险级别选择
|
||
|
||
#### 4. OpenAI Agent SDK:OutputGuardrail + 声明式 Guardrail
|
||
|
||
**项目**: [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/guardrails/) — 官方 Agent 框架
|
||
|
||
**核心机制**:
|
||
|
||
OpenAI Agent SDK 提供三种 Guardrail:
|
||
|
||
| 类型 | 触发时机 | 作用 |
|
||
|------|---------|------|
|
||
| **Input Guardrail** | Agent 执行前 | 检查输入合法性 |
|
||
| **Output Guardrail** | Agent 执行后 | 检查产出达标 |
|
||
| **Tool Guardrail** | 每次工具调用前后 | 检查工具调用合法性 |
|
||
|
||
**Tripwire 机制**:
|
||
```python
|
||
@output_guardrail
|
||
async def guardrail_fn(ctx, agent, output):
|
||
result = await Runner.run(guardrail_agent, output)
|
||
return GuardrailFunctionOutput(
|
||
tripwire_triggered=result.final_output.is_invalid # True = 立即中断
|
||
)
|
||
```
|
||
|
||
**执行模式**:
|
||
- `blocking`(推荐)— Guardrail 先执行,通过后才启动主 Agent
|
||
- `parallel` — Guardrail 和主 Agent 同时跑(不适合长任务 Agent,因为 token 已消耗)
|
||
|
||
**关键洞察**:
|
||
- **Guardrail 本身也是 Agent** — 可以用小模型做快速检查,成本可控
|
||
- **触发 tripwire = 抛异常 = 流程立即停止** — 代码层面的强制执行
|
||
- **声明式定义 + 程序式执行** — 规则声明为函数/配置,执行由框架保证
|
||
- **Input Guardrail 只在第一个 Agent 执行,Output Guardrail 只在最后一个 Agent 执行**
|
||
- **Tool Guardrail 粒度最细** — 每次工具调用都可以检查
|
||
|
||
#### 5. 其他优秀实践
|
||
|
||
##### 5.1 Edict 的门下省审核(封驳打回机制)
|
||
|
||
**项目**: [cft0808/edict](https://github.com/cft0808/edict) — 三省六部制 Multi-Agent Orchestration
|
||
|
||
**核心流程**:
|
||
```
|
||
皇上 → 太子分拣 → 中书省规划 → 门下省审议 → 尚书省派发 → 六部执行 → 回奏
|
||
↑ │
|
||
└── 封驳打回 ─────┘
|
||
```
|
||
|
||
**门下省角色**:
|
||
- **质量管控中心** — 对中书省方案进行质量评审、风险识别与标准把控
|
||
- **封驳权** — 不合格方案可直接"封驳",打回中书省重新规划
|
||
- **状态机**:`已派发 → 执行中 → 待审查 → 已完成`,中间可 `阻塞 Blocked`
|
||
|
||
**关键洞察**:
|
||
- 封驳打回是一种**方向级否决** — 不只是修改建议,而是"方案不对,重来"
|
||
- 门下省是**独立于执行链的审核层** — 不参与执行,只负责审核
|
||
- 类似 moziplus 中司马懿的角色定位
|
||
|
||
##### 5.2 wanman 的评估引擎(三阶段 explore→evaluate→execute)
|
||
|
||
**项目**: [chekusu/wanman](https://github.com/chekusu/wanman) — Agent Matrix Runtime
|
||
|
||
**核心流程**:
|
||
```
|
||
Explore 阶段 → 多 Agent 并行探索,收集方案
|
||
↓
|
||
Evaluate 阶段 → 评估引擎打分(4 维度加权)
|
||
↓
|
||
Execute 阶段 → 执行最优方案
|
||
```
|
||
|
||
**评估维度**(据 PRD 中描述):
|
||
- **Feasibility**(可行性)
|
||
- **Risk**(风险)
|
||
- **Impact**(影响)
|
||
- **Cost**(成本)
|
||
|
||
**信心度机制**:信心度 < 0.7 升级到人工审批。
|
||
|
||
**关键洞察**:
|
||
- **量化评估**比定性评估更可追溯 — 4 维度加权打分,不是"感觉行不行"
|
||
- **阈值自动升级** — 信心度低于阈值自动升级,不需要人判断
|
||
- **适合方案选择场景** — 多个方案用同一标准评估
|
||
|
||
##### 5.3 SWE-agent 的 RetryLoop(多次尝试 + Reviewer 选最优)
|
||
|
||
**项目**: [SWE-agent/SWE-agent](https://github.com/SWE-agent/SWE-agent) — AI Software Engineering Agent
|
||
|
||
**核心机制**:
|
||
|
||
```yaml
|
||
agent:
|
||
type: retry
|
||
retry_loop:
|
||
cost_limit: 6.00
|
||
max_attempts: 3
|
||
agent_configs:
|
||
- <config 1> # 可能用不同的 prompt
|
||
- <config 2> # 可能用不同的 model
|
||
```
|
||
|
||
- **多次独立尝试** — 可以用不同配置(prompt/model/参数)尝试多次
|
||
- **预算继承** — 每次尝试继承上一次失败后剩余的预算,不浪费
|
||
- **Reviewer LLM** 选最优 patch(`tools/review_on_submit_m`)
|
||
- **Trajectory 审计** — 每次尝试的完整轨迹都保存,可回溯
|
||
|
||
**关键洞察**:
|
||
- **多尝试优于单次完美** — LLM 输出有随机性,多次尝试取最优是务实策略
|
||
- **Trajectory 是审计基础** — 完整保留每次尝试的过程,可以对比分析
|
||
- **实际效果**:SWE-agent 团队承认 reviewer 有时"rejects correct patches" — LLM 评审不是万能的
|
||
|
||
#### 综合对比表
|
||
|
||
| 项目 | 审查模式 | 强制力 | 粒度 | 协商轮次 | 失败处理 | 声明式 |
|
||
|------|---------|--------|------|---------|---------|--------|
|
||
| **Superpowers** | 串行双审(spec→quality) | ✅ 系统触发 | 每任务 | 0(只审不改) | 返回 implementer | ❌ 硬编码 |
|
||
| **TradingAgents** | 多空辩论 + 裁决 | ✅ 图结构 | 每决策 | max_debate_rounds | 裁决者决定 | ✅ 条件边 |
|
||
| **oh-my-claudecode** | 三方共识循环 | ⚠️ prompt | 规划阶段 | 共识达成 | 循环/超时 | ❌ prompt |
|
||
| **OpenAI Agent SDK** | Input/Output Guardrail | ✅ 代码层 | 每工具调用 | 0(tripwire) | 抛异常停止 | ✅ 声明式 |
|
||
| **Edict** | 门下省封驳 | ⚠️ 状态机 | 每方案 | 封驳打回 | 打回中书省 | ✅ 状态机 |
|
||
| **wanman** | 量化评估打分 | ✅ 阈值 | 每方案 | 0 | 低于阈值升级 | ✅ 声明式 |
|
||
| **SWE-agent** | 多次尝试取最优 | ✅ 代码层 | 每任务 | max_attempts | reviewer 选最优 | ✅ YAML 配置 |
|
||
|
||
---
|
||
|
||
### v1.0 三层体系评估
|
||
|
||
#### 三层体系分析
|
||
|
||
| 层级 | 机制 | 优点 | 缺点 |
|
||
|------|------|------|------|
|
||
| **第 1 层:PAV** | Agent 自律 Plan→Act→Verify | 轻量、无额外成本 | 依赖模型自觉,skill 是"菜单"不是"触发器",实践中经常被忽略 |
|
||
| **第 2 层:节点 review** | 司马懿独立评审 | 独立视角、有结构化 verdict | **每个节点都审过重**(成本高、延迟大),协商轮次固定 3 轮不够灵活 |
|
||
| **第 3 层:最终整合审查** | 庞统汇总 + 司马懿终审 | 全局视角、质量兜底 | 和第 2 层重复(司马懿审了两次),庞统的角色定位模糊 |
|
||
|
||
#### 三层是否高效?
|
||
|
||
**结论:不够高效,主要体现在**:
|
||
|
||
1. **第 1 层形同虚设** — PAV 是 prompt 层面的约束,模型可以忽略。张飞调查报告(Mail #214)已证明 skill 是"菜单"不是"触发器"
|
||
2. **第 2 层过重** — 每个节点产出都过司马懿,对于简单任务(如格式化输出、数据搬运)是过度审查
|
||
3. **第 2 层和第 3 层重复** — 司马懿既审每个节点又审最终整合,角色重叠
|
||
4. **没有任务类型适配** — 编码任务、调研任务、数据任务用同一个审查标准,不灵活
|
||
|
||
#### 三层是否足够?
|
||
|
||
**结论:在特定场景下不够**:
|
||
|
||
1. **缺少方案阶段审查** — 只审产出,不审方案。编码前的方案设计没有独立审查
|
||
2. **缺少量化评估** — 只有 pass/fail/revise,没有打分机制,难以对比多方案
|
||
3. **缺少安全红线** — 没有 tripwire 机制,危险操作没有代码级拦截
|
||
4. **缺少并行审查** — 只有一个审查者(司马懿),没有多视角对抗
|
||
|
||
#### 三层是否过重?
|
||
|
||
**结论:在简单任务上过重,在复杂任务上不够** — 需要分级。
|
||
|
||
---
|
||
|
||
### 推荐方案(课题3)
|
||
|
||
基于以上调研,为 moziplus v2.6 推荐以下挑战/评审体系:
|
||
|
||
#### 设计原则
|
||
|
||
1. **声明式 + 代码执行分离** — 审查规则声明在 YAML/JSON 中,执行由框架保证
|
||
2. **分级审查** — 按任务类型和风险级别选择审查深度
|
||
3. **方案先审,产出后审** — 关键节点先审方案,再审产出
|
||
4. **多视角可选** — 支持单审、对抗、共识三种模式
|
||
5. **有限协商 + 自动升级** — 超过轮次自动升级
|
||
|
||
#### 分级审查矩阵
|
||
|
||
| 任务类型 | 方案审查 | 产出审查 | 审查模式 | 最大轮次 |
|
||
|---------|---------|---------|---------|---------|
|
||
| **高风险**(生产部署/资金操作) | ✅ 必须独立审查 | ✅ 独立审查 + 安全 Guardrail | 对抗(多空辩论) | 5 轮 |
|
||
| **标准**(编码/设计/架构) | ✅ 方案过挑战 | ✅ 产出过挑战 | 单审(指定挑战者) | 3 轮 |
|
||
| **低风险**(文档/格式化/数据搬运) | ❌ 跳过 | ⚡ 轻量 Guardrail(格式检查) | 自动检查 | 0 轮 |
|
||
| **调研/分析** | ❌ 跳过 | ✅ 结论过挑战 | 单审 | 2 轮 |
|
||
|
||
#### 三阶段审查流程(关键节点)
|
||
|
||
参考 superpowers 的串行双审和 TradingAgents 的对抗辩论,对高风险和标准任务采用:
|
||
|
||
```
|
||
阶段 1:方案审查(Plan Review)
|
||
├── 执行者提交方案到黑板
|
||
├── 挑战者审查方案(可行性/风险/遗漏)
|
||
├── 高风险:多视角对抗辩论
|
||
└── 通过 → 进入执行
|
||
└── 未通过 → 协商修改(最多 max_rounds 轮)
|
||
└── 超轮次 → 升级用户
|
||
|
||
阶段 2:执行 + Output Guardrail
|
||
├── 执行者按方案执行
|
||
├── 系统自动运行 Output Guardrail(声明式规则检查)
|
||
│ ├── 文件存在性检查
|
||
│ ├── JSON schema 校验
|
||
│ ├── 代码编译/运行测试
|
||
│ └── 安全红线检查
|
||
└── Guardrail 通过 → 进入产出审查
|
||
└── Guardrail 不通过 → 自动打回(tripwire)
|
||
|
||
阶段 3:产出审查(Output Review)
|
||
├── 执行者提交产出到黑板
|
||
├── 挑战者审查产出(质量/完整性/与方案一致性)
|
||
├── 审查结果结构化记录
|
||
└── 通过 → 流转下一节点
|
||
└── 未通过 → 协商修改
|
||
```
|
||
|
||
#### 声明式 Guardrail 规则示例
|
||
|
||
```yaml
|
||
# guardrails.yaml — 声明式质量门控规则
|
||
task_types:
|
||
coding:
|
||
plan_review:
|
||
required: true
|
||
reviewer: challenger # 挑战者池分配
|
||
max_rounds: 3
|
||
output_guardrails:
|
||
- name: file_exists
|
||
check: "output.files | length > 0"
|
||
severity: blocking
|
||
- name: tests_pass
|
||
check: "output.test_result == 'passed'"
|
||
severity: blocking
|
||
- name: code_quality
|
||
check: "output.lint_score >= 8"
|
||
severity: warning # 不阻塞,但记录
|
||
output_review:
|
||
required: true
|
||
reviewer: challenger
|
||
max_rounds: 3
|
||
|
||
deploy:
|
||
plan_review:
|
||
required: true
|
||
reviewer: challenger
|
||
mode: debate # 对抗辩论模式
|
||
max_rounds: 5
|
||
output_guardrails:
|
||
- name: no_direct_production
|
||
check: "output.target_env != 'production'"
|
||
severity: tripwire # 立即中断
|
||
- name: rollback_plan_exists
|
||
check: "output.rollback_plan != null"
|
||
severity: blocking
|
||
output_review:
|
||
required: true
|
||
reviewer: challenger
|
||
max_rounds: 5
|
||
escalate_to: user # 超轮次升级用户
|
||
|
||
data:
|
||
plan_review:
|
||
required: false
|
||
output_guardrails:
|
||
- name: format_check
|
||
check: "output.format in ['csv', 'parquet', 'json']"
|
||
severity: blocking
|
||
output_review:
|
||
required: false # 低风险,Guardrail 自动检查即可
|
||
```
|
||
|
||
#### 对 v1.0 三层体系的改进
|
||
|
||
| 改进点 | v1.0 | v2.6 推荐 |
|
||
|--------|------|----------|
|
||
| **第 1 层 PAV** | 依赖模型自律 | 替换为**声明式 Output Guardrail** — 系统自动执行,不依赖模型 |
|
||
| **第 2 层节点 review** | 每个节点都审 | **分级审查** — 按任务类型和风险级别选择审查深度 |
|
||
| **第 3 层最终整合** | 司马懿再审一次 | **保留但简化** — 只在高风险任务终审,标准任务由最后节点的审查覆盖 |
|
||
| **方案审查** | ❌ 无 | ✅ 新增**方案先审** — 关键节点先审方案再执行 |
|
||
| **量化评估** | ❌ 无 | ✅ 可选 — 支持打分机制(参考 wanman),信心度 < 0.7 升级 |
|
||
| **对抗辩论** | ❌ 无 | ✅ 高风险任务启用多视角对抗(参考 TradingAgents) |
|
||
|
||
---
|
||
|
||
## 课题 5:质量门控结构化
|
||
|
||
### 业界优秀实践对比表(课题5)
|
||
|
||
#### 1. Control Center 的 Task Store(artifacts + rollback + review 结构)
|
||
|
||
**项目**: [keshrath/agent-tasks](https://github.com/keshrath/agent-tasks)(参考 Control Center 模式)
|
||
|
||
**核心结构**:
|
||
|
||
```
|
||
Task
|
||
├── definitionOfDone(完成标准)
|
||
├── artifacts[](产出物列表,按 stage 组织)
|
||
│ ├── id, stage, type, path, metadata
|
||
│ └── version(版本化)
|
||
├── comments[](评论,结构化)
|
||
├── dependencies[](依赖关系)
|
||
└── pipeline(流水线配置)
|
||
└── stages[](阶段定义 + 审查规则)
|
||
```
|
||
|
||
**API 设计**:
|
||
- `GET /api/tasks/:id/artifacts` — 按 stage 过滤产出物
|
||
- `PUT /api/tasks/:id/stage` — 推进/回退阶段(支持 regress)
|
||
- `POST /api/tasks/:id/comments` — 添加评论
|
||
|
||
**关键洞察**:
|
||
- **Artifacts 按 stage 组织** — 每个阶段有独立的产出物列表
|
||
- **支持阶段回退(regress)** — 不只是前进,可以打回
|
||
- **definitionOfDone 是结构化的** — 不是自然语言描述,是可验证的条件列表
|
||
|
||
#### 2. SWE-agent 的 Trajectory 审计
|
||
|
||
**项目**: [SWE-agent/SWE-agent](https://github.com/SWE-agent/SWE-agent)
|
||
|
||
**核心机制**:
|
||
|
||
SWE-agent 的每次尝试产生一个 **Trajectory**(轨迹),是完全线性的事件序列:
|
||
|
||
```
|
||
Trajectory = [
|
||
{ step: 1, action: "open_file", args: {...}, observation: "..." },
|
||
{ step: 2, action: "search", args: {...}, observation: "..." },
|
||
{ step: 3, action: "edit", args: {...}, observation: "..." },
|
||
...
|
||
{ step: N, action: "submit", args: {...}, observation: "patch applied" }
|
||
]
|
||
```
|
||
|
||
- **线性追加** — 每个步骤只是追加到 messages,不修改历史
|
||
- **轨迹 = 消息** — trajectory 和传给 LLM 的 messages 是同一个东西
|
||
- **可回溯** — 完整保留每次尝试的所有步骤
|
||
- **Trajectory Inspector** — 命令行工具,可以滚动查看数百条轨迹
|
||
|
||
**在 RetryLoop 模式下**:
|
||
- 多次尝试产生多条 Trajectory
|
||
- Reviewer LLM 对比多条 Trajectory,选择最优 patch
|
||
- 所有 Trajectory 都保存,可用于后续分析
|
||
|
||
**关键洞察**:
|
||
- **审计粒度是每步操作** — 不是每任务,是每个 action
|
||
- **不可变追加** — 不修改历史记录,只追加新记录
|
||
- **多次尝试可对比** — 重试机制下保留所有尝试的轨迹
|
||
|
||
#### 3. Hermes 的 Comment 线程 + 结构化状态
|
||
|
||
**项目**: [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent) — Kanban Multi-Agent Board
|
||
|
||
**核心结构**:
|
||
|
||
Hermes 的 Kanban 系统中,**Comment 是持久化标注通道**:
|
||
|
||
```sql
|
||
kanban_comment:
|
||
- id, task_id, author, body, metadata JSON, created_at
|
||
```
|
||
|
||
**关键设计**:
|
||
|
||
| 机制 | 描述 |
|
||
|------|------|
|
||
| **Comment 即审计** | 所有审计相关字段(changed_files, tests_run, diff_path, PR url, decisions)都放在 comment 的 metadata 中 |
|
||
| **Block with reason** | `kanban_block` 带理由,reason 前缀 `review-required:` 表示等待审查 |
|
||
| **Bulk-close guard** | 不允许批量 close 多个 task 用同一个 summary — 因为每个 task 的元数据是不同的 |
|
||
| **Worker lanes** | 每次执行产生独立的 worker lane,reviewer 看到完整的 comment thread |
|
||
| **Structured metadata** | 接受标准(acceptance criteria)写在 spec metadata 中,engineer 的 worker 自动看到 |
|
||
|
||
**审查流程**:
|
||
```
|
||
Engineer 完成工作
|
||
→ 写 structured metadata 到 kanban_comment
|
||
(changed_files, tests_run, diff_path, decisions)
|
||
→ kanban_block "review-required: 等待审查"
|
||
→ Reviewer 看到 comment thread + metadata
|
||
→ Reviewer 批准: kanban_unblock
|
||
→ Reviewer 要求修改: 再写 comment,下次 worker 运行时看到
|
||
```
|
||
|
||
**关键洞察**:
|
||
- **Comment 是主要通信和审计通道** — 不只是讨论,是结构化数据的载体
|
||
- **metadata JSON 承载结构化数据** — body 是人类可读的,metadata 是机器可读的
|
||
- **Block reason 前缀约定** — 用前缀区分 block 类型(review-required / blocked-by / waiting-on)
|
||
- **每次执行独立的 worker lane** — 不同次执行的结果不会混淆
|
||
|
||
#### 4. 其他优秀实践
|
||
|
||
##### 4.1 PRD 中定义的 review_result JSON
|
||
|
||
moziplus PRD v1.0 已定义了结构化评审结果:
|
||
|
||
```json
|
||
{
|
||
"review_id": "uuid",
|
||
"task_id": "uuid",
|
||
"stage_id": "coding",
|
||
"reviewer": "simayi",
|
||
"verdict": "approved|rejected|needs_revision",
|
||
"issues": [
|
||
{
|
||
"severity": "critical|major|minor",
|
||
"location": "文件:行号 或 方案:章节",
|
||
"description": "问题描述",
|
||
"suggestion": "修改建议"
|
||
}
|
||
],
|
||
"round": 1,
|
||
"max_rounds": 3,
|
||
"consensus_reached": true
|
||
}
|
||
```
|
||
|
||
**优点**:结构清晰,verdict 明确,issues 可追溯
|
||
**不足**:没有信心度/评分,没有关联到产出物,没有历史版本
|
||
|
||
##### 4.2 GitHub PR Review 的结构化模式
|
||
|
||
GitHub PR Review API 提供了业界最成熟的结构化审查模式:
|
||
|
||
```
|
||
Pull Request Review:
|
||
├── event: APPROVE | REQUEST_CHANGES | COMMENT
|
||
├── body: "总结性评论"
|
||
└── comments[]:
|
||
├── path: "src/file.py"
|
||
├── position: 42
|
||
├── body: "这行有问题"
|
||
├── in_reply_to_id: (支持嵌套回复)
|
||
└── side: LEFT | RIGHT
|
||
```
|
||
|
||
**关键特性**:
|
||
- **三种 verdict**:APPROVE / REQUEST_CHANGES / COMMENT — 明确表达意图
|
||
- **行级定位**:comment 精确到文件+行号
|
||
- **嵌套回复**:支持 comment 线程中的子讨论
|
||
- **review 和 comment 分离**:review 是整体评审,comment 是行级细节
|
||
- **多 reviewer 支持**:多个 reviewer 可以各自提交独立的 review
|
||
|
||
##### 4.3 代码审查工具的结构化输出模式
|
||
|
||
业界代码审查工具(SonarQube / CodeClimate / reviewdog)的共同模式:
|
||
|
||
```
|
||
Review Output:
|
||
├── summary: { verdict, score, total_issues }
|
||
├── issues[]:
|
||
│ ├── severity: critical | major | minor | info
|
||
│ ├── rule_id: "S1234" (规则 ID,可查文档)
|
||
│ ├── location: { file, line, column }
|
||
│ ├── message: "问题描述"
|
||
│ └── suggestion: "修改建议"
|
||
└── metadata:
|
||
├── tool_version
|
||
├── analyzed_files
|
||
└── duration_ms
|
||
```
|
||
|
||
**共同特点**:
|
||
- severity 有标准分级(critical/major/minor/info)
|
||
- location 精确到文件+行+列
|
||
- rule_id 关联到可查的规则文档
|
||
- summary 包含总体评分和统计
|
||
|
||
#### 综合对比表(课题5)
|
||
|
||
| 项目 | 评审存储位置 | 结构化程度 | 可追溯性 | 多轮支持 | 关联产出 |
|
||
|------|-----------|-----------|---------|---------|---------|
|
||
| **Control Center** | Task Store(内置) | ✅ artifacts + stage | ✅ 版本化 | ⚠️ 阶段回退 | ✅ artifact 关联 |
|
||
| **SWE-agent** | Trajectory 文件 | ✅ 每步结构化 | ✅ 线性追加 | ✅ 多次尝试 | ✅ patch 关联 |
|
||
| **Hermes** | Comment metadata JSON | ✅ 结构化 metadata | ✅ 追加写入 | ✅ worker lanes | ✅ 手动关联 |
|
||
| **moziplus PRD** | comments 表 | ⚠️ 自然语言为主 | ❌ 无版本 | ❌ 无 | ❌ 无 |
|
||
| **GitHub PR Review** | Review API | ✅ 行级定位 | ✅ 嵌套回复 | ✅ 多 reviewer | ✅ diff 关联 |
|
||
| **代码审查工具** | 独立输出 | ✅ rule_id + severity | ✅ 标准化 | ❌ 单次 | ⚠️ 工具特定 |
|
||
|
||
---
|
||
|
||
### 推荐方案:评审结果存储与结构
|
||
|
||
#### 设计原则
|
||
|
||
1. **黑板索引 + 文件详情** — 黑板存储结构化摘要(索引),文件系统存储完整评审记录(详情)
|
||
2. **追加写入,不修改历史** — 每轮评审是新的记录,不覆盖旧记录
|
||
3. **结构化 verdict** — 评审结论必须是枚举值,不是自然语言
|
||
4. **关联产出物** — 评审记录通过 output_id 关联到具体产出
|
||
5. **人类可读 + 机器可读** — body 给人看,metadata 给程序用
|
||
|
||
#### 推荐的评审结果结构
|
||
|
||
```sql
|
||
-- ===== 评审结果表 =====
|
||
-- 评审是追加写入的,每轮评审一条新记录
|
||
CREATE TABLE IF NOT EXISTS reviews (
|
||
id TEXT PRIMARY KEY, -- rev-001
|
||
task_id TEXT NOT NULL,
|
||
output_id TEXT, -- 关联的产出物(outputs 表)
|
||
reviewer TEXT NOT NULL, -- 审查者 agent id
|
||
review_type TEXT NOT NULL, -- plan_review | output_review | guardrail
|
||
CHECK (review_type IN ('plan_review', 'output_review', 'guardrail', 'final_review')),
|
||
|
||
-- 评审结论(必须是枚举,不是自然语言)
|
||
verdict TEXT NOT NULL,
|
||
CHECK (verdict IN ('approved', 'rejected', 'needs_revision', 'approved_with_reservations')),
|
||
|
||
-- 评分(可选,用于量化评估场景)
|
||
confidence REAL, -- 0.0-1.0 信心度
|
||
scores TEXT, -- JSON: {"feasibility": 0.9, "risk": 0.7, "impact": 0.8, "quality": 0.85}
|
||
|
||
-- 协商轮次
|
||
round INTEGER NOT NULL DEFAULT 1,
|
||
max_rounds INTEGER NOT NULL DEFAULT 3,
|
||
consensus_reached BOOLEAN DEFAULT FALSE,
|
||
|
||
-- 摘要(黑板索引)
|
||
summary TEXT NOT NULL, -- 一句话评审结论(人可读)
|
||
|
||
-- 详情路径(文件详情)
|
||
detail_path TEXT, -- 指向完整评审报告文件
|
||
|
||
-- 时间
|
||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||
|
||
FOREIGN KEY (task_id) REFERENCES tasks(id),
|
||
FOREIGN KEY (output_id) REFERENCES outputs(id)
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_reviews_task ON reviews(task_id);
|
||
CREATE INDEX IF NOT EXISTS idx_reviews_output ON reviews(output_id);
|
||
CREATE INDEX IF NOT EXISTS idx_reviews_reviewer ON reviews(reviewer);
|
||
```
|
||
|
||
#### 评审详情文件结构
|
||
|
||
```
|
||
tasks/{task_id}/
|
||
├── output.md # 任务产出
|
||
├── output.json # 产出元数据
|
||
└── reviews/
|
||
├── rev-001-round1.json # 第 1 轮评审
|
||
├── rev-001-round2.json # 第 2 轮评审(协商后修改)
|
||
└── rev-001-round3.json # 第 3 轮评审(最终通过)
|
||
```
|
||
|
||
**评审详情 JSON**:
|
||
|
||
```json
|
||
{
|
||
"review_id": "rev-001",
|
||
"task_id": "task-001",
|
||
"output_id": "out-001",
|
||
"reviewer": "simayi-challenger",
|
||
"review_type": "output_review",
|
||
"verdict": "needs_revision",
|
||
"confidence": 0.65,
|
||
"round": 1,
|
||
"max_rounds": 3,
|
||
"summary": "代码逻辑正确但缺少错误处理和单元测试",
|
||
"issues": [
|
||
{
|
||
"id": "iss-001",
|
||
"severity": "critical",
|
||
"category": "correctness",
|
||
"location": "src/trading.py:42",
|
||
"description": "未处理网络超时异常",
|
||
"suggestion": "添加 try-except 包装,设置 30s 超时",
|
||
"rule_id": "ERR-001"
|
||
},
|
||
{
|
||
"id": "iss-002",
|
||
"severity": "major",
|
||
"category": "testing",
|
||
"location": "tests/",
|
||
"description": "缺少单元测试",
|
||
"suggestion": "至少覆盖正常路径和异常路径",
|
||
"rule_id": "TEST-001"
|
||
}
|
||
],
|
||
"positives": [
|
||
"代码结构清晰,职责分离做得好",
|
||
"命名规范,可读性强"
|
||
],
|
||
"metadata": {
|
||
"model": "zhipu/glm-5.1",
|
||
"duration_ms": 12500,
|
||
"files_reviewed": ["src/trading.py", "src/utils.py"],
|
||
"total_lines_reviewed": 150
|
||
},
|
||
"created_at": "2026-05-15T10:30:00Z"
|
||
}
|
||
```
|
||
|
||
#### Guardrail 自动检查结果
|
||
|
||
Guardrail 检查结果也存入 reviews 表(`review_type = 'guardrail'`),但来源是系统自动执行:
|
||
|
||
```json
|
||
{
|
||
"review_id": "rev-auto-001",
|
||
"reviewer": "system",
|
||
"review_type": "guardrail",
|
||
"verdict": "rejected",
|
||
"issues": [
|
||
{
|
||
"severity": "blocking",
|
||
"rule_id": "GUARD-FILE-EXISTS",
|
||
"description": "产出文件不存在: output.md",
|
||
"location": null
|
||
}
|
||
],
|
||
"metadata": {
|
||
"guardrail_config": "guardrails.yaml#coding.output_guardrails",
|
||
"checks_run": 3,
|
||
"checks_passed": 2,
|
||
"checks_failed": 1
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 评审产出物与任务产出物的关系
|
||
|
||
```
|
||
Task (task-001)
|
||
├── Output 1 (out-001) → 编码产出
|
||
│ ├── Review 1 (rev-001, plan_review, round 1) → 方案评审
|
||
│ ├── Review 2 (rev-002, guardrail, round 1) → 自动 Guardrail
|
||
│ └── Review 3 (rev-003, output_review, round 1) → 产出评审
|
||
│ └── Review 4 (rev-004, output_review, round 2) → 协商后再审
|
||
└── Output 2 (out-002) → 测试报告
|
||
└── Review 5 (rev-005, output_review, round 1) → 测试产出评审
|
||
```
|
||
|
||
**关系规则**:
|
||
- **一个 output 可以有多个 review**(多轮协商)
|
||
- **一个 review 关联一个 output**(不跨产出)
|
||
- **review 按时间追加**,不修改历史(round 递增)
|
||
- **黑板只存摘要**(verdict + summary + round),完整详情在文件
|
||
|
||
#### 多轮协商的追溯
|
||
|
||
```sql
|
||
-- 查看某个任务的所有评审历史
|
||
SELECT r.id, r.round, r.verdict, r.summary, r.created_at
|
||
FROM reviews r
|
||
WHERE r.task_id = 'task-001'
|
||
ORDER BY r.created_at ASC;
|
||
|
||
-- 查看某个产出的最新评审
|
||
SELECT * FROM reviews
|
||
WHERE output_id = 'out-001'
|
||
AND review_type = 'output_review'
|
||
ORDER BY round DESC
|
||
LIMIT 1;
|
||
```
|
||
|
||
#### 对比现有 comments 表的改进
|
||
|
||
| 维度 | 现有 comments 表 | 推荐 reviews 表 |
|
||
|------|----------------|----------------|
|
||
| **数据类型** | 自然语言 | 结构化 JSON |
|
||
| **结论** | 无(靠读 body 推断) | ✅ verdict 枚举 |
|
||
| **关联产出** | ❌ 只关联 task | ✅ 关联 output |
|
||
| **评分** | ❌ 无 | ✅ confidence + scores |
|
||
| **轮次追踪** | ❌ 无 | ✅ round + max_rounds |
|
||
| **评审类型** | ❌ 无 | ✅ plan_review / output_review / guardrail / final_review |
|
||
| **详情** | ❌ body 只有自然语言 | ✅ body + detail_path 文件 |
|
||
|
||
**comments 表保留用途**:日常讨论、@ mention、非结构化沟通。reviews 表专注评审。
|
||
|
||
---
|
||
|
||
## 附录:关键参考源码
|
||
|
||
### A. Superpowers 串行双审
|
||
```
|
||
skills/subagent-driven-development/SKILL.md
|
||
skills/requesting-code-review/code-reviewer.md
|
||
skills/subagent-driven-development/code-quality-reviewer-prompt.md
|
||
```
|
||
|
||
### B. TradingAgents 辩论条件边
|
||
```python
|
||
# tradingagents/graph/trading_graph.py
|
||
workflow.add_conditional_edges(
|
||
"Bull Researcher",
|
||
should_continue_debate,
|
||
{"Bear Researcher": ..., "Research Manager": ...}
|
||
)
|
||
```
|
||
|
||
### C. oh-my-claudecode Critic 工具限制
|
||
```yaml
|
||
# agents/critic.md
|
||
disallowedTools: Write, Edit
|
||
```
|
||
|
||
### D. OpenAI Agents SDK Tripwire
|
||
```python
|
||
# agents/guardrails.py
|
||
@output_guardrail
|
||
async def guardrail_fn(ctx, agent, output):
|
||
return GuardrailFunctionOutput(
|
||
tripwire_triggered=output.is_invalid
|
||
)
|
||
```
|
||
|
||
### E. SWE-agent RetryLoop
|
||
```yaml
|
||
# config.yaml
|
||
agent:
|
||
type: retry
|
||
retry_loop:
|
||
cost_limit: 6.00
|
||
max_attempts: 3
|
||
```
|
||
|
||
### F. Hermes Kanban Comment
|
||
```sql
|
||
-- kanban_comment with structured metadata
|
||
INSERT INTO kanban_comment (task_id, author, body, metadata)
|
||
VALUES (?, ?, ?, json(?))
|
||
-- metadata: {"changed_files": [...], "tests_run": 5, "tests_passed": 5, "diff_path": "..."}
|
||
```
|