Use when qa-engineer (or miniapp-qa-engineer) is about to publish an E2E or UAT report. Provides the report skeleton, evidence-quality bar, verdict criteria, and hand-off rules. SIT is now dev-owned and lives in progress/<role>.md (see agf-running-sit-tests skill) — this skill does NOT cover SIT reports.
npx skills add https://github.com/pcliangx/AppGenesisForge --skill agf-writing-qa-report
Use this skill when:
## Re-run [N] — [date] to the existing [feature]-e2e-[YYYY-MM-DD].md; never a new file — see "File path & naming" below)Pair with:
agf-running-sit-tests skill — SIT 由 dev 自跑,本 skill 不覆盖 SIT 报告(SIT 证据已在 progress/<role>.md 的 SIT 证据 段,归档随 docs/qa/<feature>-process-log.md 走)docs/qa/[feature]-uat-cases-[date].md(模板 docs/qa/uat-cases-_TEMPLATE.md,gate SSOT 见 testing.md「UAT 用例文档」节)— UAT 执行前生成 + 用户审核 status: Approved;执行证据回填用例文档(证据 SSOT),UAT 报告引用用例 ID,不重复粘贴证据docs/qa/[feature-kebab-case]-[stage]-[YYYY-MM-DD].md — Stage ∈ {e2e, uat}. Examples:
docs/qa/oauth-login-e2e-2026-05-13.mddocs/qa/oauth-login-uat-2026-05-15.mdOne report per stage per feature. Re-runs after defect fix → append a new ## Re-run [N] — [date] section to the same file, do not create a new file.
---
# frontmatter 是 verdict 数据的唯一 SSOT(agf-verdict.py 解析;validate-verdict hook 校客观底线、agf-matrix.sh fan-in 都读这里)
feature: [feature-slug]
date: YYYY-MM-DD
tester: qa-engineer
stage: E2E # E2E | UAT
report_verdict: Promote # Promote | Conditional promote | Block
critical_defect_count: 0 # 客观底线事实(>0 时 report_verdict 必须为 Block)
p0_pass2_total: 0 # P0 用例数(需 pass²)
p0_pass2_ok: 0 # 连续 2 次都过的 P0 数
uat_signoff_verdict: N/A # approve | request changes | N/A(仅 UAT 阶段有值;不推导)
---
# QA Report — [Feature] — [E2E|UAT]
- **Date**: YYYY-MM-DD
- **Stage**: E2E / UAT
- **Tester**: qa-engineer ([model name]) / 业务方姓名(UAT)
- **Branch**: [branch + commit hash]
- **Environment**: local docker-compose / staging / pre-prod
- **需求入口**: docs/changes/[change]/tasks.md(AC↔scenario 映射,ADR-012;旧 feature fallback docs/prd/[feature]-[date].md)
- **Code review (含 SIT Audit)**: docs/reviews/[feature]-[date].md
## Summary
- Total AC: N
- Passed: M
- Failed: K
- Blocked: J
- 界面渲染核查(仅 UAT 且含界面 feature): N/N 界面真渲染 + 截图 + 读图四查通过(矩阵 SSOT 在用例文档)
- **Verdict**: ✅ Promote to next stage / ❌ Block / ⚠️ Conditional promote
## Pre-conditions Checked
- [ ] 单元测试 + lint + typecheck 全绿
- [ ] code-reviewer 报告已存在且 verdict ≠ Block(含 SIT Audit = ✅ / ⚠️)
- [ ] AC 来源可访问(`docs/changes/<change>/tasks.md`;旧 feature fallback PRD)
- [ ] 环境就绪(DB 起来 / 迁移已 apply / 服务已启动)
- [ ] **(仅 UAT)用例文档已审核**:`docs/qa/[feature]-uat-cases-[date].md` 存在且 frontmatter `status: Approved`(MAJOR / MINOR 强制;PATCH 级 hotfix 由 PL 豁免时在报告注明理由)
任何一条没勾 → 不该开始测;先 SendMessage product-lead 解决先决条件。
## AC Results
### AC-1 (P0): [verbatim AC text from tasks.md(fallback PRD)]
- **Priority**: P0 / P1 / P2(来自 `docs/changes/<change>/tasks.md` 的 AC 优先级标注;旧 feature 来自 PRD §4 Priority;P0 必须跑 2 次,P1/P2 跑 1 次即可)
- **Setup**: [起始状态]
- **Action**: [触发步骤]
- **Expected**: [复制 AC 原文]
- **Actual (run 1)**:
HTTP/1.1 200 OK
Content-Type: application/json
{"id": 42, "status": "created"}
- **Actual (run 2)** [P0 必填;P1/P2 可空]:
HTTP/1.1 200 OK
...
- **Reliability**: `pass^1 = 1/1` 或 `pass^2 = 2/2`(P0)— 两次不一致 = `⚠️ Flaky`,按 fail 处理
- **Verdict**: ✅ Pass / ❌ Fail / ⚠️ Blocked / ⚠️ Flaky
(每个 AC 都要单独一节,**禁止合并写 'all passed'**。**为什么 P0 要跑 2 次**:业界实证(τ-bench)pass@1 高 ≠ pass^k 高,单次过的 P0 case 偶发问题会逃逸到生产。)
## Defects Found
| ID | Severity | Title | Repro steps | Suspected file |
|---|---|---|---|---|
| DEF-1 | High | ... | 1. ... 2. ... | backend/app/foo |
Severity 标准:
- **Critical**: 阻断核心流程,无 workaround
- **High**: 阻断核心流程但有 workaround;或非核心流程的数据/安全问题
- **Medium**: 边缘场景失败,不阻断核心流程
- **Low**: 体验/文案/兼容性
## Cross-stage Notes
- E2E → UAT: 给业务方的操作手册 / 数据准备说明 / 已知 P2 defect 列表
## Cost (this QA session)
- Tokens consumed: [from `/usage`]
- Estimated cost: [CNY]
- 同 feature 累计(E2E + UAT 总和):[CNY]
## Hand-off
✅ Promote → SendMessage product-lead 进下一阶段
❌ Block → SendMessage product-lead 列 critical defect,重新派回 dev
⚠️ Conditional → 列 P2 defect 单独建 issue,allow 进下一阶段
任一 P0 AC = Fail → ❌ Block
所有 P0 + P1 AC = Pass → ✅ Promote
P0 全 Pass,P1 部分 Fail → ⚠️ Conditional(P1 失败必须建跟踪 issue)
有 P0 = Blocked(环境问题) → ⚠️ Block + 升级 product-lead
report_verdict 的定性选择(Promote vs Conditional)不套公式,但两条客观底线由 validate-verdict.sh(委托 agf-verdict.py,ADR-010)退出时重算、违反即 exit 2 打回——填 frontmatter 前自查:
critical_defect_count > 0 → report_verdict 必须为 Block(有 critical defect 却 Promote/Conditional = 不可能组合)。p0_pass2_ok < p0_pass2_total(P0 未全部 pass²)→ report_verdict 不得为 Promote(P0 没连过 2 次不准晋级)。> 这两条只拦"客观不可能组合",不强定 Promote/Conditional 档;极保守 fail-open(缺字段 / 坏 yaml 一律放行 + WARN)。uat_signoff_verdict 仅结构化记录、不推导。
每条 Pass 的 Actual 段必须有可验证产物之一:
curl -i 完整响应头 + body(敏感字段可遮)SELECT 前后对比evidence/AC-N-[step].png)ls -la + 内容 head禁止只写"Passed, looks correct"——这种 Pass 不可信,等同没测。
UAT 含用户可见界面的用例额外强制(SSOT:testing.md「UAT 界面渲染核查」节):
evidence/UAT-[case]-[界面slug].png),落盘后必须用 Read 读回做视觉分析(对照 design spec + index.html 原型),在用例文档「界面渲染核查矩阵」回填四查结论(导航 / 裁切 / 控件可点 / 视觉达标)SELECT 输出只能作补充——纯 API / DB 断言不构成 Pass;矩阵任一行缺截图或缺读图结论("已截图" ≠ "已核查")= 该界面未测,本报告不得发布("合并写 all passed" / "无 evidence 的 Pass" / "Defect 不写 Repro" 已由下文「完成前的验证」checklist 反向守门,此处不重列。)
progress/<role>.md,不再有独立 SIT 报告testing.md 前后端对接强制覆盖项 ③)?testing.md「UAT 界面渲染核查」节)?任一不行 → 不要 publish,回去补。
报告落盘后立即(不等用户问):
TaskCreate 单独开 follow-up task(由 product-lead 派发)Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
Use when implementing any feature or bugfix, before writing implementation code
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes
Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always
Expert guidance for systematic backtesting of trading strategies. Use when developing, testing, stress-testing, or validating quantitative trading strategies. Covers "beating ideas to death" methodology, parameter robustness testing, slippage modeling, bias prevention, and interpreting backtest results. Applicable when user asks about backtesting, strategy validation, robustness testing, avoiding overfitting, or systematic trading development.
Cloud laboratory platform for automated protein testing and validation. Use when designing proteins and needing experimental validation including binding assays, expression testing, thermostability measurements, enzyme activity assays, or protein sequence optimization. Also use for submitting experiments via API, tracking experiment status, downloading results, optimizing protein sequences for better expression using computational tools (NetSolP, SoluProt, SolubleMPNN, ESM), or managing protein design workflows with wet-lab validation.
This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection, segmentation, and similarity search. Use when working with temporal data, sequential patterns, or time-indexed observations requiring specialized algorithms beyond standard ML approaches. Particularly suited for univariate and multivariate time series analysis with scikit-learn compatible APIs.
Take pcliangx/agf-writing-qa-report from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.