# 01. Semantic Digest: Tiến Hóa Đọc RAM Vitals, Con Trỏ Động & Tọa Độ XYZ (2026)

- **Mã lưu trữ**: `ARCHIVE-DIGEST-VITALS-XYZ-EVOLUTION`
- **Mốc thời gian nén**: `16/09/2026`
- **Các tài liệu gốc đã nén**: Doc 08, 09, 13 (2 bản), 16, 18 (CI), 20 (2 bản), 23 (2 bản), 24, 30, 34, 46, vitals_calibration_architecture.md.
- **Trạng thái**: `[HISTORICAL ARCHIVE — SỞ HỮU TRI THỨC ĐÃ ĐÓNG GÓI]`

---

## 1. Bối Cảnh Lịch Sử & Thách Thức Kỹ Thuật (06/09 - 13/09/2026)
Trong những ngày đầu phát triển AutoPOE2 trên client Path of Exile 2 (build `6AA2213C`):
1. **Trôi lệch con trỏ Vitals (HP/Mana/ES)**: Các phương pháp heuristic dò tìm chuỗi số trong bộ nhớ thường xuyên nhầm lẫn giữa giá trị máu thật và các đối tượng UI (Entity Marker 778/779) hoặc các vùng nhớ đệm tạm thời. Khi nhân vật chuyển cảnh hoặc thay đổi trang bị, địa chỉ bị stale gây crash hoặc không thể kích hoạt Auto-Flask.
2. **Kẹt cứng tọa độ XYZ tại Sandswept Marsh**: Các module điều hướng ban đầu dựa vào các offset tĩnh kiểu POE1 (`0x290`, `0x540`). Khi nhân vật bước trên địa hình bùn lầy phẳng (flat ground) của Sandswept Marsh (Act 3), tọa độ bị đóng băng tại `(0,0,0)`, khiến bot tưởng nhân vật đứng yên và kích hoạt chu trình AntiStuck vô tội vạ.
3. **Thách thức nhân vật CI (Chaos Inoculation - Monk BEONGUSI#3653)**: Build CI có `HP Max = 1`, toàn bộ sinh mệnh phụ thuộc vào Energy Shield (ES). Bot ban đầu spam Life Flask liên tục vì tưởng máu đang ở mức 1% (< ngưỡng 45%).

---

## 2. Nguyên Nhân Gốc Rễ (RCA) & Các Bước Khắc Phục

### A. Triệt tiêu Neo Tĩnh (Static Anchor) -> Giải Pháp PlayerFinder Quét Động 16MB
- **Nguyên nhân**: POE2 sử dụng kiến trúc bộ nhớ phân mảnh động hoàn toàn. Địa chỉ Player Entity thay đổi sau mỗi lần nạp instance (Loading Screen).
- **Giải pháp**: Xây dựng module `PlayerFinder` quét vi sai 16MB quanh vùng Heap của game.
  - Sử dụng đặc trưng kiểm định: $X, Y \in [-10000.0, 10000.0]$, $Z \in [-2000.0, 5000.0]$, và biến thiên $\Delta Y 
e 0$ liên tục khi nhân vật di chuyển.
  - Bổ sung kiểm tra `IsValidXYZ()` từ chối tuyệt đối `(0, 0, 0)` hoặc các giá trị NaN/Inf.
  - **Bất biến hình thành**: `INV-MEM-DYNAMIC-XYZ` — cấm neo tĩnh `0x290` / `0x540`.

### B. Thang Phân Giải Con Trỏ 4 Cấp (Pointer Chain Resolver)
- **Nguyên nhân**: Truy vết con trỏ qua 4-5 cấp offsets (`[[[Base + 0x18] + 0x30] + 0x80] + 0x24`) có nguy cơ invalid dereference khi map vừa unload.
- **Giải pháp**:
  - Tầng Hot Path (C++23): Thực thi Safe Dereference với `ReadProcessMemory` có bounds check và time-decay cache (< 0.051µs per resolution).
  - Kháng mã rác UI: Lọc bỏ ngay lập tức nếu giá trị HP đọc được nằm trong tập mã UI `[778, 779, 1337]`.
  - Hỗ trợ CI: Cờ `--ci` kích hoạt logic bảo vệ Energy Shield làm máu chính, cấm uống Life Flask khi `maxHP == 1` (`INV-CI-01`).

### C. Đối Soát Kép Quang Học vs RAM (Optical Sensor Alignment)
- Tích hợp `OpticalHPSensor` dùng GDI/DirectX chụp ảnh quả cầu máu với ROI 16:9 chuẩn hóa.
- Nếu chênh lệch giữa giá trị đo quang học và RAM $> 25\%$, kích hoạt cảnh báo Invariant Violation và chụp incident dossier tại thời điểm $0ms$.

---

## 3. Các Bất Biến & Mã Nguồn Chuẩn Đã Đúc Kết
Toàn bộ tri thức trên đã được tích hợp chuẩn hóa vào:
- `src/core/memory/player_finder.cpp` & `pointer_chain_resolver.cpp`
- `src/core/survival/reflex_manager.cpp` (CI mode, Smart Flask)
- Bất biến: `INV-MEM-DYNAMIC-XYZ`, `INV-CI-01`.
