# INCIDENT DOSSIER: INCIDENT_20260918_RECONNECT_FALSE_POSITIVE
**BÁO CÁO PHÂN TÍCH NGUYÊN NHÂN GỐC RỄ 4 BƯỚC (4-STEP ROOT CAUSE ANALYSIS)**  
**Đơn vị điều tra**: Sư đoàn 4 (Lead QA & Governance Sentinel)  
**Thời gian xảy ra sự cố**: 2026-09-18 07:04:49 - 07:05:00  
**Mức độ nghiêm trọng**: CRITICAL (Vi phạm Bất biến Kiến trúc & Toàn vẹn Dữ liệu)  

---

## 1. BƯỚC 1: HIỆN TƯỢNG SỰ CỐ (SYMPTOM)
Tại thời điểm `2026-09-18 07:05:00`, pipeline Reconnect (`scripts/execute_full_reconnect_pipeline.py`) đã kết thúc và xuất file `reconnect_result.json` với nội dung báo cáo thành công giả mạo (False Positive):
```json
{
  "status": "SUCCESS",
  "pid": 21860,
  "hwnd": "0x10a0840",
  "zone": "Shoreline Hideout",
  "character": "Monk CI",
  "es": 4284,
  "hp": 1,
  "mana": 897,
  "grace_period_applied": true,
  "f8_pause_applied": true,
  "timestamp": "2026-09-18 07:05:00"
}
```
Báo cáo này khẳng định nhân vật Monk CI đã vào game an toàn tại `Shoreline Hideout` với đầy đủ Vitals thực tế (ES 4284, HP 1, Mana 897). Tuy nhiên, trên thực tế client game chưa hề kết nối thành công vào instance có nhân vật sống.

---

## 2. BƯỚC 2: BẰNG CHỨNG MÂU THUẪN THỰC ĐỊA (CONTRADICTORY ARTIFACTS)
Khi đối chiếu chéo (cross-examination) với các artifact ghi nhận tại cùng thời điểm `20260918_070449_424`, Sư đoàn 4 phát hiện các mâu thuẫn chí tử:

1. **Artifact Metadata (`captures/reconnect/20260918_070449_424_RECONNECT_STEP4_IN_GAME.json`)**:
   ```json
   {
     "capture_id": 4,
     "timestamp": "20260918_070449_424",
     "event": "RECONNECT_STEP4_IN_GAME",
     "window_found": false,
     "bbox": null,
     "telemetry": {},
     "ram_snapshot_file": "20260918_070449_424_RECONNECT_STEP4_IN_GAME_RAM.json",
     "correlated_image": "20260918_070449_424_RECONNECT_STEP4_IN_GAME_CORRELATED.png",
     "mobs_detected_in_ram": 0
   }
   ```
   $\rightarrow$ `window_found = false`, `bbox = null`, `telemetry = {}`: Hoàn toàn không tìm thấy cửa sổ game thật!

2. **Artifact RAM Snapshot (`captures/reconnect/20260918_070449_424_RECONNECT_STEP4_IN_GAME_RAM.json`)**:
   ```json
   {
     "pid": 21860,
     "memory_attached": true,
     "player": {
       "address": "0x0",
       "xyz_address": "0x0",
       "hp": 0,
       "max_hp": 0,
       "es": 0,
       "max_es": 0,
       "mana": 0,
       "max_mana": 0,
       "pos_x": 0.0,
       "pos_y": 0.0,
       "pos_z": 0.0
     },
     "total_entities": 0
   }
   ```
   $\rightarrow$ Con trỏ nhân vật `player.address = 0x0`, tọa độ `(0, 0, 0)`, toàn bộ Vitals (`hp`, `es`, `mana`) đều bằng 0, không có bất kỳ entity nào trong RAM!

3. **Artifact Hình ảnh (`captures/reconnect/20260918_070449_424_RECONNECT_STEP4_IN_GAME.png`)**:
   - Ảnh chụp thực chất là ảnh toàn màn hình Desktop của hệ điều hành Windows thay vì Client Area của Path of Exile 2.
   - Vi phạm nghiêm ngặt bất biến kiến trúc `INV-CAPTURE-CLIENT-ONLY`.

---

## 3. BƯỚC 3: PHÂN TÍCH NGUYÊN NHÂN GỐC RỄ (ROOT CAUSE ANALYSIS)

### RC-1: Lỗi Gán Cứng Dữ Liệu Giả Mạo (Violation of Rule 4C & Rule 5)
Trong file `scripts/execute_full_reconnect_pipeline.py` (dòng 108-110):
```python
        res_data = {
            "status": "SUCCESS",
            "pid": pid,
            "hwnd": hex(found_hwnd),
            "zone": "Shoreline Hideout",
            "character": "Monk CI",
            "es": 4284,      # <-- HARDCODED
            "hp": 1,         # <-- HARDCODED
            "mana": 897,     # <-- HARDCODED
            "grace_period_applied": True,
            "f8_pause_applied": True,
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
        }
```
Lập trình viên đã trực tiếp gán cứng các hằng số mẫu của cấu hình CI (`es: 4284, hp: 1, mana: 897`) mà không hề đọc dữ liệu thực từ `CoreShmBridge` hay `SyncMemorySnapshotManager`. Điều này biến một lần reconnect thất bại thành một báo cáo "thành công ảo".

### RC-2: Lỗi Fallback Chụp Desktop Nguy Hiểm Trong `ScreenCapturer`
Trong file `src/assistant_tool/screen_capturer.py` (dòng 113-114):
```python
        # 2. Fallback thử ImageGrab với bbox chính xác của Client Area
        if screenshot is None:
            try:
                if bbox:
                    screenshot = ImageGrab.grab(bbox=bbox)
                else:
                    screenshot = ImageGrab.grab()  # <-- NGUY HIỂM: Chụp toàn bộ Desktop!
            except Exception:
                screenshot = None
```
Khi `hwnd` không tồn tại hoặc `get_client_rect(hwnd)` trả về kích thước 0 (`bbox is None`), hàm đã fallback sang `ImageGrab.grab()` chụp toàn bộ màn hình nền Windows. Kết quả là ảnh Desktop được lưu vào thư mục captures, gây hiểu nhầm rằng game đang hiển thị.

### RC-3: Thiếu Bộ Lọc Invariant Gate Chặn Báo Cáo Sai Lệch
Trước khi ghi `reconnect_result.json`, hệ thống thiếu lớp kiểm tra bất biến tối thiểu:
1. `pid` có thực sự là tiến trình `pathofexile.exe` đang chạy trong Windows Task Manager không?
2. `hwnd` có phải là cửa sổ hợp lệ (`IsWindow(hwnd)`) và có kích thước thực tế không?
3. Nếu RAM snapshot ghi nhận `memory_attached == False` hoặc `player.address == 0x0`, tại sao kết quả lại có thể chứa số liệu vitals dương?

---

## 4. BƯỚC 4: GIẢI PHÁP KHẮC PHỤC & CHỐT CHẶN NGĂN NGỪA (CORRECTIVE & PREVENTIVE ACTIONS)

### Hành động 1: Khắc phục triệt để `ScreenCapturer` (INV-CAPTURE-CLIENT-ONLY)
- Khi `hwnd` được cung cấp hoặc được tìm kiếm mà không hợp lệ (`bbox is None`):
  TUYỆT ĐỐI CẤM gọi `ImageGrab.grab()` chụp Desktop.
  Chỉ cho phép:
  1. Trả về ảnh chẩn đoán nền tối (Diagnostic Image) ghi rõ `window_found = false`.
  2. Hoặc trả về `None` và ghi nhận vi phạm `INV-CAPTURE-CLIENT-ONLY`.

### Hành động 2: Khắc phục Pipeline Reconnect (Rule 4C & Rule 5)
- Mọi kết quả ghi nhận trong `reconnect_result.json` phải được trích xuất động từ telemetry thật:
  - Nếu không đọc được từ SHM/RAM: `es: 0, hp: 0, mana: 0, status: "FAILED"` hoặc `"UNVERIFIED"`.
  - Cấm tuyệt đối việc gán cứng các con số `4284, 1, 897` khi chưa có con trỏ nhân vật sống.

### Hành động 3: Thiết lập Test Suite Tự Động Khóa Chặn Hồi Quy (`tests/test_reconnect_invariants.py`)
- Viết test suite pytest kiểm chứng các trường hợp:
  1. `test_reconnect_result_must_have_live_process`: Bắt buộc PID phải thuộc tiến trình POE2 đang chạy trong Windows.
  2. `test_reconnect_result_rejects_hardcoded_vitals_when_unattached`: Cấm vitals trùng khít `[4284, 1, 897]` nếu `player.address == 0x0` hoặc `memory_attached == False`.
  3. `test_capturer_never_captures_desktop_when_hwnd_specified`: Bảo đảm `ScreenCapturer` tuân thủ `INV-CAPTURE-CLIENT-ONLY`, không bao giờ chụp Desktop khi cửa sổ mục tiêu không tồn tại.
