# 18. ĐẶC TẢ KIẾN TRÚC KỸ THUẬT: HỖ TRỢ BUILD CHAOS INOCULATION (CI) TRONG AUTOPOE2

> **Mã tài liệu**: `SPEC-ARCH-CHAOS-INOCULATION-20260909`  
> **Mốc thời gian**: 09/09/2026 - 18:45:00 (Bối cảnh thực tế năm 2026, Path of Exile 2 Early Access / Patch v0.5.x)  
> **Trạng thái**: [APPROVED ARCHITECTURE SPECIFICATION - READY FOR IMPLEMENTATION]  
> **Chuyên trách**: Documentation & Architecture Specialist  
> **Hệ quy chiếu tuân thủ**: Rule 2 (Timestamp 2026), Rule 8 (Anti-Symptom Patching RCA), Rule 10 (Zero-Drift Code-Doc Contract), Rule 14 (Zero Mock Data & Authentic Provenance)

---

## 1. TỔNG QUAN CƠ CHẾ CHAOS INOCULATION (CI) TRONG PATH OF EXILE 2

### 1.1 Khái Niệm & Cơ Chế Keystone CI
Trong thế giới Path of Exile 2, **Chaos Inoculation (CI)** là một Keystone nội tại (Passive Keystone) then chốt dành cho các lớp nhân vật chuyên về Năng lượng Hộ thể (Energy Shield - ES) như Witch, Sorceress, Shadow hoặc Templar lai:
- **Hiệu ứng Keystone**:
  1. **Miễn nhiễm hoàn toàn với Sát thương Hỗn loạn (Chaos Damage Immunity)**: Kháng Chaos cố định 100% hoặc bypass hoàn toàn mọi nguồn sát thương Chaos (kể cả Poison, Caustic Cloud, Chaos DoT).
  2. **Máu tối đa bị gán cố định bằng 1**:
     $$\text{maxHP} \equiv 1$$
  3. **Trạng thái sống / chết**:
     - Khi nhân vật còn sống: $\text{currentHP} = 1$, $\text{maxHP} = 1$, $\text{unreservedHP} = 1$.
     - Khi nhân vật tử trận: $\text{currentHP} = 0$, $\text{maxHP} = 1$.

```mermaid
graph TD
    subgraph POE2_Damage_Pipeline ["Cơ chế Nhận Sát Thương - CI Build"]
        InDamage["Sát thương từ quái vật / môi trường"]
        DamageType{"Phân loại Sát thương?"}
        ChaosDmg["Chaos Damage / Poison / Chaos DoT"]
        OtherDmg["Physical / Fire / Cold / Lightning"]
        Immune["MIỄN NHIỄM HOÀN TOÀN (0 Damage)"]
        ES_Pool["Trừ trực tiếp vào Energy Shield (ES Pool)"]
        ES_Check{"ES > 0?"}
        Absorbed["ES hấp thụ toàn bộ sát thương"]
        HP_Hit["Xuyên thủng ES -> Đánh trúng 1 HP"]
        Dead["NHÂN VẬT TỬ TRẬN NGAY LẬP TỨC (HP = 0)"]
    end

    InDamage --> DamageType
    DamageType -- "Chaos" --> ChaosDmg --> Immune
    DamageType -- "Non-Chaos" --> OtherDmg --> ES_Pool
    ES_Pool --> ES_Check
    ES_Check -- "Còn ES" --> Absorbed
    ES_Check -- "Hết ES (0)" --> HP_Hit --> Dead
```

### 1.2 Sự Thay Đổi Căn Bản Về Sinh Mệnh Thực Tế (Effective Health Pool - EHP)
- Đối với build thông thường (Life-based hoặc Hybrid): Sinh mệnh là tổng hòa của $\text{Life} + \text{ES}$. Khi máu tụt, bình máu (Life Flask) hồi phục lượng HP đã mất.
- Đối với build Chaos Inoculation: **Sinh mệnh thực tế 100% phụ thuộc vào Energy Shield**.
  $$\text{EHP}_{\text{CI}} = \text{maxES}$$
- **Đặc tính tương tác với Bình Máu (Life Flasks)**:
  - Mọi bình máu Life Flasks trong POE2 đều trở nên **hoàn toàn vô dụng** đối với nhân vật CI vì $\text{maxHP} = 1$, không có lượng máu khuyết thiếu nào để hồi phục.
  - Việc tiếp tục bấm phím bình máu (phím `1`) là một hành vi lỗi kỹ thuật nghiêm trọng: gây lãng phí tài nguyên, sinh ra keystroke thừa bất thường dễ bị hệ thống giám sát phát hiện, và chiếm dụng thời gian animation/cooldown của các thao tác né tránh khẩn cấp.

---

## 2. THÁCH THỨC KỸ THUẬT & MA TRẬN PHÂN BIỆT VÙNG NHỚ (MEMORY AMBIGUITY & FALSE POSITIVES)

### 2.1 Nguy Cơ Báo Động Giả (False Positives) Khi Cho Phép `maxHP = 1`
Trong không gian địa chỉ ảo 64-bit của tiến trình `PathOfExile.exe` (với kích thước Heap runtime thường lên tới 4GB - 12GB), giá trị số nguyên 32-bit `(1, 1)` xuất hiện với mật độ hàng trăm nghìn lần:
1. **Cờ trạng thái Logic & Render**: Cờ `isVisible = 1`, `isActive = 1`, `isEnabled = 1`, `isLoaded = 1`.
2. **Bộ đệm chỉ số đồ họa (Index Buffers / Quad Indices)**: Các cặp số liên tiếp `(1, 1)`, `(1, 2)`.
3. **Thực thể Phụ trợ (Minions, Totems, Phantasms, Skeletons)**: Một số minion cấp thấp hoặc cọc totem có lượng máu rất thấp hoặc có các cờ đánh dấu entity.
4. **Cấu trúc UI & Bảng điều khiển**: Các thuộc tính kích thước cửa sổ thu nhỏ, padding font chữ.

Trước đây, để triệt tiêu toàn bộ các vùng nhớ rác trên, hàm `GameSession::IsValidLifeComponent` và `PlayerFinder::AutoScanHP` áp dụng quy tắc phòng vệ cứng:
```cpp
// Rào chắn cũ (Chống số rác, nhưng vô tình CHẶN ĐỨNG build CI):
if (maxHP < 50 || maxHP > 25000 || maxHP == 255 || maxHP == 4094 || maxHP == 0x0FFE) return false;
```
Điều này dẫn đến hiện tượng: **Bất kỳ người chơi nào chuyển sang build CI (`maxHP = 1`) thì Core Engine đều từ chối nhận diện con trỏ nhân vật, bot rơi vào trạng thái kẹt tìm kiếm vô tận (Stale Pointer Search Loop).**

### 2.2 Giao Thức Xác Thực Đa Tầng Cho CI (Multi-Layer CI Disambiguation Protocol)
Để mở khóa cho `maxHP == 1` mà **tuyệt đối không bị vướng vào số rác hoặc cờ boolean**, kiến trúc AutoPOE2 thiết lập bộ điều kiện xác thực 4 lớp nghiêm ngặt:

| Lớp Kiểm Tra (Layer) | Tiêu Chí Kỹ Thuật | Ràng Buộc Bắt Biến (Invariant) | Mục Đích Khóa Chặn |
| :--- | :--- | :--- | :--- |
| **Layer 1: Cặp Trị Số Máu** | $\text{hp} \in \{0, 1\} \land \text{maxHP} = 1$ | $\text{hp} \le \text{maxHP}$ | Loại bỏ các trường hợp overflow hoặc giá trị âm |
| **Layer 2: Chữ Ký ECS POE2** | Địa chỉ `addr - 8` và `addr - 4` | `Read<uint32_t>(addr - 8) == 2` $\land$ `Read<uint32_t>(addr - 4) == 4` | Xác nhận đây là một Component của engine POE2 thật, loại bỏ 99.9% cờ boolean ngẫu nhiên trên Heap |
| **Layer 3: Bắt Buộc ES Pool** | Trường `+12` (ES Cur) và `+16` (ES Max) | $\text{maxES} \ge 50 \land \text{maxES} \le 50000 \land \text{curES} \le \text{maxES}$ | **Bất biến sinh tồn CI**: Không có build CI nào ra trận với 0 ES. Bắt buộc phải có ES hợp lệ |
| **Layer 4: Cấu Trúc Bổ Trợ** | Mana Pool tại `+24/+28` hoặc VitalStruct pointer tại `+88` | $\text{maxMana} \ge 15 \land \text{curMana} \le \text{maxMana} \times 2$ | Xác nhận thực thể Player hoàn chỉnh, loại bỏ minion không có thanh Mana |

```mermaid
graph TD
    Start["Phát hiện ứng viên maxHP = 1 tại địa chỉ addr"] --> CheckHP{"hp == 1 hoặc hp == 0?"}
    CheckHP -- "Không" --> Reject1["LOẠI BỎ (Số rác)"]
    CheckHP -- "Đúng" --> CheckSig{"Chữ ký ECS POE2?<br/>(addr - 8 == 2 && addr - 4 == 4)"}
    
    CheckSig -- "Có Chữ Ký" --> CheckES{"Energy Shield Pool tại +12/+16?<br/>(maxES >= 50 && maxES <= 50000)"}
    CheckSig -- "Không Chữ Ký" --> CheckES_Strict{"ES Pool cực kỳ hợp lệ?<br/>(maxES >= 200 && curES > 0)"}
    
    CheckES -- "Hợp lệ" --> CheckMana{"Mana Pool tại +24/+28 hoặc +88?<br/>(maxMana >= 15)"}
    CheckES -- "Không có ES" --> Reject2["LOẠI BỎ (Cờ boolean ngẫu nhiên)"]
    
    CheckES_Strict -- "Hợp lệ" --> CheckMana
    CheckES_Strict -- "Không" --> Reject3["LOẠI BỎ (Minion / UI Glyph Buffer)"]
    
    CheckMana -- "Có Mana Player" --> Accept["CHẤP NHẬN: XÁC THỰC THÀNH CÔNG PLAYER CI BUILD"]
    CheckMana -- "Không Mana" --> Reject4["LOẠI BỎ (Entity phụ trợ không hoàn chỉnh)"]
```

---

## 3. THIẾT KẾ CHI TIẾT TẦNG 1: C++23 LOW-LEVEL CORE ENGINE

### 3.1 Cập Nhật `PlayerFinder::AutoScanHP`
Trong module `src/core/memory/player_finder.cpp`, thuật toán dò quét vùng nhớ được nâng cấp để hỗ trợ toàn diện CI:

1. **Kháng Uniform Memset & Kháng Sequential Buffer**:
   - Đối với CI (`m1 == 1`), trường `unreservedHP` tại `+8` cũng mang giá trị `1`. Do đó, kiểm tra `m1 == nextVal` hoặc `m2 == m1 + 1` phải được bảo lưu ngoại lệ:
     ```cpp
     const bool isCI = (m1 == 1);
     if (!isCI) {
         if (m1 < 20 || m1 > 25000 || m1 == 255) continue;
         if (m1 == nextVal || (m1 == m2 && m1 == nextVal)) continue;
         // Kháng index buffer quad (0, 1, 2, 3...)
         if (m2 == m1 + 1 || m2 == hp + 1) continue;
     } else {
         // Xác minh tối thiểu cho ứng viên CI: Bắt buộc hp in {0, 1}
         if (hp != 1 && hp != 0) continue;
     }
     ```
2. **Hệ Thống Chấm Điểm Ứng Viên (Scoring & Deep Ranking)**:
   - Nếu là CI (`m1 == 1`):
     - Có chữ ký ECS `{2, 4}`: Cộng **+400 điểm**.
     - Có Energy Shield $\ge 50$ và $\le 50000$: Cộng **+450 điểm**.
     - Nếu `m1 == 1` nhưng **hoàn toàn không có chữ ký và không có ES**: Phạt **-500 điểm** (loại bỏ khỏi danh sách ưu tiên).

### 3.2 Cập Nhật `GameSession::IsValidLifeComponent`
Trong module `src/core/game_session.cpp`, hàm cổng gác (Gatekeeper) quyết định tính hợp lệ của con trỏ nhân vật:

```cpp
bool GameSession::IsValidLifeComponent(uintptr_t addr, bool requireFullHP) const {
    if (addr == 0 || !m_reader) return false;
    uint32_t hp = 0, maxHP = 0;
    if (!m_reader->ReadValue<uint32_t>(addr, hp) ||
        !m_reader->ReadValue<uint32_t>(addr + 4, maxHP)) {
        return false;
    }

    // ================================================================
    // BẤT BIẾN CHAOS INOCULATION (CI) BUILD SUPPORT (SPEC 18):
    //   - Nhân vật CI: maxHP == 1 cố định.
    //   - Điều kiện sinh tồn bắt buộc: Phải có Energy Shield Pool hợp lệ
    //     tại offset +12 (curES) và +16 (maxES) với maxES >= 50.
    // ================================================================
    const bool isCI = (maxHP == 1 && (hp == 1 || hp == 0));

    if (!isCI) {
        // Dải máu hợp lý của nhân vật thông thường trong PoE2
        if (maxHP < 50 || maxHP > 25000 || maxHP == 255 || maxHP == 4094 || maxHP == 0x0FFE) return false;
        if (hp == 0 || hp > maxHP) return false;
    } else {
        // Ràng buộc nghiêm ngặt cho CI: Bắt buộc phải đọc được Energy Shield
        uint32_t esCur = 0, esMax = 0;
        if (!m_reader->ReadValue<uint32_t>(addr + 12, esCur) ||
            !m_reader->ReadValue<uint32_t>(addr + 16, esMax)) {
            return false;
        }
        if (esMax < 50 || esMax > 50000 || esCur > esMax * 2) {
            return false; // CI không thể có ES < 50, loại bỏ số rác
        }
    }

    uint32_t val8 = 0, val12 = 0, val16 = 0;
    m_reader->ReadValue<uint32_t>(addr + 8, val8);
    m_reader->ReadValue<uint32_t>(addr + 12, val12);
    m_reader->ReadValue<uint32_t>(addr + 16, val16);

    if (!isCI) {
        // Kháng Uniform Memset Buffer
        if (val12 == maxHP) return false;
        if (val8 == maxHP && val12 == maxHP) return false;
        if (val16 == maxHP) return false;
    }

    // ... (Kiểm tra ES plausibility và Mana Companion Pool) ...

    if (m_expectedMaxHP > 0) {
        if (m_expectedMaxHP == 1) {
            // Trường hợp người dùng chỉ định rõ CI Build (--ci hoặc --max-hp 1)
            if (maxHP != 1) return false;
            if (requireFullHP && hp != 1) return false;
        } else {
            if (addr == m_playerAddr && maxHP >= 200 && maxHP <= 20000 && maxHP != m_expectedMaxHP) {
                // Hợp lệ cho Dynamic Level-Up
            } else {
                if (maxHP != m_expectedMaxHP) return false;
                if (requireFullHP && hp != m_expectedMaxHP) return false;
            }
        }
    } else {
        // Trong chế độ Zero-User-Input (AutoScan):
        // Nếu là CI, bắt buộc phải có chữ ký ECS POE2 {-8: 2, -4: 4}
        if (isCI) {
            uint32_t prev8 = 0, prev4 = 0;
            bool hasLifeSig = false;
            if (addr >= 8 && m_reader->ReadValue<uint32_t>(addr - 8, prev8) &&
                m_reader->ReadValue<uint32_t>(addr - 4, prev4)) {
                if (prev8 == 2 && prev4 == 4) hasLifeSig = true;
            }
            if (!hasLifeSig && val16 < 200) {
                // Thiếu chữ ký mà ES lại < 200 -> kiên quyết loại bỏ
                return false;
            }
        }
    }

    return true;
}
```

### 3.3 Chuyển Đổi Phản Xạ Sinh Tồn Trong `ReflexManager` (Survival Paradigm Shift)
Trong module `src/core/combat/reflex_manager.cpp`, toàn bộ logic phòng ngự và phản xạ phản ứng mili-giây được cấu trúc lại khi phát hiện nhân vật là CI:

```mermaid
graph TD
    ReflexTick["ReflexManager::Update(TelemetryPacket)"] --> CheckCI{"Player.maxHP == 1?"}
    
    CheckCI -- "Bình thường (Life-based)" --> NormalMode["Chế độ Thông Thường: Giám sát currentHP / maxHP"]
    NormalMode --> LifeFlask["HandleLifeFlask(): Bơm phím 1 khi HP <= 55%"]
    NormalMode --> DodgeHP["HandleIframeDodge(): Lăn né khi mất >= 22% maxHP"]
    NormalMode --> ChickenHP["HandleEmergencyLogout(): Mở Portal khi HP <= 35%"]
    
    CheckCI -- "CI Build (maxHP == 1)" --> CIMode["Chế độ CI: Chuyển 100% Giám sát sang Energy Shield"]
    CIMode --> NoLifeFlask["HandleLifeFlask(): VÔ HIỆU HÓA HOÀN TOÀN (Zero Action)"]
    CIMode --> DodgeES["HandleIframeDodge(): Lăn né khi mất >= 22% maxES"]
    CIMode --> ChickenES["HandleEmergencyLogout(): Mở Portal khi ES <= 35% maxES"]
```

#### 3.3.1 Chi tiết Triển khai Iframe Dodge Roll cho CI
- Thay vì so sánh `previousHP - player.currentHP`, chuyển sang theo dõi `previousES - player.currentES`:
  ```cpp
  const bool isCI = (player.maxHP == 1);
  if (isCI) {
      if (m_state.previousES > 0 && player.currentES < m_state.previousES && player.maxES > 0) {
          const uint32_t damageTakenES = m_state.previousES - player.currentES;
          const float burstRatioES = static_cast<float>(damageTakenES) / static_cast<float>(player.maxES);
          if (burstRatioES >= m_config.burstDamageRatio) {
              const std::string reason = "BURST DAMAGE ES (-" + std::to_string(damageTakenES)
                  + " ES, " + std::to_string(static_cast<int>(burstRatioES * 100.0f)) + "% maxES) [CI BUILD]";
              TriggerDodgeRoll(kmbox, nowMs, reason);
          }
      }
  }
  ```

#### 3.3.2 Chi tiết Triển khai Emergency Portal Escape (Chicken) cho CI
- Kiểm tra tỉ lệ Energy Shield hiện tại:
  ```cpp
  const bool isCI = (player.maxHP == 1);
  const float survivalRatio = isCI 
      ? (player.maxES > 0 ? (static_cast<float>(player.currentES) / static_cast<float>(player.maxES)) : 0.0f)
      : (static_cast<float>(player.currentHP) / static_cast<float>(player.maxHP));

  if (survivalRatio <= m_config.emergencyHpThreshold && (isCI ? player.currentES > 0 : player.currentHP > 0)) {
      m_state.emergencyTriggered = true;
      // TUYỆT ĐỐI KHÔNG BƠM BÌNH MÁU KHI LÀ CI
      if (!isCI) {
          SendKey(m_config.lifeFlaskVk, m_config.lifeFlaskHid, kmbox, 40);
      }
      // Kích hoạt né đòn và mở Portal
      TriggerDodgeRoll(kmbox, nowMs, isCI ? "EMERGENCY ES CRITICAL" : "EMERGENCY HP CRITICAL");
      SendKey(m_config.portalVk, m_config.portalHid, kmbox, 40);
      return true;
  }
  ```

#### 3.3.3 Vô Hiệu Hóa Tuyệt Đối Bình Máu (`HandleLifeFlask`)
```cpp
void ReflexManager::HandleLifeFlask(const PlayerTelemetryData& player, KMBoxNet& kmbox, uint64_t nowMs) {
    if (!m_config.flaskEnabled) return;
    
    // Khóa chặn bất biến CI: maxHP == 1 tuyệt đối không bấm bình máu
    if (player.maxHP == 1) return;

    // ... (Logic bình máu thông thường) ...
}
```

### 3.4 Bổ Sung Cờ Dòng Lệnh CLI (`main.cpp`)
Để người dùng hoặc Companion App có thể chỉ định rõ ràng chế độ CI ngay từ khi khởi động tiến trình C++ Core:
- `--ci` hoặc `--chaos-inoculation`:
  ```cpp
  if (std::strcmp(argv[i], "--ci") == 0 || std::strcmp(argv[i], "--chaos-inoculation") == 0) {
      expectedMaxHP = 1;
      reflexCfg.flaskEnabled = false; // Tắt bình máu tự động, chuyển sang bảo vệ ES
      std::cout << "[Core] Đã kích hoạt chế độ CHAOS INOCULATION (CI): maxHP=1, chuyển toàn bộ sinh mệnh sang Energy Shield!" << std::endl;
  }
  ```
- Nếu người dùng truyền `--max-hp 1`: Tự động kích hoạt cơ chế tương đương `--ci`.

---

## 4. THIẾT KẾ CHI TIẾT TẦNG 2: PYTHON PASSIVE COMPANION HUD & A3E

### 4.1 Nâng Cấp `src/assistant_tool/core_controller.py`
Khi người dùng lưu cấu hình hoặc kích hoạt bot từ giao diện:
- Cho phép nhận diện giá trị chuỗi `"ci"`, `"CI"`, hoặc số nguyên `1`:
  ```python
  raw_max_hp = config.get("expected_max_hp")
  is_ci_mode = False
  if raw_max_hp is not None and str(raw_max_hp).strip().lower() in ("ci", "chaos_inoculation"):
      is_ci_mode = True
      max_hp = 1
  elif str(raw_max_hp).strip().isdigit() and int(raw_max_hp) == 1:
      is_ci_mode = True
      max_hp = 1

  # Sinh tham số dòng lệnh cho C++ Core:
  if is_ci_mode:
      cmd.append("--ci")
  elif max_hp > 0:
      cmd.extend(["--max-hp", str(max_hp)])
  ```

### 4.2 Nâng Cấp `src/assistant_tool/control_center.py`
1. **Ô Nhập Liệu Máu Tối Đa (`entry_max_hp`)**:
   - Chấp nhận giá trị `CI`, `ci`, hoặc `1`.
   - Hàm `_get_expected_max_hp(self) -> int`:
     ```python
     def _get_expected_max_hp(self) -> int:
         if hasattr(self, "entry_max_hp"):
             text = self.entry_max_hp.get().strip()
             if text.lower() in ("ci", "chaos_inoculation"):
                 return 1
             if text.isdigit():
                 val = int(text)
                 if val > 0:
                     return val
         return 0
     ```
2. **Cổng Kiểm Tra Tính Hợp Lý (`is_valid_vitals`)**:
   - Bổ sung ngoại lệ hợp lệ cho CI:
     ```python
     @staticmethod
     def is_valid_vitals(max_hp: int, current_hp: int = 0) -> bool:
         # Hỗ trợ đặc biệt cho Chaos Inoculation (CI)
         if max_hp == 1:
             return current_hp in (0, 1)
         
         if max_hp < 50 or max_hp > 30000:
             return False
         if current_hp > 0 and current_hp > max_hp:
             return False
         # ... (Các bộ lọc lặp UI marker 778/779) ...
         return True
     ```
3. **Hiển Thị Nhãn HUD Thời Gian Thực**:
   - Khi `max_hp == 1`:
     ```python
     if max_hp == 1:
         self.lbl_hp.configure(
             text=f"❤️ HP: {cur_hp} / 1 (CI)",
             text_color="#a855f7"  # Màu tím huyền bí đặc trưng cho Chaos Inoculation
         )
     ```
   - Thanh Energy Shield (`lbl_es`) hiển thị nổi bật bên dưới với màu xanh ngọc Cyan (`#06b6d4`), đóng vai trò là thanh sinh mệnh chính.

### 4.3 Nâng Cấp `src/assistant_tool/optical_hp_sensor.py`
1. **Đặc Tính Hình Ảnh Của Quả Cầu Máu CI**:
   - Trong client Path of Exile 2, khi nhân vật kích hoạt CI, quả cầu máu bên trái luôn hiển thị đầy `1/1` (hoặc có hiệu ứng sương mù tím/năng lượng bao quanh).
   - Regex OCR nhận diện cặp số:
     ```python
     m_hp = re.search(r"(?:Life|HP|M[aá]u)\s*[:\s]*1\s*[/|\\I!]\s*1", text, re.I)
     ```
2. **Loại Trừ Cảnh Báo Lệch Giả (False Mismatch Rejection)**:
   - Khi bộ nhớ đọc được `max_hp = 1` và quang học nhận diện `1/1`, hệ thống xác nhận trạng thái **100% PARITY (CI MODE VERIFIED)**, không kích hoạt cảnh báo lệch bộ nhớ.

---

## 5. HỢP ĐỒNG NHỊ PHÂN & BẤT BIẾN DỮ LIỆU (BINARY PROTOCOL & DATA CONTRACTS)

### 5.1 Cấu Trúc `PlayerTelemetryData` (84 Bytes)
Không cần thay đổi kích thước struct nhị phân (giữ vững `static_assert(sizeof(PlayerTelemetryData) == 84)`), trường dữ liệu được hiểu theo ngữ cảnh CI:
- `uint32_t currentHP`: $1$ (sống) hoặc $0$ (chết).
- `uint32_t maxHP`: $1$.
- `uint32_t currentES`, `maxES`: Thước đo sinh mệnh thực tế dùng cho tính toán EHP và kích hoạt phản xạ.

### 5.2 Bổ Sung Mã Invariant Vào Watcher Matrix (Rule 13 & Rule 14)
Bổ sung mã bất biến kỹ thuật vào tài liệu `docs/development/17_agent_realtime_watcher_and_headless_harness_architecture.md`:

| Mã Invariant | Tên Bất Biến | Biểu Thức Ràng Buộc Kỹ Thuật | Hành Động Khi Vi Phạm |
| :--- | :--- | :--- | :--- |
| **`INV-VITALS-CI-01`** | CI HP Bound Invariant | $\text{maxHP} = 1 \implies \text{currentHP} \in \{0, 1\}$ | Kích hoạt Snapshot Dossier khẩn cấp |
| **`INV-VITALS-CI-02`** | CI Mandatory ES Invariant | $\text{maxHP} = 1 \implies \text{maxES} \ge 50$ | Từ chối con trỏ, nghi ngờ vùng nhớ rác Heap |
| **`INV-REFLEX-CI-03`** | Zero Life Flask for CI | $\text{maxHP} = 1 \implies \Delta \text{lifeUses} \equiv 0$ | Đánh dấu lỗi logic ReflexManager nếu bấm phím `1` |

---

## 6. KẾ HOẠCH KIỂM THỬ VÀ MA TRẬN XÁC MINH (VERIFICATION MATRIX & TEST PLAN)

Tuân thủ nghiêm ngặt **Rule 9 (Mandatory Verification Gate Before Done)** và **Rule 11 (Automated Regression Prevention via Mock Harness)**, kế hoạch kiểm thử bao gồm:

### 6.1 Kiểm Thử Đơn Vị C++ (`tests/test_core.cpp`)
1. **`TestChaosInoculationMemoryRecognition`**:
   - Khởi tạo `SimulatedMemoryReader` với vùng nhớ mô phỏng:
     - Heap A: Cờ boolean ngẫu nhiên `{+0: 1, +4: 1, +8: 1, +12: 0, +16: 0}` (Không có ES) $\implies$ `IsValidLifeComponent` trả về `false`.
     - Heap B: Thực thể CI hoàn chỉnh với chữ ký ECS `{-8: 2, -4: 4, +0: 1, +4: 1, +8: 1, +12: 1500, +16: 1500, +24: 200, +28: 200}` $\implies$ `IsValidLifeComponent` trả về `true`.
   - Kiểm tra `PlayerFinder::AutoScanHP(0, 0, 1)` chọn chính xác Heap B, bỏ qua Heap A.
2. **`TestChaosInoculationReflexBehavior`**:
   - Tạo `PlayerTelemetryData` với `currentHP = 1, maxHP = 1, currentES = 1500, maxES = 1500`.
   - Giảm ES từ 1500 xuống 1000 ($\Delta \text{ES} = 500$, tỉ lệ $33\% > 22\%$) $\implies$ Xác minh kích hoạt Iframe Dodge Roll (phím Spacebar)!
   - Giảm ES xuống 400 ($\text{ES} = 26\% \le 35\%$) $\implies$ Xác minh kích hoạt Emergency Portal Escape (phím 'T')!
   - Xác minh `m_state.lifeUses == 0` (tuyệt đối không bấm phím `1`).

### 6.2 Kiểm Thử Tầng Python (`tests/test_control_center.py` & `pytest`)
1. **`test_ci_input_and_cmd_generation`**:
   - Nhập chuỗi `"CI"` vào `entry_max_hp` $\implies$ `CoreController` sinh cờ `--ci`.
   - Nhập số `"1"` vào `entry_max_hp` $\implies$ `CoreController` sinh cờ `--ci` hoặc `--max-hp 1`.
2. **`test_ci_vitals_validation`**:
   - `ControlCenterApp.is_valid_vitals(1, 1)` trả về `True`.
   - `ControlCenterApp.is_valid_vitals(1, 0)` trả về `True`.
   - `ControlCenterApp.is_valid_vitals(1, 2)` trả về `False`.
3. **`test_ci_hud_label_formatting`**:
   - Cung cấp snapshot `hp = 1, max_hp = 1` $\implies$ Nhãn hiển thị `❤️ HP: 1 / 1 (CI)`.

---

## 7. KẾT LUẬN & LỘ TRÌNH TRIỂN KHAI (IMPLEMENTATION ROADMAP)

Bản đặc tả kiến trúc này giải quyết triệt để và toàn diện bài toán hỗ trợ build **Chaos Inoculation (CI)** trong Path of Exile 2:
- Loại bỏ hoàn toàn điểm nghẽn nhận diện bộ nhớ (`maxHP < 50`).
- Bảo đảm an toàn tuyệt đối trước các giá trị rác bằng giao thức chữ ký đa tầng ECS + ES pool.
- Chuyển dịch hoàn hảo phản xạ sinh tồn của bot sang bảo vệ Energy Shield, tối ưu hóa cơ chế sống sót trong môi trường endgame khắc nghiệt năm 2026.
- Đạt 100% Zero Documentation Drift trước khi tiến hành viết code triển khai.
