## 2026-10-01T02:52:05Z

You are worker_m2_progression_1, a teamwork_preview_worker for Milestone M2 (LevelProgressionService & Death Penalty).
Your working directory is: c:\Projects\FreeExile\.agents\teamwork\worker_m2_progression_1
Your parent is: orchestrator_4 (conversation ID: 6f4a2aa2-4315-4660-8cb7-8352a7220c95)

Read the authoritative requirements in c:\Projects\FreeExile\.agents\teamwork\ORIGINAL_REQUEST.md under section ## 2026-10-01T00:40:44Z.
Read the project architecture in c:\Projects\FreeExile\.agents\teamwork\orchestrator_4\PROJECT.md.
Also read the detailed specifications and drop-in code prepared by the M2 explorers in:
- `c:\Projects\FreeExile\.agents\teamwork\explorer_m2_progression_1\report.md` and `handoff.md`
- `c:\Projects\FreeExile\.agents\teamwork\explorer_m2_progression_2\report.md` and `handoff.md`
- `c:\Projects\FreeExile\.agents\teamwork\explorer_m2_progression_3\report.md` and `handoff.md`

MANDATORY INTEGRITY WARNING:
DO NOT CHEAT. All implementations must be genuine. DO NOT hardcode test results, create dummy/facade implementations, or circumvent the intended task. A teamwork_preview_auditor will independently verify your work. Integrity violations WILL be detected and your work WILL be rejected.

File Ownership:
You exclusively own and may edit the following files:
- `server/world/level_progression_types.py` (new)
- `server/world/level_progression_service.py` (new)
- `server/world/combat_engine.py`
- `tests/unit/test_level_progression_service.py` (new)
- `tests/e2e/test_level_progression_e2e.py`

Task Instructions:
1. Create `server/world/level_progression_types.py`:
   - Follow 2026 Elite Code Standards: strict typing 100%, `@dataclass(slots=True, frozen=True)`.
   - Implement `PlayerProgressionState`, `ExpAwardResult`, `DeathPenaltyResult`, `LevelUpEvent`.
   - Provide property aliases for E2E test compatibility:
     * On `ExpAwardResult`: `effective_exp` -> returns `exp_awarded`; `level_up_occurred` -> returns `leveled_up`; `new_exp` -> returns `current_exp`.
     * On `DeathPenaltyResult`: `exp_lost` -> `penalty_exp_lost`; `penalty_ratio` -> `penalty_percentage`.
   - Keep file length strictly <= 350 lines.

2. Create `server/world/level_progression_service.py`:
   - Dependency inject `GameDesignMatrixService` (or default initialize with canonical DB).
   - In-memory player state dictionary `_players: Dict[str, PlayerProgressionState]`.
   - `get_player_state(player_id: str, default_level: int = 1) -> PlayerProgressionState`: return or create starting at Level 1 with 0 EXP, 0 unspent talent points.
   - `calculate_level_gap_multiplier(player_level: int, monster_level: int) -> float`:
     Delta = abs(player_level - monster_level).
     If Delta <= 5: 1.0.
     If Delta > 5: exp(-0.60 * (Delta - 5)).
     Ensure Delta >= 10 results in <= 0.05.
   - `award_monster_exp(player_id: str, monster_level: int, zone_level: Optional[int] = None, base_exp: Optional[int] = None, **kwargs: Any) -> ExpAwardResult`:
     Handle polymorphic call signatures (both `(player_id, monster_level, zone_level, base_exp)` and `(player_id, monster_level, base_exp=..., zone_level=...)`).
     If player_level >= 100: award 0 exp, leveled_up = False.
     Compute raw EXP (default to benchmark monster EXP if None) * gap multiplier.
     Handle leveling up (support multi-level gain if massive EXP awarded).
     On level up, increment level, grant 1 talent point per level (or as configured), recompute `exp_to_next_level` from `progression_benchmarks`.
     Strict cap at Level 100 with zero overflow.
   - `apply_death_penalty(player_id: str) -> DeathPenaltyResult`:
     Lookup tiered death penalty ratio for player's current level:
     1-60: 0.0, 61-80: 0.05, 81-89: 0.10, 90-98: 0.15, 99: 0.25, 100: 0.0.
     Calculate exp_lost = int(exp_to_next_level * penalty_ratio).
     Clamp exp_lost to current_exp: exp_lost = min(current_exp, exp_lost).
     new_exp = max(0, current_exp - exp_lost).
     `de_leveled = False` (NEVER de-level).
   - Keep file length strictly <= 350 lines (soft cap), <= 500 lines (hard cap).

3. In `server/world/combat_engine.py`:
   - Add `is_fatal: bool = False` to `DamageEventResult`.
   - Add `attach_progression_service(self, service: Any) -> None` and optional fatal damage hook / callback to notify progression on player fatal damage or monster defeat.
   - Keep changes minimal, non-blocking (< 25ms SLA), and clean.

4. In `tests/unit/test_level_progression_service.py`:
   - Create comprehensive unit tests covering:
     * Level gap decay formula at Delta = 0..15.
     * EXP award and level transitions (1 -> 2, multi-level up, cap at 100).
     * Tiered death penalties at 1-60, 70, 85, 95, 99, 100.
     * Safe floor boundary: dying at 0% EXP, dying at 10% EXP when penalty is 25%.
     * In-memory isolation and polymorphic call parameters.

5. In `tests/e2e/test_level_progression_e2e.py`:
   - Remove `@pytest.mark.xfail` on Feature F05 tests (`test_f05_death_penalty_safe_floor_no_delevel`, etc.) so they execute as clean passing tests.
   - Verify that all F03, F04, F05 tests pass.

6. Run verification commands and capture output:
   - `pytest tests/unit/test_level_progression_service.py`
   - `pytest tests/e2e/test_level_progression_e2e.py -k "test_f03 or test_f04 or test_f05"`
   - `python -m mypy --explicit-package-bases server/world/level_progression_types.py server/world/level_progression_service.py tests/unit/test_level_progression_service.py`
   - `python tools/lint/check_code_and_doc_hygiene.py --strict`
   - `python tools/security/run_independent_security_audit.py`

7. Deliverables:
   - Write full implementation report to `c:\Projects\FreeExile\.agents\teamwork\worker_m2_progression_1\report.md`
   - Write handoff report with test evidence to `c:\Projects\FreeExile\.agents\teamwork\worker_m2_progression_1\handoff.md`
   - Notify parent (`6f4a2aa2-4315-4660-8cb7-8352a7220c95`) via `send_message`.
