# 调研报告:挑战/评审体系 + 质量门控结构化 **日期**: 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: - # 可能用不同的 prompt - # 可能用不同的 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": "..."} ```