# BÁO CÁO BÀN GIAO (HANDOFF REPORT) — EXPLORER M1 PROGRESSION 1 GEN 2

> **Người thực hiện**: `explorer_m1_progression_1_gen2` (teamwork_preview_explorer)  
> **Người nhận**: `orchestrator_4` (`6f4a2aa2-4315-4660-8cb7-8352a7220c95`) & `worker_m1_progression_1`  
> **Loại Handoff**: Hard Handoff  
> **Thời điểm**: 2026-10-01T02:29:00Z  
> **Tài liệu tham chiếu chi tiết**: `c:\Projects\FreeExile\.agents\teamwork\explorer_m1_progression_1_gen2\report.md`

---

## 1. Observation (Quan Sát Trực Tiếp)

1. **Kết Quả Kiểm Thử Thất Bại của Challenger Gate M1**:
   Lệnh thực thi: `python .agents/teamwork/challenger_m1_progression_1/challenge_exp_curve.py`
   Kết quả trả về nguyên văn:
   ```
   3. Level 99->100 Delta EXP Ratio -> FAIL [HIGH]
      Details:  Cumulative 1-98 EXP: 17,989,242,456. Delta 99->100: 5,936,450,010. Lifetime EXP: 23,925,692,466. Delta / Cum(1-98) = 33.000000% (Req: >= 30.0%). Delta / Lifetime = 24.812030% (Req: 25.0% - 35.0%).
      Expected: ratio_vs_98 >= 30.0% AND 25.0% <= ratio_vs_lifetime <= 35.0%
      Actual:   ratio_vs_98 = 33.000000%, ratio_vs_lifetime = 24.812030% (DEFICIENT (< 25.0%))
   ...
   OVERALL EMPIRICAL VERDICT: CHANGES REQUESTED
   ```

2. **Mã Nguồn Cốt Lõi Tính Delta Cấp 99**:
   Tại `server/world/level_progression_curve.py:68-71`:
   ```python
   # Segment 7 (99->100): Hardcore Soft-Wall (33% of cumulative 1-98 EXP)
   sum_1_98 = sum(deltas[k] for k in range(1, 99))
   deltas[99] = int(math.floor(0.33 * sum_1_98))
   deltas[100] = 0
   ```
   Hệ số $f = 0.33$ được gán cứng, tính toán:
   - $sum\_1\_98 = 17,989,242,456$
   - $deltas[99] = \lfloor 0.33 \times 17,989,242,456 \rfloor = 5,936,450,010$
   - $total\_lifetime = 17,989,242,456 + 5,936,450,010 = 23,925,692,466$
   - Tỷ số so với Lifetime: $5,936,450,010 / 23,925,692,466 = 24.812030\% < 25.0\%$.

3. **Yêu Cầu Thiết Kế Gốc (Authoritative Requirements)**:
   Tại `ORIGINAL_REQUEST.md:173`:
   > *"Cấp 99 - 100: Bức tường cực hạn (Hardcore Soft-Wall) — delta EXP riêng cho cấp 99->100 tương đương **25-35% tổng EXP cả đời nhân vật**..."*
   Tại `ORIGINAL_REQUEST.md:200`:
   > *"và cấp 99-100 cần lượng EXP bằng **ít nhất 30% toàn bộ EXP từ 1 đến 99**."*

4. **Kiểm Thử Oracle và Assertion Bị Nới Lỏng trong E2E Suite**:
   Tại `tests/e2e/test_level_progression_e2e.py:54` và `:141`:
   - Dòng 54: `return int(math.floor(0.33 * sum_1_98))`
   - Dòng 141: `assert 0.20 <= (delta_99 / total_lifetime) <= 0.35` (ngưỡng sàn bị hạ từ `0.25` xuống `0.20`).

5. **Kết Quả Tính Toán Thực Nghiệm với Hệ Số Mới $f = 0.35$**:
   Thực thi kiểm chứng qua lệnh Python:
   ```python
   sum_1_98 = 17,989,242,456
   deltas[99] = int(math.floor(0.35 * sum_1_98)) # = 6,296,234,859
   total_lifetime = sum_1_98 + deltas[99]        # = 24,285,477,315
   ratio_vs_98 = deltas[99] / sum_1_98          # = 35.000000% >= 30.0%
   ratio_vs_lifetime = deltas[99] / total_lifetime # = 25.925926% in [25.0%, 35.0%]
   ```
   - Tính đơn điệu: `target_exp(100) = 24,285,477,315 > target_exp(99) = 17,989,242,456`.
   - Delta cấp 98 = $3,330,652,650$ < Delta cấp 99 = $6,296,234,859$ ($+89.04\%$).
   - Tổng cấp 1-20 = $3,248,870$ chiếm $0.013378\% \ll 0.1\%$ Lifetime EXP.
   - Cả 100 cấp đều bảo toàn đơn điệu ngặt 100%.

---

## 2. Logic Chain (Chuỗi Suy Luận)

1. **Từ Observation 1, 2 và 3**:
   Phương trình xác định tỷ lệ Lifetime EXP theo hệ số $f$:
   $$\text{Ratio}_{\text{lifetime}} = \frac{D}{L} = \frac{f \cdot S}{S + f \cdot S} = \frac{f}{1 + f}$$
   Để thỏa mãn $\text{Ratio}_{\text{lifetime}} \ge 0.25$, điều kiện toán học bắt buộc là:
   $$f \ge \frac{0.25}{1 - 0.25} = \frac{0.25}{0.75} = \frac{1}{3} \approx 0.333333...$$
   Do $f = 0.33 < 1/3$, giá trị $\frac{0.33}{1.33} = 24.812030\%$ toán học chắc chắn nhỏ hơn $25\%$. Đây là lỗi thiết kế tham số thuần túy.

2. **Từ Observation 3 và Logic 1**:
   Miền nghiệm đồng thời của $f$ thỏa mãn cả hai ràng buộc của game design matrix là:
   $$\frac{D}{S} \ge 0.30 \implies f \ge 0.30$$
   $$0.25 \le \frac{f}{1 + f} \le 0.35 \implies \frac{1}{3} \le f \le \frac{7}{13} \approx 0.538462$$
   Hợp hai điều kiện: $f \in \left[\frac{1}{3}, \frac{7}{13}\right]$.

3. **Từ Observation 5**:
   Chọn $f = 0.35$ (tức $35\%$):
   - Nằm trọn vẹn trong miền hợp lệ $\left[\frac{1}{3}, \frac{7}{13}\right]$.
   - Cho $\text{Ratio}_{\text{lifetime}} = \frac{0.35}{1.35} = \mathbf{25.925926\%}$, tạo khoảng đệm $+0.926\%$ an toàn tuyệt đối so với sàn $25\%$, loại trừ mọi rủi ro làm tròn số nguyên `int(math.floor(...))`.
   - $\text{Ratio}_{\text{vs\_98}} = \mathbf{35.000000\%} \ge 30.0\%$.

4. **Từ Observation 4 và 5**:
   Để suite E2E và code nguồn đạt sự đồng nhất hoàn toàn:
   - File `server/world/level_progression_curve.py:70` cần cập nhật factor `0.35`.
   - File `tests/e2e/test_level_progression_e2e.py:54` cần cập nhật factor `0.35`.
   - File `tests/e2e/test_level_progression_e2e.py:141` khôi phục assertion chuẩn `assert 0.25 <= (delta_99 / total_lifetime) <= 0.35`.
   - Database `data/game_design_matrix.db` cần tái đồng bộ qua `verify_game_design_matrix.py --sync`.

---

## 3. Caveats (Các Điểm Cần Lưu Ý)

1. **Phạm vi tác động (Blast Radius)**:
   Thay đổi chỉ tác động cục bộ đến EXP cấp 99 và cấp 100:
   - Các cấp từ 1 đến 98 hoàn toàn không đổi ($100\%$ byte-for-byte identical).
   - Delta EXP cấp 99 tăng $+359,784,849$ EXP ($+6.06\%$), làm cho việc đạt cấp 100 thử thách hơn, đúng tinh thần PoE2 Hardcore Soft-Wall.
2. **Quy tắc Read-Only của Explorer**:
   Explorer không trực tiếp sửa file mã nguồn. Toàn bộ thay đổi phải do `worker_m1_progression_1` áp dụng vào codebase.
3. **Các Milestone Kế Tiếp (M2 - M5)**:
   Các service tầng sau (`LevelProgressionService`, `AscendancyEngine`, `simulate_level_progression.py`) truy vấn bảng `progression_benchmarks` hoặc model `LevelExpBenchmark` mà không hardcode số cứng, do đó không bị đứt gãy tương thích.

---

## 4. Conclusion (Kết Luận & Phán Quyết)

- **Đánh giá**: Đề xuất chuyển đổi factor từ `0.33` sang `0.35` hoàn toàn chính xác về mặt toán học, thỏa mãn 100% các tiêu chí nghiệm thu của Milestone 1.
- **Giá trị chuẩn xác sau điều chỉnh**:
  - `sum_1_98 = 17,989,242,456`
  - `deltas[99] = 6,296,234,859`
  - `total_lifetime = 24,285,477,315`
  - `ratio_vs_98 = 35.000000%` ($\ge 30\%$)
  - `ratio_vs_lifetime = 25.925926%` ($25.0\% - 35.0\%$)
  - Tính đơn điệu: Tuyệt đối bảo toàn trên toàn bộ 100 cấp độ.
- **Hành động cụ thể cho Worker M1**:
  1. `server/world/level_progression_curve.py:70`: `deltas[99] = int(math.floor(0.35 * sum_1_98))`
  2. `tests/e2e/test_level_progression_e2e.py:54`: `return int(math.floor(0.35 * sum_1_98))`
  3. `tests/e2e/test_level_progression_e2e.py:141`: `assert 0.25 <= (delta_99 / total_lifetime) <= 0.35`
  4. Chạy `python tools/lint/verify_game_design_matrix.py --sync` để cập nhật SQLite database.

---

## 5. Verification Method (Phương Pháp Kiểm Chứng Độc Lập)

Các agent (Worker, Challenger, Orchestrator) có thể kiểm chứng độc lập giải pháp bằng các lệnh sau:

```powershell
# 1. Kiểm chứng công thức toán học nhanh
python -c "
sum_1_98 = 17989242456
d99 = int(0.35 * sum_1_98)
lifetime = sum_1_98 + d99
print('d99:', d99)
print('lifetime:', lifetime)
print('ratio_98:', f'{d99/sum_1_98:.6%}')
print('ratio_lifetime:', f'{d99/lifetime:.6%}')
"

# 2. Sau khi Worker sửa code, chạy E2E unit tests
python -m pytest tests/e2e/test_level_progression_e2e.py -k "test_f01" -v

# 3. Đồng bộ và xác thực database
python tools/lint/verify_game_design_matrix.py --sync

# 4. Chạy lại Challenger Harness thẩm định (Bắt buộc trả về PASS 7/7, APPROVED)
python .agents/teamwork/challenger_m1_progression_1/challenge_exp_curve.py

# 5. Kiểm toán vệ sinh mã nguồn
python tools/lint/check_code_and_doc_hygiene.py --strict
```

**Điều kiện bất hiệu hóa (Invalidation Conditions)**:
- Nếu Game Designer yêu cầu tỷ số delta 99 so với Lifetime EXP nằm ngoài khoảng $[25\%, 35\%]$, hoặc nếu yêu cầu $\Delta_{99}$ phải thấp hơn $5.9$ tỷ EXP. Ngược lại, nếu giữ nguyên bản đặc tả `ORIGINAL_REQUEST.md`, giải pháp $f = 0.35$ là bắt buộc và tối ưu.
