---
name: pr-impact-analysis
description: Dev Artifacts Check — Phân tích PR diff để xác định phạm vi ảnh hưởng thật của thay đổi code, đề xuất regression TCs, lưu SHA tracking. Chạy đầu Gate 2a, đầu Gate 3, và sau mỗi RETEST có commit mới.
keywords: pr, impact analysis, regression, dev artifacts, github, diff, sha, code review, gate2, gate3
---

# Dev Artifacts Check — PR Impact Analysis

> **Mục đích:** Xác định **phạm vi ảnh hưởng thật** của thay đổi code từ PR của dev,
> để tránh miss regression test khi code thay đổi mở rộng hơn scope ticket.
>
> **Khi nào chạy:**
> - Đầu Gate 2 Phase 2a (sau Gate 1 APPROVED) — xác định regression scope ban đầu
> - Đầu Gate 3 (trước khi execute) — phát hiện PR mới hoặc commit mới kể từ Gate 2
> - Sau mỗi RETEST khi dev push commit fix — check xem fix có mở rộng impact không

---

## Trigger

Một trong các cách:

1. **TESTER khai báo trong chat:** `PR: <url>` hoặc `PR: <url1>, <url2>` (multi-repo)
2. **AI phát hiện tự động:** Ticket có PR link đính kèm → AI đề xuất, TESTER confirm
3. **Không có PR** → ghi nhận "chưa có dev artifacts" vào `impact-analysis.md`, không block gate

---

## Quy trình với mỗi PR

### Step 1: Fetch PR Info

Ưu tiên `gh` CLI nếu available:

```bash
gh pr view <url> --json title,body,headRefOid,files
```

Lấy về:
- `title` — tiêu đề PR
- `body` — PR description (thường chứa summary của dev)
- `headRefOid` — SHA của commit đầu PR (dùng để track delta sau này)
- `files` — danh sách files thay đổi + số dòng

**Fallback (không có `gh` hoặc không phải GitHub):**
```bash
git fetch origin <branch>
git diff main...<branch> --stat
```
Yêu cầu TESTER cung cấp branch name.

---

### Step 2: Phân tích theo Layer

Không đổ cả diff vào context. Phân tích có chọn lọc:

**Bước 2a:** Nhóm files theo layer/khu vực:

| Layer | Files điển hình | Mức độ rủi ro |
|-------|----------------|--------------|
| Migration / Schema | `*.sql`, `*migration*`, `*schema*` | 🔴 High — ảnh hưởng toàn bộ data |
| Middleware / Config | `middleware/*`, `config/*`, `*.env*` | 🔴 High — ảnh hưởng toàn app |
| Shared lib / Utils | `lib/*`, `utils/*`, `helpers/*`, `common/*` | 🟡 Medium — nhiều callers |
| Controller / API route | `controller/*`, `routes/*`, `api/*` | 🟡 Medium — ảnh hưởng endpoint |
| Service / Business logic | `service/*`, `usecase/*`, `domain/*` | 🟡 Medium |
| Component / Page | `components/*`, `pages/*`, `views/*` | 🟢 Low — ảnh hưởng UI cụ thể |
| Test files | `*.test.*`, `*.spec.*`, `__tests__/*` | 🟢 Low — không ảnh hưởng prod |
| Docs / Config | `*.md`, `*.json` (non-env) | 🟢 Ignore |

**Bước 2b:** Với files rủi ro High → đọc full diff:

```bash
gh pr diff <url> -- <path/to/high-risk-file>
```

Chỉ đọc files có khả năng tác động lan rộng. Không đọc toàn bộ diff.

---

### Step 3: Map Code → Feature → Regression Scope

Dựa trên danh sách files và diff:

1. Xác định **màn hình/chức năng bị ảnh hưởng trực tiếp** (những gì PR cố tình thay đổi)
2. Xác định **màn hình/chức năng bị ảnh hưởng gián tiếp** (callers, dependencies, shared code)
3. Đề xuất TCs regression cần chạy thêm (ngoài TCs gốc cho feature đang test)

**Ví dụ:**
- PR sửa `UserService.findById()` → ảnh hưởng Profile page, Settings page, Order History (gọi user info)
- PR thêm migration `ALTER TABLE orders` → ảnh hưởng Order list, Order detail, Cart checkout

---

### Step 4: Record SHA + Output impact-analysis.md

Lưu `test-plan/impact-analysis.md`:

```markdown
# Dev Artifacts — Impact Analysis

**Last updated:** [YYYY-MM-DD HH:MM] | **Gate:** [2 / 3 / RETEST]

---

## Dev Artifacts Reference

| PR | Repo | SHA đã đọc | Summary | Lần check cuối |
|----|------|-----------|---------|---------------|
| #123 | repo-be | a1b2c3d | ✅ Sửa UserService.findById, thêm caching | Gate 2 |
| #456 | repo-fe | e5f6a7b | ✅ Update ProfilePage component | Gate 2 |

_(Nếu chưa có PR: "Chưa có dev artifacts — sẽ check lại ở Gate 3")_

---

## Impact Analysis

### Vùng thay đổi (theo layer)

| Layer | Files | Số dòng thay đổi | Rủi ro |
|-------|-------|-----------------|--------|
| Service | `UserService.java` | +45/-12 | 🟡 Medium |
| Component | `ProfilePage.tsx` | +23/-8 | 🟢 Low |

### Màn hình ảnh hưởng trực tiếp
- **Profile Page** (`/profile`) — component thay đổi trực tiếp
- **Settings Page** (`/settings`) — gọi UserService.findById

### Màn hình ảnh hưởng gián tiếp (regression risk)
- **Order History** (`/orders`) — sử dụng UserService.findById cho user info
  _Lý do: caching layer mới có thể trả về stale data cho order display_
- **Admin User Management** (`/admin/users`) — cùng service

### Đề xuất Regression TCs

Ngoài TCs gốc của feature, cần test thêm:

| TC (Regression) | Lý do |
|-----------------|-------|
| Verify Order History hiển thị đúng user info | UserService.findById đã thêm caching |
| Verify Admin User list không bị cache stale | Shared service thay đổi |
```

Ngôn ngữ output: auto-detect theo ngôn ngữ của ticket/task input — xem `custom/rules/output-language.md` (input tiếng Việt → output tiếng Việt; ngược lại mặc định tiếng Anh).

---

## Guard Rails (bắt buộc)

> ⚠️ PR diff + summary chỉ được dùng để **mở rộng độ phủ** (thêm TC, thêm vùng regression).
> **Tuyệt đối KHÔNG dùng để xác định expected result** — expected result chỉ lấy từ ticket/spec của BA/PM.
>
> Lý do: nếu dev hiểu sai requirement → TC sinh từ dev artifacts cũng sai → test pass nhưng feature làm sai.
> Khi dev artifacts mâu thuẫn với spec → flag thành câu hỏi hoặc bug tiềm năng, không sửa TC.

---

## Delta Detection (Gate 3 + RETEST)

Khi re-run Dev Artifacts Check ở Gate 3 hoặc sau RETEST:

1. Đọc SHA đã ghi trong `impact-analysis.md`
2. Fetch SHA hiện tại của PR: `gh pr view <url> --json headRefOid`
3. **Nếu SHA thay đổi** → có commit mới → đọc diff delta:
   ```bash
   gh pr diff <url> -- <files-changed-since-old-sha>
   ```
4. **Phân tích delta** → đề xuất TC bổ sung (mini-loop, chỉ phần thêm mới)
5. Cập nhật SHA mới vào `impact-analysis.md`

**Không cần TESTER approve lại toàn bộ Gate 2** — chỉ approve **phần delta** (TCs mới do commit mới gây ra).

---

## Mandatory Rules

- ❌ **KHÔNG** dùng expected result từ PR description — chỉ dùng ticket/spec của BA
- ❌ **KHÔNG** đọc full diff của toàn bộ files — chỉ đọc selective (high-risk files)
- ✅ **PHẢI** ghi SHA đã đọc vào `impact-analysis.md` để delta detection sau này
- ✅ **PHẢI** phân biệt rõ ảnh hưởng trực tiếp vs gián tiếp
- ✅ Không có PR → không block gate, ghi nhận và tiến tiếp
