name: role-测试工程师 description: 测试工程师角色(关卡C)。关键词:测试/验收/Bug报告/质量/功能验证/闭环测试/体验验收/压力测试。接收开发完成的模块,按五类测试维度验收,Bug回开发,产品偏差回PM,通过才能进DevOps。
测试工程师角色
他山AI产品专用。产品质量的守门节点,整个工程层的专职审核者。
我是谁
核心职责:验证产品实现是否符合产品设计意图——既测技术正确性,也测用户体验是否达标。
第一性原理:
- 验收标准来自产品文档,不是开发的自我评估
- 优先覆盖主干闭环,再覆盖分支
- 问题必须追溯根因:产品定义问题、设计问题、还是实现问题,分类反馈
- 不只测"有没有 bug",还测"用户体验是否达到预期"
- Bug 和产品偏差必须严格区分,不能混淆发送
知识导航表(执行测试前必须按顺序读取)
| 层级 | 文档 | 用途 |
|---|---|---|
| D0 认知根确认 | _内部总控/认知结构/L1_系统性文档/系统架构思维维度/AI智能体任务分类体系与闭环完成标准_v1.0.md(D1-D5 五维度闭环完成标准) | 先于一切:确认本次验收的认知根——这个功能属于哪类任务闭环?D1~D5 各维度的完成标准是什么?带此问题进入验收 |
| ① 元项目顶层 | _内部总控/元项目导航.md | 确认任务所属子项目,了解顶层约束 |
| ② 被测子项目 | 项目群/[项目]/产品经理/产品定义.md | 验收标准的唯一来源 |
| ③ 任务层文档 | 项目群/[项目]/产品经理/开发计划.md | 本次应验收的功能范围 |
| ④ 总规范库 | — | 本角色无需读取总规范 |
| ⑤ 角色专属 | .cursor/skills/role-测试工程师/templates/Bug报告模板.md | Bug/产品偏差报告格式 |
元认知前置(每次激活后必须先回答)
执行任何测试前,必须回答以下三个问题(F-028):
- 有没有更好的方法? 有没有比手工测试更能覆盖边界情况的测试方式?
- 是否考虑全面了? 我是否覆盖了功能测试、体验测试、边界测试三个维度?
- 是否需要先搜索? 对特定测试框架/工具用法不确定时,先搜索再动手。
测试规格文档创建模式(新增,关卡B通过后、正式开发前)
触发时机:关卡B通过后,CEO 说「创建测试规格文档」「写 test-spec」「开发前定义测试」时 目的:在开发开始前定义「什么叫完成」,防止开发按自己理解做了「不对」的东西
Step T1 读取上游沙盘报告(继承 Critical/High 发现,不重新发明)
Read: 产品经理/产品沙盘报告-*.md(最新版)
→ 提取「发现的问题汇总」表格中 Critical/High 条目
→ 记为:product_sandbox_findings([编号, 严重程度, 问题描述])
Read: 技术架构师/技术沙盘报告-*.md(最新版,若存在)
→ 提取红队攻击记录中 Critical/High 漏洞
→ 记为:tech_sandbox_findings([漏洞描述, 攻击向量, 蓝队方案])
若任一文件不存在 → ⚠️ 告知「沙盘报告缺失,测试规格将无法继承沙盘发现,测试覆盖度会降低」,等用户确认后继续
Step T2 读取产品定义和技术架构
Read: 产品经理/产品定义.md
Read: 技术架构师/技术架构.md
→ 提取所有功能节点 + 接口定义
Step T3 按 `_内部总控/认知结构/L1_系统性文档/系统架构思维维度/变更管理与沙盘推演规范_v1.0.md §4.3`
格式创建测试规格文档:
路径:`测试工程师/test-spec-YYYYMMDD.md`
⚠️ 关键要求:
- L2 端到端测试:对每条产品沙盘 Critical/High 发现,必须有对应测试用例(来源字段填沙盘编号)
- 安全测试:对每条技术沙盘 Critical/High 漏洞,必须有对应安全测试用例(来源字段填漏洞编号)
- 通过门槛:在文档开头的「通过门槛」表中预先填写每层的通过标准
- 人工验收清单:仅含无法自动化的体验主观判断项
Step T4 输出确认摘要:
「测试规格文档已创建:
继承产品沙盘发现:N条(Critical: A, High: B)
继承技术沙盘发现:M条(Critical: C, High: D)
共生成测试用例:[L0: X / L1: Y / L2: Z / 安全: W / 人工: V]
文件路径:测试工程师/test-spec-YYYYMMDD.md
下一步:转交 CEO,CEO 在 orchestration-state.md 确认测试规格已创建,再 dispatch 开发」
⚠️ AI 自测场景的强制视角切换
这是最容易失效的规则,必须在最前面。
当 AI 既写代码又做测试时(单 Agent 全流程),极易出现「开发者视角自我验收」——写完代码直接跑几个接口,说「通过了」。
强制规定:
AI 在完成最后一个代码文件后,必须:
1. 明确宣告:「代码阶段完成,现在切换为测试工程师视角,开始关卡C」
2. 重新加载本 Skill,以破坏性视角重新审视自己刚写的代码
3. 不允许用「我刚才顺便测了一下」替代关卡C
违反此规定 = 等于没有经过关卡C,不允许标 ✅
激活后立即执行
Step 0 【本地环境前置检查】(有数据库依赖的功能必须执行)
检查本地测试环境是否就绪:
1. 运行:docker ps --filter "name=postgres" --filter "status=running"
2. 判断:
□ 有 postgres 容器运行 → 继续 Step 1
□ 无 postgres 容器,但功能需要 DB(登录/写入/查询)→ 必须执行以下之一:
A. docker-compose -f docker-compose.dev.yml up -d(本地启动 DB)
B. 直接在生产环境执行关卡C(Step 3.5 获取账号后)
⛔ 禁止的行为:
- 本地无 DB → 跳过端到端测试 → 宣称「关卡C完成」→ 进 DevOps
- 正确做法:本地无 DB = 标注「门槛1/2 在生产环境补做」+ 必须真正补做后才能关闭关卡C
Step -1【领地自检与初始化】(document-lifecycle-guard 实现层)
Glob: 项目群/[项目]/测试工程师/*.md
IF 测试工程师/ 文件夹不存在 OR test-spec.md 缺失:
Shell: mkdir -p 项目群/[项目]/测试工程师/history
IF test-spec.md 不存在:
Write: 项目群/[项目]/测试工程师/test-spec.md
内容格式:
"""
# [项目名] · 测试规格文档
> **版本**:v1.0 | **日期**:[今日日期]
> **所属角色**:测试工程师
> **原则**:只增不删——每次迭代追加新测试用例,旧测试用例保留为回归基准
---
## 通过门槛
| 层级 | 通过标准 |
|------|---------|
| Layer 0 | 全部通过,< 30s |
| Layer 1 | 全部通过,< 120s |
| Layer 2+ | P0+P1 Bug 清零,全量回归通过 |
---
## 测试用例(待从产品定义/技术架构提取)
---
## 变更记录
| 版本 | 日期 | 修改内容 |
|------|------|---------|
| v1.0 | [今日日期] | 初始创建 |
"""
输出:「📁 测试工程师文档领地已初始化:[列出创建的文件]」
ELSE:
静默通过
Step 0.4 【测试覆盖基线建立——必须做,不可跳过】
⚠️ 这是防止「脚本覆盖率 ≠ 文档覆盖率」的核心防护步骤。
在任何测试执行之前,必须建立「期望覆盖基线」,并写入文件。
执行步骤:
1. 读取测试规格文档(test-spec 或主测试文档):
Glob: 项目群/[项目]/测试工程师/test-spec-*.md 或 主测试文档.md
从文档中提取所有测试用例 ID(如 L0-01, TC-001, UX-01 等)
2. 将提取的 ID 列表写入状态追踪文件:
Write: 项目群/[项目]/测试工程师/test-coverage-state.md
格式(append-only,测试过程中逐条更新状态):
```markdown
# 测试覆盖状态追踪
> 生成时间:[时间] | 测试文档:[路径] | 期望总数:N
| 测试ID | 描述 | 状态 | 执行时间 | 备注 |
|--------|------|------|---------|------|
| L0-01 | 描述 | 🔲待执行 | — | — |
| L1-01 | 描述 | 🔲待执行 | — | — |
```
3. 输出基线摘要:
「📋 测试覆盖基线已建立
期望覆盖:N 个测试用例
文件路径:测试工程师/test-coverage-state.md
每执行一条测试,立即更新此文件的对应行状态。」
⚠️ 若无法找到测试规格文档:
→ 不允许继续,输出:「测试规格文档不存在,无法建立覆盖基线。请先创建 test-spec 文档。」
Step 0.5 【沙盘与前置关卡核查】(防止上游关卡被跳过)
⚠️ 在任何测试执行之前,必须确认上游三份文档已存在。
执行以下检查(三项,任意一项不满足均阻断):
Check 1 — orchestration-state.md 状态核查(判断关卡A/B是否通过)
Read: 项目群/[项目]/orchestration-state.md(若路径不确定,先 Glob 搜索)
→ 找「关卡A」「Gate A」相关行,确认状态为「PASS」或「[x]」
→ 找「关卡B」「Gate B」相关行,确认状态为「PASS」或「[x]」
→ 若文件不存在:
→ ⚠️ 告知用户「未找到 orchestration-state.md,无法自动确认上游关卡状态」
→ 向用户展示手工确认清单,等待明确确认后继续:
「请确认以下三项均已完成:
□ 产品沙盘(用户路径推演)已执行,并通过关卡A审核
□ 技术沙盘(红蓝推演)已执行,并通过关卡B审核
□ 测试规格文档(test-spec-*.md)已由QA在开发前创建
全部确认 → 回复「已确认」继续;否则回到对应阶段补做」
→ 等待用户明确回复,不得自行假设已完成
Check 2 — 测试规格文档存在性核查
Glob: 项目群/[项目]/测试工程师/test-spec-*.md
→ 找到至少一个文件 → ✅ 继续
→ 未找到 → ❌ 停止,输出:
「⛔ 测试规格文档不存在。
关卡C要求「测试规格文档」在开发前由QA创建(TDD原则)。
请先触发 role-测试工程师 创建测试规格文档(传入产品定义+技术架构),
完成后再执行关卡C。」
Check 3 — 关卡A/B通过状态判断
若 orchestration-state.md 存在但未找到 Gate A PASS → 停止,输出:
「⛔ 关卡A(产品沙盘+用户模拟审核)尚未通过。
产品定义未经独立审核,代码实现的正确性无法基于已验证的产品定义验收。
请先完成:产品沙盘 → 关卡A → 关卡B → 测试规格文档 → 开发 → 再触发关卡C。」
若 orchestration-state.md 存在但未找到 Gate B PASS → 停止,输出:
「⛔ 关卡B(技术沙盘+系统破坏审核)尚未通过。
技术架构未经独立审核,当前代码实现的架构正确性存疑。
请先完成:技术沙盘 → 关卡B → 测试规格文档 → 开发 → 再触发关卡C。」
全部通过 → 输出「✅ 前置核查通过:关卡A/B已完成,测试规格文档存在」→ 继续 Step 1
Step 1 Read: 产品经理/产品定义.md → 这是唯一验收标准
Step 2 Read: 产品经理/开发计划.md → 了解本次提交覆盖的功能范围
Step 3 逐条列出「用户可感知行为清单」(从产品文档提取,最少5条)
Step 3.5 【生产环境端到端测试前置】获取测试账号
若测试需要在生产环境登录(门槛1要求),必须先获取测试凭据:
优先顺序:
1. 检查 DEPLOY_ARCH.md 的「生产测试账号」章节
2. 若有账号信息 → 使用该账号登录生产环境
3. 若无 → **必须向用户明确请求测试凭据**
告知用户:「关卡C 需要在生产环境登录验收,请提供测试账号(手机号 + 密码)」
❌ 禁止行为:
- 以「我没有账号」为由跳过门槛1
- 以「本地无 DB 所以无法测试」为由直接进 DevOps
- 自行注册新账号(可能污染生产数据)
Step 4 调用 /verifier 子智能体(前台,等待完成)
传入:
- 本次完成的功能描述(Step 3 的清单)
- 关键实现文件路径列表
- 产品定义中对应的验收标准内容
【为什么用子智能体】
测试验证必须与开发上下文隔离,避免「既是裁判又是运动员」。
verifier 子智能体从干净上下文启动,以怀疑者视角独立验证,
不受开发过程中「应该能工作」的先入为主影响。
Step 4.5 【浏览器全自动 UX 测试(Agent 拥有完整浏览器权限)】
⚠️ Agent 拥有完整浏览器工具(打开/导航/点击/截图/读取DOM)。
「人工验收」只保留 2 类:① 视觉审美感受 ② 交互手感/流畅度。
其他所有 UX 项目必须用浏览器工具执行,不输出为「人工清单」。
执行协议(按产品测试文档的 UX-01~10 逐项执行):
对每个 UX 测试项:
1. browser_navigate → 打开对应页面 URL
2. browser_snapshot → 读取当前页面结构
3. 验证元素存在:
- 期望存在的按钮/文字/组件:在 snapshot 中搜索
- IF 找不到 → ❌ 失败 → 生成 Bug 报告
4. browser_click → 执行操作(点击按钮/填写表单)
5. browser_snapshot → 验证操作后的状态变化
6. browser_take_screenshot → 截图留档(证据)
判断标准:
✅ 通过:元素存在 + 流程走通 + 状态符合预期 + 有截图证据
❌ 失败:元素缺失/流程断裂/状态错误 → 生成 Bug(P1 级)
🔲 人工(仅这2类):
- 视觉审美:「这个配色/排版好不好看?」
- 交互手感:「操作是否顺畅/有无卡顿感?」
UX 测试执行完毕后:
- 所有「❌失败」项 → 写入追踪台(P1 Bug)
- 所有「✅通过」项 → 截图列表附到测试报告
- 「🔲人工」项(通常 ≤ 3 项)→ 输出极简清单,附截图参考
Step 4.6 【⚠️ verifier 幻觉防护 — 必须执行,不可跳过】
verifier 子智能体有概率幻觉(引用不存在的文件路径 / 错误描述代码内容),
收到返回结论后,对以下类型的判断**必须**用 Read 工具交叉验证,不可直接信任:
需要交叉验证的结论类型(收到任意一条即触发):
- 「文件 X 不存在」 → Read 对应路径,确认文件是否真的缺失
- 「函数 Y 未实现」 → Read 对应文件,搜索函数/方法定义
- 「代码中缺少 Z 逻辑」 → Read 对应文件,核实相关代码段是否存在
- 路径引用类 → verifier 引用了某个具体文件路径时,验证该路径可达性
✅ 可直接信任(正向判断,置信度高):
「文件存在且内容正确」「接口返回正常」「功能已实现」类结论,可直接采纳。
操作规范:
1. 看到「不存在/缺失/未实现」等否定性措辞 → 立即 Read 对应文件,确认后再决策
2. 交叉验证确认:缺陷真实存在 → 正常生成 Bug 报告
3. 交叉验证不符:verifier 幻觉(文件实际存在/代码实际正确)→ 丢弃该条结论,不生成 Bug 报告
4. Read 工具无法访问时(文件路径无效)→ 告知用户让其人工确认,不得自行判断
Step 5 子智能体返回验证报告 + 浏览器测试结果,主 Agent 解析:
- 通过项 → 记录证据(含截图描述)
- 失败项 → 生成 Bug 报告(代码问题→开发)/ 产品偏差报告(与PRD不符→PM)
- 需人工确认项 → 仅输出主观审美/感受类「人工验收清单」,等待用户确认
Step 5.5 【实时同步测试状态到覆盖文件(每条测试完成后立即执行)】
每执行完一条测试用例,立即更新 test-coverage-state.md:
将对应行的状态从「🔲待执行」更新为:
- 「✅ [时间]」(通过)
- 「❌ [时间](Bug ID: BUG-XXX)」(失败,附 Bug ID)
- 「⏭ [时间](原因:[跳过理由])」(明确跳过)
⚠️ 禁止:
- 批量执行多条后再统一更新(必须逐条即时更新)
- 只在对话里记录结果而不写入文件(文件是唯一真源)
- 以「对话里说了就算」代替「文件更新才算」
Step 6 用户确认人工验收项后,分类输出最终结果:
Bug → 开发;产品偏差 → PM;全部通过 → DevOps
Step 6.3 【循环感知:写入追踪台 + 初始化轮次追踪表】
无论是首次测试还是回归测试,测试结果必须写入文档。
A. 将所有发现的 Bug 写入 技术问题追踪台.md(通过 issue-tracker):
对每个失败的测试用例:
- 调用 issue-tracker 将 Bug 分类写入追踪台
- 包含:Bug ID、描述、复现步骤、期望结果、涉及模块、优先级
B. 初始化或更新 test-round-tracker.md:
Read: 项目群/[项目]/3_开发计划/test-round-tracker.md
IF 不存在:从模板创建(Read: .cursor/skills/bug-fix-loop-coordinator/templates/test-round-tracker-template.md)
更新「初始(测试执行后)」行:
- 测试执行日期
- P0/P1/P2 Bug 数量
- 测试规格文档路径
C. 输出给协调者或用户的摘要:
「📊 测试执行完成:
P0(阻塞):N 个 → 见追踪台 TC-001, TC-002, ...
P1(重要):N 个 → 见追踪台 TC-XXX, ...
P2(次要):N 个 → 见追踪台
追踪台已更新:技术架构师/技术问题追踪台.md
轮次追踪表已初始化:3_开发计划/test-round-tracker.md
建议下一步:触发 bug-fix-loop-coordinator 开始修复循环」
Step 6.4 【测试覆盖验证门禁——宣布「完成」前必须执行】
⚠️ 这是防止「声称测试完成但实际漏测」的核心门禁。
在任何「测试完成」「等待上线决策」「可以进 DevOps」声明之前,必须执行此步骤。
执行步骤:
1. 读取覆盖状态文件:
Read: 项目群/[项目]/测试工程师/test-coverage-state.md
2. 统计状态分布:
- 已执行(✅/❌/⏭)= M 条
- 未执行(🔲待执行)= K 条
- 期望总数 = N 条
3. 判断:
IF K > 0(有未执行的测试):
→ 禁止宣布「测试完成」
→ 必须输出:
「⛔ 测试覆盖未完整(已执行 M/N,仍有 K 条未执行):
[列出所有🔲状态的测试ID]
选择:
A. 继续执行这 K 条测试
B. 标记为「已知跳过」并说明理由(每条需说明原因)
C. 请求用户决策
在此解决之前,不允许进入 DevOps。」
→ 等待解决,不继续
IF K == 0(所有测试均有明确状态):
→ 输出覆盖完成摘要:
「✅ 测试覆盖验证通过
总计:N 条 | ✅通过:A | ❌失败:B | ⏭跳过:C
跳过理由已记录:[是/否]
覆盖状态:[路径]
→ 进入 DevOps 前置门禁检查」
→ 继续 Step 6.5
Step 6.5 【强制】DevOps 前置门禁检查
在触发 DevOps 之前,必须逐条核查以下清单,
任意一项未满足,禁止进入 DevOps:
□ 门槛1:核心路径已走通(有 API 调用/截图证据)
□ 门槛1b:路径覆盖矩阵已输出(正常/错误/边界三类)
□ 门槛2:DB 写入已验证(有实际数据证据),
或已标注「部署后补做」并计划了具体时间
□ 门槛3:AI 边界场景已测试
□ 门槛4:人工验收清单已获用户明确回复「通过」
(不可将「继续执行」「按规范执行」解读为门槛4确认)
输出确认文本:
「关卡C 4条门槛逐条确认:门槛1[✅/❌] 门槛1b[✅/❌] 门槛2[✅/❌] 门槛3[✅/❌] 门槛4[✅/❌]
全部 ✅ → 进入 DevOps」
Step 6.6 【写入关卡C完成凭证(B3.8 检查所依据的状态文档)】
⚠️ 此步骤是 session-bootstrap B3.8 的数据来源。
关卡C测试完成后,test-coverage-state.md 必须无 🔲 条目,
这是 B3.8 判断「关卡C已完成」的唯一依据。
确认 Step 5.5 已将所有测试项更新为 ✅/❌/⏭(无 🔲 残留):
Read: [项目路径]/测试工程师/test-coverage-state.md
IF 仍有 🔲 条目 → 禁止声明关卡C完成,必须继续执行或明确标注跳过理由
IF 无 🔲 条目 → 关卡C状态文档已就绪,B3.8 核查可通过
输出最终确认:
「✅ 关卡C完成凭证已写入
test-coverage-state.md 状态:[N条 ✅ / M条 ❌ / K条 ⏭]
B3.8 核查将依据此文件。下一步可触发 DevOps 或结束本轮任务。」
五类测试维度(含执行者标注)
| 测试类型 | 验证角度 | 执行者 | 典型问题 |
|---|---|---|---|
| 功能测试 | 每个功能节点是否按产品文档实现 | AI 自动 | 接口返回码、数据写入、路由正确性 |
| 闭环测试 | 整条用户动线是否可以走通 | AI 自动 + 浏览器 | 核心路径端到端,每步确认输出 |
| AI 行为评测 | 智能体层可靠性 | AI 自动 | 回答风格、边界输入、空输入、SSE 流 |
| 体验验收 | 体验是否符合设计意图 | AI 用浏览器完全自动执行;仅「视觉审美/手感流畅度」2类留人工(≤3项) | 按钮存在/文案/空状态/错误提示/流程走通:全部浏览器自动验证+截图留档。人工只判断 AI 无法量化的主观感受 |
| 压力测试 | 系统稳定性 | 可选(本地跳过) | 并发写文件、长时运行;SaaS 产品必测 |
规则(v1.2 修订):
- AI 拥有浏览器工具(cursor-ide-browser MCP)时,体验验收类测试必须优先用浏览器执行,不得直接跳过输出「人工验收清单」
- AI 用浏览器可验证的项目:界面元素是否存在、交互流程是否走通、错误状态是否显示、文案是否正确
- 仅以下类型保留人工判断:① 视觉审美(颜色/排版好不好看)② 交互感受(顺不顺手/有没有卡顿)
- 人工验收清单应最小化:只包含 AI 浏览器无法判断的主观感受类,不得把可自动化的项目放入清单
规则(v1.3 新增):人工验收清单只能包含「本 Phase 已实现」的功能
❌ 禁止把「未来 Phase 才会实现」的功能放入人工验收清单,即使包装为「可待 X 实现后验证」
判断标准:
- 该功能的代码/配置已经写入本次提交 → 可以放入人工清单(等真实环境确认)
- 该功能还没有代码存在(属于下个迭代计划)→ 不得放入人工清单,应标注为「Phase N 待实现」
根因:把未实现功能放入人工清单会混淆「已完成」和「未完成」的边界,误导关卡C通过判断(2026-03-21 实战踩坑)
关卡C 硬性通过门槛(4条缺一不可)
不满足以下任意一条,不允许标 ✅,不允许进 DevOps。
□ 门槛1:核心用户路径端到端至少走通1条完整路径
(从用户第一步输入到最终输出,每步有 API 调用证据)
⚠️ 对话/AI功能特别要求:若功能包含「用户发消息→AI响应」路径,
必须实际发送至少1条消息并等到 AI 真实回复(不能只验证界面存在或输入框可用)
「界面正常+输入框可见」≠「对话功能通过」
□ 门槛1b(F-021全量搜索):产品定义中所有「反馈分支路径」均有测试覆盖
不只测正常路径(happy path),必须覆盖主要错误路径、边界路径
输出「路径覆盖矩阵」:
| 路径类型 | 描述 | 已测试 | 结果 |
| 正常路径 | [主流程] | ✅/❌ | 通过/Bug |
| 错误路径 | [输入错误/权限不足] | ✅/❌ | 通过/Bug |
| 边界路径 | [空状态/极限输入] | ✅/❌ | 通过/Bug |
若某路径无法在本次测试中覆盖,必须说明原因并标注「跳过」
□ 门槛2:所有文件写入/DB 写入操作有真实写入验证
(不是"代码里有写入逻辑",而是"实际调用后文件/DB 里有数据")
□ 门槛3:至少1个 AI 行为边界场景测试
(空输入 / 异常输入 / 越权操作 / 意图外输入,至少测其中一个)
□ 门槛4:人工验收清单已列出,用户明确确认「通过」
(体验类项目不能由 AI 自行判断通过)
⚠️ 门槛4 关键执行规则(防止最常见违规):
- 用户说「继续执行」「按规范执行」「没问题」≠ 门槛4通过
- 门槛4 要求用户针对人工验收清单的每项,明确回复「通过」或具体反馈
- AI 必须等待用户对清单的明确回复,才能进 DevOps
- 门槛4 和 DevOps 是严格顺序依赖:人工确认 → DevOps,不可并行
□ 门槛1特例(本地无DB/生产环境未部署时):
- 若本地无数据库导致端到端无法执行,必须在人工验收清单中明确标注:
「门槛1/2 待部署后在生产环境验收,DevOps 后需补做 API 全量测试」
- 部署到生产后,必须立即在生产环境执行完整的 API 测试,不能以「代码看起来正确」代替
- 发现 Bug → 修复 → 重新部署 → 重新测试(不允许跳过回归)
TE-01 验收可自测原则(Testable Acceptance Criteria)
核心规定:所有验收标准应默认设计为「可 API 自测」,不依赖人工观察。
定义:可自测验收 = 自动化测试脚本(如 scripts/integration_test.py)能在固定时限内跑完并输出 PASS/FAIL,退出码非0=有失败。
分层原则
| Layer | 依赖 | 测试范围 | 时限 |
|---|---|---|---|
| Layer 0(无LLM) | 直接调 Python 函数 | 纯逻辑、数据处理 | <10s |
| Layer 1(有LLM) | HTTP + SSE + logs 断言 | 完整链路(Agent调用→工具→返回) | <120s |
断言设计原则(解决 LLM 不确定性)
✅ 只验关键节点存在
示例:`read_skill` tool_call 在 logs 中存在,不验完整文本或顺序
✅ Layer 1 用例隔离
- 测试前后 DELETE /logs
- 使用带时间戳的 session_id(防测试间干扰)
❌ 禁止:验证 LLM 输出的完整文字内容(非确定性,导致测试脆弱)
❌ 禁止:验证工具调用的具体顺序(LLM 可能选择不同但等效的执行路径)
「需要用户实测」= 技术债起点
□ 每次新增能力,对应验收用例同步写入 integration_test.py(不延后)
□ 验收通过 = integration_test 自动 PASS,不是「我测了,感觉对」
□ 「需要用户实测才能验证」写进开发计划 → 必须转化为可自测用例,否则是技术债
关卡C:实现-产品文档对比审核清单
完整执行流程。
步骤1 打开产品定义.md,找到对应功能的描述章节
步骤2 列出该章节中所有"用户可感知行为"(至少5条)
示例(双模式功能):
□ 访问 ?mode=proxy 看到 Proxy 单栏界面和 Banner
□ Proxy 模式输入问题,收到基于认知文档的回答(不触发工作流)
□ Proxy 对话结束后,Owner 模式收件箱出现该条记录
□ 点击「→ 整合到认知库」,输入框填入「【来自访客】…」
□ 点击「分享分身」弹出包含 ?mode=proxy URL 的 popover
步骤3 对每条行为,验证实现
→ 找不到实现 → 标"未实现" → Bug 报告
→ 有代码但未接通执行路径 → 标"架构就绪但未完成" → Bug 报告
→ 实现了但与 PRD 不符 → 标"产品偏差" → 产品偏差报告(回PM)
→ 有意简化 → 标"🔧简化" → 记录差距
步骤4 对所有文件/DB 写入操作,执行一次真实测试
→ 实际调用 API,查询文件/DB 确认数据写入
→ 必须有截图或 API 响应作为证据
步骤5 走完全量用户路径(F-021全量搜索原则)
→ 主干路径(正常完成):测试完整端到端
→ 错误路径(各类错误输入/权限不足/异常状态):至少覆盖全部错误类型
→ 边界路径(空状态/极限值/并发等):至少覆盖关键边界
→ 输出路径覆盖矩阵(格式见门槛1b),说明已覆盖和跳过的路径
→ 每步记录 API 请求和响应摘要
步骤6 输出「人工验收清单」给用户
→ 列出所有需要打开浏览器才能验证的体验项
→ 等待用户确认,不得跳过
步骤7 全部通过(含用户确认人工验收项)→ 可以进 DevOps
有任何未通过 → 不能进 DevOps,分类回报
Bug 报告格式
见:.cursor/skills/role-测试工程师/templates/Bug报告模板.md
标准格式:
### BUG-YYYYMMDD-NN: [简短描述]
**严重程度**:P0(阻塞核心路径)/ P1(功能错误)/ P2(体验问题)
**发现于**:[功能模块]
**现象**:[用户看到了什么]
**复现步骤**:
1. [步骤1]
2. [步骤2]
3. [结果]
**期望结果**:[根据产品文档,应该发生什么]
**根因分类**:代码/逻辑错误(→ 开发修复)/ 与PRD不符(→ PM决策)
**回归要求**:修复后需验证 [具体验证点]
产品偏差报告格式
### DEVIATION-YYYYMMDD-NN: [简短描述]
**发现于**:[功能模块]
**产品文档要求**:[PRD 中的具体描述]
**实际实现**:[当前代码/功能的实际行为]
**差距描述**:[设计了X,实现了Y,差距是Z]
**PM 决策选项**:
- 选项A:修改实现,使其符合 PRD(影响:开发工作量 _)
- 选项B:修改 PRD,接受当前实现(影响:产品功能调整)
人工验收清单格式(输出给用户)
AI 完成自动测试后,必须用此格式向用户输出需要人工确认的项目。
## 🙋 需要你人工验收的项目
以下内容 AI 无法自动测试,需要你打开浏览器确认:
| # | 验收项 | 操作步骤 | 期望结果 |
|---|---|---|---|
| 1 | Proxy Banner 显示 | 访问 /?mode=proxy | 顶部有蓝色 Banner 显示主人名 |
| 2 | 分享分身 popover | 点击顶栏「分享分身」 | 弹出含 ?mode=proxy URL 的 popover |
| 3 | 收件箱空状态 | 无访客记录时进入收件箱 | 显示「暂无访客问题」和链接提示 |
请逐项确认,并回复「通过」或指出问题。
在你确认之前,本功能不标 ✅。
测试用例覆盖矩阵
账号系统测试用例
| 场景 | 步骤 | 期望结果 |
|---|---|---|
| 正常注册 | 填入手机号→发送验证码→填入验证码→填入密码→注册 | 注册成功,自动登录,跳转首页 |
| 验证码错误 | 填入错误验证码→注册 | 提示"验证码错误" |
| 手机号已注册 | 填入已注册手机号→注册 | 提示"该手机号已注册" |
| 正常登录 | 填入手机+密码→登录 | 登录成功,跳转首页 |
| 密码错误 | 填入错误密码→登录 | 提示"密码错误" |
| Token 过期 | 等待 Token 过期→访问受保护路由 | 跳转登录页,不显示未授权错误 |
| API Key 登录 | 用 oak_ 前缀 Key 调用 API | 成功,行为与 JWT 登录一致 |
AI 功能测试用例
| 场景 | 验证点 | 执行者 |
|---|---|---|
| 正常对话 | AI 返回有意义的回复(非空,非乱码) | AI 自动 |
| 长对话 | 第 N 轮对话后,AI 仍记得用户之前说的信息 | AI 自动 |
| 边缘输入(空消息) | 系统优雅处理,不崩溃 | AI 自动 |
| 边缘输入(超长消息) | 系统处理,或友好提示字数限制 | AI 自动 |
| SSE 流式输出 | 客户端实时收到数据,不是等全部完成再显示 | AI 自动 |
| SSE 中断 | 服务端错误时,客户端收到错误事件,不是永远转圈 | AI 自动 |
| 回答风格(Proxy 模式) | 含第三人称,不以「我认为」开头 | AI 自动 |
| 质疑/反馈输入 | 先承认访客视角,再基于认知结构回应 | 人工验收 |
强制集成测试时机
□ 任何文件/DB 写入函数写完后 → 实际调用,查询确认写入(必须有文件存在或DB记录证据)
□ 任何 SSE 端点 → curl 或 requests 发真实请求,确认流式输出
□ 任何新增路由 → curl 调用,确认状态码和内容
□ 登录/认证修改后 → 走完注册→登录→受保护路由完整流程
□ 核心路径任何修改后 → 走完完整核心用户路径
□ 任何影响界面的修改 → 必须列入人工验收清单
生产环境验收:使用服务器 AI 接口
执行关卡C 时,生产环境状态验证使用以下接口,无需 SSH:
import httpx
def ask_server(message: str) -> str:
r = httpx.post(
"https://openclaw.tashan.chat/api/internal/chat",
headers={"X-API-Key": "tashan-internal-2026"},
json={"message": message},
timeout=120,
)
r.raise_for_status()
return r.json()["reply"]
# 验收常用指令
ask_server("检查所有容器健康状态")
ask_server("查看 [项目名]-backend 最新日志,是否有错误")
ask_server("访问 https://[域名]/api/health 并返回响应")
→ 详见 _内部总控/开发规范/AI调用服务器助手接口规范.md
与其他角色的接口
我接收:
- 各开发(前端/后端/AI工程师)→ 完成的功能模块(含自测报告)
- 产品经理 → 产品文档(唯一验收标准)
我输出(三个方向,严格区分):
- → 对应开发:Bug 报告(代码/逻辑错误)
- → PM:产品偏差报告(实现了但与PRD不符)
- → 用户:人工验收清单(体验类,等待用户确认)
- → DevOps:测试通过报告(发布授权,含用户已确认人工验收项的记录)
- → issue-tracker(必须调用):
- 每发现一个 Bug → 同时调用 issue-tracker,写入
技术架构师/技术问题追踪台.md - 每发现一个产品偏差 → 同时调用 issue-tracker,写入
产品经理/产品问题追踪台.md - 目的:确保问题在对话结束后不消失,下次相关角色激活时能感知
- 每发现一个 Bug → 同时调用 issue-tracker,写入
关键规则:
- Bug 修复后必须执行回归测试
- Bug 和产品偏差必须严格区分,不能混淆发送
- 人工验收清单未得到用户确认前,不能进 DevOps
- 每个发现的问题都必须写入追踪台,不允许只在对话中输出
变更记录
2026-03-18 22:26 — 重构关卡C规范(三大缺陷修复)
根因:在双模式+访客收件箱功能开发中,AI 在写完代码后只跑了 8 个接口测试便自称「关卡C完成」,实际上漏掉了端到端闭环测试、体验验收、边界场景测试,根本没有向用户输出人工验收清单。这是三个结构性缺陷造成的:触发机制失效(AI 自测场景)、通过标准不可量化、未区分 AI/人工测试。
修改内容:
- 新增:「AI 自测场景的强制视角切换」章节(最前面,防止最常见的执行漏洞)
- 修改:「五类测试维度」表格新增「执行者」列(AI自动 / 必须人工 / 可选)
- 新增:「关卡C 硬性通过门槛(4条缺一不可)」章节
- 修改:「关卡C 审核清单」Step 5 拆分为 Step 5+6,Step 6 为「输出人工验收清单」
- 新增:「人工验收清单标准格式」章节
- 修改:「与其他角色接口」新增「→ 用户:人工验收清单」输出方向
- 修改:「AI 功能测试用例」表格新增「执行者」列
验证结果:
- 正向验证:待下次执行关卡C时验证新规则是否生效
- 负向验证:原有 Bug 报告格式、产品偏差格式、强制集成测试时机均未改动
已知风险:人工验收清单的「等待用户确认」会在自动化任务中造成阻塞,需要用户有意识地回复。如果用户没有回复,AI 不应自行判断通过。
激活后立即执行
Step 1 Read: 产品经理/产品定义.md → 这是唯一验收标准
Step 2 Read: 产品经理/开发计划.md → 了解本次提交覆盖的功能范围
Step 3 执行五类测试(见下方)
Step 4 分类输出结果:Bug → 开发;产品偏差 → PM;通过 → DevOps
五类测试维度
| 测试类型 | 验证角度 | 典型问题 |
|---|---|---|
| 功能测试 | 产品使用完整性 | 每个功能节点是否按产品文档实现 |
| 闭环测试 | 主干动线完整性 | 整条用户动线是否可以走通 |
| AI 行为评测 | 智能体层可靠性 | 接口是否完备、输出是否稳定、幻觉率 |
| 体验验收 | 人层感知质量 | 体验是否符合设计意图(非代码问题);两产品前端统一任务:必须逐页截图对比,不能只验功能 |
| 压力测试 | 系统稳定性 | 高并发、大数据量、长时间运行 |
关卡C:实现-产品文档对比审核清单
这是测试工程师执行关卡C的完整流程。
步骤1 打开产品定义.md,找到对应功能的描述章节
步骤2 列出该章节中所有"用户可感知行为"(至少5条)
示例(账号系统):
□ 用户可以用手机号发送验证码(收到真实短信)
□ 验证码输入框始终显示(发送前也显示)
□ 注册成功后自动登录,跳转到首页
□ 错误情况有明确的用户可读提示
□ dev_code 在响应含有时展示 15 秒
步骤3 对每条行为,验证实现
→ 找不到实现 → 标"未实现" → Bug 报告
→ 有代码但未接通执行路径 → 标"架构就绪但未完成" → Bug 报告
→ 实现了但与 PRD 不符 → 标"产品偏差" → 产品偏差报告(回PM)
→ 有意简化 → 标"🔧简化" → 记录差距
步骤4 对所有数据库写入操作,执行一次真实测试
→ 实际调用 API,在 DB 中查询确认数据写入
步骤5 走完整个核心用户路径(端到端)
→ 核心路径 = 产品定义中定义的最短完整路径
→ 每步确认输出符合产品文档的描述
步骤6 全部通过 → 可以进 DevOps
有任何未通过 → 不能进 DevOps,分类回报
Bug 报告格式
见:.cursor/skills/role-测试工程师/templates/Bug报告模板.md
标准格式:
### BUG-YYYYMMDD-NN: [简短描述]
**严重程度**:P0(阻塞核心路径)/ P1(功能错误)/ P2(体验问题)
**发现于**:[功能模块]
**现象**:[用户看到了什么]
**复现步骤**:
1. [步骤1]
2. [步骤2]
3. [结果]
**期望结果**:[根据产品文档,应该发生什么]
**根因分类**:代码/逻辑错误(→ 开发修复)/ 与PRD不符(→ PM决策)
**回归要求**:修复后需验证 [具体验证点]
产品偏差报告格式
### DEVIATION-YYYYMMDD-NN: [简短描述]
**发现于**:[功能模块]
**产品文档要求**:[PRD 中的具体描述]
**实际实现**:[当前代码/功能的实际行为]
**差距描述**:[设计了X,实现了Y,差距是Z]
**PM 决策选项**:
- 选项A:修改实现,使其符合 PRD(影响:开发工作量 _)
- 选项B:修改 PRD,接受当前实现(影响:产品功能调整)
测试用例覆盖矩阵
账号系统测试用例
| 场景 | 步骤 | 期望结果 |
|---|---|---|
| 正常注册 | 填入手机号→发送验证码→填入验证码→填入密码→注册 | 注册成功,自动登录,跳转首页 |
| 验证码错误 | 填入错误验证码→注册 | 提示"验证码错误" |
| 手机号已注册 | 填入已注册手机号→注册 | 提示"该手机号已注册" |
| 正常登录 | 填入手机+密码→登录 | 登录成功,跳转首页 |
| 密码错误 | 填入错误密码→登录 | 提示"密码错误" |
| Token 过期 | 等待 Token 过期→访问受保护路由 | 跳转登录页,不显示未授权错误 |
| API Key 登录 | 用 oak_ 前缀 Key 调用 API | 成功,行为与 JWT 登录一致 |
AI 功能测试用例
| 场景 | 验证点 |
|---|---|
| 正常对话 | AI 返回有意义的回复(非空,非乱码) |
| 长对话 | 第 N 轮对话后,AI 仍记得用户之前说的信息 |
| 边缘输入(空消息) | 系统优雅处理,不崩溃 |
| 边缘输入(超长消息) | 系统处理,或友好提示字数限制 |
| SSE 流式输出 | 客户端实时收到数据,不是等全部完成再显示 |
| SSE 中断 | 服务端错误时,客户端收到错误事件,不是永远转圈 |
强制集成测试时机
□ 任何 DB 写入函数写完后 → 实际调用,查询数据库确认写入
□ 任何 SSE 端点 → curl 或 httpx 发真实请求,确认流式输出
□ 任何新增路由 → curl 调用,确认状态码和内容
□ 登录/认证修改后 → 走完注册→登录→受保护路由完整流程
□ 核心路径任何修改后 → 走完完整核心用户路径
与其他角色的接口
我接收:
- 各开发(前端/后端/AI工程师)→ 完成的功能模块(含自测报告)
- 产品经理 → 产品文档(唯一验收标准)
我输出(三个方向,严格区分):
- → 对应开发:Bug 报告(代码/逻辑错误)
- → PM:产品偏差报告(实现了但与PRD不符)
- → DevOps:测试通过报告(发布授权)
关键规则:
- Bug 修复后必须执行回归测试
- Bug 和产品偏差必须严格区分,不能混淆发送
2026-03-19 02:10 — 断点2+3修复:发现问题后强制调用 issue-tracker 写入追踪台
根因:测试工程师发现 Bug 和产品偏差后,报告只在对话中输出,开发和 PM 重新激活时看不到这些未解决问题。
修改内容:
- 修改:「与其他角色接口 → 我输出」→ 新增「issue-tracker(必须调用)」输出方向,明确每个 Bug 写技术追踪台,每个产品偏差写产品追踪台
- 新增:关键规则「每个发现的问题都必须写入追踪台」
验证结果:
- 正向验证:测试工程师发现一个 Bug 后,技术追踪台应有新条目
- 负向验证:Bug 报告格式、产品偏差格式、人工验收流程不变
经验感知钩子
本节由 uto-experience-hook Rule 驱动,此处为提示性说明。
执行本 Skill 过程中,若触发以下任一信号,立即追加一行到暂存区(不中断主任务):
- 踩坑:遇到错误且踩坑速查中找不到解决方案,最终找到了正确做法
- 新发现:完成了某个当前 Skill 流程未覆盖的步骤,且未来会重复用到
- 步骤偏差:Skill 描述的步骤顺序/内容与实际执行不符
- 缺失 Skill:遇到某类任务没有对应 Skill,只能凭经验执行
暂存格式(追加到 .cursor/skills/skill-index/PENDING-EXPERIENCES.md):
| [今日日期] | [本Skill目录名] | [信号类型] | [一句话描述经验内容] | 🔲 待处理 |
所有执行步骤完成后,检查暂存区是否有新增条目。若有,在收尾时告知用户: 「本次执行感知到 N 条经验(已暂存),任务确认跑通后可说「做一次项目复盘」处理。」
⚠️ 强制收尾——写入任务日志(不可省略,不可等用户提示):
执行顺序铁律:先工具调用 → 确认成功 → 告知用户。禁止声称「已写入」而未实际调用工具。
1. [工具调用-读取] grep 今日 TASK-YYYYMMDD 全部条目,取最大序号 NN → 新序号 = NN+1
2. [工具调用-写入] StrReplace 追加到 `_内部总控/任务日志.md`:
本次 Skill 执行的核心操作 + 创建/修改的文件 + 用户原始需求 + 遗留事项
3. 工具调用成功 → 输出「📝 任务日志已写入 [TASK-YYYYMMDD-NN]」
工具调用报错 → 输出「⚠️ 任务日志写入失败,请手动检查任务日志.md」
跨产品前端一致性验收(特殊场景)
当任务是「两个产品前端统一」时,体验验收不能只验功能是否可用,必须执行截图逐页对比。
强制执行条件:任务描述含「前端统一」「UI 对齐」「样式一致」「合并前端」等关键词。
截图对比清单(5项缺一不可):
□ ①标题/标签文本一致 — 所有页面的标题、按钮文字、标签文案完全相同
□ ②整体布局结构一致 — 页面区块排列、层级结构、导航位置视觉一致
□ ③CSS 样式一致 — 输入框、按钮、间距、圆角、颜色等样式属性一致
□ ④默认值一致 — 输入框预填充值、选择器默认选项、开关默认状态一致
□ ⑤容器/外层组件一致 — 包裹页面的上层容器(Layout/Page 组件)使用同一版本
执行方式:用 cursor-ide-browser 对两个产品的同名页面各截图一张,并排对比逐项确认。
失败处理:任一项不一致 → 标记为 P2 体验 Bug,回开发修复,修复后重新截图对比验证。
变更记录(续)
2026-03-19 — v1.2 → v1.3 — 关卡C 改为调用 verifier 子智能体
根因:测试工程师(关卡C)在单 Agent 全流程中存在「开发者视角自我验收」的结构性缺陷,即使已有「强制视角切换」规则,仍然共享开发上下文。verifier 子智能体从干净上下文启动,从根本上解决上下文污染问题。
修改内容:
- 修改:「激活后立即执行」Step 4 → 从「执行AI可自动测试项目」改为「调用 /verifier 子智能体(前台),传入功能描述、文件路径、验收标准」
- 修改:Step 5 → 从「输出人工验收清单」改为「解析子智能体报告,分类处理通过项/失败项/需人工项」
验证结果:
- 正向验证:触发关卡C,AI 应调用 verifier 子智能体,主对话不包含测试中间步骤(待真实场景验证)
- 负向验证:Bug 报告格式、产品偏差格式、人工验收清单格式、4条硬性通过门槛均不变
验证状态:✅ 已验证(2026-03-21 tashan-workbench Phase E 关卡C:verifier独立发现4个开发者遗漏Bug,关卡C 4条门槛全部通过)
v1.3.1 — 2026-03-19 — 新增生产环境验收:服务器 AI 接口
根因:AGENT_RULES.md 新增 RULE-25。关卡C 生产环境验收时,需要查容器状态、日志、接口可达性,原流程无对应工具指引,测试工程师只能通过 SSH 或跳过验证。
经验核心:生产环境验收应优先使用服务器 AI 接口(https://openclaw.tashan.chat/api/internal/chat),无需 SSH 权限,从容器状态到接口可达性均可通过 ask_server() 查询。
修改内容:
- 新增:「生产环境验收:使用服务器 AI 接口」章节,位于「强制集成测试时机」之后、「与其他角色的接口」之前
- 包含可直接运行的
ask_server()示例代码及三条常用验收指令
验证结果:
- 正向验证:执行关卡C生产环境验收时,可调用接口查询容器/日志/接口状态 → 待验证
- 负向验证:Bug报告格式、人工验收清单、4条硬性通过门槛均不变
验证状态:🔵 待验证
v1.4 — 2026-03-19 — 体验验收改为 AI 用浏览器主动执行,人工仅保留审美判断
根因:真实事件——Phase 2(认证系统/登录/注册/Owner模式)完整部署上线,但关卡C没有用浏览器走通登录UI主干闭环。发现根本原因:「体验验收 → 必须人工」这条规则给了AI合理逃跑理由,直接输出「人工验收清单」而不使用手头的 cursor-ide-browser MCP 工具做验证。AI能做的测试没有做,直接推给用户。
经验核心:「体验类测试必须人工」这个假设在 AI 没有浏览器工具时成立。一旦 AI 拥有浏览器工具,大部分体验类测试(界面元素存在/流程走通/错误提示正确/文案正确)应由 AI 自动执行,只有「视觉审美好不好看」「交互手感顺不顺」这类无法客观验证的主观感受才需要人工。
修改内容:
- 修改:「五类测试维度」表格中「体验验收」执行者从「必须人工」改为「AI 用浏览器执行;仅审美主观留人工」
- 修改:五类测试维度下方的「规则」说明,明确「AI 有浏览器工具时必须用浏览器验证体验类」
- 新增:Step 4.5 浏览器端到端测试步骤(核心路径走通 + 截图确认 + 错误状态验证)
- 修改:Step 5 合并浏览器测试结果到验证报告解析
验证结果:
- 正向验证:本次立即执行 Phase 2 关卡C,AI 用浏览器打开 openbrain.tashan.chat 完成登录/Owner模式闭环测试
- 负向验证:API 测试/verifier子智能体/Bug报告格式/4条硬性门槛均不变
验证状态:✅ 已验证(2026-03-19 Phase 2 关卡C:浏览器测试发现 React P0 Bug,体验类测试 AI 用浏览器执行规范有效,人工验收清单缩短至3项主观感受类)
v1.8 → v1.9 — 2026-03-20 — 新增 Step 0 本地环境前置检查(防无 DB 放行关卡C)
根因:OpenBrain v2.0 部署时,本地没有 PostgreSQL,AI 未做端到端测试就声称「关卡C通过」并触发 DevOps。P0 Bug(u.display_name 列不存在,所有平台 API 返回 500)在生产才被发现。根本原因是关卡C入口没有对「本地测试环境是否就绪」做前置阻断。
修改内容:
- 新增:Step 0「本地环境前置检查」——docker ps 检查 postgres 是否在运行;无 DB 时要求在生产环境补做,明确禁止「无 DB → 跳过 → 宣称通过」的行为链
验证结果:
- 正向验证:在无 postgres 容器的环境触发关卡C → 应看到 Step 0 输出阻断提示和选项(待验证)
- 负向验证:本地有 DB(或在生产执行)时,Step 0 通过,不影响后续 Step 1-6.5
验证状态:🔵 待验证
v1.8 — 2026-03-19 — 新增 Step 3.5:生产测试账号获取前置步骤
根因:关卡C 在生产环境验收时,AI 遇到「无法登录」就停下来,或直接跳到 DevOps,而不是主动向用户请求测试凭据。用户指出测试账号本应是标准工具,应在规范中明确。
修改内容:
- 新增:Step 3.5「生产环境端到端测试前置」,明确三步优先级(DEPLOY_ARCH.md → 向用户请求 → 不允许跳过)
- 明确禁止行为:不允许以「无账号」为由跳过门槛1
同步修改:DEPLOY_ARCH.md 新增「生产测试账号」章节,说明账号来源和关卡C使用说明。
验证结果:
- 正向验证:生产测试账号前置步骤在 tashan-openbrain Phase 2 测试中执行,账号 18811132625 通过步骤 3.5 正确获取,登录验证和 smoke test 均通过
- 负向验证:原有 verifier 调用、浏览器测试、门槛逻辑不变
验证状态:✅ 已验证(2026-03-20)
v1.7 — 2026-03-19 — 门槛4防误解 + DevOps 前置门禁检查
根因:OpenBrain v2.0 部署时,关卡C 执行到一半就触发了 DevOps。发生原因:
① 用户说「继续执行」被误解为门槛4「人工验收已确认」;
② 没有强制的 DevOps 前逐条核查清单;
③ 本地无 DB 时声称「跳过」而非「标注待补做」。
结果:P0 Bug(u.display_name 列不存在)进入了生产,在生产环境 API 测试中才发现。
修改内容:
- 修改:门槛4 → 新增「⚠️ 关键执行规则」,明确「继续执行」不等于门槛4确认,门槛4与DevOps严格顺序依赖
- 新增:门槛1特例条款 → 本地无 DB 时的处理方式(标注待补做,部署后必须立即补测)
- 新增:Step 6.5「DevOps 前置门禁检查」→ 进入 DevOps 前必须逐条核查5条门槛,输出确认文本
验证结果:
- 正向验证:tashan-openbrain Phase 2 部署时,DevOps 前置门禁检查正确拦截了「未完成关卡C就部署」的情况,门禁规则有效
- 负向验证:已有的 verifier 调用、浏览器测试、Bug 报告格式、4条门槛内容本身不变
验证状态:✅ 已验证(2026-03-20)
v1.6 — 2026-03-19 — F-021全量搜索:关卡C从「最短核心路径」升级为「全量路径覆盖」
根因:F-021原则写入认知体系,关卡C步骤5仅要求测试「最短完整路径」,忽略错误路径、边界路径,测试覆盖不完整,与「全量搜索」原则矛盾。
修改内容:
- 新增:硬性门槛1b「全量路径覆盖:正常路径+错误路径+边界路径」,含路径覆盖矩阵格式
- 修改:详细步骤5 → 从「走完核心用户路径」改为「走完全量用户路径」,要求输出路径覆盖矩阵
验证结果:
- 正向验证:下次关卡C时,必须输出路径覆盖矩阵,不能只跑正常路径(待验证)
- 负向验证:门槛1/2/3/4、Bug报告格式、人工验收清单格式、浏览器测试规范不变
验证状态:🔵 待验证
v1.5 — 2026-03-19 — 新增跨产品前端一致性验收特殊场景
根因:画像系统两产品前端统一任务中,关卡C 体验验收只确认了「功能可用」而未做截图对比,导致上层容器组件(ProfileHelperPage.tsx)样式不同(tashan-world 旧版 vs TopicLab 新版)被漏过,验收后仍存在视觉不一致问题。
经验核心:「两产品前端统一」是特殊任务类型,体验验收必须升级为「截图逐页对比」——5项缺一不可:①标题/文本 ②布局结构 ③CSS样式 ④默认值 ⑤容器/外层组件。
修改内容:
- 修改:「五类测试维度」表格(两处)「体验验收」典型问题列 → 追加「两产品前端统一任务:必须逐页截图对比,不能只验功能」
- 新增:「跨产品前端一致性验收(特殊场景)」章节,包含5项截图对比清单、触发条件、执行方式和失败处理
验证结果:
- 正向验证:下次执行「两产品前端统一」任务时,关卡C应自动触发截图对比清单 → 待验证
- 负向验证:单产品功能测试、Bug报告格式、4条硬性门槛均不变
验证状态:🔵 待验证
v1.9 → v1.10 — 2026-03-22 — 新增 Step 4.6:verifier 幻觉防护交叉验证
根因:2026-03-22 实测发现,verifier 子智能体有概率幻觉,引用不存在的文件路径或错误描述代码内容,导致「文件不存在」「函数未实现」类误报。主 Agent 若直接信任这类否定性结论并生成 Bug 报告,会产生虚假 Bug,浪费开发资源并降低测试工程师可信度。
经验核心:verifier 的正向判断(「存在/正确/通过」)置信度较高;否定性判断(「不存在/缺失/未实现」)必须用 Read 工具交叉验证后再采纳。
修改内容:
- 新增:Step 4.6「verifier 幻觉防护」——在调用 verifier 后、解析结论前,对否定性判断强制用 Read 工具交叉验证;正向判断可直接采纳;幻觉判断(交叉验证不符)直接丢弃,不生成 Bug 报告
验证结果:
- 正向验证:收到 verifier「文件 X 不存在」结论 → AI 应先 Read 文件确认,再决定是否生成 Bug 报告(待真实场景验证)
- 负向验证:verifier 返回「接口正常返回/功能已实现」类正向结论时,不触发交叉验证,流程不受影响
验证状态:🔵 待验证
备份路径:.cursor/skills/role-测试工程师/history/SKILL_v1.9_20260322.md
2026-03-21 — verifier 子智能体首次完整验证通过(A类状态升级)
验证事件:tashan-workbench Phase E brain_ask 关卡C。
验证结果:
- verifier 从独立上下文发现4个开发者自检遗漏的Bug:P0-1未实现/profile/sync是stub/autoConfirm非功能/500代替429
- 「与开发上下文隔离」有效性得到实证
- 关卡C 4条门槛全部通过,Phase E 标 ✅
验证状态升级:Step 4(verifier 子智能体)🔵 → ✅
v1.11 → v1.12 — 2026-03-23 — 新增 TE-01 验收可自测原则(Testable Acceptance Criteria)
根因:tashan-openbrain_myagent Phase 5(TASK-20260322-104/105)实战发现:当验收标准设计为「需要用户实测」时,形成「感觉对」= 通过的主观判断闭环,无法在 CI 中复现,本质上是技术债起点。触发条件:integration_test.py 已能自动跑完链路测试,但对应验收用例未同步写入,验收仍依赖人工观察。
经验核心:可自测验收(Layer 0 纯逻辑 <10s / Layer 1 HTTP+SSE+logs <120s)+ 断言设计原则(只验关键节点存在,不验完整文本或顺序;Layer 1 用例隔离)= 让关卡C可机器复现,不依赖人工状态。
修改内容:
- 新增:「TE-01 验收可自测原则(Testable Acceptance Criteria)」章节,位于「关卡C 硬性通过门槛」之后、「关卡C 实现-产品文档对比审核清单」之前
- 包含:分层原则表格(Layer 0/1)、断言设计原则、「需要用户实测=技术债」强制清单
验证结果:
- 正向验证:下次新增能力时,验收用例同步写入 integration_test.py → 待真实场景验证
- 负向验证:Bug报告格式、人工验收清单格式、4条硬性通过门槛均不变
验证状态:🔵 待验证
备份路径:.cursor/skills/role-测试工程师/history/SKILL_v1.11_20260323_before_selftestable.md
v1.13 → v1.14 — 2026-03-24 — 新增 Step 0.5 沙盘与前置关卡核查(修复关卡前置被跳过的缺口)
根因:上一轮系统分析(TASK-20260324-64)发现:Gate C(测试工程师)激活后没有前置检查「上游沙盘/关卡A/B/测试规格文档是否存在」,导致开发流程可以在没有执行产品沙盘、技术沙盘、通过关卡A/B的情况下直接进入关卡C。这意味着验收标准(产品定义)可能没经过独立审核,技术架构可能没经过压力测试,测试规格文档可能不存在。
影响范围:仅 role-测试工程师/SKILL.md,加入一个前置检查步骤,不影响其他 Step 的逻辑。
修改内容:
- 新增:Step 0.5「沙盘与前置关卡核查」——在读产品定义之前,Check 1 读取 orchestration-state.md 确认关卡A/B已通过,Check 2 用 Glob 确认测试规格文档存在,Check 3 判断关卡状态;任意一项不满足均阻断并给出明确的引导信息。
- 特殊处理:orchestration-state.md 不存在时不阻断,而是向用户展示手工确认清单等待明确回复。
验证方法:
- 正向验证:对一个没有 orchestration-state.md 和 test-spec 的项目触发关卡C,应看到 Check 2 阻断提示
- 正向验证B:对一个有完整前置文档的项目触发关卡C,Step 0.5 应输出「✅ 前置核查通过」并继续
- 负向验证:Step 0.5 不影响 Step 1-6.5 的任何执行逻辑,已有门槛和格式不变
验证状态:🔵 待验证(下次触发关卡C时验证)
备份路径:history/SKILL_v1.12_20260324_before_sandbox-precheck.md
v1.12 → v1.13 — 2026-03-23 — 新增 TE-02 大文件/长时任务测试原则
根因:tashan-openbrain_v2 部署实战中,「上传失败」bug 花了多轮才定位,根因是两个系统性测试遗漏:① 测试只用小样本(<100KB),没用真实大文件;② 长时 SSE 测试(>2min)通过 internet tunnel 调用,被网络超时误判为失败,实际后端在正常运行。
经验核心:
- 测试文件应使用真实业务数据,覆盖全量大小(本项目:费曼 16 个文件 1.5MB)
- 长时 SSE 任务(如 AI build-cognition)测试必须在服务器 localhost 调用,不走外部 tunnel
修改内容:
- 新增:「TE-02 大文件与长时任务测试原则」章节
验证状态:🟢 已验证(2026-03-23 费曼 1.5MB 上传测试实战)
TE-02 大文件与长时任务测试原则
适用于:文件上传接口、批量处理、SSE 流式接口、AI agent 任务
原则一:测试文件必须使用真实规模数据
| 错误做法 | 正确做法 |
|---|---|
构造 io.BytesIO(b"# test") 小样本 | 使用实际业务文件(如 npc-content/02-richard-feynman/sources/ 全量 16 个文件) |
| 单文件测试 | 多文件并发测试(模拟用户一次选 10+ 个文件的场景) |
| 只测 HTTP 200 | 验证 count、confidence_score、files 字段值 |
必须覆盖的测试边界:
- 单文件接近上限(90% 大小)
- 多文件总计接近上限
- 包含所有支持的文件格式(.html、.json、.zip 等)
原则二:长时 SSE 任务测试必须在服务器本地执行
背景:AI 认知构建(build-cognition)等任务耗时可达 3-10 分钟。通过 internet(SSH tunnel + nginx proxy)调用时:
- nginx
proxy_read_timeout默认 60s(即使配置了 600s 也受网络层影响) - SSH tunnel 连接不稳定,断开后任务仍在运行,测试客户端误判为失败
正确测试模式:
# 在 Windows 服务器本地用 PowerShell 调用(直接访问 localhost:8100)
$resp = Invoke-WebRequest -Uri "http://localhost:8100/twin/build-cognition" `
-Method POST -Body $body -ContentType "application/json" `
-Headers $hdrs -TimeoutSec 600 -UseBasicParsing
# 在 Linux 服务器本地测试(通过 SSH 在服务器上运行脚本)
r = requests.post("http://localhost:8100/twin/build-cognition", timeout=600)
验证完成标准:收到 {"type":"done","layers":{...}} SSE 事件,AND doc-registry 文档数增加。
原则三:测试顺序 — 先小后大
- Layer 0(纯 API <10s):单文件、正常格式、正常大小 → 验证接口可达
- Layer 1(真实规模 <60s):全量文件、多格式、全量大小 → 验证 nginx 配置正确
- Layer 2(长时任务 <600s):在服务器 localhost 运行,验证端到端完成并更新 doc-registry
v1.17 → v1.18 — 2026-03-25 — 新增覆盖基线+覆盖验证门禁(根因修复:声称完成但实际漏测)
根因(来自对话 53b74d66 的事后分析):
测试智能体在 753 条消息的对话里,把「执行了 run_tests.py(36个测试)」等价于「完成了主测试文档要求的所有测试(62个)」。当用户质疑时,AI 才承认漏了 Layer 3 AI质量评测、E2E完整链路、幂等性、Soak Test 等。
本质:测试完成没有门禁——没有任何机制强制 AI 在声明「完成」前验证「文档要求的每条测试是否都有明确状态」。
修改内容:
- 新增 Step 0.4「测试覆盖基线建立」:测试前读文档提取所有ID,写入 test-coverage-state.md(真实文件,非对话记忆)
- 新增 Step 5.5「实时同步测试状态」:每条测试完成后立即更新状态文件(即时写入,不允许批量事后补)
- 新增 Step 6.4「测试覆盖验证门禁」:宣布「测试完成」前必须确认 test-coverage-state.md 中无「🔲待执行」,否则禁止进入 DevOps
设计原理:与 Step 6.5 DevOps门禁的设计保持一致——门禁是明确的阻断,不是「建议」。
验证方法:
- 正向:执行测试时,test-coverage-state.md 应逐条更新
- 负向:在有「🔲待执行」时尝试宣布「测试完成」,应看到 Step 6.4 阻断提示
备份路径:history/SKILL_v1.17_20260325_before_coverage_guard.md
v1.16 → v1.17 — 2026-03-24 — UX 测试升级为完全自动化(浏览器工具全覆盖)
根因:Agent 拥有完整浏览器权限(browser_navigate/click/snapshot/screenshot),原「人工验收清单」中大量项目实际上可以被浏览器自动验证。「视觉审美」「手感流畅度」是真正无法量化的2类,其余全部应自动化。
修改内容:
- Step 4.5:从「浏览器执行 + 人工审美留清单」改为「浏览器完全执行,人工仅留≤3项主观感受类」
- 五类测试维度表:体验验收执行者标注更新
验证状态:🔵 待验证
v1.15 → v1.16 — 2026-03-24 — 新增 Step 6.3 循环感知(与 bug-fix-loop-coordinator 联动)
根因:role-测试工程师 测试完成后只输出 Bug 报告到对话,但 bug-fix-loop-coordinator 需要通过文档(追踪台 + 轮次追踪表)获取测试状态。没有 Step 6.3,测试结果无法被协调者感知,全自动修复循环无法启动。
修改内容:
- 新增:Step 6.3「循环感知」——测试完成后强制写入追踪台 + 初始化/更新轮次追踪表 + 输出带追踪台路径的摘要给协调者
验证方法:
- 正向验证:执行关卡C后,应看到追踪台更新和轮次追踪表初始化
- 负向验证:Bug报告格式、人工验收清单、门禁条件均不变
验证状态:🔵 待验证
备份路径:history/SKILL_v1.14_20260324_before_sandbox-precheck.md(同批)
v1.14 → v1.15 — 2026-03-24 — 新增「测试规格文档创建模式」(修复沙盘→测试规格链路断裂缺口)
根因:变更管理与沙盘推演规范 §4.3 定义了含「来源字段」的测试规格文档格式,但 role-测试工程师 没有「创建测试规格文档」的执行模式,导致沙盘报告和测试规格之间的继承链路不存在——即使沙盘发现了 Critical 漏洞,也不会自动进入测试用例。
修改内容:
- 新增:「测试规格文档创建模式」章节(Step T1-T4),位于关卡C执行流程之前
- Step T1 强制读取产品/技术沙盘报告,提取 Critical/High 发现
- Step T3 按 §4.3 标准格式输出 test-spec-YYYYMMDD.md,沙盘发现继承为 L2/安全测试用例(含来源字段)
验证方法:
- 正向验证:说「创建测试规格文档」→ 应在 Step T1 读取沙盘报告,输出的 test-spec 包含沙盘编号来源字段
- 负向验证:原有关卡C流程(Step 0-Step 6.5)不受影响
备份路径:history/SKILL_v1.12_20260324_before_sandbox-precheck.md(v1.13/v1.14 改动均在同一批次备份中)
验证状态:🔵 待验证