---
name: evidence-aggregation
description: Gate 3 — Sau khi Playwright chạy xong, tổ chức screenshots/traces/logs vào thư mục evidence/ theo từng TC, generate result.md per TC, auto-draft bug report cho TCs failed.
keywords: gate3, evidence, screenshots, playwright, test results, bugs, bug report, pass fail
---

# Evidence Aggregation — Gate 3

> **Mục đích:** Tổ chức evidence từ Playwright test run vào cấu trúc `evidence/` theo từng TC,
> và auto-generate draft bug reports cho TCs bị fail.
>
> **Khi nào chạy:** Sau `npx playwright test` hoàn thành trong Gate 3.

---

## Input

1. `test-results/results.json` — Playwright JSON report (từ config `reporter: ['json']`)
2. `test-results/` — thư mục chứa screenshots/traces của Playwright
3. `playwright-report/` — HTML report
4. `test-plan/test-cases/final-testcases.md` — danh sách TCs gốc (để lấy metadata)

---

## Step 1: Parse Playwright Results

Đọc `test-results/results.json` và extract:

```json
{
  "suites": [
    {
      "tests": [
        {
          "title": "[AD10_001] Đăng nhập thành công với email và password hợp lệ",
          "status": "passed",
          "duration": 1234,
          "attachments": [
            { "name": "screenshot", "path": "test-results/..." }
          ],
          "errors": []
        }
      ]
    }
  ]
}
```

Từ `title` field: extract TC_ID (format: `[ScreenID]_[NNN]` ở đầu title, trong dấu `[]`).

**Mapping rule:** `"[AD10_001] Đăng nhập thành công với email và password hợp lệ"` → `TC_ID = "AD10_001"`.

---

## Step 2: Tổ chức Evidence theo TC

Với mỗi TC, tạo folder và copy files:

```
evidence/
├── AD10_001-dang-nhap-thanh-cong/
│   ├── step-01-mo-trang-login.png      ← screenshot (nếu có)
│   ├── step-02-nhap-credentials.png
│   ├── step-03-ket-qua.png
│   └── result.md                       ← summary (xem Step 3)
├── AD10_002-error-sai-password/
│   ├── failure-screenshot.png
│   ├── trace.zip                       ← Playwright trace (nếu có)
│   └── result.md
└── ...
```

**Đặt tên folder:** `TC_[ID]-[kebab-case-scenario]` (lowercase, dấu cách thành `-`).

**Copy files từ `test-results/`:**
- Screenshots: tìm theo TC_ID trong filename hoặc theo test title match
- Traces: `.zip` files trong `test-results/`
- Nếu không tìm thấy attachment theo TC_ID → ghi chú "no screenshot" trong result.md

---

## Step 3: Generate result.md per TC

Với mỗi TC, tạo `evidence/TC_[ID]-[scenario]/result.md`:

Ngôn ngữ output: auto-detect theo ngôn ngữ của ticket/testcase input — xem `custom/rules/output-language.md` và `custom/skills/test-skills/rules/qa-writing-standards.md` (input tiếng Việt → output tiếng Việt; ngược lại mặc định tiếng Anh; tiêu đề cột bảng vẫn giữ tiếng Anh).

**Template khi PASS:**

```markdown
# Result: AD10_001 — Đăng nhập thành công

**Status:** ✅ PASS
**Duration:** 1.23s
**Run date:** [YYYY-MM-DD HH:MM]

## Evidence

| Step | Screenshot |
|------|-----------|
| 1. Mở trang /login | step-01-mo-trang-login.png |
| 2. Nhập email + password | step-02-nhap-credentials.png |
| 3. Redirect về /dashboard | step-03-ket-qua.png |

## Notes

_Test passed. No issues found._
```

**Template khi FAIL:**

```markdown
# Result: AD10_002 — Error khi sai password

**Status:** ❌ FAIL
**Duration:** 2.45s
**Run date:** [YYYY-MM-DD HH:MM]

## Failure Details

**Error message:**
```
Error: expect(received).toBeVisible()
Expected: visible
Received: not visible (element not found)
Locator: page.getByText('Sai email hoặc mật khẩu')
```

**Steps executed:**
1. ✅ Mở trang /login
2. ✅ Nhập email hợp lệ
3. ✅ Nhập password SAI
4. ✅ Click "Đăng nhập"
5. ❌ Error message không xuất hiện → FAIL

## Evidence

| File | Mô tả |
|------|-------|
| failure-screenshot.png | Trạng thái màn hình lúc fail |
| trace.zip | Playwright trace (mở bằng `npx playwright show-trace`) |

## Bug Reference

→ Xem: bugs/BUG-001-error-message-khong-hien.md
```

---

## Step 4: Auto-generate Bug Draft cho TCs Failed

Với mỗi TC có status `failed`, tạo draft bug report:

**Lưu `bugs/BUG-[NNN]-[slug-title].md`** (số tăng dần, bắt đầu từ 001):

```markdown
# BUG-001 — Error message không hiển thị khi sai password

**TC_ID:** AD10_002
**Severity:** [High] ← dựa trên Severity của TC trong final-testcases.md
**Status:** 🔴 Open
**Found at:** Gate 3 Execution | [YYYY-MM-DD]
**Environment:** [baseUrl] | Chrome Latest | Windows

---

## Steps to Reproduce

1. Mở trang /login tại [baseUrl/login]
2. Nhập email hợp lệ: `user@example.com`
3. Nhập password SAI: `WrongPassword`
4. Click button "Đăng nhập"

## Expected Result

Error message "Sai email hoặc mật khẩu" hiển thị ngay dưới form.

## Actual Result

Error message KHÔNG hiển thị. Trang vẫn load bình thường, không có feedback cho user.

## Evidence

- Screenshot: `evidence/AD10_002-error-sai-password/failure-screenshot.png`
- Playwright trace: `evidence/AD10_002-error-sai-password/trace.zip`

## Technical Notes

```
Playwright assertion failed:
expect(page.getByText('Sai email hoặc mật khẩu')).toBeVisible()
Element not found in DOM after 5000ms timeout.
```

_Dev có thể reproduce bằng cách mở trace: `npx playwright show-trace evidence/AD10_002.../trace.zip`_

---

## Resolution

- [ ] Dev fix
- [ ] Retest: `RETEST: AD10_002`
```

**Severity từ TC metadata:**
- TC Severity = Critical → Bug Severity = Critical
- TC Severity = High → Bug Severity = High
- TC Severity = Medium → Bug Severity = Medium
- TC Severity = Low → Bug Severity = Low

---

## Step 5: Display Gate 3 Summary

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⏸️ GATE 3: EXECUTION COMPLETE

Results:
  ✅ Passed:  [N] / [total]
  ❌ Failed:  [N] / [total]
  🚫 Blocked: [N] / [total]
  🔧 Manual:  [N] (chưa execute)

Bugs logged:
  🔴 Critical: [N]
  🟠 High:     [N]
  🟡 Medium:   [N]
  🟢 Low:      [N]

→ Review evidence: evidence/
→ Review bugs:     bugs/
→ Type APPROVED when all critical/high bugs resolved
→ Type RETEST: [TC_ID] to re-execute a specific test case
→ Type PR: [url] to declare new dev PRs (triggers Dev Artifacts Check)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

---

## Mandatory Rules

- ✅ **PHẢI** tạo đúng 1 folder per TC (kể cả TC pass)
- ✅ **PHẢI** tạo `result.md` trong mỗi folder
- ✅ **PHẢI** tạo bug draft cho mọi TC failed, không bỏ sót
- ✅ Bug severity phải map từ TC severity trong final-testcases.md
- ❌ **KHÔNG** overwrite evidence của previous run — tạo subfolder với timestamp nếu re-run
- ✅ Nếu `test-results/results.json` không tồn tại → hướng dẫn TESTER chạy `npx playwright test --reporter=json` trước
