# ĐỘNG CƠ TỰ HỌC TRỰC TUYẾN & RA QUYẾT ĐỊNH A3E (AGENTIC AUTONOMOUS ADAPTATION ENGINE)
> **Tài liệu đặc tả kỹ thuật chi tiết về Kiến trúc Tự học Trực tuyến, Tối ưu hóa Phản xạ & Trả lời câu hỏi "What Is Better"**  
> *Mốc thời gian tham chiếu: 07/09/2026 - Bối cảnh Path of Exile 2 v0.5.5 Early Access*  
> *Target Build: Martial Artist (Way of the Stonefist / Titan Gauntlets)*

---

## 1. TỔNG QUAN & TRIẾT LÝ THIẾT KẾ A3E (AGENTIC AUTONOMOUS ADAPTATION ENGINE)

### 1.1. Bối Cảnh & Đặt Vấn Đề
Trong Path of Exile 2 (phiên bản v0.5.5), nhịp độ trận đánh và độ khó cơ chế quái vật được đẩy lên cực cao:
- Hệ thống sát thương sốc (Burst Slam) có thể hạ gục người chơi trong vòng **300ms** nếu né đòn (Iframe Dodge) sai nhịp.
- Vật phẩm rơi chủ yếu ở dạng **Chưa Giám Định (Unidentified)**, trong khi tài nguyên giám định dã chiến (**Scroll of Wisdom**) cực kỳ khan hiếm, đòi hỏi sự phối hợp chiến lược với NPC **The Hooded One** tại làng.
- Các quy tắc cứng (Hardcoded Heuristics) truyền thống của bot không thể thích ứng với sự thay đổi liên tục của trang bị, độ khó Map Tier, và biến động kinh tế sàn giao dịch Faustus.

Hệ thống **A3E (Agentic Autonomous Adaptation Engine)** nằm trong gói mã nguồn [`src/agentic_engine/`](../../src/agentic_engine) được kiến trúc như một "bộ não thích ứng trực tuyến" của Tier 2 (Passive Companion HUD), cho phép agent tự quan sát, tự đánh giá, tự học hỏi và tự tiến hóa hành vi dựa trên dữ liệu thực chiến mà không cần can thiệp thủ công từ người dùng.

```mermaid
flowchart TB
    subgraph SENSORS ["1. TẦNG THU THẬP DỮ LIỆU THỜI GIAN THỰC"]
        SHM["CoreShmBridge (30Hz Telemetry)<br/>HP, ES, Mana, XYZ, Monsters"]
        LOG["LogWatcher (LatestClient.txt)<br/>ZONE_CHANGE, PLAYER_DEATH"]
    end

    subgraph A3E_CORE ["2. ĐỘNG CƠ TỰ HỌC TRỰC TUYẾN A3E (src/agentic_engine/)"]
        direction TB
        COORD["AgenticCoordinator (Façade Singleton)"]
        
        subgraph FAST_PATH ["VÒNG LẶP SUY LUẬN SIÊU TỐC (< 0.05ms)"]
            BB["BlackboxRecorder<br/>(120 Ticks Circular Buffer)"]
            DPS["DPSAccumulator<br/>(Sliding Window 3.0s)"]
            BANDIT["LinUCBTacticalAdvisor<br/>(8D Context, 5 Actions)"]
        end

        subgraph SLOW_PATH ["VÒNG LẶP PHẢN TƯ & TỰ HỌC NỀN"]
            CRITIC["ReflectionCritic<br/>(Post-Mortem Root Cause Analysis)"]
            TUNER["ReflexParameterTuner<br/>(Tightening / Relaxing)"]
            LIFE["ItemLifecycleManager<br/>(Unidentified 4-Stage Pipeline)"]
            PARETO["WhatIsBetterEvaluator<br/>(Multi-Objective Utility)"]
            TRACK["RunTracker<br/>(Map Session History)"]
        end
    end

    subgraph OUTPUTS ["3. TẦNG ĐIỀU PHỐI VÀ HIỂN THỊ"]
        OVERLAY["OverlayGUI & ControlCenter HUD<br/>(Realtime Advice & Radar)"]
        CMD_Q["SPSC Command Queue<br/>(IPC gửi xuống C++ Core Engine)"]
    end

    SHM -->|on_telemetry_snapshot| COORD
    LOG -->|on_log_event| COORD
    
    COORD --> BB
    COORD --> DPS
    COORD --> BANDIT
    
    COORD --> CRITIC
    COORD --> TUNER
    COORD --> LIFE
    COORD --> PARETO
    COORD --> TRACK

    CRITIC -->|Reward Feedback| BANDIT
    CRITIC -->|Tuned Parameters| TUNER
    LIFE -->|Appraise Item| PARETO
    
    COORD -->|Dashboard State| OVERLAY
    COORD -->|Tactical Directives| CMD_Q
```

### 1.2. Ba Trụ Cột Triết Lý Thiết Kế Cốt Lõi

1. **Zero External Dependencies (Độc Lập Tuyệt Đối, Không Phụ Thuộc Thư Viện Ngoài)**:
   - Toàn bộ thuật toán toán học ma trận, nghịch đảo Gauss-Jordan, phân phối xác suất và quản lý bộ nhớ đệm được viết hoàn toàn bằng **chuẩn Python 3.11 Standard Library** (`math`, `collections`, `json`, `threading`, `dataclasses`, `enum`, `os`, `time`, `logging`).
   - Tuyệt đối **không dùng** NumPy, SciPy, PyTorch hay Scikit-learn. Điều này loại bỏ hoàn toàn nguy cơ phân mảnh môi trường (Virtualenv mismatch), xung đột DLL C-extensions, rủi ro tương thích Windows x64 và triệt tiêu các mẫu chữ ký bộ nhớ dễ bị các hệ thống quét tiến trình (Anti-Cheat Telemetry) dò quét.

2. **Sub-0.05ms Inference Latency (Độ Trễ Suy Luận Dưới 0.05 Mili-giây)**:
   - Các phép toán vector 8 chiều và nghịch đảo ma trận $8 \times 8$ được tối ưu hóa ở mức vi mô, cho thời gian thực thi trung bình $\approx 0.015 - 0.035$ ms trên một luồng CPU tiêu chuẩn.
   - Cho phép nhúng trực tiếp thuật toán vào chu kỳ xử lý Telemetry 30Hz của `CoreShmBridge` mà không gây hiện tượng Drop Frame hoặc nghẽn hàng đợi IPC.

3. **Asynchronous & Decoupled Online Learning (Phân Tách Pha Suy Luận Nhanh và Tự Học Nền)**:
   - **Fast-Path Inference**: Được thực thi đồng bộ khi nhận snapshot viễn trắc (tính DPS cửa sổ trượt, trích xuất context vector, tính điểm UCB và gợi ý hành động chiến thuật).
   - **Slow-Path Adaptation**: Việc cập nhật tri thức kinh nghiệm (cập nhật tích lũy ma trận hiệp phương sai $A_a$, vector $b_a$, phân tích Hộp Đen sau tử trận, ghi file JSON) được xử lý tách biệt hoặc thực hiện theo lô (định kỳ 20 bước quyết định hoặc khi có sự kiện `PLAYER_DEATH` / `ZONE_CHANGE`), bảo vệ toàn vẹn bằng `threading.Lock()`.

---

## 2. CƠ CHẾ GIẢI QUYẾT ITEM CHƯA GIÁM ĐỊNH (PoE2 UNIDENTIFIED ITEM 4-STAGE LIFECYCLE)

Trong Path of Exile 2, vật phẩm rơi trên mặt đất gần như $100\%$ ở dạng **Chưa Giám Định (Unidentified)**. Do cơ chế kinh tế đặc thù của PoE2:
- **Scroll of Wisdom** không còn rơi tràn lan như PoE1 mà có tỷ lệ drop rất thấp, là tài nguyên quý giá giai đoạn đầu league.
- NPC **The Hooded One** tại làng/Hideout cung cấp tính năng **"Identify All" hoàn toàn miễn phí** (0 Vàng, 0 Scroll).

Module [`src/agentic_engine/item_lifecycle.py`](../../src/agentic_engine/item_lifecycle.py) hiện thực hóa **Vòng đời 4 giai đoạn (4-Stage Lifecycle)** để tối đa hóa giá trị trang bị và tiết kiệm triệt để tài nguyên của người chơi.

```mermaid
stateDiagram-v2
    [*] --> Stage1_PreID_Triage: Vật phẩm rơi trên đất (Unidentified)
    
    state Stage1_PreID_Triage {
        [*] --> ExtractBaseInfo: Đọc Base Name, iLvl, Rarity, Slot
        ExtractBaseInfo --> QueryKnowledgeDB: Đối chiếu Phôi S-Tier & Lịch sử Upgrade Rate
        QueryKnowledgeDB --> CalculateBaseScore: Tính Base Tier Score & Expected Value (Chaos)
    }

    Stage1_PreID_Triage --> Stage2_ChannelRouting: Phân luồng giám định

    state Stage2_ChannelRouting {
        state "Kênh 1: FIELD_SCROLL_OF_WISDOM" as Ch1
        state "Kênh 2: TOWN_THE_HOODED_ONE" as Ch2
        state "Kênh 3: SKIP_DO_NOT_IDENTIFY" as Ch3

        Ch1: Unique xịn hoặc Phôi S-Tier Gloves iLvl >= 75\nvà Scrolls > 5\n--> Dùng Scroll dã chiến ngay tại chỗ!
        Ch2: Đồ Rare thông thường / Thiếu Scroll\n--> Gom vào túi đồ mang về làng
        Ch3: Phôi rác iLvl thấp\n--> Bỏ qua hoặc rã tại Salvage Bench lấy Vàng
    }

    Ch1 --> Stage3_PostID_Appraisal: Giám định thành công
    Ch2 --> SafeHubDetected: Rời map về Làng / Hideout
    SafeHubDetected --> HoodedOnePrompt: Thông báo HUD: 'Identify All' qua The Hooded One
    HoodedOnePrompt --> Stage3_PostID_Appraisal: Giám định hàng loạt 0 Scroll

    state Stage3_PostID_Appraisal {
        [*] --> ParseStats: Trích xuất thuộc tính ẩn (ItemStats)
        ParseStats --> ComparePareto: Gọi WhatIsBetterEvaluator
        ComparePareto --> VerdictDecision: Quyết định: EQUIP_UPGRADE / KEEP_CURRENT
    }

    Stage3_PostID_Appraisal --> Stage4_ProbabilityLearning: Cập nhật cơ sở tri thức

    state Stage4_ProbabilityLearning {
        [*] --> UpdateStatsDB: N_id++, N_upgrade++, Total_Chaos
        UpdateStatsDB --> SaveDisk: Lưu vào unidentified_learning_db.json
        SaveDisk --> [*]: Phản hồi ngược vào Hệ số Base Tier ở lần lặp sau
    }

    Stage4_ProbabilityLearning --> [*]
```

### 2.1. Giai Đoạn 1: Sàng Lọc Tiền Giám Định (Pre-Identification Triage)
Trước khi tiêu tốn 1 Cuộn Giám Định hay tốn 1 ô trống trong hòm đồ (Inventory), agent thẩm định giá trị tiềm năng của phôi đồ thông qua hàm `triage_unidentified_item()`:

1. **Nhận Diện Nhóm Phôi Tối Thượng (S-Tier Bases)**:
   Hệ thống duy trì danh mục phôi cơ sở tối ưu theo meta của từng vị trí trang bị:
   - **Găng tay (`gloves`)**: `Spiked Fists`, `Fists of Stone`, `Iron Gauntlets`, `Titan Gauntlets`.
   - **Nhẫn (`ring`)**: `Amethyst Ring` (nền tảng kháng Chaos), `Diamond Ring` (Crit), `Two-Stone Ring`, `Prismatic Ring`.
   - **Dây chuyền (`amulet`)**: `Lunar Amulet`, `Jade Amulet`, `Amber Amulet`.
   - **Giày (`boots`)**: `Windrunner Boots`, `Dragonscale Boots`, `Rawhide Boots`.
   - **Áo giáp (`body_armour`)**: `Dragonscale Doublet`, `Varnished Coat`, `Astral Plate`.

2. **Công Thức Tính Điểm Tiềm Năng Phôi ($S_{\text{base}}$)**:
   Xuất phát từ điểm cơ bản $S_0 = 40.0$:
   $$S_{\text{base}} = 40.0 + \Delta_{\text{tier}} + \Delta_{\text{ilvl}} + \Delta_{\text{rarity}} + \Delta_{\text{history}}$$
   Trong đó:
   - $\Delta_{\text{tier}} = +35.0$ nếu phôi thuộc `S_TIER_BASES`.
   - $\Delta_{\text{ilvl}} = +15.0$ nếu $\text{item\_level} \ge 75$ (mở khóa mod tier cao nhất).
   - $\Delta_{\text{rarity}} = +20.0$ nếu vật phẩm là `UNIQUE`.
   - $\Delta_{\text{history}} = \min\left(10.0, P_{\text{upgrade}} \times 40.0\right)$ với $P_{\text{upgrade}}$ là xác suất nâng cấp thực tế đã học được trong quá khứ.

3. **Tính Toán Giá Trị Kỳ Vọng (Expected Value in Chaos)**:
   $$EV_{\text{chaos}} = \text{round}\left(\text{AvgChaos}_{\text{history}} \times \frac{S_{\text{base}}}{50.0}, 1\right)$$

### 2.2. Giai Đoạn 2: Điều Phối Giám Định 2 Kênh (Dual-Channel Identification Routing)
Dựa trên điểm $S_{\text{base}}$, số lượng Scroll of Wisdom sẵn có và bối cảnh khu vực (đang ở chiến trường hay thành phố), hệ thống chỉ định kênh giám định tối ưu (`IdentificationChannel`):

| Kênh Giám Định | Điều Kiện Kích Hoạt | Hành Động & Lý Do Chiến Thuật |
|---|---|---|
| **`FIELD_SCROLL_OF_WISDOM`** | - Đồ `UNIQUE` và $\text{Scrolls} > 5$ trong combat zone.<br/>- Phôi S-Tier Gloves $iLvl \ge 75$ và $\text{Scrolls} \ge 10$. | **Giám định dã chiến tức thì**: Đồ Unique hoặc phôi găng tay tối thượng có tiềm năng tạo đột biến sức mạnh ngay lập tức. Nếu roll ra dòng đẹp, agent mặc đồ ngay giữa bản đồ để gia tăng sinh tồn. |
| **`TOWN_THE_HOODED_ONE`** | - Phôi `RARE` thông thường ($S_{\text{base}} \ge 50.0$).<br/>- Đồ Unique hoặc S-Tier nhưng lượng Scroll dã chiến $< 5$. | **Gom về thành phố**: Nhặt vào túi đồ nhưng không tốn Scroll. Khi người chơi quay về Hideout/Town, hệ thống kích hoạt thông báo HUD nhắc nhở đến NPC The Hooded One bấm "Identify All" miễn phí 100%. |
| **`SKIP_DO_NOT_IDENTIFY`** | - Phôi rác, $iLvl$ thấp, $S_{\text{base}} < 50.0$ và không phải Rare. | **Bỏ qua hoặc Rã rác**: Không nhặt để giữ trống Inventory, hoặc nếu nhặt thì đưa thẳng vào Bàn Thợ Rèn (`SALVAGE_BENCH`) rã lấy Vàng trả thuế sàn Faustus. |

### 2.3. Giai Đoạn 3: Thẩm Định Hậu Giám Định (Post-Identification Appraisal)
Khi vật phẩm được giám định (thông qua Scroll dã chiến hoặc The Hooded One), các thuộc tính ẩn lộ diện và được chuyển đổi thành cấu trúc `ItemStats`. 
Hệ thống gọi ngay `WhatIsBetterEvaluator.compare_items()` để đối soát với trang bị đang mặc trên người người chơi nhằm đưa ra chỉ thị dứt khoát:
- `EQUIP_UPGRADE`: Thay đồ ngay lập tức; chuyển đồ cũ sang đề xuất rã tại Bàn Thợ Rèn (`SALVAGE_BENCH`).
- `KEEP_CURRENT`: Giữ đồ cũ; nếu đồ mới có giá trị thị trường ước tính $\ge 15$ Chaos thì chuyển sang hòm buôn bán (`STASH_FOR_TRADE`), ngược lại đưa vào bàn rã lấy Vàng.

### 2.4. Giai Đoạn 4: Tự Học Xác Suất Phẩm Chất (Probability & EV Online Learning)
Mỗi lần thẩm định đồ sau giám định hoàn tất, hệ thống kích hoạt hàm `_update_learning_database()` để tự động cập nhật cơ sở dữ liệu `captures/unidentified_learning_db.json`:
- Tăng số lần giám định của phôi: $N_{\text{id}} \leftarrow N_{\text{id}} + 1$.
- Nếu kết quả là `EQUIP_UPGRADE`: $N_{\text{upgrade}} \leftarrow N_{\text{upgrade}} + 1$.
- Tích lũy giá trị thị trường: $\text{TotalChaos} \leftarrow \text{TotalChaos} + \text{Value}_{\text{chaos}}$.
- Cập nhật giá trị trung bình: $\text{AvgChaos} = \frac{\text{TotalChaos}}{N_{\text{id}}}$.
- Tính tỷ lệ thành công: $P_{\text{upgrade}} = \frac{N_{\text{upgrade}}}{N_{\text{id}}}$ (áp dụng khi $N_{\text{id}} \ge 5$).

**Vòng lặp khép kín**: Các tham số $P_{\text{upgrade}}$ và $\text{AvgChaos}$ được cập nhật này sẽ trực tiếp phản hồi ngược lại vào Giai đoạn 1 ($S_{\text{base}}$ và $EV_{\text{chaos}}$) trong các lần nhặt đồ tương lai!

---

## 3. HÀM ĐA MỤC TIÊU PARETO (PARETO MULTI-OBJECTIVE UTILITY FOR "WHAT IS BETTER?")

Trong PoE2, một món đồ có sát thương cao hơn chưa chắc đã tốt hơn nếu nó làm tụt trần kháng nguyên tố (Resistance Cap) khiến nhân vật bị quái vật "one-shot". 

Module [`src/agentic_engine/what_is_better.py`](../../src/agentic_engine/what_is_better.py) hiện thực hóa **Hàm Đa Mục Tiêu Pareto (Pareto Multi-Objective Optimization)** nhằm trả lời câu hỏi *"Cái nào tốt hơn và vì sao?"* cho cả Trang bị nhân vật lẫn Lựa chọn Hoạt động Kinh tế.

### 3.1. Mô Hình Toán Học So Sánh Trang Bị (Gear Pareto Comparison)

#### 1. Chỉ Số Sát Thương Hiệu Dụng (DPS Score)
Trong bối cảnh build Way of the Stonefist / Titan Gauntlets, sát thương Băng (Cold) mang lại giá trị chiến thuật cực lớn nhờ cơ chế đóng băng (Freeze/Chill) làm chậm hành vi tấn công của Boss:
$$\text{FlatDamage} = \text{Phys} + 1.3 \times \text{Cold} + \text{Fire} + \text{Lightning}$$

Điểm số DPS tổng hợp có tính đến Tốc độ đánh (Attack Speed) và Sát thương Chí mạng (Critical Strike Multiplier):
$$\text{DPS\_Score} = \text{FlatDamage} \times \left(1.0 + \frac{\text{AttackSpeed}\%}{100.0}\right) \times \left(1.0 + \frac{\text{CritMultiplier}\%}{200.0}\right)$$

Tỷ lệ chênh lệch phần trăm sát thương giữa đồ ứng viên (`candidate`) và đồ hiện tại (`current`):
$$\Delta \text{DPS}\% = \text{round}\left(\frac{\text{DPS\_Score}_{\text{cand}} - \text{DPS\_Score}_{\text{curr}}}{\max(1.0, \text{DPS\_Score}_{\text{curr}})} \times 100.0, 1\right)$$

#### 2. Chỉ Số Sinh Tồn Hiệu Dụng (EHP Score)
Kháng Hỗn Loạn (Chaos Resistance) trong PoE2 là chỉ số phòng thủ then chốt vì sát thương Chaos xuyên qua Energy Shield và các hiệu ứng nguyền rủa nguy hiểm:
$$\text{Res\_Sum} = \text{FireRes} + \text{ColdRes} + \text{LightningRes} + 1.5 \times \text{ChaosRes}$$

Điểm số EHP tổng hợp kết hợp Máu tối đa (`MaxLife`), Kháng nguyên tố/Chaos và Tỷ lệ Giảm sát thương phép (`SpellSuppression%`):
$$\text{EHP\_Score} = 1.5 \times \text{MaxLife} + 2.0 \times \text{Res\_Sum} + 3.0 \times \text{SpellSuppression}\%$$

Tỷ lệ chênh lệch phần trăm sinh tồn:
$$\Delta \text{EHP}\% = \text{round}\left(\frac{\text{EHP\_Score}_{\text{cand}} - \text{EHP\_Score}_{\text{curr}}}{\max(1.0, \text{EHP\_Score}_{\text{curr}})} \times 100.0, 1\right)$$

#### 3. Hàm Lợi Ích Tổng Thể (Total Utility Score)
$$U = \left(\Delta \text{DPS}\% \times w_{\text{dps}}\right) + \left(\Delta \text{EHP}\% \times w_{\text{ehp}}\right)$$
Trọng số cấu hình mặc định:
- $w_{\text{dps}} = 1.0$
- $w_{\text{ehp}} = 1.2$ (ưu tiên sống sót cao hơn sát thương thuần)
- $w_{\text{speed}} = 0.8$

#### 4. Hình Phạt Vi Phạm Trần Kháng (Resistance Caps Violation Penalty)
Nếu việc thay đồ làm tụt bất kỳ kháng nguyên tố nào (`fire`, `cold`, `lightning`) xuống dưới mức trần tối thiểu an toàn **$75\%$**:
$$\text{PlayerRes}_{\text{new}} = \text{PlayerRes}_{\text{current}} + \left(\text{Res}_{\text{candidate}} - \text{Res}_{\text{current}}\right) < 75\%$$
Khi đó, hệ thống lập tức giáng đòn phạt nặng nề vào hàm lợi ích:
$$U_{\text{final}} = U - 30.0$$
Đồng thời gắn nhãn cảnh báo nguy hiểm: `"CẢNH BÁO: Tháo đồ cũ sẽ làm Kháng [Element] tụt dưới trần 75%!"`.

```mermaid
flowchart TD
    A[Món đồ Ứng viên mới] --> B[Tính toán Flat Damage & DPS Score]
    A --> C[Tính toán Res Sum & EHP Score]
    B --> D[Tính Delta DPS %]
    C --> E[Tính Delta EHP %]
    D & E --> F["Hàm Lợi Ích Gốc: U = (Delta_DPS * 1.0) + (Delta_EHP * 1.2)"]
    
    F --> G{Kiểm tra Trần Kháng 75%?}
    G -- "Bị tụt dưới 75%" --> H["Phạt nặng: U = U - 30.0<br/>Gắn nhãn Cảnh báo Trần Kháng!"]
    G -- "Đạt trần an toàn >= 75%" --> I[Giữ nguyên U]

    H & I --> J{Đánh giá Ngưỡng Pareto}
    J -- "U >= +10.0" --> K["EQUIP_UPGRADE<br/>Đồ mới tốt hơn vượt trội, mặc ngay!<br/>Đồ cũ: Đưa vào SALVAGE_BENCH"]
    J -- "U <= -8.0" --> L["KEEP_CURRENT<br/>Đồ hiện tại tốt hơn nhiều.<br/>Đồ mới: Trade (>15c) hoặc Rã Vàng"]
    J -- "-8.0 < U < +10.0" --> M["TIE / KEEP_CURRENT<br/>Hai đồ ngang ngửa, giữ đồ cũ để ổn định"]
```

### 3.2. Đánh Giá Khuyến Nghị Hoạt Động Kinh Tế (Farming Activity Pareto Optimization)
Hàm `compare_farming_activities()` giải quyết bài toán: *"Với số Vàng và Divine hiện tại, nên làm gì để tối ưu lợi nhuận mà không phá sản vì thuế sàn Faustus?"*.

| Hoạt Động | Lợi Nhuận Ước Tính | Thuế Vàng Cần Thiết | Vốn Divine Tối Thiểu | Đánh Giá Rủi Ro & Khuyến Nghị |
|---|:---:|:---:|:---:|---|
| **`SEKHEMA_CARRY`** | **13.5 Div/h** | 16,000 Vàng | 3.2 Divine | Lợi nhuận cao nhất; yêu cầu build đủ cứng để không chết trong Trial. |
| **`FAUSTUS_ARBITRAGE`** | **9.0 Div/h** | 25,000 Vàng | 5.0 Divine | Buôn chênh lệch Ngọc/Omen; cần vốn dày và nhiều vàng để trả phí sàn. |
| **`WAYSTONE_T16_SPEEDRUN`** | **6.5 Div/h** | 0 Vàng | 0.5 Divine | Cày map T16 lấy phôi đồ và nhặt Vàng; là lựa chọn cứu cánh khi hết Vàng! |

**Quy tắc Pareto**: Lọc tất cả hoạt động thỏa mãn điều kiện vốn ($\text{CurrentGold} \ge \text{GoldTax}$ và $\text{AvailableDivine} \ge \text{CapitalRequired}$), sau đó chọn hoạt động có $\text{ProfitDivPerHour}$ lớn nhất. Nếu quỹ vàng không đủ, tự động chuyển về `WAYSTONE_T16_SPEEDRUN` để tái nạp quỹ vàng.

---

## 4. THUẬT TOÁN CONTEXTUAL BANDIT LinUCB (ONLINE ADAPTATION BRAIN)

Module [`src/agentic_engine/bandit_advisor.py`](../../src/agentic_engine/bandit_advisor.py) cài đặt bộ thuật toán **LinUCB (Linear Upper Confidence Bound with Disjoint Linear Models)** thuần Python, mang lại khả năng ra quyết định chiến thuật thích ứng động theo thời gian thực.

### 4.1. Không Gian Hành Động (Action Space)
Gồm 5 hành động chiến thuật then chốt:
1. `AGGRESSIVE_BURST`: Dồn toàn lực sát thương bộc phát, áp sát tiêu diệt nhanh các mục tiêu nguy hiểm.
2. `KITE_STABILIZE`: Thả diều lùi ra cự ly an toàn, giữ nhịp tấn công và đợi hồi phục bình máu.
3. `RETREAT_SAFE`: Rút lui chiến thuật về khu vực đã dọn sạch quái.
4. `EMERGENCY_PORTAL`: Mở portal khẩn cấp để thoát hiểm về thành.
5. `LOOT_WINDOW`: Tranh thủ khoảng trống giao tranh an toàn để nhặt vật phẩm rơi.

### 4.2. Không Gian Bối Cảnh (8-Dimensional Context Vector)
Tại mỗi frame 30Hz từ Telemetry, vector trạng thái $x \in \mathbb{R}^8$ được trích xuất và chuẩn hóa về đoạn $[0.0, 1.0]$:
$$x = \begin{bmatrix}
x_0 \\ x_1 \\ x_2 \\ x_3 \\ x_4 \\ x_5 \\ x_6 \\ x_7
\end{bmatrix} = \begin{bmatrix}
\text{clamp}\left(\text{HP}\% / 100.0\right) \\
\text{clamp}\left(\text{ES}\% / 100.0\right) \\
\text{clamp}\left(\text{MonsterCount} / 20.0\right) \\
\text{clamp}\left(\text{BossPoise}\% / 100.0\right) \\
\text{clamp}\left(\text{FlaskCharges}\% / 100.0\right) \\
\text{clamp}\left(\text{MapTier} / 16.0\right) \\
\text{clamp}\left(\text{RecentDPS} / 50000.0\right) \\
\text{clamp}\left(\text{DamageTakenRate} / 100.0\right)
\end{bmatrix}$$

### 4.3. Cơ Sở Toán Học Của LinUCB
Với mỗi hành động $a \in \mathcal{A}$:
- Duy trì ma trận hiệp phương sai $A_a \in \mathbb{R}^{d \times d}$ (khởi tạo bằng ma trận đơn vị $I_d$ với $d=8$).
- Duy trì vector phản hồi $b_a \in \mathbb{R}^d$ (khởi tạo bằng vector không $\mathbf{0}$).
- Vector trọng số sườn ước lượng của hành động:
  $$\hat{\theta}_a = A_a^{-1} b_a$$
- Điểm đánh giá UCB cho hành động $a$ trước bối cảnh $x$:
  $$\text{Score}(a, x) = \underbrace{\hat{\theta}_a^T x}_{\text{Kỳ vọng phần thưởng (Exploitation)}} + \underbrace{\alpha \sqrt{x^T A_a^{-1} x}}_{\text{Thưởng khám phá (Exploration Bonus)}}$$
  Trong đó hệ số khám phá $\alpha = 0.8$.
- Hành động tối ưu được chọn:
  $$a^* = \arg\max_{a \in \mathcal{A}} \text{Score}(a, x)$$

### 4.4. Thuật Toán Nghịch Đảo Ma Trận Trực Tiếp (Gauss-Jordan với Partial Pivoting)
Để đảm bảo **Zero External Dependencies**, thuật toán giải nghịch đảo ma trận $A^{-1}$ được lập trình thuần Python với độ ổn định số học cao:

```python
def _invert_matrix(A: List[List[float]]) -> List[List[float]]:
    """Đảo ma trận kích thước nhỏ bằng Gauss-Jordan với Partial Pivoting & Regularization."""
    n = len(A)
    # Tạo ma trận mở rộng [A | I]
    aug = [row[:] + [1.0 if i == j else 0.0 for j in range(n)] for i, row in enumerate(A)]

    for col in range(n):
        # 1. Tìm dòng có phần tử trụ lớn nhất (Partial Pivoting)
        pivot_row = col
        max_val = abs(aug[col][col])
        for r in range(col + 1, n):
            if abs(aug[r][col]) > max_val:
                max_val = abs(aug[r][col])
                pivot_row = r

        # 2. Điều hòa số học (Ridge Regularization) nếu ma trận gần suy biến
        if max_val < 1e-12:
            aug[col][col] += 1e-5

        # Hoán đổi dòng
        if pivot_row != col:
            aug[col], aug[pivot_row] = aug[pivot_row], aug[col]

        # 3. Chuẩn hóa dòng trụ về 1
        pivot = aug[col][col]
        for c in range(2 * n):
            aug[col][c] /= pivot

        # 4. Khử toàn bộ các dòng còn lại
        for r in range(n):
            if r != col:
                factor = aug[r][col]
                if factor != 0.0:
                    for c in range(2 * n):
                        aug[r][c] -= factor * aug[col][c]

    # Trích xuất ma trận nghịch đảo ở nửa phải
    return [row[n:] for row in aug]
```

### 4.5. Cơ Chế Thích Ứng Trực Tuyến & Cập Nhật Phần Thưởng (Online Learning Update)
Khi có phản hồi kết quả sau hành động, hệ thống cập nhật ma trận:
$$A_{a^*} \leftarrow A_{a^*} + x x^T$$
$$b_{a^*} \leftarrow b_{a^*} + r \cdot x$$

**Quy tắc Tính Phần Thưởng Thực Chiến (`compute_combat_reward`)**:
- Nếu người chơi tử trận (`is_player_slain == True`): Phạt cực nặng: $r = -15.0$.
- Bảo toàn sinh mệnh: Nếu $\text{HP}_{\text{end}} > 70\% \implies +1.5$; Nếu $\text{HP}_{\text{end}} < 30\% \implies -2.0$.
- Tiến độ chiến trường: Thưởng quái tiêu diệt $+\min(2.0, \text{monsters} \times 0.5)$ và sát thương gây ra $+\min(2.0, \text{dmg} / 20000.0)$.
- Tính tương thích chiến thuật:
  - Chọn `AGGRESSIVE_BURST` mà giữ được $\text{HP} > 50\% \implies +1.0$.
  - Chọn `KITE_STABILIZE` hoặc `RETREAT_SAFE` mà bảo toàn được $\text{HP} \ge 40\% \implies +0.8$.

---

## 5. BỘ TỰ HIỆU CHỈNH PHẢN XẠ & RÚT KINH NGHIỆM TỬ TRẬN (DYNAMIC REFLEX TUNER & POST-MORTEM REFLECTION CRITIC)

### 5.1. Bộ Tự Hiệu Chuẩn Phản Xạ Sinh Tồn (`ReflexParameterTuner`)
Module [`src/agentic_engine/reflex_tuner.py`](../../src/agentic_engine/reflex_tuner.py) quản lý và tự động tinh chỉnh 4 tham số phản xạ sống còn của Core Engine:
1. `flask_hp_threshold`: Ngưỡng máu kích hoạt bình hồi máu (Mặc định: $0.55$, trần an toàn: $0.75$).
2. `burst_dodge_threshold`: Ngưỡng sụt máu tức thời trong 1 tick để lộn nhào né tránh Iframe Spacebar (Mặc định: $0.22$, sàn nhạy cảm: $0.15$).
3. `kiting_distance`: Khoảng cách tối thiểu duy trì khi thả diều quái vật (Mặc định: $35.0$, trần an toàn: $50.0$).
4. `emergency_chicken_hp`: Ngưỡng máu kích hoạt ngắt kết nối khẩn cấp cứu mạng (Mặc định: $0.18$, trần an toàn: $0.28$).

```mermaid
stateDiagram-v2
    [*] --> BalancedState: Khởi tạo thông số chuẩn

    state BalancedState {
        Flask_HP: 0.55
        Dodge_Delta: 0.22
        Kite_Dist: 35.0
        Chicken_HP: 0.18
    }

    BalancedState --> HighStressState: Sự kiện Tử trận (record_death) hoặc Suýt chết x3
    HighStressState --> HighStressState: Tử trận liên tiếp (Siết chặt tiếp)

    state HighStressState {
        Flask_HP: min(0.75, +0.05)
        Dodge_Delta: max(0.15, -0.02)
        Kite_Dist: min(50.0, +3.0)
        Chicken_HP: min(0.28, +0.02)
    }

    HighStressState --> BalancedState: Hoàn thành 5 map liên tiếp không chết (record_clean_run)
```

- **Quy tắc Siết Chặt Phòng Thủ (Defensive Tightening)**: Khi xảy ra sự kiện tử trận (`record_death`), hệ thống tăng `flask_hp_threshold` thêm $+0.05$, hạ `burst_dodge_threshold` $-0.02$ (tăng độ nhạy né đòn) và nới khoảng cách thả diều $+3.0$ đơn vị.
- **Quy tắc Thư Giãn Tự Nhiên (Natural Relaxation)**: Khi hoàn thành 5 bản đồ liên tiếp không có tử vong (`record_clean_run`), các tham số được nới lỏng nhẹ nhàng để nhân vật di chuyển linh hoạt hơn và tránh lãng phí bình máu.

### 5.2. Hộp Đen Telemetry 120 Ticks (`BlackboxRecorder`)
Module [`src/agentic_engine/blackbox.py`](../../src/agentic_engine/blackbox.py) sử dụng cấu trúc hàng đợi tròn hai đầu `collections.deque(maxlen=120)`.
- **Dung lượng**: Lưu trữ chính xác 120 snapshots gần nhất từ ShmBridge (tương đương khoảng $4 - 10$ giây thực chiến trước biến cố).
- **Cấu trúc Tick Snapshot**:
  ```json
  {
    "snapshot_id": 14502,
    "timestamp_ms": 1788749012345,
    "hp": 1820,
    "max_hp": 3200,
    "hp_pct": 56.88,
    "mana": 450,
    "max_mana": 800,
    "es": 0,
    "max_es": 0,
    "spirit": 100,
    "max_spirit": 100,
    "pos_xyz": [124.5, -88.2, 12.0],
    "monsters_count": 9,
    "items_count": 4,
    "portals_count": 1,
    "area_name": "The Vastiri Outskirts",
    "area_level": 78
  }
  ```
- Khi nhận được tín hiệu `PLAYER_DEATH` từ `LogWatcher`, hộp đen lập tức bị đóng băng và xuất ra file `captures/blackbox_player_death_YYYYMMDD_HHMMSS.json` để phục vụ công tác giám định pháp y tử trận.

### 5.3. Bộ Phản Tư & Hậu Kiểm Tử Trận (`ReflectionCritic`)
Module [`src/agentic_engine/reflection_critic.py`](../../src/agentic_engine/reflection_critic.py) phân tích chuỗi 120 ticks của Hộp Đen để chẩn đoán nguyên nhân gốc rễ (Root Cause Analysis - RCA):

| Phân Loại Tử Trận | Đặc Trưng Nhận Diện Từ Hộp Đen | Chẩn Đoán Nguyên Nhân Gốc Rễ | Chỉ Thị Điều Chỉnh Tự Động |
|---|---|---|---|
| **`BURST_SLAM_DAMAGE`** | Sụt $>60\%$ máu tối đa trong $<1.5$s hoặc tốc độ sát thương nhận vào $>1500$ DPS. | **Sốc sát thương bộc phát từ Boss/Rare Slam**: Nhân vật đứng yên trong vùng kỹ năng diện rộng của đối thủ. | - Giảm `burst_dodge_threshold` xuống $18\%$.<br/>- Bổ sung tối đa $100\%$ Spell Suppression trên trang bị. |
| **`SWARM_SURROUNDED`** | Số lượng quái vật quanh người $\ge 8$ con tại thời điểm mất máu. | **Bị bầy quái áp đảo bao vây**: Tốc độ dọn quái không theo kịp tốc độ sinh quái, cự ly đứng quá gần. | - Kích hoạt `KITE_STABILIZE` sớm khi quái $\ge 5$.<br/>- Nới cự ly thả diều `kiting_distance` lên $42 - 50$ đơn vị. |
| **`ATTRITION_OR_DOT`** | Máu sụt từ từ, số lượng quái ít, thời gian sụt kéo dài $>2.0$s. | **Sát thương duy trì (DoT) hoặc thiếu Kháng**: Bị dính Bleed, Poison hoặc suy kiệt tài nguyên bình máu. | - Kiểm tra và nâng trần Kháng Hỗn Loạn (Chaos Res).<br/>- Nâng ngưỡng bơm bình máu lên $65\%$. |

Tất cả bài học rút ra được lưu trữ vĩnh viễn trong `captures/agent_memory.json` (giới hạn 100 bài học gần nhất) để tạo thành ký ức dài hạn cho AI.

---

## 6. ĐẶC TẢ API `AgenticCoordinator` & HƯỚNG DẪN TÍCH HỢP

Module [`src/agentic_engine/coordinator.py`](../../src/agentic_engine/coordinator.py) đóng vai trò là **Façade Pattern duy nhất**, che giấu toàn bộ độ phức tạp của 8 phân hệ con và cung cấp giao diện lập trình thread-safe, không gây nghẽn (non-blocking) cho toàn bộ ứng dụng.

### 6.1. Bảng Tra Cứu API Công Khai (Public API Reference)

| Phương Thức | Tham Số Đầu Vào | Kiểu Trả Về | Chức Năng Chi Tiết |
|---|---|:---:|---|
| `get_instance()` | Không có | `AgenticCoordinator` | Lấy thực thể Singleton duy nhất của bộ điều phối não bộ. |
| `set_enabled(enabled)` | `enabled: bool` | `None` | Bật hoặc tắt toàn bộ chức năng suy luận và tự học A3E. |
| `register_ui_listener(cb)` | `cb: Callable[[Dict], None]` | `None` | Đăng ký hàm callback nhận cập nhật trạng thái đẩy lên giao diện HUD. |
| `on_telemetry_snapshot(snap)` | `snap: CoreTelemetrySnapshot` | `None` | **Cầu nối 30Hz**: Nhận viễn trắc từ ShmBridge, nạp Hộp Đen, tính Realized DPS và tính UCB Action. |
| `on_log_event(event)` | `event: LogEvent` | `None` | **Cầu nối Sự kiện**: Xử lý chuyển map (`ZONE_CHANGE`) và tử trận (`PLAYER_DEATH`). |
| `triage_unidentified_item(...)` | `base_name, ilvl, rarity, slot, scrolls, in_combat` | `PreIdTriageResult` | Sàng lọc tiền giám định: Quyết định nhặt, dùng Scroll dã chiến hay gom về cho The Hooded One. |
| `appraise_item_comparison(...)` | `current, candidate, player_resists` | `ItemComparisonResult` | Thẩm định hậu giám định: So sánh Pareto, cảnh báo trần kháng và gợi ý thay đồ/rã đồ. |
| `get_dashboard_state()` | Không có | `Dict[str, Any]` | Tổng hợp toàn bộ dữ liệu thống kê phiên chơi, DPS, gợi ý chiến thuật và tham số phản xạ cho GUI. |

### 6.2. Hướng Dẫn Tích Hợp Vào Vòng Lặp Chính (Integration Example)

Dưới đây là mẫu mã nguồn tích hợp `AgenticCoordinator` vào tầng giao tiếp của Tool:

```python
import logging
from src.agentic_engine.coordinator import AgenticCoordinator
from src.assistant_tool.core_shm_bridge import CoreShmBridge, CoreTelemetrySnapshot
from src.assistant_tool.log_watcher import LogEvent, LogWatcher

logger = logging.getLogger("AutoPOE2_App")

# 1. Khởi tạo Singleton Coordinator
coordinator = AgenticCoordinator.get_instance()

# 2. Đăng ký Listener cập nhật giao diện người dùng
def handle_ui_update(state: dict):
    # Cập nhật thông điệp lên Transparent Overlay HUD
    headline = state.get("advice_headline", "")
    action = state.get("recommended_action", "")
    current_dps = state.get("current_dps", 0.0)
    # Ví dụ: my_overlay.update_tactical_banner(action, headline, current_dps)

coordinator.register_ui_listener(handle_ui_update)

# 3. Tích hợp vào vòng lặp ShmBridge Telemetry Reader (30Hz)
def on_shm_telemetry_received(snapshot: CoreTelemetrySnapshot):
    # Đẩy snapshot vào bộ não A3E
    coordinator.on_telemetry_snapshot(snapshot)

# 4. Tích hợp vào LogWatcher (LatestClient.txt)
def on_game_log_event(event: LogEvent):
    # Đẩy sự kiện chuyển map hoặc tử trận vào bộ não A3E
    coordinator.on_log_event(event)
```

---

## 7. BẢNG TỔNG KẾT CHỈ SỐ KỸ THUẬT (A3E ENGINE PERFORMANCE BENCHMARKS)

| Tiêu Chí Đo Lường | Giá Trị Đạt Được | Ghi Chú Kỹ Thuật |
|---|:---:|---|
| **Thời gian tính toán LinUCB Inference** | **$< 0.035$ ms** | Nghịch đảo ma trận $8 \times 8$ Gauss-Jordan thuần Python trên CPU i7/Ryzen 7. |
| **Thời gian thẩm định Pareto Gear Comparison** | **$< 0.010$ ms** | Đánh giá đồng thời DPS, EHP, trần kháng 75% và sinh chỉ thị thay đồ. |
| **Dung lượng bộ nhớ Hộp Đen Telemetry** | **$\approx 35$ KB** | Ring buffer 120 ticks lưu trữ trong RAM, không gây phân mảnh bộ nhớ. |
| **Tần số tương thích tối đa** | **120 Hz** | Có thể gọi trực tiếp từ tầng C++ Core thông qua cấu trúc dữ liệu phẳng. |
| **Độ phụ thuộc bên ngoài** | **0 thư viện (0 MB)** | 100% Pure Python 3.11 Standard Library. |
| **Tính an toàn tiến trình (Thread-Safety)** | **$100\%$** | Bảo vệ bằng `threading.Lock()` trên mọi cổng biến đổi trạng thái. |

---
*Tài liệu được biên soạn bởi AI & Game Mechanics Documentation Specialist - Dự án AutoPOE2 (07/09/2026).*
