Benchmark Evaluator 执行流程
前置检查
✓ .pipeline/agents/plan/harness.md 存在
✓ .pipeline/agents/generate/CHANGES.md 存在
✓ pipeline.json agents.generate.status = "completed"
Step 1: 读取输入
读取 agents/plan/harness.md → MUST/SHOULD 条件
读取 agents/plan/PLAN.md → 对照计划
读取 agents/generate/CHANGES.md → 变更摘要
读取 agents/generate/deviations.md → 偏差记录(如有)
Step 2: 运行测试
pnpm test
记录:测试总数 / 通过数 / 失败数 + 失败详情。
Step 3: 逐条验证 MUST 条件
对 harness.md 中的每个 MUST 条件,通过以下方式验证:
| 验证方式 | 说明 |
|---|---|
| 自动测试 | 测试脚本覆盖的条件 |
| 代码检查 | Grep/Glob 验证文件/代码存在 |
| 功能验证 | 运行特定命令验证 |
Step 4: 评估 5 个维度
功能正确性 (30%)
功能得分 = (通过的 MUST 数 / 总 MUST 数) × 100
测试覆盖 (25%)
| 条件 | 得分 |
|---|---|
| 全通过 + 覆盖率 ≥ 80% | 90-100 |
| 全通过 + 覆盖率 60-80% | 70-89 |
| 全通过 + 覆盖率 < 60% | 50-69 |
| 有测试失败 | 0-49 |
视觉/UI (20%)
不涉及 UI 变更时默认 80 分
| 条件 | 得分 |
|---|---|
| 布局正确、样式一致、响应式正常 | 80-100 |
| 布局正确、小瑕疵 | 60-79 |
| 布局有问题但不影响使用 | 40-59 |
| 布局错乱 | 0-39 |
代码质量 (15%)
| 条件 | 得分 |
|---|---|
| 可读性好、命名清晰、无反模式 | 80-100 |
| 整体良好、有小问题 | 60-79 |
| 可读性差或明显反模式 | 0-59 |
扣分项:未处理 Promise(-10)、硬编码魔法数字(-5)、内联样式滥用(-5)、过深嵌套(-10)、未清理副作用(-10)
计划符合度 (10%)
| 偏差程度 | 得分 |
|---|---|
| 完全按计划 | 90-100 |
| 轻微偏差(合理) | 60-89 |
| 重大偏差(改方案) | 0-59 |
Step 5: 计算总分
总分 = 功能×0.30 + 测试×0.25 + 视觉×0.20 + 代码×0.15 + 计划×0.10
通过阈值:≥ 70
Step 6: 生成评分报告
写入 .pipeline/agents/score/SCORE.md:
# 评分报告:{任务名称}
> 时间: {ISO时间}
> 迭代: 第 {N} 次
## 总分: {XX}/100 — {A/B/C/D 级}
| 维度 | 得分 | 权重 | 加权 |
|------|------|------|------|
| 功能正确性 | {s} | 30% | {w} |
| 测试覆盖 | {s} | 25% | {w} |
| 视觉/UI | {s} | 20% | {w} |
| 代码质量 | {s} | 15% | {w} |
| 计划符合度 | {s} | 10% | {w} |
## 结论: ✅ 通过 / ❌ 不通过
## MUST 条件验证
- [x] MUST-1: {描述} — ✅
- [ ] MUST-2: {描述} — ❌ {原因}
## 问题清单
### 严重 (Blocker)
- {问题}
### 重要 (Major)
- {问题}
### 轻微 (Minor)
- {问题}
## 改进建议
1. {建议}
2. {建议}
写入 .pipeline/agents/score/report.json:
{
"timestamp": "{ISO时间}",
"iteration": 1,
"overallScore": 75,
"passed": true,
"dimensions": {
"functionality": { "score": 80, "weighted": 24 },
"tests": { "score": 70, "weighted": 17.5 },
"visual": { "score": 75, "weighted": 15 },
"codeQuality": { "score": 80, "weighted": 12 },
"planAdherence": { "score": 90, "weighted": 9 }
},
"mustResults": [
{ "id": "MUST-1", "passed": true },
{ "id": "MUST-2", "passed": false, "reason": "..." }
],
"issues": [
{ "severity": "blocker|major|minor", "description": "..." }
]
}
Step 7: 更新 pipeline.json
{
"agents": {
"score": {
"status": "completed",
"completedAt": "{ISO时间}",
"outputFiles": ["agents/score/SCORE.md", "agents/score/report.json"]
}
}
}
同时在 pipeline.json 的 history 数组中追加本轮记录。
Step 8: 告知编排器结果
向编排器(即调用方)返回:
- 总分和通过/不通过
- 如果不通过,说明建议:重试 Generator 还是回退 Plan
等级定义
| 等级 | 分数 | 含义 |
|---|---|---|
| A | 90-100 | 优秀,可直接交付 |
| B | 70-89 | 合格,通过 |
| C | 50-69 | 不通过,需修复 |
| D | 0-49 | 严重不足,需重新审视 |