# BÁO CÁO THẨM ĐỊNH THỬ THÁCH (CHALLENGER HANDOFF REPORT) — MILESTONE 1 (PROGRESSION 1)

> **Người thực hiện**: `challenger_m1_progression_1` (teamwork_preview_challenger)  
> **Người nhận**: `orchestrator_4` (`6f4a2aa2-4315-4660-8cb7-8352a7220c95`)  
> **Loại Handoff**: Hard Handoff  
> **Phán quyết (Verdict)**: **REQUEST_CHANGES**  
> **Thời điểm**: 2026-10-01T02:20:30Z  

---

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

1. **Khởi tạo và Thực thi Harness Thử Thách Độc Lập**:
   - Tệp kiểm chứng thực nghiệm: `c:\Projects\FreeExile\.agents\teamwork\challenger_m1_progression_1\challenge_exp_curve.py`.
   - Kết quả chạy lệnh: `python .agents/teamwork/challenger_m1_progression_1/challenge_exp_curve.py`
   ```
   ================================================================================
   EMPIRICAL CHALLENGER REPORT: LEVEL PROGRESSION EXP CURVE
   ================================================================================

   1. Strict Monotonicity (Memory Curve) -> PASS [OK]
      Details:  Evaluated 100 levels. Cumulative violations: 0. Target violations: 0. Delta violations (1-99): 0. Level 100 exp_to_next_level = 0.
      Expected: cumulative_exp(L) > cumulative_exp(L-1) for all L in [2, 100]
      Actual:   PASS: 0 violations

   2. Level 1-20 Cumulative EXP Ratio (< 0.1%) -> PASS [OK]
      Details:  Level 20 cumulative: 2,755,579 (0.011517%). Level 21 cumulative (sum deltas 1..20): 3,248,870 (0.013579%). Lifetime EXP: 23,925,692,466.
      Expected: Ratio < 0.1% (< 0.001)
      Actual:   L20=0.011517%, L21=0.013579%

   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%))

   4. Death Penalty Tier Ratios (Memory Curve) -> PASS [OK]
      Details:  Checked 100 level tiers. Tiers: 1-60 (0%), 61-80 (5%), 81-89 (10%), 90-98 (15%), 99 (25%), 100 (0%). Mismatches: 0.
      Expected: Exact matching ratios across all 100 levels
      Actual:   PASS: 0 mismatches

   5. Level Gap Penalty Constants (Memory Curve) -> PASS [OK]
      Details:  Checked 100 levels. Constant mismatches: 0.
      Expected: safe_range=5, penalty_exp=0.60, benchmark_exp=25
      Actual:   PASS: 0 mismatches

   6. SQLite DB Persistence & Zero Drift -> PASS [OK]
      Details:  Total columns: 13/13 (Missing: []). Row count: 100/100. Drift errors vs memory curve: 0.
      Expected: 13 columns, 100 rows, 0 drift errors
      Actual:   PASS: 0 drift errors

   7. Integer Bounds & Headroom -> PASS [OK]
      Details:  Lifetime EXP = 23,925,692,466. Exceeds INT32 (2,147,483,647): True. Fits in INT64: True. Float53 precision safe (< 9.0e15): True.
      Expected: Requires 64-bit storage, safe in SQLite INTEGER (signed 64-bit) & IEEE 754 float
      Actual:   PASS: Lifetime=23925692466 fits safely in signed INT64

   ================================================================================
   OVERALL EMPIRICAL VERDICT: CHANGES REQUESTED
   ================================================================================
   ```

2. **Quan sát Mã Nguồn Triển Khai (`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
   ```
   - Giá trị $sum\_1\_98 = 17,989,242,456$.
   - Giá trị $deltas[99] = \lfloor 0.33 \times 17,989,242,456 \rfloor = 5,936,450,010$.
   - Giá trị Lifetime EXP = $sum\_1\_98 + deltas[99] = 23,925,692,466$.
   - Tỷ số so với tích lũy 1-98: $5,936,450,010 / 17,989,242,456 = 33.000000\% \ge 30\%$.
   - Tỷ số so với Lifetime EXP: $5,936,450,010 / 23,925,692,466 = \mathbf{24.812030\% < 25.000000\%}$.

3. **Quan sát Yêu Cầu Thiết Kế Gốc (`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**..."*
   Và chỉ thị dispatch từ orchestrator:
   > *"- Level 99->100 delta EXP ratio: must be >= 30% of cumulative 1-98 EXP and **25-35% of lifetime EXP**."*

4. **Quan sát Suite Kiểm Thử E2E (`tests/e2e/test_level_progression_e2e.py:136-141`)**:
   ```python
   def test_f01_exp_curve_pinnacle_softwall_tier7_ratio(self) -> None:
       """Level 99->100 delta is >= 30% of total 1-99 EXP and 25-35% of lifetime EXP."""
       sum_1_98 = sum(calc_delta_exp(i) for i in range(1, 99))
       delta_99 = calc_delta_exp(99)
       total_lifetime = sum_1_98 + delta_99
       assert delta_99 >= 0.30 * sum_1_98
       assert 0.20 <= (delta_99 / total_lifetime) <= 0.35
   ```
   - Docstring ghi rõ: *"25-35% of lifetime EXP"*, nhưng dòng assertion lại hạ ngưỡng sàn xuống `0.20` thay vì `0.25` để che lấp khiếm khuyết toán học $24.81\% < 25.0\%$.

---

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

1. Từ Observation 2 & 3:
   Gọi $S = \sum_{k=1}^{98} \Delta_k$ là tổng EXP tích lũy từ cấp 1 đến 98.
   Gọi $D = \Delta_{99}$ là delta EXP cần có để lên cấp 100 từ cấp 99.
   Tổng EXP cả đời (Lifetime EXP) là $L = S + D$.
   Tỷ số giữa delta cấp 99 và Lifetime EXP là:
   $$\text{Ratio}_{\text{lifetime}} = \frac{D}{L} = \frac{D}{S + D}$$
2. Yêu cầu của bản đặc tả kỹ thuật đặt ra đồng thời 2 ràng buộc:
   - Ràng buộc 1: $D \ge 0.30 \cdot S$ (tức $\frac{D}{S} \ge 30\%$).
   - Ràng buộc 2: $0.25 \le \frac{D}{S + D} \le 0.35$ (tức $25\% \le \text{Ratio}_{\text{lifetime}} \le 35\%$).
3. Nếu đặt $D = f \cdot S$, ta có:
   $$\text{Ratio}_{\text{lifetime}} = \frac{f \cdot S}{S + f \cdot S} = \frac{f}{1 + f}$$
   Để thỏa mãn $\frac{f}{1 + f} \ge 0.25$:
   $$f \ge \frac{0.25}{1 - 0.25} = \frac{0.25}{0.75} = \frac{1}{3} \approx 0.333333...$$
   Và để thỏa mãn $\frac{f}{1 + f} \le 0.35$:
   $$f \le \frac{0.35}{1 - 0.35} = \frac{0.35}{0.65} = \frac{7}{13} \approx 0.538462...$$
4. Do tác giả module chọn hệ số cứng $f = 0.33$, ta có:
   $$\text{Ratio}_{\text{lifetime}} = \frac{0.33}{1.33} = 24.812030\% < 25.000000\%$$
   Điều này khiến delta EXP cấp 99->100 bị hụt $0.188\%$ so với mức sàn tối thiểu của bản thiết kế game.
5. Từ Observation 4: Kiểm thử E2E đã bị nới lỏng bất thường từ `0.25` xuống `0.20` tại `test_f01_exp_curve_pinnacle_softwall_tier7_ratio`, trái ngược với mục đích thiết kế "bức tường cực hạn 25-35% tổng EXP cả đời".
6. Các hạng mục còn lại (Tính đơn điệu 100 cấp, tỷ lệ cấp 1-20 $< 0.1\%$, 6 bậc phạt chết, 3 hằng số level gap, và cấu trúc SQLite 13 cột) đều đạt chuẩn hoàn hảo 100%.

---

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

1. **Phạm vi tác động của thay đổi (Blast Radius)**:
   Nếu điều chỉnh $f$ từ $0.33$ lên $0.35$ (hoặc $1/3$):
   - Cấp 1 đến 98 hoàn toàn không bị ảnh hưởng (giữ nguyên $100\%$).
   - Delta cấp 99 tăng từ $5,936,450,010$ lên $6,296,234,859$ (tăng $+359,784,849$ EXP, tương đương $+6.06\%$).
   - Cumulative EXP cấp 100 tăng từ $23,925,692,466$ lên $24,285,477,315$.
   - Tỷ lệ Lifetime đạt $25.9259\%$, nằm chuẩn xác trong khoảng $[25\%, 35\%]$.
2. **Quy định vai trò Review-Only**:
   Tuân thủ nghiêm ngặt chỉ thị cốt lõi của Challenger: *"Review-only — do NOT modify implementation code"*, `challenger_m1_progression_1` không trực tiếp sửa mã nguồn `server/world/level_progression_curve.py` mà chỉ ra chính xác vị trí và giải pháp khắc phục cho Worker.

---

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

- **Phán quyết**: **REQUEST_CHANGES**
- **Đánh giá rủi ro tổng thể**: **MEDIUM** (Lỗi toán học biên, không gây crash runtime hay đứt gãy schema, nhưng sai lệch chỉ số cân bằng game thiết yếu đã cam kết trong Acceptance Criteria).
- **Hành động khắc phục đề xuất cho Worker (Actionable Remediation)**:
  1. Trong `server/world/level_progression_curve.py:70`:
     Thay:
     ```python
     deltas[99] = int(math.floor(0.33 * sum_1_98))
     ```
     Bằng:
     ```python
     deltas[99] = int(math.floor(0.35 * sum_1_98))
     ```
     *(Hoặc bất kỳ hệ số nào trong dải $f \in [0.33334, 0.53846]$, khuyến nghị $0.35$ để đạt $25.93\%$ lifetime ratio và $35.0\%$ 1-98 ratio)*.
  2. Trong `tests/e2e/test_level_progression_e2e.py:54` và `:141`:
     Đồng bộ công thức `calc_delta_exp(99)` thành `0.35 * sum_1_98` và khôi phục assertion:
     ```python
     assert 0.25 <= (delta_99 / total_lifetime) <= 0.35
     ```
  3. Chạy lệnh tái đồng bộ SQLite:
     ```powershell
     python tools/lint/verify_game_design_matrix.py --sync
     ```
  4. Chạy lại challenge harness:
     ```powershell
     python .agents/teamwork/challenger_m1_progression_1/challenge_exp_curve.py
     ```
     -> Kết quả sẽ PASS 100% (7/7 tests).

---

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

Các reviewer, worker và orchestrator có thể kiểm chứng độc lập bằng chuỗi lệnh sau:

```powershell
# 1. Chạy harness thẩm định thực nghiệm của challenger (hiện đang FAIL do ratio 24.81% < 25.0%)
python .agents/teamwork/challenger_m1_progression_1/challenge_exp_curve.py

# 2. Kiểm chứng công thức toán học tỷ lệ
python -c "
sum_1_98 = 17989242456
d99_current = int(0.33 * sum_1_98)
print('Current Ratio:', d99_current / (sum_1_98 + d99_current))

d99_fixed = int(0.35 * sum_1_98)
print('Fixed Ratio (0.35):', d99_fixed / (sum_1_98 + d99_fixed))
"

# 3. Kiểm chứng tính đơn điệu và 6 bậc phạt chết
python -m pytest tests/e2e/test_level_progression_e2e.py -k "test_f01 or test_f04" -v
```

**Điều kiện bất hiệu hóa (Invalidation Conditions)**:
- Nếu bản đặc tả chấp nhận ngưỡng sàn thấp hơn $24.8\%$ cho delta cấp 99 so với Lifetime EXP. Ngược lại, nếu giữ nguyên yêu cầu thiết kế $25-35\%$, phán quyết `REQUEST_CHANGES` có giá trị bắt buộc.
